From 2b15db82a7c53e3da99796130649f0c4bd2f161b Mon Sep 17 00:00:00 2001 From: Sarmad Qadri Date: Tue, 23 Sep 2025 18:23:52 -0400 Subject: [PATCH 01/11] Fix workflow resume issue --- src/mcp_agent/executor/workflow.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/mcp_agent/executor/workflow.py b/src/mcp_agent/executor/workflow.py index 723c99bb9..eaf58a08b 100644 --- a/src/mcp_agent/executor/workflow.py +++ b/src/mcp_agent/executor/workflow.py @@ -9,6 +9,7 @@ Generic, Literal, Optional, + Sequence, TypeVar, TYPE_CHECKING, ) @@ -424,16 +425,17 @@ async def cancel(self) -> bool: return False # Add the dynamic signal handler method in the case that the workflow is running under Temporal - if "temporalio.workflow" in sys.modules: - from temporalio import workflow + try: + from temporalio import workflow as temporal_workflow from temporalio.common import RawValue - from typing import Sequence + except ImportError: # Temporal not installed or available in this environment + temporal_workflow = None # type: ignore[assignment] + RawValue = None # type: ignore[assignment] - @workflow.signal(dynamic=True) + if temporal_workflow is not None: + @temporal_workflow.signal(dynamic=True) async def _signal_receiver(self, name: str, args: Sequence[RawValue]): """Dynamic signal handler for Temporal workflows.""" - from temporalio import workflow - self._logger.debug(f"Dynamic signal received: name={name}, args={args}") # Extract payload and update mailbox @@ -450,8 +452,8 @@ async def _signal_receiver(self, name: str, args: Sequence[RawValue]): sig_obj = Signal( name=name, payload=payload, - workflow_id=workflow.info().workflow_id, - run_id=workflow.info().run_id, + workflow_id=temporal_workflow.info().workflow_id, + run_id=temporal_workflow.info().run_id, ) # Live lookup of handlers (enables callbacks added after attach_to_workflow) @@ -461,7 +463,7 @@ async def _signal_receiver(self, name: str, args: Sequence[RawValue]): else: cb(sig_obj) - @workflow.query(name="token_tree") + @temporal_workflow.query(name="token_tree") def _query_token_tree(self) -> str: """Return a best-effort token usage tree string from the workflow process. @@ -481,7 +483,7 @@ def _query_token_tree(self) -> str: except Exception: return "(no token usage)" - @workflow.query(name="token_summary") + @temporal_workflow.query(name="token_summary") def _query_token_summary(self) -> Dict[str, Any]: """Return a JSON-serializable token usage summary from the workflow process. From c9a65530226b68e582cc21965d2ff85b354e2118 Mon Sep 17 00:00:00 2001 From: Sarmad Qadri Date: Tue, 23 Sep 2025 18:24:41 -0400 Subject: [PATCH 02/11] temp wip --- auth_spec.png | Bin 0 -> 415449 bytes docs/configuration.mdx | 43 +++ docs/oauth_support_design.md | 108 ++++++ src/mcp_agent/app.py | 44 ++- src/mcp_agent/config.py | 89 ++++- src/mcp_agent/core/context.py | 20 ++ src/mcp_agent/mcp/mcp_server_registry.py | 19 ++ src/mcp_agent/oauth/__init__.py | 19 ++ src/mcp_agent/oauth/access_token.py | 82 +++++ src/mcp_agent/oauth/callbacks.py | 53 +++ src/mcp_agent/oauth/errors.py | 21 ++ src/mcp_agent/oauth/flow.py | 218 +++++++++++++ src/mcp_agent/oauth/http/__init__.py | 5 + src/mcp_agent/oauth/http/auth.py | 68 ++++ src/mcp_agent/oauth/identity.py | 46 +++ src/mcp_agent/oauth/manager.py | 249 ++++++++++++++ src/mcp_agent/oauth/metadata.py | 60 ++++ src/mcp_agent/oauth/pkce.py | 27 ++ src/mcp_agent/oauth/records.py | 46 +++ src/mcp_agent/oauth/store/__init__.py | 11 + src/mcp_agent/oauth/store/base.py | 33 ++ src/mcp_agent/oauth/store/in_memory.py | 30 ++ src/mcp_agent/server/app_server.py | 398 +++++++++++++++++------ src/mcp_agent/server/token_verifier.py | 138 ++++++++ tests/test_oauth_utils.py | 85 +++++ 25 files changed, 1810 insertions(+), 102 deletions(-) create mode 100644 auth_spec.png create mode 100644 docs/oauth_support_design.md create mode 100644 src/mcp_agent/oauth/__init__.py create mode 100644 src/mcp_agent/oauth/access_token.py create mode 100644 src/mcp_agent/oauth/callbacks.py create mode 100644 src/mcp_agent/oauth/errors.py create mode 100644 src/mcp_agent/oauth/flow.py create mode 100644 src/mcp_agent/oauth/http/__init__.py create mode 100644 src/mcp_agent/oauth/http/auth.py create mode 100644 src/mcp_agent/oauth/identity.py create mode 100644 src/mcp_agent/oauth/manager.py create mode 100644 src/mcp_agent/oauth/metadata.py create mode 100644 src/mcp_agent/oauth/pkce.py create mode 100644 src/mcp_agent/oauth/records.py create mode 100644 src/mcp_agent/oauth/store/__init__.py create mode 100644 src/mcp_agent/oauth/store/base.py create mode 100644 src/mcp_agent/oauth/store/in_memory.py create mode 100644 src/mcp_agent/server/token_verifier.py create mode 100644 tests/test_oauth_utils.py diff --git a/auth_spec.png b/auth_spec.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd276c46e5e9eae0113935298a0e4474d7fb76a GIT binary patch literal 415449 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

E?AaYo*e_l8!Qq43%NErNgHy9OW+BP;=7??kf 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

AZ{|PM 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ΠYv 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%0AS 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 agXv17^M(vJ!4D1i+*f{}^hLoe^gjS2=P~>M literal 0 HcmV?d00001 diff --git a/docs/configuration.mdx b/docs/configuration.mdx index 22225a004..698638592 100644 --- a/docs/configuration.mdx +++ b/docs/configuration.mdx @@ -123,6 +123,49 @@ mcp-agent uses two configuration files: +## OAuth Configuration + +MCP Agent exposes two complementary OAuth configuration blocks: + +- `authorization` describes how the MCP Agent server validates inbound bearer tokens and publishes protected resource metadata. +- `oauth` configures delegated authorization when the agent connects to downstream MCP servers. + +```yaml +authorization: + enabled: true + issuer_url: https://auth.example.com + resource_server_url: https://agent.example.com/mcp + required_scopes: ["mcp.read", "mcp.write"] + introspection_endpoint: https://auth.example.com/oauth/introspect + introspection_client_id: ${INTROSPECTION_CLIENT_ID} + introspection_client_secret: ${INTROSPECTION_CLIENT_SECRET} + +oauth: + callback_base_url: https://agent.example.com + flow_timeout_seconds: 180 + token_store: + backend: memory # use "redis" for multi-instance deployments + refresh_leeway_seconds: 90 + +mcp: + servers: + github: + transport: streamable_http + url: https://github.mcp.example.com/mcp + auth: + oauth: + enabled: true + scopes: ["repo", "user:email"] + client_id: ${GITHUB_MCP_CLIENT_ID} + client_secret: ${GITHUB_MCP_CLIENT_SECRET} + redirect_uri_options: + - https://agent.example.com/internal/oauth/callback +``` + +- When `authorization.enabled` is true the MCP server advertises `/.well-known/oauth-protected-resource` and enforces bearer tokens using the provided introspection or JWKS configuration. +- `oauth` enables delegated authorization flows; the default in-memory token store is ideal for local development while Redis is recommended for production clusters. +- Downstream servers opt into OAuth via `mcp.servers..auth.oauth`. Supplying a `client_id`/`client_secret` allows immediate usage; support for dynamic client registration is planned as a follow-up. + ## Configuration Reference ### Execution Engine diff --git a/docs/oauth_support_design.md b/docs/oauth_support_design.md new file mode 100644 index 000000000..5aea9b1f2 --- /dev/null +++ b/docs/oauth_support_design.md @@ -0,0 +1,108 @@ +# MCP Agent OAuth Support + +## Goals +- Protect MCP Agent Cloud servers using OAuth 2.1 so MCP clients obtain tokens via standard flows. +- Enable MCP Agent runtimes to authenticate to downstream MCP servers that require OAuth access tokens. +- Provide pluggable token storage for both local development (in-memory) and multi-instance deployments (Redis planned). +- Maintain compatibility with MCP Authorization spec (RFC 8414, RFC 9728, OAuth 2.1 + PKCE, Resource Indicators) and the proposed delegated authorization SEP. + +## Architecture Overview + +### Components +1. **Auth Server Integration** – Configure the FastMCP instance with `AuthSettings` and a custom `TokenVerifier` that calls MCP Agent Cloud auth services. +2. **Protected Resource Metadata** – Serve `/.well-known/oauth-protected-resource` using FastMCP hooks so clients can discover the auth server. +3. **Access Token Validation** – Enforce bearer tokens on every inbound MCP request via `RequireAuthMiddleware`, populating the request context with the authenticated user. +4. **OAuth Token Service** – New `mcp_agent.oauth` package with: + - `TokenStore`/`TokenRecord` abstractions + - `InMemoryTokenStore` and Redis-backed implementation (second pass) + - `TokenManager` orchestration (acquire, refresh, revoke) + - `OAuthHttpxAuth` for attaching tokens to downstream HTTP transports + - `AuthorizationFlowCoordinator` that interacts with the user via MCP `auth/request` +5. **Delegated Authorization UI Flow** – Extend the gateway/session relay so servers can send `auth/request` messages to MCP clients, capturing authorization codes via either: + - Client-returned callback URL (preferred, works with SEP-capable clients) + - MCP Agent hosted callback endpoint (`/internal/oauth/callback/{flow_id}`) as a fallback / native-app style loopback. +6. **Configuration Surface** – Extend `Settings` and per-server `MCPServerAuthSettings` to describe OAuth behaviour (scopes, preferred auth server, redirect URIs, etc.) and global token-store configuration. + +### Key Data Flow +1. **Inbound Requests** + - Client presents bearer token ⇒ `BearerAuthBackend` + `MCPAgentTokenVerifier` introspect token. + - Verified token populates context with `OAuthUserIdentity` (provider + subject + email). + - Context is propagated into workflows/sessions so downstream OAuth flows know the acting user. + +2. **Outbound HTTP (downstream MCP server)** + - `ServerRegistry` detects `auth.oauth` configuration. + - Wraps HTTP transport with `OAuthHttpxAuth` which requests an access token from `TokenManager`. + - `TokenManager` checks store; if missing/expired ⇒ `AuthorizationFlowCoordinator` performs RFC 9728 discovery, PKCE, delegated browser flow through MCP client, exchanges code for tokens, caches result. + - Requests automatically retry after token refresh when a response returns 401/invalid token. + +3. **Token Storage** + - Tokens stored per `(user_identity, resource, authorization_server)` tuple with metadata (scopes, expiry, refresh token, provider claims). + - Store implements optimistic locking to avoid concurrent refresh storms. + - Pluggable backend (`InMemoryTokenStore` initial, Redis follow-up). + +## Module Plan + +``` +src/mcp_agent/oauth/ + __init__.py + identity.py # OAuthUserIdentity, helpers to extract from auth context + records.py # TokenRecord dataclass/pydantic model + store/base.py # TokenStore protocol + store/in_memory.py # Default store + manager.py # TokenManager (get/refresh/invalidate) + flow.py # AuthorizationFlowCoordinator + http/auth.py # OAuthHttpxAuth (httpx.Auth implementation) + metadata.py # RFC 8414 + RFC 9728 discovery helpers + pkce.py # PKCE + state utilities + errors.py # Custom exception hierarchy +``` + +Integration touchpoints: +- `mcp_agent/config.py` – add OAuth settings models. +- `mcp_agent/core/context.py` – add `current_user`, `token_manager`, `token_store`, `oauth_config` fields. +- `mcp_agent/app.py` – initialize token store/manager based on settings. +- `mcp_agent/server/app_server.py` – configure FastMCP auth settings, register callback route, surface user identity, extend relay to handle `auth/request`. +- `mcp_agent/mcp/mcp_server_registry.py` & `mcp_agent/mcp/mcp_connection_manager.py` – wire `OAuthHttpxAuth` into HTTP transports and expose helper for manual token teardown. +- `mcp_agent/mcp/client_proxy.py` – add proxy helpers for `auth/request`. +- `SessionProxy` – add direct request helper for `auth/request` and ensure Temporal flow support. +- `examples/mcp_agent_server/*` – demonstrate configuration changes. +- Tests – new suite exercising token store, metadata discovery, flow orchestration (with mocked HTTP + client responses). + +## OAuth Flow Details +1. **Discovery** + - If downstream server responds 401 with `WWW-Authenticate`, parse for `resource_metadata` ⇒ GET metadata ⇒ determine auth server URL(s). + - Fetch authorization server metadata (RFC 8414). + - Perform optional dynamic client registration when configured and supported. + +2. **Authorization Request** + - Generate PKCE challenge/verifier, secure `state`, choose `redirect_uri`. + - Build authorization URL including `resource` parameter (RFC 8707) + requested scopes. + - Invoke `auth/request` via SessionProxy → MCP client opens browser. + +3. **Callback Handling** + - Preferred: MCP client returns callback URL payload via request result. + - Fallback: Authorization server redirects to `/internal/oauth/callback/{flow_id}`. + - Coordinator validates `state`, extracts `code` (and errors). + +4. **Token Exchange / Storage** + - POST token endpoint with code + PKCE verifier + resource. + - Store access token, refresh token, expiry, scope, provider metadata. + - Associate tokens with user identity for reuse. + +5. **Refresh / Revocation** + - Manager refreshes when expiry within configurable grace window. + - Invalidate token on refresh failure or when server responses indicate revocation. + - Provide method to revoke tokens via authorization server when supported. + +## Open Questions / Follow-ups +- Redis-backed `TokenStore` (requires deployment secrets) – planned second phase. +- How LastMile auth server exposes token introspection + JWKS; need concrete endpoint specs to finalize `MCPAgentTokenVerifier`. +- MCP client adoption of `auth/request` SEP – need capability detection; until widely supported we rely on hosted callback fallback & manual instructions. +- Access control DSL (include/exclude by email/domain) – to be evaluated once token identity payload finalized. + +## Testing Strategy +- Unit tests for token store concurrency + expiry handling. +- Metadata discovery + PKCE generation (pure python tests). +- Integration-style test for delegated flow using mocked HTTP server + fake MCP client (ensures `auth/request` plumbing works end-to-end). +- Tests around server 401 enforcement + WWW-Authenticate header. + diff --git a/src/mcp_agent/app.py b/src/mcp_agent/app.py index f40349a95..558691071 100644 --- a/src/mcp_agent/app.py +++ b/src/mcp_agent/app.py @@ -3,7 +3,7 @@ import sys import functools -from types import MethodType +from types import MethodType, FunctionType from typing import ( Any, Dict, @@ -40,6 +40,8 @@ from mcp_agent.tracing.telemetry import get_tracer from mcp_agent.utils.common import unwrap from mcp_agent.workflows.llm.llm_selector import ModelSelector +from mcp_agent.oauth.manager import TokenManager +from mcp_agent.oauth.store import InMemoryTokenStore from mcp_agent.workflows.factory import load_agent_specs_from_dir @@ -249,6 +251,23 @@ async def initialize(self): # Store a reference to this app instance in the context for easier access self._context.app = self + # Initialize OAuth token management helpers if configured + oauth_settings = None + try: + if self._context.config: + oauth_settings = self._context.config.oauth + except Exception: + oauth_settings = None + + if oauth_settings: + token_store = InMemoryTokenStore() + token_manager = TokenManager( + token_store=token_store, + settings=oauth_settings, + ) + self._context.token_store = token_store + self._context.token_manager = token_manager + # Provide a safe default bound context for loggers created after init without explicit context try: set_default_bound_context(self._context) @@ -557,6 +576,25 @@ async def wrapper(*args, **kwargs): # Fall back to the original function return await fn(*args, **kwargs) + # Ensure the wrapper shares the original function's globals so that + # string annotations (from __future__ import annotations) continue to + # resolve against the workflow module rather than mcp_agent.app. + original_globals = getattr(fn, "__globals__", None) + if original_globals is not None and wrapper.__globals__ is not original_globals: + rebuilt_wrapper = FunctionType( + wrapper.__code__, + original_globals, + name=wrapper.__name__, + argdefs=wrapper.__defaults__, + closure=wrapper.__closure__, + ) + rebuilt_wrapper.__kwdefaults__ = wrapper.__kwdefaults__ + rebuilt_wrapper.__annotations__ = wrapper.__annotations__ + rebuilt_wrapper.__dict__.update(wrapper.__dict__) + rebuilt_wrapper = functools.update_wrapper(rebuilt_wrapper, fn) + rebuilt_wrapper.__wrapped__ = fn + wrapper = rebuilt_wrapper + return wrapper def _create_workflow_from_function( @@ -707,9 +745,9 @@ async def _run(self, *args, **kwargs): # type: ignore[no-redef] # decorate the run method with the engine-specific run decorator. if engine_type == "temporal": try: - run_decorator = (self._decorator_registry.get_workflow_run_decorator( + run_decorator = self._decorator_registry.get_workflow_run_decorator( engine_type - )) + ) if run_decorator: fn_run = getattr(auto_cls, "run") # Ensure method appears as top-level for Temporal diff --git a/src/mcp_agent/config.py b/src/mcp_agent/config.py index 638698b4b..d72f972ec 100644 --- a/src/mcp_agent/config.py +++ b/src/mcp_agent/config.py @@ -11,7 +11,15 @@ import warnings from httpx import URL -from pydantic import AliasChoices, BaseModel, ConfigDict, Field, field_validator +from pydantic import ( + AliasChoices, + AnyHttpUrl, + BaseModel, + ConfigDict, + Field, + field_validator, + model_validator, +) from pydantic_settings import BaseSettings, SettingsConfigDict @@ -22,6 +30,79 @@ class MCPServerAuthSettings(BaseModel): """Represents authentication configuration for a server.""" api_key: str | None = None + oauth: Optional["MCPOAuthClientSettings"] = None + + model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True) + + +class MCPAuthorizationServerSettings(BaseModel): + """Configuration for exposing the MCP Agent server as an OAuth protected resource.""" + + enabled: bool = False + issuer_url: AnyHttpUrl | None = None + resource_server_url: AnyHttpUrl | None = None + service_documentation_url: AnyHttpUrl | None = None + required_scopes: List[str] = Field(default_factory=list) + jwks_uri: AnyHttpUrl | None = None + introspection_endpoint: AnyHttpUrl | None = None + introspection_client_id: str | None = None + introspection_client_secret: str | None = None + token_cache_ttl_seconds: int = Field(300, ge=0) + + model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True) + + @model_validator(mode="after") + def _validate_required_urls(self) -> "MCPAuthorizationServerSettings": + if self.enabled: + missing = [] + if self.issuer_url is None: + missing.append("issuer_url") + if self.resource_server_url is None: + missing.append("resource_server_url") + if missing: + raise ValueError( + " | ".join(missing) + " must be set when authorization is enabled" + ) + return self + + +class MCPOAuthClientSettings(BaseModel): + """Configuration for authenticating to downstream OAuth-protected MCP servers.""" + + enabled: bool = False + scopes: List[str] = Field(default_factory=list) + resource: AnyHttpUrl | None = None + authorization_server: AnyHttpUrl | None = None + client_id: str | None = None + client_secret: str | None = None + redirect_uri_options: List[str] = Field(default_factory=list) + extra_authorize_params: Dict[str, str] = Field(default_factory=dict) + extra_token_params: Dict[str, str] = Field(default_factory=dict) + require_pkce: bool = True + use_internal_callback: bool = True + + model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True) + + +class OAuthTokenStoreSettings(BaseModel): + """Settings for OAuth token persistence.""" + + backend: Literal["memory", "redis"] = "memory" + redis_url: str | None = None + redis_prefix: str = "mcp_agent:oauth_tokens" + refresh_leeway_seconds: int = Field(60, ge=0) + + model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True) + + +class OAuthSettings(BaseModel): + """Global OAuth-related settings for MCP Agent.""" + + token_store: OAuthTokenStoreSettings = Field( + default_factory=OAuthTokenStoreSettings + ) + flow_timeout_seconds: int = Field(300, ge=30) + callback_base_url: AnyHttpUrl | None = None model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True) @@ -639,6 +720,12 @@ class Settings(BaseSettings): agents: SubagentSettings | None = SubagentSettings() """Settings for defining and loading subagents for the MCP Agent application""" + authorization: MCPAuthorizationServerSettings | None = None + """Settings for exposing this MCP application as an OAuth protected resource""" + + oauth: OAuthSettings | None = Field(default_factory=OAuthSettings) + """Global OAuth client configuration (token store, delegated auth defaults)""" + def __eq__(self, other): # type: ignore[override] if not isinstance(other, Settings): return NotImplemented diff --git a/src/mcp_agent/core/context.py b/src/mcp_agent/core/context.py index d449c938a..cc7bee78e 100644 --- a/src/mcp_agent/core/context.py +++ b/src/mcp_agent/core/context.py @@ -33,6 +33,7 @@ from mcp_agent.workflows.llm.llm_selector import ModelSelector from mcp_agent.logging.logger import get_logger from mcp_agent.tracing.token_counter import TokenCounter +from mcp_agent.oauth.identity import OAuthUserIdentity if TYPE_CHECKING: @@ -42,6 +43,8 @@ from mcp_agent.executor.workflow_signal import SignalWaitCallback from mcp_agent.executor.workflow_registry import WorkflowRegistry from mcp_agent.app import MCPApp + from mcp_agent.oauth.manager import TokenManager + from mcp_agent.oauth.store import TokenStore else: # Runtime placeholders for the types AgentSpec = Any @@ -50,6 +53,8 @@ SignalWaitCallback = Any WorkflowRegistry = Any MCPApp = Any + TokenManager = Any + TokenStore = Any logger = get_logger(__name__) @@ -93,6 +98,13 @@ class Context(BaseModel): gateway_url: str | None = None gateway_token: str | None = None + # Current authenticated user (set when acting as an MCP server) + current_user: Optional[OAuthUserIdentity] = None + + # OAuth helpers for downstream servers + token_store: Optional[TokenStore] = None + token_manager: Optional[TokenManager] = None + model_config = ConfigDict( extra="allow", arbitrary_types_allowed=True, # Tell Pydantic to defer type evaluation @@ -256,6 +268,14 @@ async def cleanup_context(shutdown_logger: bool = False): shutdown_logger: If True, completely shutdown OTEL infrastructure. If False, just cleanup app-specific resources. """ + global _global_context + + if _global_context and getattr(_global_context, "token_manager", None): + try: + await _global_context.token_manager.aclose() # type: ignore[call-arg] + except Exception: + pass + if shutdown_logger: # Shutdown logging and telemetry completely await LoggingConfig.shutdown() diff --git a/src/mcp_agent/mcp/mcp_server_registry.py b/src/mcp_agent/mcp/mcp_server_registry.py index a28735373..04a8cad08 100644 --- a/src/mcp_agent/mcp/mcp_server_registry.py +++ b/src/mcp_agent/mcp/mcp_server_registry.py @@ -31,6 +31,7 @@ from mcp_agent.logging.logger import get_logger from mcp_agent.mcp.mcp_agent_client_session import MCPAgentClientSession +from mcp_agent.oauth.http import OAuthHttpxAuth from mcp_agent.mcp.mcp_connection_manager import MCPConnectionManager if TYPE_CHECKING: @@ -215,6 +216,24 @@ async def start_server( kwargs["sse_read_timeout"] = sse_read_timeout # For Streamable HTTP, we get an additional callback for session ID + auth_handler = None + oauth_cfg = config.auth.oauth if config.auth else None + if oauth_cfg and oauth_cfg.enabled: + if context is None or getattr(context, "token_manager", None) is None: + logger.warning( + f"{server_name}: OAuth configured but token manager not available; skipping auth" + ) + else: + auth_handler = OAuthHttpxAuth( + token_manager=context.token_manager, + context=context, + server_name=server_name, + server_config=config, + scopes=oauth_cfg.scopes, + ) + if auth_handler: + kwargs["auth"] = auth_handler + async with streamablehttp_client( **kwargs, ) as (read_stream, write_stream, session_id_callback): diff --git a/src/mcp_agent/oauth/__init__.py b/src/mcp_agent/oauth/__init__.py new file mode 100644 index 000000000..7612bd080 --- /dev/null +++ b/src/mcp_agent/oauth/__init__.py @@ -0,0 +1,19 @@ +"""OAuth support utilities for MCP Agent. + +Modules export their own public APIs; this package file avoids importing them +eagerly to sidestep circular dependencies during initialization. +""" + +__all__ = [ + "access_token", + "callbacks", + "errors", + "flow", + "http", + "identity", + "manager", + "metadata", + "pkce", + "records", + "store", +] diff --git a/src/mcp_agent/oauth/access_token.py b/src/mcp_agent/oauth/access_token.py new file mode 100644 index 000000000..fe3d4bab4 --- /dev/null +++ b/src/mcp_agent/oauth/access_token.py @@ -0,0 +1,82 @@ +"""Extended access token model for MCP Agent authorization flows.""" + +from __future__ import annotations + +from datetime import datetime, timezone +from typing import Any, Dict, Iterable, List + +from mcp.server.auth.provider import AccessToken + + +class MCPAccessToken(AccessToken): + """Access token enriched with identity and claim metadata.""" + + subject: str | None = None + email: str | None = None + issuer: str | None = None + resource_indicator: str | None = None + claims: Dict[str, Any] | None = None + + @classmethod + def from_introspection( + cls, + token: str, + payload: Dict[str, Any], + *, + resource_hint: str | None = None, + ) -> "MCPAccessToken": + """Build an access token instance from an OAuth 2.0 introspection response.""" + client_id = _first_non_empty( + payload.get("client_id"), + payload.get("clientId"), + payload.get("cid"), + ) + scope_value = payload.get("scope") or payload.get("scp") + if isinstance(scope_value, str): + scopes: List[str] = [s for s in scope_value.split() if s] + elif isinstance(scope_value, Iterable): + scopes = [str(item) for item in scope_value] + else: + scopes = [] + + audience = payload.get("resource") or payload.get("aud") + if isinstance(audience, (list, tuple)): + audience_value = _first_non_empty(*audience) + else: + audience_value = audience + + resource = resource_hint or audience_value + + expires_at = payload.get("exp") + + return cls( + token=token, + client_id=str(client_id) if client_id is not None else "", + scopes=scopes, + expires_at=expires_at, + resource=resource, + subject=_first_non_empty(payload.get("sub"), payload.get("subject")), + email=_first_non_empty( + payload.get("email"), payload.get("preferred_username") + ), + issuer=payload.get("iss"), + resource_indicator=resource, + claims=payload, + ) + + def is_expired(self, *, leeway_seconds: int = 0) -> bool: + """Return True if token is expired considering optional leeway.""" + if self.expires_at is None: + return False + now = datetime.now(tz=timezone.utc).timestamp() + return now >= (self.expires_at - leeway_seconds) + + +def _first_non_empty(*values: Any) -> Any | None: + for value in values: + if value is None: + continue + if isinstance(value, str) and not value: + continue + return value + return None diff --git a/src/mcp_agent/oauth/callbacks.py b/src/mcp_agent/oauth/callbacks.py new file mode 100644 index 000000000..7cae8c992 --- /dev/null +++ b/src/mcp_agent/oauth/callbacks.py @@ -0,0 +1,53 @@ +"""Callback coordination for delegated OAuth flows.""" + +from __future__ import annotations + +import asyncio +from typing import Any, Dict + + +class OAuthCallbackRegistry: + """Manage asynchronous delivery of OAuth authorization callbacks.""" + + def __init__(self) -> None: + self._pending: Dict[str, asyncio.Future[Dict[str, Any]]] = {} + self._lock = asyncio.Lock() + + async def create_handle(self, flow_id: str) -> asyncio.Future[Dict[str, Any]]: + """Create (or reuse) a future associated with a flow identifier.""" + async with self._lock: + future = self._pending.get(flow_id) + if future is None or future.done(): + loop = asyncio.get_running_loop() + future = loop.create_future() + self._pending[flow_id] = future + return future + + async def deliver(self, flow_id: str, payload: Dict[str, Any]) -> bool: + """Set the result for a pending flow, returning False when no listener exists.""" + async with self._lock: + future = self._pending.get(flow_id) + if future is None: + return False + if not future.done(): + future.set_result(payload) + return True + + async def fail(self, flow_id: str, exc: Exception) -> bool: + async with self._lock: + future = self._pending.get(flow_id) + if future is None: + return False + if not future.done(): + future.set_exception(exc) + return True + + async def discard(self, flow_id: str) -> None: + async with self._lock: + future = self._pending.pop(flow_id, None) + if future and not future.done(): + future.cancel() + + +# Global registry used by server + flow coordinator +callback_registry = OAuthCallbackRegistry() diff --git a/src/mcp_agent/oauth/errors.py b/src/mcp_agent/oauth/errors.py new file mode 100644 index 000000000..3b1b5ce7a --- /dev/null +++ b/src/mcp_agent/oauth/errors.py @@ -0,0 +1,21 @@ +"""Custom exception types for OAuth workflows.""" + + +class OAuthFlowError(Exception): + """Base class for OAuth-related failures.""" + + +class AuthorizationDeclined(OAuthFlowError): + """Raised when the user declines an authorization request.""" + + +class CallbackTimeoutError(OAuthFlowError): + """Raised when the delegated authorization callback is not received in time.""" + + +class TokenRefreshError(OAuthFlowError): + """Raised when refreshing an access token fails irrecoverably.""" + + +class MissingUserIdentityError(OAuthFlowError): + """Raised when an OAuth flow is attempted without a known user identity.""" diff --git a/src/mcp_agent/oauth/flow.py b/src/mcp_agent/oauth/flow.py new file mode 100644 index 000000000..424385538 --- /dev/null +++ b/src/mcp_agent/oauth/flow.py @@ -0,0 +1,218 @@ +"""Delegated OAuth authorization flow coordinator.""" + +from __future__ import annotations + +import asyncio +import time +import uuid +from typing import Any, Dict, Sequence +from urllib.parse import parse_qs, urlparse + +import httpx +from mcp.shared.auth import OAuthMetadata, ProtectedResourceMetadata +from mcp.server.session import ServerSession + +from mcp_agent.config import MCPOAuthClientSettings, OAuthSettings +from mcp_agent.core.context import Context +from mcp_agent.logging.logger import get_logger +from mcp_agent.oauth.callbacks import callback_registry +from mcp_agent.oauth.errors import ( + AuthorizationDeclined, + CallbackTimeoutError, + MissingUserIdentityError, + OAuthFlowError, +) +from mcp_agent.oauth.identity import OAuthUserIdentity +from mcp_agent.oauth.pkce import ( + generate_code_challenge, + generate_code_verifier, + generate_state, +) +from mcp_agent.oauth.records import TokenRecord + +logger = get_logger(__name__) + + +class AuthorizationFlowCoordinator: + """Handles the interactive OAuth Authorization Code flow via MCP clients.""" + + def __init__(self, *, http_client: httpx.AsyncClient, settings: OAuthSettings): + self._http_client = http_client + self._settings = settings + + async def authorize( + self, + *, + context: Context, + user: OAuthUserIdentity, + server_name: str, + oauth_config: MCPOAuthClientSettings, + resource: str, + authorization_server_url: str, + resource_metadata: ProtectedResourceMetadata, + auth_metadata: OAuthMetadata, + scopes: Sequence[str], + ) -> TokenRecord: + if not user: + raise MissingUserIdentityError( + "Cannot begin OAuth flow without authenticated MCP user" + ) + + client_id = oauth_config.client_id + if not client_id: + raise OAuthFlowError( + f"No OAuth client_id configured for server '{server_name}'." + ) + + redirect_options = list(oauth_config.redirect_uri_options or []) + flow_id = uuid.uuid4().hex + internal_redirect = None + if oauth_config.use_internal_callback and self._settings.callback_base_url: + internal_redirect = f"{self._settings.callback_base_url.rstrip('/')}/internal/oauth/callback/{flow_id}" + redirect_options.insert(0, internal_redirect) + + if not redirect_options: + raise OAuthFlowError( + "No redirect URI options configured for OAuth authorization flow" + ) + + redirect_uri = redirect_options[0] + + code_verifier = generate_code_verifier() + code_challenge = generate_code_challenge(code_verifier) + state = generate_state() + scope_param = " ".join(scopes) + + authorize_url = httpx.URL( + str(auth_metadata.authorization_endpoint) + ).include_query_params( + response_type="code", + client_id=client_id, + redirect_uri=redirect_uri, + scope=scope_param, + state=state, + code_challenge=code_challenge, + code_challenge_method="S256", + resource=resource, + **(oauth_config.extra_authorize_params or {}), + ) + + callback_future = None + if internal_redirect is not None: + callback_future = await callback_registry.create_handle(flow_id) + + request_payload = { + "url": str(authorize_url), + "message": f"Authorization required for {server_name}", + "redirect_uri_options": redirect_options, + } + + result = await _send_auth_request(context, request_payload) + + try: + if result and result.get("url"): + callback_data = _parse_callback_params(result["url"]) + if callback_future is not None: + await callback_registry.discard(flow_id) + elif callback_future is not None: + timeout = self._settings.flow_timeout_seconds or 300 + try: + callback_data = await asyncio.wait_for( + callback_future, timeout=timeout + ) + except asyncio.TimeoutError as exc: + raise CallbackTimeoutError( + f"Timed out waiting for OAuth callback after {timeout} seconds" + ) from exc + else: + raise AuthorizationDeclined( + "Authorization request was declined by the user" + ) + finally: + if callback_future is not None: + await callback_registry.discard(flow_id) + + error = callback_data.get("error") + if error: + description = callback_data.get("error_description") or error + raise OAuthFlowError(f"Authorization server returned error: {description}") + + returned_state = callback_data.get("state") + if returned_state != state: + raise OAuthFlowError("State mismatch detected in OAuth callback") + + authorization_code = callback_data.get("code") + if not authorization_code: + raise OAuthFlowError("Authorization callback did not include code") + + token_endpoint = str(auth_metadata.token_endpoint) + data: Dict[str, Any] = { + "grant_type": "authorization_code", + "code": authorization_code, + "redirect_uri": redirect_uri, + "client_id": client_id, + "code_verifier": code_verifier, + "resource": resource, + } + if scope_param: + data["scope"] = scope_param + if oauth_config.extra_token_params: + data.update(oauth_config.extra_token_params) + + auth = None + if oauth_config.client_secret: + data["client_secret"] = oauth_config.client_secret + + token_response = await self._http_client.post( + token_endpoint, data=data, auth=auth + ) + token_response.raise_for_status() + payload = token_response.json() + + access_token = payload.get("access_token") + if not access_token: + raise OAuthFlowError("Token endpoint response missing access_token") + refresh_token = payload.get("refresh_token") + expires_in = payload.get("expires_in") + expires_at = None + if isinstance(expires_in, (int, float)): + expires_at = time.time() + float(expires_in) + + scope_from_payload = payload.get("scope") + if isinstance(scope_from_payload, str) and scope_from_payload.strip(): + effective_scopes = tuple(scope_from_payload.split()) + else: + effective_scopes = tuple(scopes) + + return TokenRecord( + access_token=access_token, + refresh_token=refresh_token, + expires_at=expires_at, + scopes=effective_scopes, + token_type=str(payload.get("token_type", "Bearer")), + resource=resource, + authorization_server=authorization_server_url, + metadata={"raw": payload}, + ) + + +def _parse_callback_params(url: str) -> Dict[str, str]: + parsed = urlparse(url) + params = {} + params.update({k: v[-1] for k, v in parse_qs(parsed.query).items()}) + if parsed.fragment: + params.update({k: v[-1] for k, v in parse_qs(parsed.fragment).items()}) + return params + + +async def _send_auth_request( + context: Context, payload: Dict[str, Any] +) -> Dict[str, Any]: + session = getattr(context, "upstream_session", None) + if session and isinstance(session, ServerSession): + rpc = getattr(session, "rpc", None) + if rpc and hasattr(rpc, "request"): + return await rpc.request("auth/request", payload) + raise AuthorizationDeclined( + "No upstream MCP session available to prompt user for authorization" + ) diff --git a/src/mcp_agent/oauth/http/__init__.py b/src/mcp_agent/oauth/http/__init__.py new file mode 100644 index 000000000..60479ab9e --- /dev/null +++ b/src/mcp_agent/oauth/http/__init__.py @@ -0,0 +1,5 @@ +"""HTTP client helpers for OAuth flows.""" + +from .auth import OAuthHttpxAuth + +__all__ = ["OAuthHttpxAuth"] diff --git a/src/mcp_agent/oauth/http/auth.py b/src/mcp_agent/oauth/http/auth.py new file mode 100644 index 000000000..29b2028ce --- /dev/null +++ b/src/mcp_agent/oauth/http/auth.py @@ -0,0 +1,68 @@ +"""httpx.Auth adapter that acquires tokens via TokenManager.""" + +from __future__ import annotations + +import httpx + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from mcp_agent.oauth.manager import TokenManager + from mcp_agent.core.context import Context + + +class OAuthHttpxAuth(httpx.Auth): + requires_request_body = True + + def __init__( + self, + *, + token_manager: "TokenManager", + context: "Context", + server_name: str, + server_config, + scopes=None, + ) -> None: + self._token_manager = token_manager + self._context = context + self._server_name = server_name + self._server_config = server_config + self._scopes = list(scopes) if scopes is not None else None + + async def async_auth_flow(self, request: httpx.Request): + token_record = await self._token_manager.ensure_access_token( + context=self._context, + server_name=self._server_name, + server_config=self._server_config, + scopes=self._scopes, + ) + request.headers["Authorization"] = ( + f"{token_record.token_type} {token_record.access_token}" + ) + retry_request = request.copy() + response = yield request + + if response.status_code != 401: + return + + user = self._context.current_user + if user is None: + return + + await self._token_manager.invalidate( + user=user, + resource=token_record.resource or "", + authorization_server=token_record.authorization_server, + scopes=token_record.scopes, + ) + + refreshed_record = await self._token_manager.ensure_access_token( + context=self._context, + server_name=self._server_name, + server_config=self._server_config, + scopes=self._scopes, + ) + retry_request.headers["Authorization"] = ( + f"{refreshed_record.token_type} {refreshed_record.access_token}" + ) + yield retry_request diff --git a/src/mcp_agent/oauth/identity.py b/src/mcp_agent/oauth/identity.py new file mode 100644 index 000000000..54c6d6fed --- /dev/null +++ b/src/mcp_agent/oauth/identity.py @@ -0,0 +1,46 @@ +"""Utilities for representing authenticated MCP users.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, Dict + +from .access_token import MCPAccessToken + + +@dataclass(frozen=True) +class OAuthUserIdentity: + """Canonical identifier for an authenticated user within MCP Agent.""" + + provider: str + subject: str + email: str | None = None + claims: Dict[str, Any] | None = None + + @property + def cache_key(self) -> str: + """Return a deterministic cache key for token storage.""" + return f"{self.provider}:{self.subject}" + + @classmethod + def from_access_token( + cls, token: MCPAccessToken | None + ) -> "OAuthUserIdentity" | None: + """Build an identity from an enriched access token.""" + if token is None: + return None + subject = token.subject or _claim(token, "sub") + if not subject: + return None + provider = token.issuer or _claim(token, "iss") or "unknown" + email = ( + token.email or _claim(token, "email") or _claim(token, "preferred_username") + ) + claims = token.claims or {} + return cls(provider=provider, subject=subject, email=email, claims=claims) + + +def _claim(token: MCPAccessToken, key: str) -> Any | None: + if not token.claims: + return None + return token.claims.get(key) diff --git a/src/mcp_agent/oauth/manager.py b/src/mcp_agent/oauth/manager.py new file mode 100644 index 000000000..62d0308b9 --- /dev/null +++ b/src/mcp_agent/oauth/manager.py @@ -0,0 +1,249 @@ +"""Token management for downstream OAuth-protected MCP servers.""" + +from __future__ import annotations + +import asyncio +import time +from collections import defaultdict +from typing import Dict, Iterable, Sequence, TYPE_CHECKING + +import httpx +from httpx import URL + +from mcp_agent.config import MCPOAuthClientSettings, OAuthSettings +from mcp_agent.logging.logger import get_logger +from mcp_agent.oauth.errors import ( + MissingUserIdentityError, + OAuthFlowError, + TokenRefreshError, +) +from mcp_agent.oauth.flow import AuthorizationFlowCoordinator +from mcp_agent.oauth.identity import OAuthUserIdentity +from mcp_agent.oauth.metadata import ( + fetch_authorization_server_metadata, + fetch_resource_metadata, + normalize_resource, + select_authorization_server, +) +from mcp_agent.oauth.records import TokenRecord +from mcp_agent.oauth.store import ( + InMemoryTokenStore, + TokenStore, + TokenStoreKey, + scope_fingerprint, +) + +if TYPE_CHECKING: + from mcp_agent.core.context import Context + +logger = get_logger(__name__) + + +class TokenManager: + """High-level orchestrator for acquiring and refreshing OAuth tokens.""" + + def __init__( + self, + *, + http_client: httpx.AsyncClient | None = None, + token_store: TokenStore | None = None, + settings: OAuthSettings | None = None, + ) -> None: + self._settings = settings or OAuthSettings() + self._token_store = token_store or InMemoryTokenStore() + self._http_client = http_client or httpx.AsyncClient(timeout=30.0) + self._own_http_client = http_client is None + self._flow = AuthorizationFlowCoordinator( + http_client=self._http_client, settings=self._settings + ) + self._locks: Dict[TokenStoreKey, asyncio.Lock] = defaultdict(asyncio.Lock) + self._resource_metadata_cache: Dict[str, tuple[float, object]] = {} + self._auth_metadata_cache: Dict[str, tuple[float, object]] = {} + + async def ensure_access_token( + self, + *, + context: "Context", + server_name: str, + server_config, + scopes: Iterable[str] | None = None, + ) -> TokenRecord: + oauth_config: MCPOAuthClientSettings | None = None + if server_config and server_config.auth: + oauth_config = getattr(server_config.auth, "oauth", None) + if not oauth_config or not oauth_config.enabled: + raise OAuthFlowError( + f"Server '{server_name}' is not configured for OAuth authentication" + ) + + user = context.current_user + if not user: + raise MissingUserIdentityError( + "No authenticated MCP user available for delegated OAuth flow" + ) + + resource_hint = oauth_config.resource + server_url = getattr(server_config, "url", None) + resource = normalize_resource(resource_hint, server_url) + + metadata_url = str(URL(resource).join("/.well-known/oauth-protected-resource")) + resource_metadata = await self._get_resource_metadata(metadata_url) + auth_server_url = select_authorization_server( + resource_metadata, oauth_config.authorization_server + ) + auth_metadata = await self._get_authorization_metadata(auth_server_url) + + scope_list = ( + list(scopes) if scopes is not None else list(oauth_config.scopes or []) + ) + key = TokenStoreKey( + user_key=user.cache_key, + resource=resource, + authorization_server=auth_server_url, + scope_fingerprint=scope_fingerprint(scope_list), + ) + + lock = self._locks[key] + async with lock: + record = await self._token_store.get(key) + leeway = ( + self._settings.token_store.refresh_leeway_seconds + if self._settings and self._settings.token_store + else 60 + ) + if record and not record.is_expired(leeway_seconds=leeway): + return record + + if record and record.refresh_token: + try: + refreshed = await self._refresh_token( + record, + oauth_config=oauth_config, + auth_metadata=auth_metadata, + resource=resource, + scopes=scope_list, + ) + except TokenRefreshError: + await self._token_store.delete(key) + else: + if refreshed: + await self._token_store.set(key, refreshed) + return refreshed + await self._token_store.delete(key) + + # Need to run full authorization flow + record = await self._flow.authorize( + context=context, + user=user, + server_name=server_name, + oauth_config=oauth_config, + resource=resource, + authorization_server_url=auth_server_url, + resource_metadata=resource_metadata, + auth_metadata=auth_metadata, + scopes=scope_list, + ) + await self._token_store.set(key, record) + return record + + async def invalidate( + self, + *, + user: OAuthUserIdentity, + resource: str, + authorization_server: str | None, + scopes: Iterable[str], + ) -> None: + key = TokenStoreKey( + user_key=user.cache_key, + resource=resource, + authorization_server=authorization_server, + scope_fingerprint=scope_fingerprint(scopes), + ) + await self._token_store.delete(key) + + async def _refresh_token( + self, + record: TokenRecord, + *, + oauth_config: MCPOAuthClientSettings, + auth_metadata, + resource: str, + scopes: Sequence[str], + ) -> TokenRecord | None: + if not record.refresh_token: + return None + + token_endpoint = str(auth_metadata.token_endpoint) + data = { + "grant_type": "refresh_token", + "refresh_token": record.refresh_token, + "client_id": oauth_config.client_id, + "resource": resource, + } + if scopes: + data["scope"] = " ".join(scopes) + if oauth_config.client_secret: + data["client_secret"] = oauth_config.client_secret + if oauth_config.extra_token_params: + data.update(oauth_config.extra_token_params) + + try: + response = await self._http_client.post(token_endpoint, data=data) + except httpx.HTTPError as exc: + logger.warning("Refresh token request failed", exc_info=True) + raise TokenRefreshError(str(exc)) from exc + + if response.status_code != 200: + logger.warning( + "Refresh token request returned non-success status", + data={"status_code": response.status_code}, + ) + return None + + payload = response.json() + new_access = payload.get("access_token") + if not new_access: + return None + new_refresh = payload.get("refresh_token", record.refresh_token) + expires_in = payload.get("expires_in") + new_expires = record.expires_at + if isinstance(expires_in, (int, float)): + new_expires = time.time() + float(expires_in) + + scope_from_payload = payload.get("scope") + if isinstance(scope_from_payload, str) and scope_from_payload.strip(): + scopes_tuple = tuple(scope_from_payload.split()) + else: + scopes_tuple = record.scopes + + return TokenRecord( + access_token=new_access, + refresh_token=new_refresh, + expires_at=new_expires, + scopes=scopes_tuple, + token_type=str(payload.get("token_type", record.token_type)), + resource=record.resource, + authorization_server=record.authorization_server, + metadata={"raw": payload}, + ) + + async def _get_resource_metadata(self, url: str): + cached = self._resource_metadata_cache.get(url) + if cached and time.time() - cached[0] < 300: + return cached[1] + metadata = await fetch_resource_metadata(self._http_client, url) + self._resource_metadata_cache[url] = (time.time(), metadata) + return metadata + + async def _get_authorization_metadata(self, url: str): + cached = self._auth_metadata_cache.get(url) + if cached and time.time() - cached[0] < 300: + return cached[1] + metadata = await fetch_authorization_server_metadata(self._http_client, url) + self._auth_metadata_cache[url] = (time.time(), metadata) + return metadata + + async def aclose(self) -> None: + if self._own_http_client: + await self._http_client.aclose() diff --git a/src/mcp_agent/oauth/metadata.py b/src/mcp_agent/oauth/metadata.py new file mode 100644 index 000000000..24ac6b5c8 --- /dev/null +++ b/src/mcp_agent/oauth/metadata.py @@ -0,0 +1,60 @@ +"""Helpers for OAuth metadata discovery.""" + +from __future__ import annotations + +from typing import List + +import httpx +from mcp.shared.auth import OAuthMetadata, ProtectedResourceMetadata + +from mcp_agent.logging.logger import get_logger + +logger = get_logger(__name__) + + +async def fetch_resource_metadata( + client: httpx.AsyncClient, + resource_metadata_url: str, +) -> ProtectedResourceMetadata: + response = await client.get(resource_metadata_url) + response.raise_for_status() + data = response.json() + return ProtectedResourceMetadata.model_validate(data) + + +async def fetch_authorization_server_metadata( + client: httpx.AsyncClient, + metadata_url: str, +) -> OAuthMetadata: + response = await client.get(metadata_url) + response.raise_for_status() + return OAuthMetadata.model_validate(response.json()) + + +def select_authorization_server( + metadata: ProtectedResourceMetadata, + preferred: str | None = None, +) -> str: + candidates: List[str] = list(metadata.authorization_servers or []) + if not candidates: + raise ValueError( + "Protected resource metadata did not include authorization servers" + ) + + if preferred and preferred in candidates: + return preferred + + if preferred: + logger.warning( + "Preferred authorization server not listed; falling back to first entry", + data={"preferred": preferred, "candidates": candidates}, + ) + return candidates[0] + + +def normalize_resource(resource: str | None, fallback: str | None) -> str: + if resource: + return resource.rstrip("/") + if fallback: + return fallback.rstrip("/") + raise ValueError("Unable to determine resource identifier for OAuth flow") diff --git a/src/mcp_agent/oauth/pkce.py b/src/mcp_agent/oauth/pkce.py new file mode 100644 index 000000000..1709dc332 --- /dev/null +++ b/src/mcp_agent/oauth/pkce.py @@ -0,0 +1,27 @@ +"""PKCE utilities.""" + +from __future__ import annotations + +import base64 +import hashlib +import secrets + + +def generate_code_verifier(length: int = 64) -> str: + if length < 43 or length > 128: + raise ValueError("PKCE code verifier length must be between 43 and 128") + # token_urlsafe returns ~1.3 chars per byte; adjust to reach desired length + needed_bytes = int(length * 0.8) + 1 + verifier = secrets.token_urlsafe(needed_bytes) + if len(verifier) < length: + verifier = (verifier + secrets.token_urlsafe(needed_bytes))[:length] + return verifier[:length] + + +def generate_code_challenge(verifier: str) -> str: + digest = hashlib.sha256(verifier.encode()).digest() + return base64.urlsafe_b64encode(digest).rstrip(b"=").decode() + + +def generate_state(length: int = 32) -> str: + return secrets.token_urlsafe(length) diff --git a/src/mcp_agent/oauth/records.py b/src/mcp_agent/oauth/records.py new file mode 100644 index 000000000..2a7c47be0 --- /dev/null +++ b/src/mcp_agent/oauth/records.py @@ -0,0 +1,46 @@ +"""Shared record types for OAuth token management.""" + +from __future__ import annotations + +from datetime import datetime, timezone +from typing import Any, Dict, Tuple + +from pydantic import BaseModel, Field + + +class TokenRecord(BaseModel): + """Persisted token bundle for a user/resource/authorization server combination.""" + + access_token: str + refresh_token: str | None = None + scopes: Tuple[str, ...] = () + expires_at: float | None = None + token_type: str = "Bearer" + resource: str | None = None + authorization_server: str | None = None + obtained_at: float = Field( + default_factory=lambda: datetime.now(tz=timezone.utc).timestamp() + ) + metadata: Dict[str, Any] = Field(default_factory=dict) + + def is_expired(self, *, leeway_seconds: int = 0) -> bool: + if self.expires_at is None: + return False + now = datetime.now(tz=timezone.utc).timestamp() + return now >= (self.expires_at - leeway_seconds) + + def with_tokens( + self, + *, + access_token: str, + refresh_token: str | None, + expires_at: float | None, + ) -> "TokenRecord": + return self.model_copy( + update={ + "access_token": access_token, + "refresh_token": refresh_token, + "expires_at": expires_at, + "obtained_at": datetime.now(tz=timezone.utc).timestamp(), + } + ) diff --git a/src/mcp_agent/oauth/store/__init__.py b/src/mcp_agent/oauth/store/__init__.py new file mode 100644 index 000000000..226953f43 --- /dev/null +++ b/src/mcp_agent/oauth/store/__init__.py @@ -0,0 +1,11 @@ +"""Token store implementations.""" + +from .base import TokenStore, TokenStoreKey, scope_fingerprint +from .in_memory import InMemoryTokenStore + +__all__ = [ + "TokenStore", + "TokenStoreKey", + "scope_fingerprint", + "InMemoryTokenStore", +] diff --git a/src/mcp_agent/oauth/store/base.py b/src/mcp_agent/oauth/store/base.py new file mode 100644 index 000000000..a03f7da83 --- /dev/null +++ b/src/mcp_agent/oauth/store/base.py @@ -0,0 +1,33 @@ +"""Abstract token store definition.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Iterable, Protocol + +from ..records import TokenRecord + + +@dataclass(frozen=True) +class TokenStoreKey: + """Uniquely identifies a cached token.""" + + user_key: str + resource: str + authorization_server: str | None + scope_fingerprint: str + + +def scope_fingerprint(scopes: Iterable[str]) -> str: + """Return a deterministic fingerprint for a scope list.""" + return " ".join(sorted({scope.strip() for scope in scopes if scope})) + + +class TokenStore(Protocol): + """Persistence interface for OAuth tokens.""" + + async def get(self, key: TokenStoreKey) -> TokenRecord | None: ... + + async def set(self, key: TokenStoreKey, record: TokenRecord) -> None: ... + + async def delete(self, key: TokenStoreKey) -> None: ... diff --git a/src/mcp_agent/oauth/store/in_memory.py b/src/mcp_agent/oauth/store/in_memory.py new file mode 100644 index 000000000..d1aa40460 --- /dev/null +++ b/src/mcp_agent/oauth/store/in_memory.py @@ -0,0 +1,30 @@ +"""In-memory token store for local development and testing.""" + +from __future__ import annotations + +import asyncio +from typing import Dict + +from .base import TokenStore, TokenStoreKey +from ..records import TokenRecord + + +class InMemoryTokenStore(TokenStore): + def __init__(self) -> None: + self._records: Dict[TokenStoreKey, TokenRecord] = {} + self._lock = asyncio.Lock() + + async def get(self, key: TokenStoreKey) -> TokenRecord | None: + async with self._lock: + record = self._records.get(key) + if record is None: + return None + return record + + async def set(self, key: TokenStoreKey, record: TokenRecord) -> None: + async with self._lock: + self._records[key] = record + + async def delete(self, key: TokenStoreKey) -> None: + async with self._lock: + self._records.pop(key, None) diff --git a/src/mcp_agent/server/app_server.py b/src/mcp_agent/server/app_server.py index d7d83e287..dfdbccd4c 100644 --- a/src/mcp_agent/server/app_server.py +++ b/src/mcp_agent/server/app_server.py @@ -12,8 +12,13 @@ import asyncio from mcp.server.fastmcp import Context as MCPContext, FastMCP +from mcp.server.fastmcp.server import AuthSettings +from mcp.server.auth.middleware.auth_context import ( + AuthenticatedUser, + auth_context_var, +) from starlette.requests import Request -from starlette.responses import JSONResponse +from starlette.responses import HTMLResponse, JSONResponse from mcp.server.fastmcp.exceptions import ToolError from mcp.server.fastmcp.tools import Tool as FastTool @@ -30,6 +35,9 @@ from mcp_agent.logging.logger import get_logger from mcp_agent.logging.logger import LoggingConfig from mcp_agent.mcp.mcp_server_registry import ServerRegistry +from mcp_agent.oauth.identity import OAuthUserIdentity +from mcp_agent.oauth.callbacks import callback_registry +from mcp_agent.server.token_verifier import MCPAgentTokenVerifier if TYPE_CHECKING: from mcp_agent.core.context import Context @@ -77,8 +85,8 @@ async def _get_session(execution_id: str) -> Any | None: try: logger.debug( ( - f"Lookup session for execution_id={execution_id}: " - + (f"found session_id={id(session)}" if session else "not found") + f"Lookup session for execution_id={execution_id}: " + + (f"found session_id={id(session)}" if session else "not found") ) ) except Exception: @@ -178,6 +186,32 @@ def _set_upstream_from_request_ctx_if_available(ctx: MCPContext) -> None: # ctx.session property might raise ValueError if context not available pass + # Capture authenticated user information if available + identity: OAuthUserIdentity | None = None + try: + auth_user = auth_context_var.get() + except LookupError: + auth_user = None + + if isinstance(auth_user, AuthenticatedUser): + access_token = getattr(auth_user, "access_token", None) + if access_token is not None: + # Prefer enriched token instances but fall back to raw data if necessary + try: + from mcp_agent.oauth.access_token import MCPAccessToken + + if isinstance(access_token, MCPAccessToken): + identity = OAuthUserIdentity.from_access_token(access_token) + else: + token_dict = getattr(access_token, "model_dump", None) + if callable(token_dict): + maybe_token = MCPAccessToken.model_validate( + access_token.model_dump() + ) + identity = OAuthUserIdentity.from_access_token(maybe_token) + except Exception: + identity = None + if session is not None: app: MCPApp | None = _get_attached_app(ctx.fastmcp) if app is not None and getattr(app, "context", None) is not None: @@ -185,13 +219,19 @@ def _set_upstream_from_request_ctx_if_available(ctx: MCPContext) -> None: # Previously captured; no need to keep old value # Use direct assignment for Pydantic model app.context.upstream_session = session + app.context.current_user = identity return else: return + else: + # Update identity even if we failed to resolve a session + app: MCPApp | None = _get_attached_app(ctx.fastmcp) + if app is not None and getattr(app, "context", None) is not None: + app.context.current_user = identity def _resolve_workflows_and_context( - ctx: MCPContext, + ctx: MCPContext, ) -> Tuple[Dict[str, Type["Workflow"]] | None, Optional["Context"]]: """Resolve the workflows mapping and underlying app context regardless of startup mode. @@ -201,9 +241,9 @@ def _resolve_workflows_and_context( # Try lifespan-provided ServerContext first lifespan_ctx = getattr(ctx.request_context, "lifespan_context", None) if ( - lifespan_ctx is not None - and hasattr(lifespan_ctx, "workflows") - and hasattr(lifespan_ctx, "context") + lifespan_ctx is not None + and hasattr(lifespan_ctx, "workflows") + and hasattr(lifespan_ctx, "context") ): # Ensure upstream session once at resolution time try: @@ -322,6 +362,34 @@ def create_mcp_server_for_app(app: MCPApp, **kwargs: Any) -> FastMCP: A configured FastMCP server instance """ + auth_settings_config = None + try: + if app.context and app.context.config: + auth_settings_config = app.context.config.authorization + except Exception: + auth_settings_config = None + + effective_auth_settings: AuthSettings | None = None + token_verifier: MCPAgentTokenVerifier | None = None + owns_token_verifier = False + if auth_settings_config and auth_settings_config.enabled: + try: + effective_auth_settings = AuthSettings( + issuer_url=auth_settings_config.issuer_url, # type: ignore[arg-type] + resource_server_url=auth_settings_config.resource_server_url, # type: ignore[arg-type] + service_documentation_url=auth_settings_config.service_documentation_url, # type: ignore[arg-type] + required_scopes=auth_settings_config.required_scopes or None, + ) + token_verifier = MCPAgentTokenVerifier(auth_settings_config) + except Exception as exc: + logger.error( + "Failed to configure authorization server integration", + exc_info=True, + data={"error": str(exc)}, + ) + effective_auth_settings = None + token_verifier = None + # Create a lifespan function specific to this app @asynccontextmanager async def app_specific_lifespan(mcp: FastMCP) -> AsyncIterator[ServerContext]: @@ -341,7 +409,11 @@ async def app_specific_lifespan(mcp: FastMCP) -> AsyncIterator[ServerContext]: yield server_context finally: # Don't clean up the MCPApp here - let the caller handle that - pass + if owns_token_verifier and token_verifier is not None: + try: + await token_verifier.aclose() + except Exception: + pass # Helper: install internal HTTP routes (not MCP tools) def _install_internal_routes(mcp_server: FastMCP) -> None: @@ -358,6 +430,41 @@ def _get_fallback_upstream_session() -> Any | None: return None return None + @mcp_server.custom_route( + "/internal/oauth/callback/{flow_id}", + methods=["GET", "POST"], + include_in_schema=False, + ) + async def _oauth_callback(request: Request): + flow_id = request.path_params.get("flow_id") + if not flow_id: + return JSONResponse({"error": "missing_flow_id"}, status_code=400) + + payload: Dict[str, Any] = {} + try: + payload.update({k: v for k, v in request.query_params.multi_items()}) + except Exception: + payload.update(dict(request.query_params)) + + if request.method.upper() == "POST": + content_type = request.headers.get("content-type", "") + try: + if "application/json" in content_type: + body_data = await request.json() + else: + form = await request.form() + body_data = {k: v for k, v in form.multi_items()} + except Exception: + body_data = {} + payload.update(body_data) + + delivered = await callback_registry.deliver(flow_id, payload) + if not delivered: + return JSONResponse({"error": "unknown_flow"}, status_code=404) + + html = """

Authorization complete.

You may close this window and return to MCP Agent.

""" + return HTMLResponse(html) + @mcp_server.custom_route( "/internal/session/by-run/{execution_id}/notify", methods=["POST"], @@ -525,9 +632,7 @@ def _check_gateway_auth(request: Request) -> JSONResponse | None: bearer = request.headers.get("Authorization", "") bearer_token = ( - bearer.split(" ", 1)[1] - if bearer.lower().startswith("bearer ") - else "" + bearer.split(" ", 1)[1] if bearer.lower().startswith("bearer ") else "" ) header_tok = request.headers.get("X-MCP-Gateway-Token", "") @@ -542,57 +647,100 @@ def _check_gateway_auth(request: Request) -> JSONResponse | None: return None # Auth passed # Helper functions for request handling - async def _handle_request_via_rpc(session, method: str, params: dict, execution_id: str, - log_prefix: str = "request"): + async def _handle_request_via_rpc( + session, + method: str, + params: dict, + execution_id: str, + log_prefix: str = "request", + ): """Handle request via generic RPC if available.""" rpc = getattr(session, "rpc", None) if rpc and hasattr(rpc, "request"): result = await rpc.request(method, params) - logger.debug(f"[{log_prefix}] delivered via session_id={id(session)} (generic '{method}')") + logger.debug( + f"[{log_prefix}] delivered via session_id={id(session)} (generic '{method}')" + ) return result return None - async def _handle_specific_request(session, method: str, params: dict, log_prefix: str = "request"): + async def _handle_specific_request( + session, method: str, params: dict, log_prefix: str = "request" + ): """Handle specific request types with structured request/response.""" from mcp.types import ( - CreateMessageRequest, CreateMessageRequestParams, CreateMessageResult, - ElicitRequest, ElicitRequestParams, ElicitResult, - ListRootsRequest, ListRootsResult, - PingRequest, EmptyResult, ServerRequest + CreateMessageRequest, + CreateMessageRequestParams, + CreateMessageResult, + ElicitRequest, + ElicitRequestParams, + ElicitResult, + ListRootsRequest, + ListRootsResult, + PingRequest, + EmptyResult, + ServerRequest, ) if method == "sampling/createMessage": req = ServerRequest( - CreateMessageRequest(method="sampling/createMessage", params=CreateMessageRequestParams(**params))) - result = await session.send_request(request=req, - result_type=CreateMessageResult) # type: ignore[attr-defined] + CreateMessageRequest( + method="sampling/createMessage", + params=CreateMessageRequestParams(**params), + ) + ) + result = await session.send_request( + request=req, result_type=CreateMessageResult + ) # type: ignore[attr-defined] return result.model_dump(by_alias=True, mode="json", exclude_none=True) elif method == "elicitation/create": - req = ServerRequest(ElicitRequest(method="elicitation/create", params=ElicitRequestParams(**params))) - result = await session.send_request(request=req, result_type=ElicitResult) # type: ignore[attr-defined] + req = ServerRequest( + ElicitRequest( + method="elicitation/create", + params=ElicitRequestParams(**params), + ) + ) + result = await session.send_request( + request=req, result_type=ElicitResult + ) # type: ignore[attr-defined] return result.model_dump(by_alias=True, mode="json", exclude_none=True) elif method == "roots/list": req = ServerRequest(ListRootsRequest(method="roots/list")) - result = await session.send_request(request=req, - result_type=ListRootsResult) # type: ignore[attr-defined] + result = await session.send_request( + request=req, result_type=ListRootsResult + ) # type: ignore[attr-defined] return result.model_dump(by_alias=True, mode="json", exclude_none=True) elif method == "ping": req = ServerRequest(PingRequest(method="ping")) - result = await session.send_request(request=req, result_type=EmptyResult) # type: ignore[attr-defined] + result = await session.send_request( + request=req, result_type=EmptyResult + ) # type: ignore[attr-defined] return result.model_dump(by_alias=True, mode="json", exclude_none=True) else: raise ValueError(f"unsupported method: {method}") - async def _try_session_request(session, method: str, params: dict, execution_id: str, - log_prefix: str = "request", register_session: bool = False): + async def _try_session_request( + session, + method: str, + params: dict, + execution_id: str, + log_prefix: str = "request", + register_session: bool = False, + ): """Try to handle a request via session, with optional registration.""" try: # First try generic RPC passthrough - result = await _handle_request_via_rpc(session, method, params, execution_id, log_prefix) + result = await _handle_request_via_rpc( + session, method, params, execution_id, log_prefix + ) if result is not None: if register_session: try: - await _register_session(run_id=execution_id, execution_id=execution_id, session=session) + await _register_session( + run_id=execution_id, + execution_id=execution_id, + session=session, + ) # logger.debug( # f"[{log_prefix}] rebound mapping to session_id={id(session)} for execution_id={execution_id}") except Exception: @@ -600,10 +748,16 @@ async def _try_session_request(session, method: str, params: dict, execution_id: return result # Fallback to specific structured request handling - result = await _handle_specific_request(session, method, params, log_prefix) + result = await _handle_specific_request( + session, method, params, log_prefix + ) if register_session: try: - await _register_session(run_id=execution_id, execution_id=execution_id, session=session) + await _register_session( + run_id=execution_id, + execution_id=execution_id, + session=session, + ) # logger.debug( # f"[{log_prefix}] rebound mapping to session_id={id(session)} for execution_id={execution_id}") except Exception: @@ -613,7 +767,8 @@ async def _try_session_request(session, method: str, params: dict, execution_id: if "unsupported method" in str(e): raise # Re-raise unsupported method errors logger.warning( - f"[{log_prefix}] session delivery failed for execution_id={execution_id} method={method}: {e}") + f"[{log_prefix}] session delivery failed for execution_id={execution_id} method={method}: {e}" + ) raise @mcp_server.custom_route( @@ -637,33 +792,48 @@ async def _relay_request(request: Request): if latest_session is not None: try: result = await _try_session_request( - latest_session, method, params, execution_id, - log_prefix="request", register_session=True + latest_session, + method, + params, + execution_id, + log_prefix="request", + register_session=True, ) return JSONResponse(result) except Exception as e_latest: # Only log and continue to fallback if it's not an unsupported method error if "unsupported method" not in str(e_latest): logger.warning( - f"[request] latest session delivery failed for execution_id={execution_id} method={method}: {e_latest}") + f"[request] latest session delivery failed for execution_id={execution_id} method={method}: {e_latest}" + ) # Fallback to mapped session session = await _get_session(execution_id) if not session: - logger.warning(f"[request] session_not_available for execution_id={execution_id}") + logger.warning( + f"[request] session_not_available for execution_id={execution_id}" + ) return JSONResponse({"error": "session_not_available"}, status_code=503) try: result = await _try_session_request( - session, method, params, execution_id, - log_prefix="request", register_session=False + session, + method, + params, + execution_id, + log_prefix="request", + register_session=False, ) return JSONResponse(result) except Exception as e: if "unsupported method" in str(e): - return JSONResponse({"error": f"unsupported method: {method}"}, status_code=400) + return JSONResponse( + {"error": f"unsupported method: {method}"}, status_code=400 + ) try: - logger.error(f"[request] error forwarding for execution_id={execution_id} method={method}: {e}") + logger.error( + f"[request] error forwarding for execution_id={execution_id} method={method}: {e}" + ) except Exception: pass return JSONResponse({"error": str(e)}, status_code=500) @@ -687,14 +857,18 @@ async def _async_relay_request(request: Request): return auth_error try: - logger.info(f"[async-request] incoming execution_id={execution_id} method={method}") + logger.info( + f"[async-request] incoming execution_id={execution_id} method={method}" + ) except Exception: pass if method != "sampling/createMessage" and method != "elicitation/create": logger.error(f"async not supported for method {method}") - return JSONResponse({"error": f"async not supported for method {method}"}, - status_code=405) + return JSONResponse( + {"error": f"async not supported for method {method}"}, + status_code=405, + ) if not signal_name: return JSONResponse({"error": "missing_signal_name"}, status_code=400) @@ -709,11 +883,17 @@ async def _handle_async_request_task(): if latest_session is not None: try: result = await _try_session_request( - latest_session, method, params, execution_id, - log_prefix="async-request", register_session=True + latest_session, + method, + params, + execution_id, + log_prefix="async-request", + register_session=True, ) except Exception as e_latest: - logger.warning(f"[async-request] latest session delivery failed for execution_id={execution_id} method={method}: {e_latest}") + logger.warning( + f"[async-request] latest session delivery failed for execution_id={execution_id} method={method}: {e_latest}" + ) # Fallback to mapped session if latest session failed if result is None: @@ -721,37 +901,48 @@ async def _handle_async_request_task(): if session: try: result = await _try_session_request( - session, method, params, execution_id, - log_prefix="async-request", register_session=False + session, + method, + params, + execution_id, + log_prefix="async-request", + register_session=False, ) except Exception as e: - logger.error(f"[async-request] error forwarding for execution_id={execution_id} method={method}: {e}") + logger.error( + f"[async-request] error forwarding for execution_id={execution_id} method={method}: {e}" + ) result = {"error": str(e)} else: - logger.warning(f"[async-request] session_not_available for execution_id={execution_id}") + logger.warning( + f"[async-request] session_not_available for execution_id={execution_id}" + ) result = {"error": "session_not_available"} # Signal the workflow with the result using method-specific signal try: # Try to get Temporal client from the app context app = _get_attached_app(mcp_server) - if app and app.context and hasattr(app.context, 'executor'): + if app and app.context and hasattr(app.context, "executor"): executor = app.context.executor - if hasattr(executor, 'client'): + if hasattr(executor, "client"): client = executor.client # Find the workflow using execution_id as both workflow_id and run_id try: workflow_handle = client.get_workflow_handle( - workflow_id=workflow_id, - run_id=execution_id + workflow_id=workflow_id, run_id=execution_id ) await workflow_handle.signal(signal_name, result) - logger.info(f"[async-request] signaled workflow {execution_id} " - f"with {method} result using signal") + logger.info( + f"[async-request] signaled workflow {execution_id} " + f"with {method} result using signal" + ) except Exception as signal_error: - logger.warning(f"[async-request] failed to signal workflow {execution_id}:" - f" {signal_error}") + logger.warning( + f"[async-request] failed to signal workflow {execution_id}:" + f" {signal_error}" + ) except Exception as e: logger.error(f"[async-request] failed to signal workflow: {e}") @@ -763,7 +954,12 @@ async def _handle_async_request_task(): # Return immediately with 200 status to indicate request was received return JSONResponse( - {"status": "received", "execution_id": execution_id, "method": method, "signal_name": signal_name} + { + "status": "received", + "execution_id": execution_id, + "method": method, + "signal_name": signal_name, + } ) @mcp_server.custom_route( @@ -950,6 +1146,11 @@ async def _internal_human_prompts(request: Request): except Exception: pass else: + if "auth" not in kwargs and effective_auth_settings is not None: + kwargs["auth"] = effective_auth_settings + if "token_verifier" not in kwargs and token_verifier is not None: + kwargs["token_verifier"] = token_verifier + owns_token_verifier = True mcp = FastMCP( name=app.name or "mcp_agent_server", # TODO: saqadri (MAC) - create a much more detailed description @@ -976,7 +1177,7 @@ async def _internal_human_prompts(request: Request): @lowlevel_server.set_logging_level() async def _set_level( - level: str, + level: str, ) -> None: # mcp.types.LoggingLevel is a Literal[str] try: LoggingConfig.set_min_level(level) @@ -1091,10 +1292,10 @@ async def list_workflow_runs( @mcp.tool(name="workflows-run") async def run_workflow( - ctx: MCPContext, - workflow_name: str, - run_parameters: Dict[str, Any] | None = None, - **kwargs: Any, + ctx: MCPContext, + workflow_name: str, + run_parameters: Dict[str, Any] | None = None, + **kwargs: Any, ) -> Dict[str, str]: """ Run a workflow with the given name. @@ -1118,9 +1319,9 @@ async def run_workflow( @mcp.tool(name="workflows-get_status") async def get_workflow_status( - ctx: MCPContext, - run_id: str | None = None, - workflow_id: str | None = None, + ctx: MCPContext, + run_id: str | None = None, + workflow_id: str | None = None, ) -> Dict[str, Any]: """ Get the status of a running workflow. @@ -1158,11 +1359,11 @@ async def get_workflow_status( @mcp.tool(name="workflows-resume") async def resume_workflow( - ctx: MCPContext, - run_id: str | None = None, - workflow_id: str | None = None, - signal_name: str | None = "resume", - payload: Dict[str, Any] | None = None, + ctx: MCPContext, + run_id: str | None = None, + workflow_id: str | None = None, + signal_name: str | None = "resume", + payload: Dict[str, Any] | None = None, ) -> bool: """ Resume a paused workflow. @@ -1232,7 +1433,7 @@ async def resume_workflow( @mcp.tool(name="workflows-cancel") async def cancel_workflow( - ctx: MCPContext, run_id: str | None = None, workflow_id: str | None = None + ctx: MCPContext, run_id: str | None = None, workflow_id: str | None = None ) -> bool: """ Cancel a running workflow. @@ -1362,14 +1563,14 @@ def create_declared_function_tools(mcp: FastMCP, server_context: ServerContext): import time async def _wait_for_completion( - ctx: MCPContext, - run_id: str, - *, - workflow_id: str | None = None, - timeout: float | None = None, - registration_grace: float = 1.0, - poll_initial: float = 0.05, - poll_max: float = 1.0, + ctx: MCPContext, + run_id: str, + *, + workflow_id: str | None = None, + timeout: float | None = None, + registration_grace: float = 1.0, + poll_initial: float = 0.05, + poll_max: float = 1.0, ): registry = _resolve_workflow_registry(ctx) if not registry: @@ -1462,8 +1663,8 @@ async def _wrapper(**kwargs): return getattr(result, "value", None) # If status payload returned a dict that looks like WorkflowResult, unwrap safely via 'kind' if ( - isinstance(result, dict) - and result.get("kind") == "workflow_result" + isinstance(result, dict) + and result.get("kind") == "workflow_result" ): return result.get("value") return result @@ -1569,9 +1770,9 @@ async def _async_wrapper(**kwargs): if p.name in ("ctx", "context"): continue if ( - _Ctx is not None - and p.annotation is not inspect._empty - and p.annotation is _Ctx + _Ctx is not None + and p.annotation is not inspect._empty + and p.annotation is _Ctx ): continue params.append(p) @@ -1624,7 +1825,7 @@ async def _adapter(**kw): def create_workflow_specific_tools( - mcp: FastMCP, workflow_name: str, workflow_cls: Type["Workflow"] + mcp: FastMCP, workflow_name: str, workflow_cls: Type["Workflow"] ): """Create specific tools for a given workflow.""" param_source = _get_param_source_function_from_workflow(workflow_cls) @@ -1673,8 +1874,8 @@ def _schema_fn_proxy(*args, **kwargs): """, ) async def run( - ctx: MCPContext, - run_parameters: Dict[str, Any] | None = None, + ctx: MCPContext, + run_parameters: Dict[str, Any] | None = None, ) -> Dict[str, str]: _set_upstream_from_request_ctx_if_available(ctx) return await _workflow_run(ctx, workflow_name, run_parameters) @@ -1684,7 +1885,7 @@ async def run( def _get_server_descriptions( - server_registry: ServerRegistry | None, server_names: List[str] + server_registry: ServerRegistry | None, server_names: List[str] ) -> List: servers: List[dict[str, str]] = [] if server_registry: @@ -1706,7 +1907,7 @@ def _get_server_descriptions( def _get_server_descriptions_as_string( - server_registry: ServerRegistry | None, server_names: List[str] + server_registry: ServerRegistry | None, server_names: List[str] ) -> str: servers = _get_server_descriptions(server_registry, server_names) @@ -1726,10 +1927,10 @@ def _get_server_descriptions_as_string( async def _workflow_run( - ctx: MCPContext, - workflow_name: str, - run_parameters: Dict[str, Any] | None = None, - **kwargs: Any, + ctx: MCPContext, + workflow_name: str, + run_parameters: Dict[str, Any] | None = None, + **kwargs: Any, ) -> Dict[str, str]: # Use Temporal run_id as the routing key for gateway callbacks. # We don't have it until after the workflow is started; we'll register mapping post-start. @@ -1899,7 +2100,7 @@ def _normalize_gateway_url(url: str | None) -> str | None: async def _workflow_status( - ctx: MCPContext, run_id: str | None = None, workflow_id: str | None = None + ctx: MCPContext, run_id: str | None = None, workflow_id: str | None = None ) -> Dict[str, Any]: # Ensure upstream session so status-related logs are forwarded try: @@ -1939,4 +2140,5 @@ async def _workflow_status( return status + # endregion diff --git a/src/mcp_agent/server/token_verifier.py b/src/mcp_agent/server/token_verifier.py new file mode 100644 index 000000000..324f389b6 --- /dev/null +++ b/src/mcp_agent/server/token_verifier.py @@ -0,0 +1,138 @@ +"""Token verification for MCP Agent Cloud authorization server.""" + +from __future__ import annotations + +import asyncio +from datetime import datetime, timezone +from typing import Any, Dict + +import httpx + +from mcp.server.auth.provider import AccessToken +from mcp.server.auth.provider import TokenVerifier + +from mcp_agent.config import MCPAuthorizationServerSettings +from mcp_agent.logging.logger import get_logger +from mcp_agent.oauth.access_token import MCPAccessToken + +logger = get_logger(__name__) + + +class MCPAgentTokenVerifier(TokenVerifier): + """Verify bearer tokens issued by the MCP Agent Cloud authorization server.""" + + def __init__(self, settings: MCPAuthorizationServerSettings): + if not settings.introspection_endpoint: + raise ValueError( + "introspection_endpoint must be configured to verify tokens" + ) + self._settings = settings + timeout = httpx.Timeout(10.0) + self._client = httpx.AsyncClient(timeout=timeout) + self._cache: Dict[str, MCPAccessToken] = {} + self._lock = asyncio.Lock() + + async def verify_token(self, token: str) -> AccessToken | None: # type: ignore[override] + cached = self._cache.get(token) + if cached and not cached.is_expired(leeway_seconds=30): + return cached + + async with self._lock: + # Double-check cache after acquiring lock to avoid duplicate refresh + cached = self._cache.get(token) + if cached and not cached.is_expired(leeway_seconds=30): + return cached + + verified = await self._introspect(token) + if verified: + self._cache[token] = verified + else: + self._cache.pop(token, None) + return verified + + async def _introspect(self, token: str) -> MCPAccessToken | None: + data = {"token": token} + auth = None + if ( + self._settings.introspection_client_id + and self._settings.introspection_client_secret + ): + auth = httpx.BasicAuth( + self._settings.introspection_client_id, + self._settings.introspection_client_secret, + ) + + try: + response = await self._client.post( + str(self._settings.introspection_endpoint), + data=data, + auth=auth, + ) + except httpx.HTTPError as exc: + logger.warning(f"Token introspection request failed: {exc}") + return None + + if response.status_code != 200: + logger.warning( + "Token introspection returned non-success status", + data={"status_code": response.status_code}, + ) + return None + + try: + payload: Dict[str, Any] = response.json() + except ValueError: + logger.warning("Token introspection response was not valid JSON") + return None + + if not payload.get("active"): + return None + + if self._settings.issuer_url and payload.get("iss"): + if str(payload.get("iss")) != str(self._settings.issuer_url): + logger.warning( + "Token issuer mismatch", + data={ + "expected": str(self._settings.issuer_url), + "actual": payload.get("iss"), + }, + ) + return None + + token_model = MCPAccessToken.from_introspection( + token, + payload, + resource_hint=str(self._settings.resource_server_url) + if self._settings.resource_server_url + else None, + ) + + # Respect cache TTL limit if configured + ttl_seconds = max(0, self._settings.token_cache_ttl_seconds or 0) + if ttl_seconds and token_model.expires_at is not None: + now_ts = datetime.now(tz=timezone.utc).timestamp() + cache_limit = now_ts + ttl_seconds + token_model.expires_at = min(token_model.expires_at, cache_limit) + + # Optionally enforce required scopes + required_scopes = self._settings.required_scopes or [] + missing = [ + scope for scope in required_scopes if scope not in token_model.scopes + ] + if missing: + logger.warning( + "Token missing required scopes", + data={"missing_scopes": missing}, + ) + return None + + return token_model + + async def aclose(self) -> None: + await self._client.aclose() + + async def __aenter__(self) -> "MCPAgentTokenVerifier": + return self + + async def __aexit__(self, exc_type, exc, tb) -> None: + await self.aclose() diff --git a/tests/test_oauth_utils.py b/tests/test_oauth_utils.py new file mode 100644 index 000000000..87488c41a --- /dev/null +++ b/tests/test_oauth_utils.py @@ -0,0 +1,85 @@ +import time +import pathlib +import sys + +import pytest + +PROJECT_ROOT = pathlib.Path(__file__).resolve().parents[1] +SRC_ROOT = PROJECT_ROOT / "src" +if str(SRC_ROOT) not in sys.path: + sys.path.insert(0, str(SRC_ROOT)) + +try: + from mcp_agent.oauth.metadata import normalize_resource, select_authorization_server + from mcp_agent.oauth.records import TokenRecord + from mcp_agent.oauth.store import ( + InMemoryTokenStore, + TokenStoreKey, + scope_fingerprint, + ) + from mcp.shared.auth import ProtectedResourceMetadata +except ModuleNotFoundError: # pragma: no cover - optional dependency + pytest.skip("MCP SDK not installed", allow_module_level=True) + + +def test_scope_fingerprint_ordering(): + scopes = ["email", "profile", "email"] + fingerprint = scope_fingerprint(scopes) + assert fingerprint == "email profile" + + +def test_token_record_expiry(): + record = TokenRecord( + access_token="tok", + expires_at=time.time() + 5, + ) + assert not record.is_expired(leeway_seconds=0) + assert record.is_expired(leeway_seconds=10) + + +@pytest.mark.asyncio +async def test_in_memory_token_store_round_trip(): + store = InMemoryTokenStore() + key = TokenStoreKey( + user_key="provider:subject", + resource="https://example.com", + authorization_server="https://auth.example.com", + scope_fingerprint="scope", + ) + record = TokenRecord(access_token="abc123") + + await store.set(key, record) + fetched = await store.get(key) + assert fetched.access_token == record.access_token + await store.delete(key) + assert await store.get(key) is None + + +def test_select_authorization_server_prefers_explicit(): + metadata = ProtectedResourceMetadata( + resource="https://example.com", + authorization_servers=[ + "https://auth1.example.com", + "https://auth2.example.com", + ], + ) + assert ( + select_authorization_server(metadata, "https://auth2.example.com") + == "https://auth2.example.com" + ) + assert ( + select_authorization_server(metadata, "https://unknown.example.com") + == "https://auth1.example.com" + ) + + +def test_normalize_resource_with_fallback(): + assert ( + normalize_resource("https://example.com/api", None) == "https://example.com/api" + ) + assert ( + normalize_resource(None, "https://fallback.example.com") + == "https://fallback.example.com" + ) + with pytest.raises(ValueError): + normalize_resource(None, None) From 59b1251dbb759d62541b1a8c507ce4459fa51c16 Mon Sep 17 00:00:00 2001 From: Sarmad Qadri Date: Tue, 23 Sep 2025 18:23:52 -0400 Subject: [PATCH 03/11] Fix workflow resume issue --- src/mcp_agent/executor/workflow.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mcp_agent/executor/workflow.py b/src/mcp_agent/executor/workflow.py index ad5515730..af46f64bd 100644 --- a/src/mcp_agent/executor/workflow.py +++ b/src/mcp_agent/executor/workflow.py @@ -431,7 +431,6 @@ async def cancel(self) -> bool: return False if temporal_workflow is not None: - @temporal_workflow.signal(dynamic=True) async def _signal_receiver(self, name: str, args: Sequence[RawValue]): """Dynamic signal handler for Temporal workflows.""" From f5ccb741c28b76b3e8decdb505005cf3ed3113c5 Mon Sep 17 00:00:00 2001 From: Sarmad Qadri Date: Tue, 23 Sep 2025 18:24:41 -0400 Subject: [PATCH 04/11] temp wip --- auth_spec.png | Bin 0 -> 415449 bytes docs/configuration.mdx | 43 ++++ docs/oauth_support_design.md | 108 ++++++++++ src/mcp_agent/app.py | 40 +++- src/mcp_agent/config.py | 89 +++++++- src/mcp_agent/core/context.py | 20 ++ src/mcp_agent/mcp/mcp_server_registry.py | 19 ++ src/mcp_agent/oauth/__init__.py | 19 ++ src/mcp_agent/oauth/access_token.py | 82 ++++++++ src/mcp_agent/oauth/callbacks.py | 53 +++++ src/mcp_agent/oauth/errors.py | 21 ++ src/mcp_agent/oauth/flow.py | 218 ++++++++++++++++++++ src/mcp_agent/oauth/http/__init__.py | 5 + src/mcp_agent/oauth/http/auth.py | 68 +++++++ src/mcp_agent/oauth/identity.py | 46 +++++ src/mcp_agent/oauth/manager.py | 249 +++++++++++++++++++++++ src/mcp_agent/oauth/metadata.py | 60 ++++++ src/mcp_agent/oauth/pkce.py | 27 +++ src/mcp_agent/oauth/records.py | 46 +++++ src/mcp_agent/oauth/store/__init__.py | 11 + src/mcp_agent/oauth/store/base.py | 33 +++ src/mcp_agent/oauth/store/in_memory.py | 30 +++ src/mcp_agent/server/app_server.py | 116 ++++++++++- src/mcp_agent/server/token_verifier.py | 138 +++++++++++++ tests/test_oauth_utils.py | 85 ++++++++ 25 files changed, 1622 insertions(+), 4 deletions(-) create mode 100644 auth_spec.png create mode 100644 docs/oauth_support_design.md create mode 100644 src/mcp_agent/oauth/__init__.py create mode 100644 src/mcp_agent/oauth/access_token.py create mode 100644 src/mcp_agent/oauth/callbacks.py create mode 100644 src/mcp_agent/oauth/errors.py create mode 100644 src/mcp_agent/oauth/flow.py create mode 100644 src/mcp_agent/oauth/http/__init__.py create mode 100644 src/mcp_agent/oauth/http/auth.py create mode 100644 src/mcp_agent/oauth/identity.py create mode 100644 src/mcp_agent/oauth/manager.py create mode 100644 src/mcp_agent/oauth/metadata.py create mode 100644 src/mcp_agent/oauth/pkce.py create mode 100644 src/mcp_agent/oauth/records.py create mode 100644 src/mcp_agent/oauth/store/__init__.py create mode 100644 src/mcp_agent/oauth/store/base.py create mode 100644 src/mcp_agent/oauth/store/in_memory.py create mode 100644 src/mcp_agent/server/token_verifier.py create mode 100644 tests/test_oauth_utils.py diff --git a/auth_spec.png b/auth_spec.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd276c46e5e9eae0113935298a0e4474d7fb76a GIT binary patch literal 415449 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

E?AaYo*e_l8!Qq43%NErNgHy9OW+BP;=7??kf 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

AZ{|PM z!B#a%Y@a5g+QdZ~-}I6nkk{iQ5gKr>AtF3;QK4PUV|aSTbb*4^Hz*mY5`$8*^g4|C@=jNk@tEs_f&Q+VF8lTv1@ z?W|zVIxfI~ZC-RWl0S`G()WAXpL6Gn>)I|+F1{| z#TRT2;8+Zv{l3o$X6NY#G}rA_`lvcjdo6Yj_G`Sn0oFcsaoU_R=(`aGY(gq6RBGS) zmfAMIl#=euA-nE%E#>xD7b6Vfq`V_sxyu>ifYx^Bo~{KLH8#Gm1$yE_p>t9hTH&rF zI=5nn)$z-mX`{B;r05aFaU!Bx&hh2T68j>Dkh>G(LKP0}^zPiR3XG&SAD|-eGH8UM z>)MiwJ(TV>x^h$|D#W|at5IS1@}|L z%qZfbO-5;v!u?b?m09;Ml5k*jZI5s# z52Hq$KXLcNBJMWsG6ij}Jf6m77=^PElf#M-9dVrdH!qUL@^-7-dgOrfau zX6QH}d9o{tKByA`Wss1FDoIY-FzExKWTtB?f0jkLG$}T43F>gBSL@bE4~!rkFV9vD z)M1jvB<#n$BIiYSZ`=N4QCaIll}YWc8x^mWqMg%#{54u%maR`_8L2ApmuowjP$#Hp z>&*DWC>P)Nk{IuC_lB1cx|CYy(LS4_He+6=2Ur^&HfEyU`#3v6FDa=VmEsQw# z#(LGSSzeOCi3$`ywQiJ#{ptUC{!DG@Si69Gdu{J`L`v39D!!W0J)p_4JnRw#wf=Up zG+9=6p$%kvWWU-b%$iS3O4^7;g=x`^bK{G62-b?S9z`{oR>N-sHZ5durH}UEh>X43 zuO6t;iz-zaNfW69jidOTdT3+1oLQ>km5ge2cfUM#m#RKhI+n$zR#e%JSLu%I7BDsu z^0J8|mtnEwrADuG*FynZt*4x`!mY%To9c(+@m&W*Q_iiG+2p((%+A+I2^_T8&7r~L zum)cakWI({`*`i(#}4|EZ8zHstGU#a@8pLOALr4Rf~@ODW*v_J(~^#gqQ#2e2jQ|5 z>%@Gmq-@Zhr0;Lo@NT(y-HF~Yue4>L)s6%jUn}7ekifZxGKb0KIuwnuT5UCFkP$g5 z&f`^)W77keI+rwO2Go8JNJ;`N;H!H+pmcu54N=&bo3deMxO3a88>6_h@f>Zkh4E}$ zt6r~&eB)kW-93)lt()fXW=%Zg$N(*}(WOCCYGh3q>TSA#UnzROfpIQkO)Q?!KNgK| zA)||st5Pp6SAga>PN5B4+72iBo$V$K-5s>I(b$J{7^9V)%rJyXyZY+HQRGx71{5jb z8?VxSZ*{yKV|vkoOhR@c(l*T2dx&19L`;&5$D%*m&e&{GamD_k)Z~N@Y;mvEt?e)+ z_^!{|Ap5i90}r)!*RBLdUsupK{f3okB4*OnyvD|1sfe3^twD;oN1*st3J&ovSN6vB&>N-THUHL zqX)WEw{fIUg(Q*guNE~|4r8XrdWWG!Tq3N;FI0#gz8)$B{~KKm7}j3&zFbYM#e+kg z;UY=P!X6;u+Aj&f6K{bFwAqQYdtFPRTKBs6S&NGOK2nmb>#Tk2+|{U0MEE%KKV|6u zK&fr{Q{1xAQHBK*MoLRt&FNy?w@I(s&ITxUZ-0zn)bja0q3H9RdyrW~(P;B&6nfkl z`2VT5fcUR0s!~AF=l%Ihk;P;;2am?xk)xnX=x;ME7r6=LY}*?F&$!Rob)CJ*!p-Hz zedMMjSG1KWb%wkj?Mn#q^Yz#%mv7s@R<(Taf>Z_>|}$RDf)Uz-QmCw~P%qcHekm+L|g6OQlL~I9pI4 zFSa)}T#-=`RP>qq$ZRZPET~4&e!3Pq9aJA_GQG(&6@Krs)6cv0vd2o^i>HhXjgO86 zQ7Ge{=eIvtUo^h@_w(!Cf1M5$ey2cvSCvWal;4rQ{$9Qk>rLu+ufH2m$1AA54gYdC zmnH#x8@S={9SEj>k|1!OHufifCgSb_l_p#n0g1WoZSF zgB4QS-)aXdis$N_nS0KS2)AN8eB+t6VRgrIY8BUnD0CBgUE+_?N^_B4ci7#X@jhxh zE_W#4Zui_NOF2#CsJe7FvQoqyvW0vLTtqZ@*|+552#Ly&YQrPg+bJ(%`(M_Znf%r5weB)>G?IQh z?*)w86y^St5#7NS#qg}fojSA=X|xoujaF|Y0-%&#DN5R<@bB7P?P>LwbFc$>EO3qS z`InoFnW8L~ooRB))a}kav$n0*R|4b~oz0wdn}fE8OZo(Vh(D}#@`bXA=PK-7+v}QW zX%a{CkgGm6@NX{)DV;U>%s7EE$ghU%`3m^_@K*X7gtwQyI+@2&w|a3SahtyPo8oHr z@vPW^{GwDhl)l}HsvuFskx^-zDspz}4eb2W^Q+bCY}C0*0_29f#}?d`R;+7HI*uQ@ zCWH1qb)S8oKY2U}d)lH9Cd?YYu2OBmO6D?nY+_V;ds$M8V7gw(UI8b=_^l^%Q>JwSnS< z+kYMY$+_+p*XQyFr~2NJ#$i@tl&isBm`nAs6WJMpd!5ZKvw!C{Ih4>+)>o{OF8Eox z{VRyBX2|z|V@{Zygs*AaklUk6aN1b##ar|EJe4`R8{DL0|FP%Csk5>!h<>H>3l?`$ z5>VH4IYH^Ws$4%AW35Nbi?7PF;`;0u9P%{+`)7ie@%E{MzZ~YqKlbdgaueuq z^6R|sHc(^EkO1~@R29z^E2_nTs%6O^eF~x81l#Su9f2kNLEU8vvt;TsC&B`5q3uGQwKF$*Ew1xkFgnegJlUuj7 zLWCe72`E({B+^8hG^GTA(4-wviu8_1l`ar^3DTuV5l}ix??rl3q=WR1(t9T%@IBo7 zo^#&&>l-7Ek-><`e)e8_?X~8bdoJYwAL3?Yn#yS!j(cla>@Kb(=y;HQbpigOvCtW|ejqjH9<*n8u#mg1C;R?Z{f=|UQ?@T{%?|DW|`Ce0# z%&>Q4LI>9wb%9tO9ys(fH@M2qcb#Zrfqr6Q!hxREb2~Mb5sW)ykyFU7bS=!9Lszwz zh|coSpjM4{z|PygTHe;m^{zKe_yp@a+kC%k2Wtj!g_p&_mh~r(Cwtte(w-mM+xQxm zOJ*ATZXF60X{6zHvr_q5G$SeIxEmgL1=xzSzguE;9nYP#>2wl*Tq!l5=OnrrZm&6B zvsXGWSL1Fh-O z7jUd$;-oLEEq8GW-HyzC2j7hvWA{_ZJiZh>16=XAYpcd*PmPrsEr^e^7s7U04qpGaEzZt4B>idvdb z#ntTWN?;CZ0P18@cA5kEBY|z2u!c(wO{|1@xR06xVJ-W?$ECa5w$o0p1Wx(~i=>Qr z$GqGx94`+x0yjcD$y^<_cJ-D-{qnU|j?P>bSKjbu->Px4Uzz=+0xDB{;_ocH_I3Lk zOEX~{uRLYeL8tk{7odMy$nX1KBkVrVPc)yet@zf=E{-(|DK?}uP^ zKJrr~@}gBXhQzeU66w%_%pvct(-Rp!4wm}YL-)<{FVZ5Zy9ZLVMDbku z;U-V2OZ}u$M&>yQRms#Je*gL87GWBAn@pM?Eb*F~sBp=6o`b$Xh5S6Hy@$_tnNS|g z7uRA$X>0UJ5Ilrb2-+fZk2L4|LHv1F$V7=2cCrKkL9JS0abY7ars(-G;ynv=$pi2i zrX1s_bgmyLWlEHg(PBw-Nvkb0Z!#aYIwni1m#D)N-F)4z3_^<&{PezL!(GRHIDCe(cumr$M`WSmthNb}i03 zl%pAkFrg<5B&&nds~hY#eCTMtX#L|a7!ZfKq13=bbaz35l0gq*+UyfbVF5o4pE5$x zDttV;D1$v6<&mWL93VWDUQ#}UV;uv-t)E7#W*=GlgSvwK46Eb)488oC10f0P0tV@0 zbSOo8#6?a&%3rX`Q5+q75ee%R3VL!E#B3R+wgYtC@6@KtBy>9GH`oe5%ooXV8@~CnIM3#}bRy{78?so^DRt4i2yw&cp9bk%H zBqdzOD3X2r;F(g(GfoSUKmW2@2V{U*mW}oID(L(;!KDT?{ctSvg~@#Cam)3Ew^_Il zj*Yy2hp5gdjOC&3>7b;#zw_%>Wk}YHrf{U6P{FD_I5)2UZJaEctEl$R$piTLTg|_S zSF%yTBk16k%YnIu)P>2t4NmZooh2maoT*jfy?4aGs2@yXnBA#n4*byQa_G+@DC1H8 zJI5xqCC@a@Q-^7y_?9N{1k?>gh-DsguUVev!H!W%QuKi*#-G;L^k;#r+LdV%@Q*tr z?$xP1mxrvL>)CV~>N$<5HMR6t#2nP{)Gn`DViu>%jowxH8nqnx?^p?>KWE0nr|t3d zPi{-ceQpdo;$%tjL{fR}img19vK9BQn0jch`8+RRBg|5EWUkE&bjdKa`n<$=kw`g= z(QMV4r_Yi5IkT`}oxM@#V?D`fgmC~L<(u4o$EM7t1LcKA)yq!?ASR*v$VUSr^R1}I+Qx)i=FCk_ zlC6f*&mpTdvo)G+=*gXI2TOl_^HaOubNQ<~(}+~g{_qZ-d#!1n6my0(B7Mg@0&$8s zcR44DdE~^elhY{6o8B$O%HQTiKlhH46PHo%qSege$6VvjkuwT7;JL! zgD%pN%LZM@bE@sLS&Kfy`GQ?yJU*DA*ZVRoOQ@IR*P5j2C%Yxp`orKF+a?)ty`{sc zU5RPjJv_-=bCh>b@mW!eM9>POH|@gQn=`LQAA7Tm^~nvb;2llnR|{$FCsKV|hbf3L z);X&^iCF5rF})_Y1FySV7w;M=)R|6{ym|$acOvfo6l%p?8@u1Qf}`tlC|;_E{u%bE zx#Vy0+W{TELFTGHBycb^W}aIB9^uv)$sCEhLB~0qf(ov8d&QtjBCM(}{ii@(TXCr4 zrNPQvTSL=xYP^J($i8W)(26N)Z4J@bNMNNUMM*3-Erm?nce%>QBoSrT_l8`$aV$hWuD3rrPH;W zmwcT@sL_d=86`?RMNtvGI82}QyDaJ9XWqv2i#JfM>-n$qtHnuRrs zS%z*rXh6!DCPoc~VX5N(D_kXf--xg(whqGZC`v(=D3c@Q7-nE379dSVV9Xn^JKnc4 ze#hnniz#U*B08aMW?c_xY@WCM(rXv+p$kU2l0BrJbIh`6q!ouvbbUkS;-H!`)ePfy z9cqA2Ej&5omm82v6WpeFu2zeZW3~2h+h#^E~MLZz))sNXabW?xr z$T)CmMDMlW`b=|Vt~8|VG`y^Y#bFnJ9;wfT4NsTX|J+|gt{3uk_rP)0{xqztBy}V0 zB7_$rHcmV8hrX2vBnTo#3EaPlpNZ;Vn+!07i0{!nOHjVo+%*ox)>n5)>de|duQHXy zCzzg!?6dgfVqd*uu5#dAq-Qq;t=wSv=oymo?ljmIx->Ai*C3L-`r!P#OM64hR}wtt zyOB+Mt)`!el1cq|f!+--9$VqAHGo)*b;{^DTFJVuV^KCJw+vLM;FvWC`>?a&!Q|Z;<<%!an^N09;7SYHu9%2wYvCg|uiY{$ zoS&5P%1M{cZ#3?E8`o0VEkQb$+lTmdvj3u_kz%UNsc)*?g&xbj@>o)Mvb7-`cf&R( zYEbU@4O!zSU#qOG?jYZQkh6hgd$f?qX z4FS=*ejq2A^dmGMo_oYQvLal8J)nK_PGOOcrRBy;_s5L`#r{nnd0nW_$kR5$F62kU z2j*r(fCFI6n2>BWHm*&8eu|R;irjZvr`xi1g#c0bqyE)ho0Aoieq~A9+Vl@6ZqG0njw`3sMwT+n5qW!)F;G>M(A4kIbY)F`JEwPJ zF6EuJPi1y>^pPHsXzSDalmrT%dK|Cv7rSiNL6>{k^9qHEraXr|otmsZL8Dfx*8J>*O1q9-+O9Sd#0XHoW4OX zS!0#mtLk~zs`ZGcqxQJ)@jsNOMcgey4yL<4DqXgToJL&8&n>!b&n#T@xe-W4S^I8S zcbu3Mc}hlAjB#PfPE@eUB`rHNpPO)x+c|V=bSfx_vh3KmteEPP7~j!Z zIFt2RF{p38;guE&9#W7)J%g z>X#wh%m=@OMI~yg5S5fqUCDI}a3dj$RVxN4k(I#5ZQU4WkkvJ4Z7;RiE2}|HTCBY$ zi9&SWeQ%94UeG;-m9Sj1TrkG>Kd;|3*N4VRnZ_yAT6AT)?MQ~s{ycdJ41lkIBw93; zS$HV=ed7n8%1~dhS(GnmZL_q0C0SQTbZY>wV~bt-dFLCMNHDwnx6uzDX*aCxiZ#p_ ze5S`_3~i3LeYE9T*-Nm=qqY%r!e4Y<48MIEZ}gJOkD$+9(GwArxv&)V7mOLqVz&Ho zbI7mU3-oi~6_uY2Wi%{R1^Y$J9t;ecLF@l4DKi0bwjZUYYUf_;fi1Vk5TwGj)jaxwsj~&e*Ia-GPk${oV z-XvH94~64gW&}&KxFQzzZ~|)Vo146>Hrv);kAsve8pq3x#%xWhE*CmnH%VBl&bqWz z!X%agvh?xwuAaNDhRkTqNYP_y= zF$XT2E%d2x_48aO8JhT0Jb4fZOr-dmxSrd8+bYD*3qHT3-=mW*QvPFdQmoKbdHKd# zB&yY-4?A#UFED~mVpQ&hM#!tCN=Jw5jwnenZJpSap>t6BX zR^!*$(ZR`;&ocW9tG&HE^+>zeDz3ewu#l{qcP2^woIz{CKK*)p#lLFUHOD#&yM3OD ztLvnI&0>LPw;9r!c`F0h_H515U|_xeV~kG>phmu*-bj7rwo}$V%InG9G^lv>8NW!g z!f?st*+XMf&nfmYHf*pTDbPzT#8bgoH8&yrahIQqbIsGYKyrXp;UwgJB=kD;J262F z487MuGlhr}H(^h6&)BNlD5`29V$fDmiD0qmO%muzPDzn*%5a_q|H9~@o<;4FNR|@N z4_ZgBJ zX42n@0VlSlK9X@~tE=5_ELJY7%SeY+C!o#Egg2zke&N z!G;@lZvN)&z&F-?(Z4Z7?pQ?!*!&N(+)B?nx9#%M_i!KK@&biE;b+0*RDd%L3C;Y~ z;|HDZY;ZTO=T4luYe5-72NW0(i*=zCWMBKJ|Fu_RwNHpas|fPK(VD!OFB@en3L@ib z-i~S9dgDgyA06Ipm9+5)yKURlpXFG~{1${C#cjFmORer-$368w^o4%828H5}W1zS|9c?6_%ErJC0w6`l3OLBFKEmLb{&0s%-%>GUS2 zRBGbJfD+%yrZ3^GlJY*$p9)`*w;BA`m3SM>iW`oTRgwjNq-Tqf$qEtPr$UYycotSx zS5MJ2opwNe%%zh+l?B}ai;6f9ne%eO0m}Z5VPbXZ;k)O+)w&4=`)|g;kjrxkF5DqU zib0pvP552|^wBSeLO{;fFF1Pke-^m?7|_&_Yzf{ds_(neTzb4^?=!`w`jJDb4p`p# zMDw4bTi*$Fw+ekMG=H;-dX!6qZ5D-SdiNWYWew*@B$a$He45-3t!zUYnxxq1Y{n|6 zKV8g_O?CZs$5!~L{zpOd+*TqSx5xX`cIN1|Rf-~U7D5516<_io?yTwJSG&(Q3dQKY ztf?1T6u>!fa!s}#^+^oyNi(6V_Wz!n5Wg1K!04ngxsz^TZGPJqd5Sbx@5$KcD7Egl zn!yAf{l)yrNwkUiG;#SC@eJdvcmyBr_L*#$=AA5&DH~Ex+?L4JsIL7!$LERTiGC)F zsd`w$1(vFyyPw-c5YemR@0>jEoDBG@KIrOw1;i*Cpc0e&3z`T{0g6MGIDlPD69hjyaAv1VWcsZ>jPg{N%3!`%c(BEfor9k}iKez^#G^AKilcL7Y-n(~RhXOx@rhW5JK%FY~+_4361^9Hz zaB{1j{oaF^r>&)nuPVNoS*;M>;vuOMFOY&c90THHSx2$Z*Yr0@mV?_ z;EepgnkHC)^j2(I!#WK*|1%Gsb&GY4G86QZEm!n@(?H3pDF& zyUt886IiaV$A{0OrhIan%(;02UuccFo6Ulz%*O!AP$9eL>mDdGG%GZ)?((8u{LAJu zUeh;^yi;u1rk=^C&d1nMarb!)S=mu$4TExrfxOx=^4iG+hjg8Y6c*48M`Iw!fGrBt?cNJJwu%>-7?qTY@RHeN;SqjTuASWbyU7`<^G!)BLmRR@L zr^WvU*ZR9-DyyGoS)B4COXn&gGtNQRdMw8kMD1z+V$1KXAD#OUs~FngzPIRr+{$j` zh;WKqtgVNs=r||F1iy_{5iTvPntUxQD0*x}st47}+30`}Z6^7o)a1+)gPk zcKvO&<{Tev%@Yg9$v-~tt9|ApEhs-7#QI>B-R6|A$w^!fGu{>a{n%{|ErJ=uw1L|U zu|prEeT*W^vBcpDG87`~pBMpeVz;Ul7omU1u$g5u>9_MJ4ZqWL=?%#OdO`4uEn*P< zFqP$N;}BLApG@(Gqyt)<>8=Zsw1Z6DI@!E+;OCN-q3GRhJuV)_$zX=4%1ATak`GIz zA6{+b?GQsQm?u42ZqR@LuFuL{k|AiK@$Sy^VansJ;!}yu_@0|Xd#}sY(qGsRGgFt> zJ(Kljbe**4RUNO;)tr2`9?E!2tZ>}>yu9pAn*02PD{gN1yiwG&qbM8?ml8G2)5_;y zluAD734Y6MOuqJIa;PM-Vl>*|#@CDQ1b}0D>05OFAnKZ-JFCJ<`kYzm-+_WJ__yeF zfXmo#w|9LZ>lc}Npfh}M+e*f8FRrwDBE`OOoA75P@-MObn4$8Op8eaU3}+s>hWnLJ zcC7DqtA@I3apmY_n)mU``ja#^%bJdOQX;>vd0+aBW-a zQxHSzZ$M+>_N26Ksr_idOJSGw7lxfCc90~f(?m$>NCYorCiFL}tQd4?T=6lW>K0pi zi$7*!W=a;H)zkfY3T_M}UYW^tp z7NlTLvdTmZ&ihf3SuIYWb(f}bHwd;nRGmmGWhUb7C-i_#IT7OitiO_}L3wJG6f^KV zN14P{61$qY1!z52{p4*DKXn8e@sX@mLf=CRq2EfGn}&Bd7}6cMZGekBE%xB%xQOux zv>9ph=#`f6=LR)Nyz{El;dAxrCAZCcLZTOKQOdNRicM*}N-}F6+1X#>&}wJskly5j zw5^Jtw^trXp1#|-&QE_iaI)tjXaz*FV_f#`_=~QT$*tA{%F$Ch*Ga~Mv$PF6U9+W8 z0Z-f?RozGEY{om*NsPE76I|bkx_^b?vFp;2?Xi#H{*9dSl3%tauK3jK<2`O5k5N1a z;ikCuTWbV-?cS7Myl zl|c)dRXyV>#(dj*ZrJ0Zg}7XjEM~BPOJ7&l@(nYDz1OWS1+?b;V@({0-SiNA5UFIR z&}ms;wn~u=H3X{cg5P=>4ugM!m$AgLfGBMv9-UMcqq#9TnBh6#a!%`8R5|>d(yzy3 z6!p1Gj?bS#nr)F$T3~U0(z=+jT^X*$NwYvF_3@x|?drZ0%^^uaN^8s!2y_g1YW-8q9FeXt(1BQf3$z0&uNd1W*KOCXcD&Vec_9@S%!q^hTJSR>6@$NnT7*&t zKi-7YL7y2@6&eGF1jgZ=Q8?`-ATx^u7oRRyP1%u#Taj)mo`h>Ng{D56GP;cNId3bf zS$qeP=t=&8sdg|&ThPt`QM=TGTqMZk6v2Z43m9MbOW<(dtT`Ih4R{nb2i1Y~EGXdJsj z^VD|83^33$+q~m!gaUhPDhnx1zjENJw&LCsgFnGvtnRxdLZe|4J$H+ibL4#)s^M9~ zrn%++!QcM}h4)~O-lf|Jqp8qYg54ZaWRBC{r_ zp4BbGs@+p4PK&w10lrfJo;{0!MTHbf9{L6Uhu6o7J=OXBoV6O+U=uhP+`^vj+CnZh`#>==;Bg^|JM zS*VeKTVhdXkfM>o0s5H65F+SXMG2MLJkNfByTKnf<#%Oh@9iHgr`T8Zip)*-Jz5Hf zyqVFDmV*HeXJI+|aiJv<97^|XQHC}djHo5oxp`Fkkv*W*3EQQ76Yj1$Y2N39KN^#% z*!Cl4q6LlpA{oNe(C9nITt!q;d2H`#q49aTD3go?3ZRn>422LEcm+VNZB-v#a|bKDB%)}OSxbmuc}!kdRQ;6}PDW|OLbU_K`l_mHx% z@pemrg>F^W%z9_SL|$dL7QMOk3itPmwS`ffcg!KEaonD@g|)05QbUGYu!{*V}IomfhQbeMQcT z&JaiU@4F~9z1m`uh^LdP8-5>}#jQVLQt9%B;c-q6aqVza6%z=1U;64e7-Hl5ODY+o zHRN#Fba`^=|5q^W_XZrGK7T0<;vo?7XJBaM_lKFxujQsQ1)3j28`34WjdjPHk72$F&ivA*KJY9n#5besPU_ihPkb=y_D5sad6A+JzA zd0N>Q9j@xH5Cn)%@PTxPRuUF}x)`d3G@&*tPkY^a3T;e2%|WkTC&Gw^i7|Sesu|Hx zJ!9qD!gyZ}3$|+|w+KZSBm2XH>?8BfOAp=JQpW5!bipY zC~CiyLQ`2B_B8do{dqHy5@-!T4Y|z#e=w3EeAA38e*c&kr(mde(gLu!xo5o#Tc}tIDZdwnE!y$8-?7hRU$P z>e+^Mvw<6=qFb}|lUqd90x2effjP+A)iWm?d!8o8Z^>y$hoD&iq}$&fzw5@Q?s^~- zS0N1j&US@DW);^R1OrIiw>R-*cm73n&RORDovoEZdhsPcCMDGCTzkM=^q?5mwf7yz zLrrPbR%%F#qXRlJo|Eg#?zEe1>t_)n1_vz@ynq~d>fNE7TeYw)!nGffsx)&{qqEa? znPbN-YsodBwez+7GJxariNVkB<`Bve{t8HsB+0GPLosq-R`uI0ksQz9=}_4T`3g>g zyC!^aet*HW;Lx%^;|iF2i-{Pm3nXyaxYeT#Gl!|h#Gw-5a){e-K73yZg(@RF3@$8!<*I^<_qI%!7rF9#LqEzr zvP85dVC=miub}CBKazo`d5Oq#M4BMYn-ArYob$kGduxN`IlDg}!|~o3h-ODIM3o_t z!&lNcz=+8f(}a2uYsb)1TOBu}ENrBH9Up+P$(UISabR0d`fiMUV(2fJAz|_eP1uq~ z{w5XUi85y+htNf&f`<;puqELMZ2srt)Y8I*<4TFErKOQ|S8Ii$trJ>bqOL z?p^)PXphfr<7p_FN&8kTun{vomqcHl85KH(`I5HN71N7#+XVw)(m`5nGdr>xNBK;s z^3B&GuFCho+O{0Ld-^m4Fec}`wU5T~zBJJ6O(s`6t$=^a>PFv5_?*x!)6~{FqsBs+ z#Fpf1C*lOy1j)J8K@;Bb_QI-4&Z(W-MB{WL-s}17UJ$(6acw{2Og&7Z>$$6;eE0Ur zRy&or`H5k63m_^M#9~==^D2@s`UIjyJb8h* ze|s=0&kR(qARe9(rRW(xe|nX)#ovdnKt>_fp{}wJxpSEph-^XY8&tKS(eh^ZTkk>p zF)^5l7+A09$Y5RD3*QoquhNVAT?q9ugKb8)X(&h~!vMih%IrtMpM-_-13<`AxvY&S zSVUr|M4VsZ1fX^a0FnV<#Y3*O8fbUDqc4lDJ%K<5n+cz_v`-2V|9z z8mbUXxFOc|ZG(t`ww&l;Ob>X7kJUruDQ6^1<(?q47PYl#I9`|!i}=n!GF0$KiJ*IB=6cBRHMW7>Dzb&M%rw_`p-QZ*KM~2wq?_{}6TIEJl zriNb2!Y!ZYAt%Yju!v^^>`XrI@3h_7aO z{{;rz@w=t=d92r@eSu4FM)*{mml`5Azx~{*UbxrYz?JNYG2qAr2jI=L_`A=`nED*AUR)H2Q zH8q|u#@tSuEfy5YOVEmZUwTzM9082MQ6~x85zYc(};p|3Lbl3stT7ZGS<3QGfOfv2T#9 z>IsXKJN^%WdL-|&uPA4E>9>JNP8ndU#2B5A2XE6#p9xE1!au5YZ~ZD{QF)76R_{|x zqhyeJG>Q33EMe34`~8gl@r zJf2h_rQ;T8=B-UbpN?E#EBkS)S#$-c)V_j|pRB993M>Q&o}d!Sa|ACo=oeILM}7nn zz_X~BSkQ&?3QE!2vxG-(Y9L3&=*YK5hc(<`Ua3aqK?l7#n>uD)=+EtJDylQMlFMuw zG{K*2q)hv|o86suRthM`&b1ctH~d%XGcN%Oxi$Jhv7vI02g*HewR zjgWbzascP-&@KC~oOnOvNh>0Yrq8~THH<2Nng!n{X78CbdSu+Nsu-K&9yl$mxtU49 z-1l)|(3--tuIGc-C)`HE%^?7D+&g+`UjmemM%Zk{I$USX-PGnD56bqO*Yz8=4LGkN8IK0&|^QM#$HUXS)zHkF&48Hk10JVTV^=(aiD z5G1e8g}C7VOSu+om$hX8gzqwkubiBmAned1h~XG2df6Rb6dK8z%KxmzCX0Z5pZ+?< z;2RE*6+A?dD*~o+c;5#hEoT+`@*wH<2udZEC;9v6whN9V|8Fe-27hsD1*#UM-y&;2 zpu-ai^~%no8|FJTOOXpZKz;x&0S{s7<3hfN&W9O7zH-K{I%_wrtn~xGEZ5HJaRPMY zA>DY6_$a^lcFgsNO~F*A!a~>v^PBBy($R-Cn(;Q&jf@Y9`MtkyfX0C2=ppKivM?gC zud`J7n)VF+5C9lyY9mrOJVBrk{#t4}5@-+iMPG_fsDJ<-p5 z|G*lN&BkM}+5c{1YD;A9U}rK+z&;MN)+3-MAHBWH8mp5cp`=kZoZiKsep~PNi8AL< z(n;Fu&8GmyqD7C@2YIkG(^!%WH8c;}{dcY85PWKLG&*|gir$_X`#zv5`0zbzgs|=8 zl54+2HSQX&{%2+vAcm}QHtRXOwVK&v)O8n~QLH~>CwX~xmZs_QnbEUHk)^?{CwD;d z=y1t(g|T{q%+SdrfShf7g+j73D1J*q$nfm-)Z|(K(^jK_puh9Vxu(Hv|Y|<$n+5yRV25{Y%DT&U*S)}qHB+xg^ zi!QW3D4VtJgu?yJ-3&qVHy1<!S zmBf}RMzC*JzeSC*Z@0|we<`0V3>z)K5R&GXmiY4*)7m%BchPJ&&w;d;Z*z>Z^Gi#05*kyFM~HM)ZM7aX9oD@zKH)h1`t{sA)!j- zlk-UVKj>Bf)ou}e&&ZVT))FyKYk_BDYu70~dl8-K8iAcma zge5Apb3Q8>_me=;&jD#y@Ky{=rS4TELYlgidM{aF!dimz1BWG2zQ#;OTi*FzYrIee z6bijrT)$m6fJEt!%CVsZj>{s2{y_2FP2*Dc9{N9oHeo_%MA|h#>VXCsQI9F=5iuXY z&f_-qTUAnlvNp>Cr!8R^oj{#Hwb2X<=3_`qSYjA+CfKYGu}Iw#e>jH8FIhM(vQ}7P zZa0_&Ap$kvgV3(f)gUSpZj=2Od8V@%4l9%i{5RA%^wx^kqte0IiE_)3xQP+EY{-g$ z&CKhsfSQI31^I@O=?S0*;m_zcKq4qsW5 zDG<2DfMp--j0?Dg#9F_8?LQwzk>v)O4H{!NQ^Z$f8 zc4>Ogqs|VE;Xf3)`sCIFVF}E%fCYYR-?us{Pqv+S@2a+9V39d`|HRW|Zm`c5xmWv{NlJ80iTw;@e90NA1eBxaUW~~D z!QBN1)fUt*3K9*&L+?$p{9m9%VPb}_sUv}Btt44WN5%uv^Ykltw9U@im46aZD;LgD zI{7SHhgX#Qy{IAx1sfv)ZV_-sKnbDen9+Mjf&_vY_e^*f;c$di5cCX^2qg%mP31F| zj)Fh1l`pvG7;g&Qf*6D*SjY^Z;t&%2i=0+Xnf;JuZ9{rv2!G70ML=}~Hp}9_|JZ*! zj`O*6vI9yZ62UFt3ipTCP*$qcZp!@iQP@@o^F{7Q zoRNIqJ=wz!8pFFokAR}mEEjw*6e6D|U((4GsM78^*#HEJH}+`w0odFEXh~=Bh=?IH zr?aUd$O*Ha%@g<*h3#VUd@xS>Jn+}HwJ8-;`Kk3J0dZf{koj{YnoCFQqbS4;st!F@ zgn^FA!>BqVJ5c2xH8|c7` z_AKI|anoT>B)=~S!TEq43JcIIdS3~ox5QqQ0Oj(KizgDPKj5A#P34<0As1F*A9zX# zDX?+2RcAR|L*)W%{v6IlT3&rRBZmy|YTlZ8{{e$h&D^L`L)`@`_oMh*Vh6unQ_f5* zI%d=j^XJPAA5@VGKPXdAk8QKPp!mQlY0`z+vtUoBD!2FII=b78h(f*xe)sA4N3Dm} z2b#pUCpxs^CWEQ&*;wp%E67K)nY$@DwTj~B++X(Kv`X)An!B;h;Z5u<5PG$b3^7u5M zZX%>PlzZgYFQ(1k2j7{rUF=1+mYhHfMY#z+i_mS0LK}GU8dppc92rMScznRCYxZ2rU^B{QxhBtc zyt#I8?ku&G|vP{8m;`9`aaL*V#rZ1;J2~{;D|$IZ^z%aiW{+ zo$WOCSL5&RPYwT)Y;|?MmA{}Esv0LYb`VHHCH=b^w1#nCxJ==es&hq@d*;MXOfIR9 zb@oui9%t@UO=OCo3=f}gj?FcG=Q-D(W>YbE%Xq%m>56M1$;YX%NmR^zc(?iOK*@Ic zG_E(P!1K{qd?akETC^zy>vMi7yIr(+@$J};=X5kFQv6q&q5Mz20duw%M>)Ld!lS~}{U?F(6 zKvr4QY>3aA%C88t>SOxD1?=Goc;L_^4)xtnZ1q{>QQ3@9txwb z&@q+KJym_^>J`+1J1s(?MDv$ldZu9BW)y~&$tTLqk7}NREc#U^MVf{zF6+kF)w7ll z&9Vjyy3TvkJ2&Ho)nodRYOMxdEXE@GDJ36rlDOULhdXUF%|h;KnXPzR{%KFVaUiz! z?&suY-GP>>M>nR$AQVXMV+<Rk?6RU(B~eK1E1&@}-liv! z-|FP2*S!WH6^8yPFjPr?(|Kv6c;7wH+qNyF*{#p2vcBlJ;ATXUwNojvxP6&t4E|zS z0})BXyjQe4Q+ct6$GV7`L7Ys4aPDWezkBlmU-`rPs1t^dk#xr)Ku58^* zdr9d4nEt3>xL0(xjZ>7q3ZOorrO!tGYSRio26@HjjGyx=jSp8_7=$x5sl=$@O{bBK9o-`f4HIAR0ZITU zl&q`=a1EJ`=GK(%$7^Tv=HKS}5mepTVxBp)9|k~==ldTDdMSZvcu7$F`rmE%shK2t zJz2q$ne?cV4XqEz+Rn@}s00e;kI}E|7WQU--RMj>Q+s=i$nq3*-!c70#ekV>ER8HQxV5{`b`> z`?V608DJ3llD$1U>7v=+8+SJ3i_42LYy@Py%((#?z&8;#z3}CiQbatn0!Q&Ctk3ZY zj8_ZareC>C2R!lHWxk}p3FE*C^j7+sR9#^hOdlZFsEM-+{4*JjG0n+x3M(cIX3t&0 zADxxMB=A~>@^#z?M;~4!+g7^8Y}L7ys!ZBt&reNHTRE*bPxjEIx}Kzq6(UKk>JaoR zdQ9b}YJb&jW8~Q`Rpg^p;R>E{f>i0D;R&!*#i;zES->N1M}!}TJ)r@{SKmBP{Lg_1 zya|wlWvT1V=Z}bDKa}Z0hXR5PZUCh6|DE&O|GVQy$b{B%Hl{XP4@7N#5Yv4r33Ncq_Un{Jsh{?@&?zQ@N|rk|Htp9tC_OoF&L+w72uMO z(+;}i01oR0;IM`Rhc)~CNp^yntML(`eEuaI`+~`CULUgSPan1+F_fuueUSugu#?*0 z3ecKVOOf|%%Yj*J`x0SZt24`Hn@o&_lZ$if0vlbh<_ z@{0|nk+0E@jN_4>qc6a}#?j;V02kgq{~yG`PmdkIy2d2prjF4ItJI#$_7jRzsXxsc z(Xu^}NY%Bv@;{k>(*bpd1m47JC1}5ueNe!fS}2@n0QL0+Ssf8VSBU|$!TV;({PTdo zo6*E;)(X`)qw8}bN(seVzqD8=vv3)i{r`L>_=+mp)<8^FfcL4(pYh(CL1_-VQWV?> z@Hr+DyFHOT)^4kmy}{&FgMYw(#p>!rd0J}A)Qt-iT9dDNw~iXi0AR{t^rFT>kTme@ zpWW5B{<*9H@tcM>haYLGY_P&{ljN=vm}{iig#sy@$6Vlrx@A}5=~I?ujRn5KL~ zuf2#t*AAT;tM$aJ;NNkR0p_)Ky?HpF3;YeQ8G`Q@ncRv95k)VqzME-V|3D%}GZCcK zZo6T7n=#e4EBC6J6w1+yLnz6_pQ^oi!_1pJVVAYeObwtO6r>_wV+a9U*W(k&rSadN zz%&~H^Cm%iTO;`IKR)>k)YkR$(t5q>?aoZ=@rRp%LcM)nGZRHner&jtN!5-wtEL7k zRAA}?*q41(ybkW84z#+iGb^y9BO|JHS2TPJn9}gn;+&IoU;!`6hhqNucHj-3y?MShr zDEbxftU1~80{W)ug^~a48CvhFMUzaYa0xT?`rPJyy5;J*!B3M-C8MwF`g88p2RLqy z^r_9*j8Z{`V0~5IaXbj9O;1g|9~~dCKs}AhyI=bBGBo~n@q-slp--r;{P&8{K>n;70r5BrAf8J<&} zR-I)UJ27Y`&_JLESzA0B(I>;7&kRp%-MM-bwEnVE>2JdWf?*|?)cs0XTNd*Zu-cgZvzI2a9SvMVKv1y3 z`-|uAJT!XhYWk{t{vTuC0Zn!M|6NjUA#N(!7a57n2-!1)hP~IlHbwS`j4QkBnU%7+ zC|eoHcC%%cmAyC5=c`}p|2*e;e$P2N$LZYb`}ux8@BMzgU!T>1aw1{b!G;>k53V{9 zi>6l(sEG^MyCuP)d-Gj`f>-eii2PN)Nvq^eG)y1V)*tbDR zL_8#@ud9ExQ$T{+sPaD;JN!j6H2`X$r^CARqTW!pgMC>~P>|LWnlop?XTMZIo&Vo) zJYo&{Gf6wPSx@`|v81#B&z5R$arhyjY36keIp#n_$1qL$UQVk@=v&A<3~+pCNK1dM zDpb^+W$}a7$}z9>fde5CSb@KPa!>PVp!q_g&job;{CTMJB7>7YXKiV^0W-r8)9R=g zHoOd543Bg;5e{_iFCbpJRJ88G$~ZJ0F~xg}iv4VTj0-PN_X6&AUc%TNN(;KiE!ups z)KmHhYxZd`Ulj8K_=Ii7iAjEjM?kLdb3t1yWB?6+8APo)c!pgF^hhgF4%@D8Yiw4Nz7{Eiir84S z^7%9Lz+UR_+i!9J;J-`E9nH2A{Ur7xAd%g@CYCx}m*)Nkq56;#ceeW61#lMqVp)oR zwhxgHDc()T$*MvOl3{^VWaaWmjr?wX*LNGmo^qrs)kDiK$=Ze_A3`+D%oc}O@!NpN zy-w_1oRh&58;tfbJea8-;cn2t-@l8oa-IPZ^CDx%Y_y&Hey`EXc723of7bBfd4B>xzjQ&=W zcGHYj?emHiQ_Yg-sCEWo`d&`KO^XJH?eHfQB6&?Lk*R{w-@mbI0sD6BeG{S(vT7i0 zYioLV^9I|Zn!A83E|_`4olT+3eu@wM;{7y}oc^EnNW7{0_U<;@eJ38N%t#fd!O9}_ z+%#x^?xm&Naj@w-C~6-UkUe)4J|TkGHbuMQc=)LRbS z1*&K;K4zY5Yb7jNBMLpvQAu$le05mlMzVmPIAdfgV!=3Kz=klXLxsKuN z?A3`EAUq{+ET2j|tU0ViO`V02#cn}nstUj7xdKq6#PiKr5`P3z6q-~Fk;KMD!)bMl zO(qLD?5fxwXnLL0TkolZw9>S6!*xKrFMTk7;25B``nB^lEc#$zM7l zPrb!5RO01)0loaZ5e2E%{reBL!-<88h1(y`f)I_0DzSGkVi{(JzZCOCsV^4>kO&GJ z>kz)$#<*Ayw;U{N_^hADNdySZkMiK;(CUb^^o4Dnei5G5l2guW4HU6+ISX;JK?dM2 ztaI2oQS*=*lxH+V&zf;rXm^{*N7)bd)X4YOByBSPivC9Ou0=XNcqqMzcNja5Hj=aa zaX&D(JgX^72OR}V#7i_JysrRRAB=&n1&F7cM>(B4SOY*zeOofW4lfo+kl4Abi3`wR z<>&Qm&3`b41B{)12%*ddbObbs+CwkDmr#}mo3(UR*a-ZSdi~@ADp591HE`}Uohm8& zA_3hqt?V-8VYB?|SH;joTCmz9oQ+FI`wM)nqlB$*=N}u#yWeHF9zwoAR~*>Uz!~Zi z93L4~4qFhn4>-!pwS^QBm~Q1I@8TMiYEOM#C|K75{SKB36e%Wd48*DcWyHMHi#%BZ zTJ+N;*;jJ846`>X1cQ0Z2`+)$?NhlH;fbZZW(e8*YXvW9>~SQOKa}if)*Q;ax@I{^ zT6nNKP?hJj=A@@HyAj*bmZuwc-dFbGhXQ|r*m<6IBXPTX=a*uoR39h&lHniGj#aA# z@BG<1_&axOJi2bDPTx%onp#5e_}xB!d~EB>NlXIs>>)N?iyPWQ57onux(-#OT5R4^ow_nGszjDoU*}C$*^lQPtLA z62I)*tZVQY=*)#zW+dRU!1d%N{i#1gPvw}wb!&79%wM?eDE*pKpTj(NwIIY^4|2(P z!}u)9e{}54b7-vyRMrjfEiX~fm9(%s_T-zT={?<%ep?E;w7C}}t)N3&INg&>3Tdlv zym9)U02~bCP@O&pyV_<$$laH1E-xfEh|1e4ER6=}Lc2nOlbO*bD90!B$;|>*o=g09 zUe-WpH7Bl)gqOjgSa~)J{1FwedC2(b9A<&wLx1^v zI)f~ep!Qw|J^urErQt8W+P%4 z|E|dgqN|U4Tv$rX0eB8K=QoNM@`w5{;6XwPRQbq2(bG_A0W>A(Z&VzB0z=9+K=$A) zUU$aw0IxQ|92=_xol=Wl$v>(kc4_(DOmEc1_&ozmhwf5AdEun0mKu3#x~oM#AW)@G zJNQRNoA1^ci}=L6gfs9$oSFZNvpRbp2##2VTJT@H0mA37?Q6l&ha^!Gz(%fop}*=lL>N0=AKqo@Q_3kym!0%AjKCD*}s1CBx{#M zjKb1;!>o%!HWfkLskLtlOOD-{k{CFtr^(tiV$f6V z0fywLDfQk(ctMjC93BF$F;EPuK$(mD8|R8Lo_Bg|e_fW_N%MnhS&tlOwc?O`vYlq`invub9m%F^Q50LPA zESaSVxBt)sgfmPN9MdaxjfbVBrM8qC>m{_e)-dG}Dfm}e3%<~Jeh1JYAwhspvHTIt zx0u~eyA$N_DK59NvQkZ2NTt1uBP|i0nH2J^It7Z1O+RKm21}WTgI!ewVKh?ymk`Eh ztMy~%!mY(0AiZmQ)K-TEM#11GKvKBlR6b_Y?YG9C;`NV}G-{00YCt@}y$<8|c@5E{`Gy<-(thnreimGF%?)mZ~@lvcU@?1gc%Pj>4w zU8U^;bNwNLi>4%u3I#<)MOQ3|r2&d%9>6*=V0yg=&#;1RSgX@z*vBhp>gMlsInX=QntCS zPp>Ou$ak~|U<9QAkgl$x((|%h_1fTM^wy~7D0IDx)}u$SsXX^r$Vk)8L>9^yN{74& zzfd_QAGzITnbfr{J0-XW0Oc8g;Ktwl7QlzuoRU~z?5hlyDUo1 z5vl>FYSN9nTdeYI4@>GGBRl@fxx_UX=#DPEwt)H{2LvT;$&ha>|2QmVhI!c>6RB43 zR`A<3?wwclhpNP)UU1O__h0Wb=U>U+Dg<@;A=9*A@pZNd_V7yd8+4aHwaYuJvdO4% z?)okw;q6*#w`DQc-Pufu>uddmMlT9lSJE3s^j{E)UtU$!vbutcEOL|@jME#4L@?KHC9zm&*n#CFgLEHkJ-68cq=>uUPQlA zQ4w!S^mz{q?oe9peV-O4tsh(bLO3~UySH3Nv;Zz~xnQ*mZlxlzoK^Z|OV@0$0&X&5 zP`JE3L0a?Cdro;Ur$`ML_o`RE9zchf37~)?07Sb{jI6OU#ay0WSZ{9KGb|h#<;H&z zp&330nS^qGV?9MEPA0Jqga5VM%C@+&X}q4L`3sY0&X#~^6nXvqBUc(`kdWHyh!S3c zbk75h#+|*H_wn;vg;+y8N?TEMt<+rxL-IoME@wc1P$Y4Y|2q1k-E?~i9<@{LBAAUM zh97`Sq_BW(p^msPP=9|O(=mw8UP+8QpB5@S$O~rXiM#Gv^s-ifS^R~JXx$<(N;+6N z>aiDAN?y2Ab99h@Kc1H@LgweP%Umw$FPV4J3c4R{Q;x?;J4XPv%UdY@tju$2z{_$c zKcA=ff!1Qhl5pJ!z&Z#@x{(y#=MU;Y>^`KPt+^5C-c6M&NT^I#l-5ykCIlNTGpT&; z%NpO&CAMlXw_WSc1s{pU6;13a>z1ja?AUogvGNU~fB;IDMthhHF4ajHj`&(AG%$FZ z(B*o!j9KRntAPKg8OfySTq2Oo-xVCM{p(P`<%+DU1VvLvO%5A97Vm7sgIeiw{O! zLHl+g#h)4wF>Bt8P!dX4L2==HkqcWKe64n%wB-mI9=o%= z&Z|GE=Ma~!jYqy4224h5=nl!FqD7wfWdY5@VEaFlH>ba0e0KXY3yzIa>WnCuZZLqh z$pJX7{x8Ctg$PEB?lUm!aEjzfpddljv~&qQH&7g@FT zY8&@CEirq>=4%EN6ajgR&7avD(1CzWyQyeI}d7gw3SB(53 zY-u}$*|K-SkLp~$N|L>fi;Eb|uQ_xft_^&M$O>^gORqxEDe}dcd>wIV0HWFkzNpDQ5Bzw5M|aJ6)*#Mij`d1k-Lvt_5jU zd^ewy+oNPw_OU`coi34+yTak6^U=( zvvKd$KyBQR1#>GU5UBQ=H_!V_xbQva;r{+>&0-NqAtS6k{hL=@am-e!LHE>#RhX&J z2qC+vR^T5==Xf6pi`!h6g_w>?J3KZqv{iS+?}RtPK1lM}u|DX5eX&HZcZeLh$#%JS zNs;f?FUF=fR1D-R!iZ3tx zz$6woGY>E@LOE>r?RmO7!;hA`zz}*qB8X&IQP7N3TyR0EQrfhyR|F&xdtdI!fT-;! z5ugDxi}KA%9=2Q%K3(28%4s1J={K3On%PrSOboTpB=fWGzW|BE`Wt!`ufO7pz)^gD z8V5qJyi!%sGLKXdw$p)Qe^LDY#4rrtJ11DWKBZ%)^muW{nN8N2gjWKH%M`j72>HGf zOSVH}e+E`Rt)=`#?hV{0x9F7-22;-7$}QJmA`uh;-_RrJZ>1xoY;&`-x$7U*_vBeT zf+SXG4xo!~b_XMZYlGAQ*$Enxywi#jAMTgB%x7hMe=0664iO?lXVPyZ65~w-cTW zrsRKm#cv*>BA|Y#@LDeJav!>+D=H5W%nZeYezKG2lP*%yMxmFgac5=inM`;e)b~?M zQ5h*+&!Qh8`RWeMW^SYgge7sA$QeIHn@gKY_%{byzcfuX5(C>J3@%b(TBp z$2A!O3cwmC1V~MW0Nu_4pb{gbv(P(*-en-X{dqAKl|U|cUK%^ka0WccMT7)nk0wRbW^de&x#n8Q)Hq9Pe$l;%<+1+)im`-xVQH!~> zK^bsR9Nuwn3k(iXT$hy*GH*MIL{v?++Jg?ds5Ru~6?a{csX~z}K8^~hX%!4pO$*X3 z<=)WjI$}6WnvfUl>x=u3Cr`jSK&V9DwDpDMC4ZYZGnL4T?c2!83chLbq5OAKzE%br z743-SW`gAsiR{~|uWdtgI9(quk6^Kv>K_11tC*7Tj`5ITAe(BASCFVY&-!st>)g`Z z{27(LiL5g5nFbifTauS$=r|_d-jpQ~3(^nda0S-gU*MkEa5SP#ov>>V_E}PlJ|vVz zL^%C(9W_sjVjMN@6r~bS502LaG zY3j&G=iFKZ!#g9KOLaDb^S}-q^ z5DG{t))B45b^o-C5IczYgn|wC%j1^f&OT?(J(3Mm#E(}5*=dsj4%kuQ73WWtliv1L z?^X8d!LSwo{7(bJI8cb0FuiT351G24_b8DL596p|v=)&-L$_o6}i3f)Jj#EJ(JzJh;0@ za_p5~d@&ZE^cKMc)5JQUj-l~+{7{o*QbCf7!h0iCD)6&Q3kZ11+Y$x)K!xCidXT!D z@e))A@p)7~nny87U;mVvj&F{^QKzqLuCQyVd#j#A3HNluj7e{XG%J!m__hiBYZb`l z&UHoE59nAi+}`5uxJyEp0JImCUI(Sb;=gP>LPKOYm?rOZb;9N%eD#Bzj>cXP`8l|Q zF>fM6UJG0LtC%UC2W^3*>=z$QcKZ^C4Cibq6t6>RR&S^uUTdaOGIeSasx`)d!uq3u zI!Qe5r&qFOxK8Q@q!ZhKz=k5V4gUVd3ugO}l(youx!o~1-@yE?rP4*k=Gq z@NoD{@f4$H$GU=ch6(3QHugns61D%2u=6f)8*v68wyD~E8FJ1CbT=0-nkPV(cwO$) zr^^qn!AYJ(peOUfzg8v9&>#}%sxJ-5^KckZqU+HK=|xjpvIW7-DZ+G~{QjOdUhJYT zNLNl}X70kn`0=#(&wVO&9e6<1Rg-h}{x2&@yIwWMhcUcG1~*M;3FxVfY#iZtvq(6} zIb(KBNuD`g$p_het+!o2b6`n&fJca=4c79}MGI*=?aR-o2D~}ia8Eao?+_`W0a53x8H1Rf?T@XQco`mA@ML$u*&o;#v(T;tw@Cu_wX?i&F zn`v*7F5|S|uniA++j@{@+^olNjT*JZ)CQnlTT66ZnsfAA8u=5wOh-Pi%B|LSl?}Z( zG@|QkI5THMs8jkuEkgqU4LU4vBVvD-uc?UjOF1#&v7D_%y*}1OgDauzAiFqaiXS1zq`Fro@P4bw*A zPS+8mBQz-CVv(BhkOc$~IsqZVBwk#n+rm^;z}}qv^b_C^Tn?g&|B#_fDxu`rhzCFv zHs{PHZyY!9JLhrLUG{-_y`Z-@*yk2%8ucBi@dVd)^T|k!XU)=NWq4Ite4>fa9=lk1 zQX2gbkb*2)OU26-=ds6$j^7jVioadm}+nG*w6pI@j=!>m-JMbfxX0xXk zZUg?<4=NE2b{sleMlW+*vm|Z|quknl6E~yCJbkVNt~rE%Vw=sL?*}KU~s;D6#3-;j&NO)E&6*%Kyl9`HYM zS%3RQ?(Abm5LR%}xU=AZpud>K`=1c47D=q%Y5z;IUD8a8xA^9jK|yQ^L!rYxz`=+7 zU90)6HQ;-{po(xB{GD{zTlNIuSp0^4L(>IWztWJ$vWywBe44}PcoFcPS2+i?AX-}s zZyn!%`XY5CO@q`}djDy0VLbx(Ax(E0vjy7WWrOG!CvOrDQtNd_FO^d8Key?Dn6%kV z^%w4h=`s5)Ru>-_yA3SH@uzr8)q-NS>TO~#La#!4T0Yl*dY9tD z=9G(?jX<&ETb9Lz3^FV#SpEEeOn@kE9MoxGyilrr#fuRVNbsbu0cS_4v(mWDI$~$T z6wLhWUq6m5fA+}Re%Mdi@0kB><1*m@=#>5GNCivi7hV%@k9zcDkMRud`^UZ;p)D@j&EsZI`WfSa4Pt zo{!Xa6`hX!s3{hwfjuoYsOuJmpc*a5%0^lE+0#oss>UE2>DhVZECd7u zk6BBOg|F1Fd8k)8aWiP3D}$lprg*Qv7Sz3p(pRN@0#&XS;Sv9IKb8G)=dCv8-DoLA zxTepXJs9Fj$rK^E)cQ*IM<>DT?b?}t5{heJ;NUf}Y6FE3Pb+WAtCW*B zq$9qGLlCE^G=(GY=xF~|+`^Ts`0+I+ppe^op1FpSH9+JyBx z$U~}wu4dr<;R4WhM4?bKOG`w1TT4Ws7;f|tsv!cJMCym{yB}8fz_2^t4P#;_`0Y50 zOBp2Mg;1(4E6(pZ4(M>=A*edzXO-Syh^qTX{llcc(jY1X*Pr7!cmB?$QcraT&Nz$f zvJztdbhdM#oc@=#y(;i>9x#L~RG=)idh|(Z)|iWo_^n3y-mmQZi|p>R@^y>D6$hCW z6@r&n*$nDcd&Kn@X)FoP2o8!Dea_N!YPMtS2)S!!{gWT#G1K%)8nPeZX*WmPDIohu zn85|LHvasmOFyqln?~UatA`cx^?i%=A(UgS&~M0>_g-Jw;owdrENl465l!(STP}6; zWy{7tEciTEyxgj__`s(rXgQL{{- z5H6j<*2ac!QWAACgZpHpnjci(At2NxeuS2Nfhb^qGs zW!pPW%Wv8Yh1W7BB)v%^wA>ok$Hv|)vAYkKu;WMTx!s>Jog0M~J=HJUyIW^Cvv|+{ zmTP-AHFgeHn#M)|Qq&Ojvpf(hYcR3Y&L7JIX@HDAt;LzMUx?HH;}BV@%Br=)sQHDd zsXbS<#tWIKwV!dM9act4{e9PhGF;;H0h=puKL#tU0X`KB4j*axQxKcqxryU{k?I2A zH{I%U^OJ~B%=|X)jeiTq?$TAg{K_Ja(3Sl=jld8d?=4v^kvp7mglFgQ1zjJev`EgT zs|Mc5zB410$17RhIIX)HAE&)+QlVuf7*V}o#d}lvQThiS7>fcBZ8|TgY(1Vv zbMS77wrXG8XXY`>6^F&|v)pN03qz!NWm9n+AKlfOI!Xp#4SyxX$9BCMuI!{_8yHTF zwu}1FyL20Z|DWqrG2REBBt)k?}Kz_qr}*|DW7A^cqClDN9h@n zl^%Xl-81|4FyaZU)ba%9*>8{28YIjaMfmy$eo7Vhm2-|I71uDcXR`s_`e}GS;`C-{ zHOM}+!;sF_9x-qs9-hm9aG7LtX_O|fVo~78b*R*8GbiQ(z0B0S@6YdkXU&o*);7H_ zmP>P)?a2(;y)9+$*MDw5@D?hun3+aCp$ESV%XUSu|2Ak#VLVG6;bOd4wld!-hcNmHBkM_ zQI0L)$y^o-6qT_=s zvqmbgi)29t-B^Wfw?1#Ac!@SqjwuS2Ju0Q&0zB-<)1NFHAs|)#!f9Tl@wdnQE4lWw zH``6KGiQCpIqkQQ;xdjb*IDKl7{tmCjacwcpdscmz}7DGXBz{X9t_|9Oj=DWycXN> zk=T8qq|c8^&|!P^yG2HxbXfa<9itZM@`Rm?TC)eXRH}Pcd`ok3wi0G}6;f6y)g9i; z;1|Lxiv0h8OP@)+X&TYxRoB;Y^-ZrTY^TQF)J2Q5sh-DXj(5`hJw#i`HUHlAI6MxmK_iia# zEh+eZ(pjKQEHp8-ha9M=0u+3$C4i>)t)Evfq8S8=NSivzkS z*?66q3fo6?FQvz4Ae)r_e8S5ds9K(192UG#H#d|=c(xY{r4L9BCUa}`%a$iqMOd{# zd&w=SA)Ex27N&!g$^M29;EERU=doRO7~k5hHU$f8RD@+A*uhYMveP}As`$6mC<@@M zW-4dFn@B@pxK6=z>wKjUDvmi(k;!e&JL;LPhc%D&YUUxdo|>4ZQ~}5sTzoCUP@mkpFu=2u0j$%-5)d8Dt$d}38IbttOa2`7HyDWmdkeD+*{&&K{Q0h&X z9s!2iSx+vvL}<3fK~24IC_g^2-Tw)Nwt4|W|1O@^LS|dkPDtbs7l^t3C%7l9eMU-<`|}= zv&mN0WW4S74H*M1Adw(^lP&v4j!wf(ad6OGtxmedg*eHyfE&)syChRkKFr!%j+XRf zYqOxJ&)i;)84M_ALdqMBlqHR!ONB$E@qEGFKhEl~7IS>8Fc0`br zyL`J6y%2@S75K*rTYv&h6)y#}gTzX|AEOwAJZPA1PqLpWqB)OU3G$@Z0G1#;^@biV z)ZM)=ksWlh9g=U}pI;Vw?e%DLTkh>8+Ol>obD*E)Uy-b|r`uGWa#Jb>lb7C6=inII3qW1Sxh`op}l;)Gl(7{<2Y1(dI zN>6$74=7(12#L$HTLPeLL#&6Ravr;h{)(Yjii35rZHj=!=bi~R1Z;lN0qOhwkHM+% zUCHNy%C5hEyxuZ|X)*he7y&b8lkd3sRve|qQhdGFAue(M1VHbgxmv8_Cz( z4126B`KKRd{{7H@iXT9Sc_1NZXb5Xz+qGkKm0{|0Znxw?u4W2@fGDryV^fv@D7%%n zW;7b8AJ9(Q?dqj2B8eft?)+5?AJwwL$UI{bZo zeLIJTsT`I@sPf8xW!VC@LO*+fg|ex&o#j5ygTBKpK)6HgFy9Za22|WW5KFelLW}NZ zQRm2rN7Plz`PI~_`_J~bSC#=gw{N1LqhCr&O4wIp-iYnx@w#!r(H%vnsaVwK?d^|* zVN7*nWBN|x_BS1uDLk3Oydwdv0y{a5ZlP+Q}{0*XnX8VYu}fLI2NA z7Q*^-W_EVO?`(e0A-YUJQ0hD4rO;qfaa*FiFzb2cG4K{$TWIt}oAO|=ulgz@6O)9D zj6We|CXP7rRy2OJj)R8Nf`uMM9w2wxXCG;w8w?nP~a(m9B_hukZ=-pNHkpE13S5MERhk}yQ-V&hJl=uib zx!*~BezgftO-*Tcf60Tm=Dq_wV7%(j6bXM2;4YsfP4V3J_q?O+u`}tl3ZE9)`KsiS zE zJ8x~FH1Ou>=dCTxn?&bNLOL|NS8QzT@~o2Qpr?SKU>!i`&UrI@=Ek6D0L|vI=h2qu zt?t8B_M@Vs7KI_lsyUrovPZo(2dYr9#T|K@+nT-X=c{FJ(n|e0OjJjdHg7y3bdk$v z0Cc3#J@}=z*HK$r8#llaPqDIYM6(w&)MPmmUHOwim^-e6*n-Am+kn(mZzD@BH-0qk zY~myy>@&@7r@x!(j@Agk<`2X_y9;jU7#}@c7@e0Y-dUdFtKrvno{Ze&(i9E~3i1Km zd(EYDrsqKt9oTLj#jOy_pd=&~hGeX|$TpBG0Ni}16SRZ)yxcCcP!WWc`7ak3P>Uxds`MOf3xj1$m)$mGUz%|F!yR`b*O0^>Cq;Z^w7D~-<9 z%g7y*s66Rn&rh1>x6JvP?uSJ&L)@HPN`0UepeP>(Ar%~{l-Cx-{ z`Vhjw?Jb6h{Ww!ycj{^v!LukD8Pm7g6Adk=m=qJ12NtwjavUan+*`H%DV&!^YewBg zBbeBmY0nji^=DQBY?#Z)eoG79cHP6#2%Nc$b zCDJsh$A`f40XGyF2kWK>GQ4r^%D`hsDEZNmH4ghL!aTTM;s#x#+Ip;hVK-{ZbbE<4dc@VG7MI?I@p91_Ds% zZ*8x3Kybr4rNf^}<%pJ7qw_c0f~LmD4M>^2e3hFO=4p1qX;$3dz=Mx|y;4V5RM>pAc9J#C1_d=7~)%Upi-826+h}%<7UlXMGZb{+d=7vDmHDq zw%hWq1~R1dl^)st9<3M)f{aO~HTPUu$WIYkTLx#TGyMDSC1vQq}=G3N85N zIGXu>S*xNnu^--^tsQm6fPXC6FTforyzTouXc$&L9~-P6RNES4i{yHJ2*@E}$-CW| z+QyBy=8g2s>z~YjQFN1np?LY_U(ny;j;DHX0IpuxtO=lSwZ$0ot+<26b>a#{Sx?%r zlDO&|Fox&3jCW@51-)GU<#c%V%GvnCEzhIAHR<&)c*qg%GYM5i2F2Prp@yBzM{;4- z5wguhz#gH02P9RC{-?6s zE##H6Kr8grY2+LxFvZ3-dtoUu?~XFC`il}QXCUu8mIFgPKU|?XD(pZX>?9xUWC*3I zAwNHBb(2ysDP^UbHTOQoLoJhttdQK2<&OG9-Eg#&>$dnq}@ZDy@DJkyP1ikj{}Z2LJ3$%*=gEeV!nXxF{&Y zuLz@;&_gxbfi*L(;`BcakCG1tlASei4SjU#jc`%*6Q4ebk*2S_DCVdHh)SK>;S!7J zq0c3)2qqy+_t!IGzgTTAn?dnm$!25_&fdWw`{kx? zQK>Yfjj+m>e@8>T&M_5)vH5h3?B^i;**C*nN)l3eefJQ zyT4VvRR!D{xHF;}e+b_59Fob`AHlEF}2oz@Y zg`m_4pHWsR$oN0G)32{Fh+H!4Tw(8YJmA+^pITK}B!tLjUf@2o{#$+!O@uQSMGU$L z7Z~%kyvz7@PfOa)ik?9>zfJm>1WNQfjH9=9q_Ndhs(U{+d528z;;!3yEbDA*t8qOF zsmHFTNRe`l^D3OwAg(G9t_?icrwE3R{KTAa=c7rz!v?95t;%Vkq$x`Pe|r;$k@a-Da3{F%vt@Ww_6{<12D*vr)&vA3J7jl#h)LgEIv82< z#lQ7Y|9xC7wb&K_;8m}QDINSJ8Zo^(4<$RJbvIiI0mGI5efU%+83m! zh^GPsMOvFiV0%r|9}jPe3FL*p9tPzK3#f!N#ZU5JP<7scR=^6Ard4dbrHOv#5eR~T z5xPzm#u2DuA?Q)`4^i!}sON;l1vRAp!BqKzpi^9KO@E^fidjKhl%x0g*dCMTD$^}t zu9hfgsEEk~X2CP)r$ zTevpFbXP;Ur@jc8zhs^6gT&FDM9ii1>8UBVS*v=RO=09)2Q953GS_R|fuzaHugN|| zvkZL*Ag6;gI_U{Qw$pq)f!S z`dOl$IRto-5TkBm45&jfK=SP%SfnB-*AZK}+*%dx`3x<}2BiWF?vYdw6NeGW|F}`Q zkgoR4?E2RPqO0~$+b|x=C!yNAy02Ozl;zfz<6Z;z+t+O4lS%=5-r3*N^Gs8qUQ<#I zxmuLGTRUEYBiFd-o!P|5z4pKboNEW!2A@S;?Z-$Bxm*>wD`JGAH9{!P2|CQ9Z`pmi zDn`CXoIbuwbF@NJ?aA%QUEwt8r5=I~eb@487)3Ap13#fpvnW3HJ8Y!DkpGE~vE(Y~ zrMe`JH9V)63E93hYjGYMUIiON54O%A-`@Sq%T9)9$FMr_q}?sA4nK@M=|>O)xow{g zG;oL`t(s2)6`cL+uQL}T>2BhbKuOfqZWZJ_kl+xVCgWqI>~H(fEppn`zyNo z*V_0hz|Q>Gzy%lVcnqTU=%kCZZ{t|oBc8ry|IC63igmAeAVwY@%TSSK@=@a@1?{tv z7f;p6DGVr2M{A6+G6auN1~j$4^!OPr^BLS$`onvnqeZg8}a;;<3MteKpL=-fn5@V;9vJ zVp&gA|Ma3$_|h4oy9EYfaT)cov^w{~z|AHB)=}d~vnO{D)ITWX-*d0U9%PJvh(ffr zKJ^%DX*t*5F>k(I7d+Xqk{yn^2e7!g4B-A7v}giUD(UFB^0_Iz43u_uxsf(CP{Es_ z%pNUD2#G7L+Z8GrAg(`1{s&3n6S@;m$=C0CjtewAjWAKY9(JG-l#qH;3yOC1jd1(z zwqMZfzv*~|H2VdB>20WSuD~ns%d~LLSCcWLAXVMV(ZI!S;F|epAoq)o)+_+{X1Vu6 zbx*_n#yiA!28?!~Ti`y7dQ?!9gI(v0ntT_V(W=|{v#r$#DI|ll__PBa5WBEXbhJ!# zi-22VyMf)Ku*0yC2q=cLq}k>ZC_bIx{&d5rgbWLt?Qee7n-A_>sms>gV9{%*Fo+*$ zhYhh39U6&j8d-mXERw$xfZ~r+EjfL`2AMY>)H4Z>_Z8*bPQ7g?lDY%tPp&vD3|=`L zBRbSKD-}rHg~IX*VnTMLGq;g*8h3i^KoC0#2}$)&K6y;tg$I-d$z;Rfh=Xw=&;AAn zBsaZ+9Tg_=2F)jOG3VQ2ag&t;XZGxp_q3h9#gF`S)ql;tuQ5S6T5v#U&w%lZtO?x3*Hm1w7F_ko9Ub(*}XH=8;seb#LC0GgB(UiKo| zrfx$wfen39^|b6sUV}*elX|R@$Li~Z)q%lnpUxHq>!|r^DCvuE2j!U=j9cHO^shu- zdjN;AaS*vRNH7aZJLT#v1co0u>tY$Q;9oT^?7J_y>RqFzzNozivhZ486H9M4?j(5n z04i<(n|v^j(zz~ek6bdrHNZ77Tv?5-`My;wT`wF@hTZme3Lf5WqwWSbOefj}0Ea%0 z+r+*brP&TW_Lr^;!$Cqf7Sj|!~^?#{`9#EFQugM zo4xIQ2f9997ZYIgii`yYhz=CUhy!A8>;uB_GN+(Z%@12zZL0thPzNTpzA!gu=M^yr z-FCgJ(5JUoqPIp?ahwOO8=qt4HUOm0i~};)!XsmQ(@Mh<@>26PJ z2q)0Tx48%)Nic5fP*qGM)C$~@+~=Negj^T_Em>hqd~8EDRZun}ht7xoC-oiM+6L2k zF=MGWQu7UJQS{TAt1`97tLtnZzE89$%Q$0LH^7D13$>Sq=5yOdStZ;7EiE20mir99 z=GBDQZ`&cuf!o3QZI*`h2QTo5$~#@bP|`<^4pw_)sOQ&B+iGxusy4GfJr2*FGIwBH zasT}!Rvlr`yOs^@oc|%ycy6S>2e5bV_cMHck&6m!nOF-aiUr1!k>cpM_4eX=7xp6eRuR(CMy&wlPT24I4VxMDV_D=s(~Np z4qZDJH+lFKK^CfQ-*P!L6A6anZ8=I@C?nMiCA7WF5iY4y82g`?kMc zmlsE%r*@!H#MfsDUl{9+o5v9BmXZly_*OsNnnzr$zrHFm=pVn{CET0-<<`7RQzN4# zJ-d(F>XgkYJ)yJmIp^A#x#jq|cO(ffh;~-_94^s#d|_HmO+X7Ba;#A{_6JneBk5NH zoEmoY&SRg1Bw2zUfI8G60%d$A^&-KVnU-gc&oafia)r{>eq`Hef!6nWZ=vcvPEhg| zX#Dhg7LxPdKg#*Ima6s+)x;rGNrb-Ioa;oTWz31PN#vq>W+1+alwAMtw;YlHx>>uI z@ejbA1)bM^R|Ypz2bL2SXmtpN-N`)L74C&u2VH<0v4gPnjuV&r92Ce3^s=0guz(yb z;M5u1Z?E~|KNVja6nvDDOYb}wlo!eRU;5UdfU9?hJCaCBDK>)_VX6GvnbZ#i zQNf7e7z+eZ{sx5)uczu`giwR5vlm?(=YJ{s8nYD6mS&xTzk`Mx83c9}aGSxqXS4k4 zmn_eDZKKPVdD}25Z6EAQ+nlP06UuFFDPbcUNnFs z3u-j1FhE!X5MFP$ZYt}*u$u{ASvon$bNt_?q@xQ~?9P?S5fF|9!&o<-iUq+dzLBbf|LL!fy2wm}&V2YGC7Nb!@_|gk3?cM6Y%7 z$rbPfwbS?SLD}7(9~Ke_DgpJ}B)F?T^p#RAq&OllX0EcNRyxaW!ZfeGrXM}#RZRY8 zSN}mkiJCx}&l*(E|AUb*>WIyyjqIYvM&6tI)&}*&Fz0U``9Xm^?Pq4DlLt$_S%h(X zF4kBmHyS!oE5xs;+xjq@_Uwq@|@9iJ=9gLj>t=q&tR`mhKK|6lv-19tr8Lp}X_DJU;P$ zfBn{)HS5m3bN1P1*V$+9ea;0eRU!9Z(S>P|$0D=S5Pm~v=K|5!Ku&hSVAk>+;8k_- zz~Z+@9zRRP{oi~-v1ltT^DM<%$|Mt#4@Lgah?1(v(`l5^!QhOH3`~hgGK@%}d)Lc; z)n?r8o}P}`h4X4#V7*XknEaTn{U>R8`REL^B=tQOx%NNuz|DFP_Cj=o>`iRZ3r$K! zMLUba{ui4{I6Oj+IFm>8=d}TBvp#$>An*?mU=TQP~R-!p26v#Qv1JzzVoqCRV`3X9B?C* zDc+|)maD@;WuVEZkcr~c6^DS8vuKnwZa`z8#L~v&y#PYo_KxeR{|W1Ogs}BjLfRez zk&%Sm{avYm^I_%RGR{Pa@u?m`pa?S{?0N$q-q z<|kOy|B5fLyZ^0wZ0l=HfHWz8f)ftcVk~QDUB4C--G{Xf)?q2&!q2IXnwyXMlSJV0 zIBIA>#^`^-2B^gy>r$Zh?-eKRUZ!DDsMBB>;?_jA`zVzocq{}x!i418kf z%JeZ+Q_b;+W-OubvO>3mheZNV?Uyl6ptel{v+ZY-b1zxuZ?b_(N`BMhW00r8Xa?wK zkfW$d`eqjgv$S*K#= zt+Z*)2o(Gcdm;jW$O11vupx2z*H=+}4-ft{ez#E*U0A}C@}N_osJa74&zb<0I%4ly z{ssO9*Y~rP9|vb0cD`lN%*447VcELXPa_wqcWTYS!Y4Rps9Wy`o&6KKCIAZW@(F+w zFf0v!nQMwVInTz-b17;3A7$(0Pr3Z)EIywCfq=*0H&8D7R}J$E=+aN`0_E5{h0T&1=8|te0)3YZ$6(sR;MojZ;TIA1@h-d%hdl2Z!R)*-G^z2n zIMHF7tyaz?2H0+aRy+420?@wgT88-lNFNN$JA*69>BGrcBqFIpD}7Zoj4XN8z^(=6 zmhKPpN=i!0b+8PFw=eatiwZKHQBhIpdwDIGO17+$9ssplV5aN;4!X?;INS5amO~S8 zaO56m5`NR+p*7JFm6iS~np<$?sI->FixMocC4QjL!;?(^_4jVTZ>zU6Wc=^M^+%1H zf|b2z<8&|YG8LcYg5pO45hZ%|b|44u=z4zz>xfkl+{%6fDge&Sss*+RcRW@*Y<{@= zXG7JaKtB3t9sVC803nEb^t4XWLI}f4e6i=-p)-7Z1*(+V@CQuPW5uny@m7u)u{IS&wkoEJALd;d?9U0@!H@I+Y$ zB)aw4Gop51CA104F$%^OyH{S|>1YoHK$b~#|KM7b|oIVA%j~OMN zN9}J*SzvAPM%Yy*(Y~!$f5j{W4FSgI&|c8_-;580x3PPfpLc|e6a!_Pg!MNZK-skM z=cAVdvs>XT(@oBpfA7Zo%dvTx2mt5~|G|&vYeMtyULEhFx+X?^-d!*#c{F8yNF!*w z%LefEaZ#rgCm;3O$<^qu4Um7duruL_j1x#ruK{vJywhj2{ubCnQ;zWy{a^Dk^%NjV z&6A2RfVG+W@R#UtZ&=~8WN_orik+m@MSuKRJK8^*F+o7xMp=_45P<`uaY}%d*U*C`gD{a9P`} z9p8}3tsYxC6{5>AM?)XhVr@jns*^@NzEgJzvxdnqG=@6IRsCh;*YzF2#FG^b1H1Y? zbe(C$1hNLzd5a4C73xHqIwu z$1sNyDtR}Vo;GlQ@HQV;C4W=;>pacyOngaROWmIf1~)`o{p?J$`&`qU`q3TP3E8&`p6?w)lipX)kE1fkdXY{mtykeap+$!_!sMBoE zyWWTOTlI{ltw_X4+c9@7tOQ^ftN5_4|9s{mBb>ghvD+Q7E?8OxCuG(_G8G|&Ge%D; zC}!2OLw{7^zfcfWVyU_Ya?1m)dv#m#%%3Zfyi!3Qch|0VtitOLwQMCTSykIMrH6XW zAw_!jIS((B3o)yBFlhIYmmXv!ntrU9_b~OD8dDd{&9S|XquF;RBW_Gr8_nZ2mAIX*?N&wR?3Nx3{jQ#%rUHK)@=xtj?jmVQqdmTX9$wr%6BiPG?P_FKBIsqZpLSp z>Z|~+qZ^tmbWHoFlJ>ooPdeXy@#k9>u(Mw*cP}z1|nLRM4U}vk6FuW5s59@u? zzY_<|a~w`ro5FHS+-L7@^VCTgeik_sF{uf{Z%|#0IFNB(snmYt9#!~_WpzQq{zySB z>y_oCo6ZKBdC2c$ukM(JbZhv@)_xBsm5Jd5OZt;lrJA;q)t6q>Fwyd zLLD-I*WI}*H}?Rw!^{4j3Mmts8L^Nq*N!y2S~wsw zu;Aqi$mu7mp4uq7D?A&^({qb0`Jam)ggRjRm0eFTN#eYDTVj4F-i6jecpDbR;tgvX z_o4{a^;z%rg)$RI)#nlyOVc2INX1!0bw0*i(L!!w)vE*c`wPxYHurhyF+#?Qv>4R& z5)z)GYoPP!nptCWJ#zL9(6RdQ^sxi6${gd8SaQLP7MPSh%(7;&j~E`@^E1!!1@Ull zdYa~a`g1->JB>^m^K|mNAKC}^)2ujSz0SuP^%99z!6j{_G+t95n zJaQTyk;jq8uYbEVbYr%3m+(22>^gu+uhLiKJ>L-QrcJuQbUqPeOiB~)u4$ADebfnw zPhPtFSTr1WO9jp2VLfr%YKUe(yvAhos9vp_nstj5SPb1;-6WF}TG~SAxk?=UQCO2e zU0;)EVB@CF>-x@(nbjtwAziB;8oxI~cwx`Wco7C^Sl_w}n}&Sht2TUF*TUAIQQY{! zTmRO6BgeD9@=5#~zCQzb zlJOzF=nK&zo(tu$QJSWZpf1xVmMF^Yeq@GPZCrY$PoYUD%%xVI83p5D>{fncsA*B6|58S-uC+^oUb5|L=N~74+RB7bhhO}kM zObYL|XQC9e9-j_P{Q)LV+uE-5gj(7n@*N=y9VU;wL`o+*UE_1tgp3BfK(eGS?65TB z^r{@IV>6V!Y8p%8nCj<@>jB@ILh2wpDcO8nlKr2CHi}9D(u&1zV8} zru4lH;Ysp$NhUAQjkJP=z|owu%;`q~7?ZI=?bt`JCfta9R_gp5n`Slct~%;cp$wH@ z$7rjx{i=qmMSLqT?Z4J#4fnZL!t)4&DEFNsMUC&{tkJ};|&eVf`#`7 z@?pb#4}!!-7C)zk-%sw+nN#lX4qpnBIRmP%nb{Qfwo&ak15UhupmpA(Ln30#vaG5K zf8|}eFP{_1{-rE>Fl9#ysR^CP^V>sWI6sS}x2Z|o`)e4fh5Seu=G>Q!dTE7JWHfH(LKnvdl& z{`?&S?HqYW{~c?BIbd%B>iS@`RcLYg)!J`bf>c|L-gWmV+Hnnfrl>37Juo123FWK; z_vd7^CaR6WmOyv!isln%BeaoSMisvXBcA!!`=+1g2lr%DkBwoujH(NPv=80oiA@hZ ztn>Apekj}MOA8bT_d?3l>oQr)i%BcFqWF<6;ex(<7u z-}miy>E50@+c-V{`cj2V)aLsONM$kv-6`kz9eZn$ZNbS z<6eazQ9g`?r$xsiaoqIU@cN}|M|$m$dgCEox>TTVn~G`IU8q-c&cHr?LWI|hp$$93 zydkdjMc7Z#$fjv&&vvA1_}W;Zaw@?odCxVCZKOGzSHX;|R`0BWEPBcJtL(NlQs+S+ ztM!|vX;jS_RGPdYUx!oDSYh|;muvmIeR?Po0J4r5_W zCyB~9slm3@@Uh5co_F>=<))b67^^Ktv-@m0m&}!p4Rc1pJmZozy59E1v(keJl|7pl ziBzFes$j8kq815F@3-h%Abrt!I&aL9uM10zvNuQ?%q6Gl-CrD4=q`zgHy360GVbRu zlSxl|#+7tpG%MzZ+pr?2I`iGhHyDd>JoWCoe7;wM zuuHkSRl(MlwRfI9;+Og$S%$=8Fzn)4DCdRqZI1Vs{gE|dyR4S1(wrfQ3&d-cl}^ra zqHVM^DG5NPg-#D>oG~WtTEOORZA}Gp&SkNV3mdy+;bj}1H9vI?+5}Q|>U8ZcUDWv^ zZKi}5gN2gqcl)q1&09{Ls@{6!H|z1W;Gun&*RdHho~msVZ2%XY^=wv(vJ>jolOv9%Pib8Tkorsxk>Sc@9D%*Te>?xgV`SO zsxLrp=kb|{o0;7|4wiYZ&2^*$;g~MT-jaurvoXi3Uf=tNH)_3|FYu`SKX)McyhTG` zL9!y$)60s4Lqr?+Nm>Q-sdyadGIi>*4z8bU>lk6bpH*yG~y(HytW<#QR_q$4fHi zS%`2y7Lhb0U2c2Ru;MmbFbPR^pAII-|322(K1fzK?}7L`uM6DG!A! z^d+?t)a&82H5IOzMX*6?CFD1zFzZ3wbGGUplTC3Q)~m(JN`~ed`h@sWBjFM~dC5*p zSleNWR6|rt&N&-0GAxijOo}vS0;yr&U$o{*@|@~?;u_iYba?81H&#h-$+>NTg`7W| z--8xus#T8!{v*148NB6!6$EF?K{YU{xO|=wc(anyI zr!jpAWEI0D?wObQ_5M}kJFEC4eNiEe@DEEty+M0bAFtUE z=xUWBv58p9y^x|!)`IP7;LK+Po}$`)rh7^|s2{m$JGjl^H;*!X$!~r~;z@eu;}yuy zfOVALbN$6SloNj6wg+kZCDUOfmt50M4R1R-zZiXg4m3ORv*@@fhK?C~m0+m5fVrn; z|2Ft68ko){sD0O$SS;u!V3BHza&_YZ$0JcD2e|QL9 z{`HP@VFQ!jZuG|XK0o7Ex6D&itJayci<$}NLCk9jgUrf%`{(;ArrGsKE*|-%Ir0X4 zXNdc!skQ|x_871-RC04oMZPwI6}ilJd|A7D-RbUgp-E z`_53pQHf*jb{4^d+N=)5{0`*&Cg@^aL&q%YmY!d&pAZUA6)+Ku+Q7PVe2F=G_XUF3 zjBUDo=-(vfw6$c)BRl*gQL+fI^v8AW!P%++9o8&e8xq67akK%tN(e7rtm%+#+0-=h3YD z-ZbIbJd|>;>xNe*lucY$*n=U`{wU~%*%N;+k>DxP9@&ta!N={zAN&KEToO9tR0v$7 zcBGzyM=z_~(S>F%QLoLvm!5)9Hgk;k7r1S0xJg59ULSQ6toV^bg+Nxf8tv~Aoxz}$ zRu`~AB*vUXFoEZbqgUPrtrs-c1`jMIlcPw5+;fK2>P&?}m&oLnfqWOwEDNAifmQhX zZ>Qc3n!}H~Tt6eIE0!N=u0@R?Veo{0#-FQW)g!3fFOR(epM^P04PTIL(>nQHc0oO{L-2L9koNhhyo8Uea z@bd~xybcBlDQXX>d&0=zg;t1u#%Ckhh%XHJc+F^3L^ zU%g_4SYL$ynjBHkY^3*7i_bvZG_7x3Ag?^=^0KLb<|Gmps(O|FJnjpvKDqTJ3RMcd za5`0*l1k0F*XQ%Za>lXQW_FH3wnCm=mRJ;N5x$>Gt*sd&TkiQe2Rcf=me8hpAv%{c z#5F2AgXQ#NvVYYWq11Z=FaWb4Rc0+kV3o+Tr4Nw?{}hDSl~WsB-rqK3!MHKYjS zUcli6j^7eCYz^}03xX2%io7vAOm5_Gj(GbVfoGK6k2(dlUGF*UQXl(EGDWVa@Y%Gg zN;4Fp+?NeWgz$-h4;ln$%ogS=gOo=ortgD5OoXnF9gyt6XK9OkLm2iI9VwV_Q2$Bq z9f+Lpxq(ln?_%ug;7mnwD3@f19`gzg2$?9XgZx;;(TB*5eF_B`$>a*1Jq6AS!Dx5I z1<4oNb}6FlbNFQ##-Zqv(fcoOjH478?YJtJvb>gtY!S%{wubLfA_O(3MsXC7f{Bt$ zmI~kan6$@rwbyC#BK7r>`-TvGS47t)G%lM!dO@`xJb|v!5$CIg#6!eJ%gVD<2{kC^ z#j`Wj`*MrpMA%E6z!u2o^rdP_SSL+%ut(ySigYf7!LK^*9SKeV(fJ5WZWT5zA{TpsY`i`2lm6?d>n5p|pl+jpO9$*v^IH3bi<-WgKO> zva&XDe@~M%_Kv{%;7F3GE@9ATEa$Woc8!#~&rn4sGrG=!*^p`Zy2}9yntLVkWyv&i zzRMo4|Et@aW~Im@P=#-OdlvmxU#jcnAfHUoRJ-15JF5MuwkIrJR9@G`%$2^^?G$cO zWqK2=?Z;^~-mdM~v*m4IwS_c86MDb6am{UVB^Ax5RLGck{U47459_@vAbI58zq9;t! z^kc>eWolePts~tF^zFcwj_Z&Lcy&1Pc0yTzsQC%#5W#S}St-r8)WW>1@+|@;u7( zDM15P^tf%aBJb?Tulz{gw?vn)7>5;2gLjUbF@cr4=Y_k)a77HF;CsRKkpoH(9-)~g zZJCBnuj}X6#+JB+$D2DicI91&xTDE(onZt8*d;{@X&nlq@5x=S0trV0YXdnh zNivs%c;H+R=sdods5C%L;2CY=jyV+hhh*MZk?A6!)sB(dN9w=(lE+0bttU8ku>=xa z0eMTz=}S*{X81%C+##MNa5T-&a^}(v&so$VspRI68zvAh;%V#!@glllUK4FIqxXJ) z4uQb=)tlU*pCPE&4iD>#)|GW% zaRGl1;qry94RDeGi+A1`pNr@hCUBD&9hCxmmkQSBGeQoFYlE;IaH;8K))(k zyNm6LxMh}sJr(Wuo+a9OxYWV*?4jf;R`Ch%EYqW{-|Nn74r)x| zj5vHJiW8Pu>y&g{$9G&mjDBJGmJI!Da=0#*1evn1@FS zhCQAE7KcGM{1=cJY^$K_0BC1WVplMwmDyF()99!jH_Fdyqbx;umw_0EesmXR_xVjL z4&#%GHboAnz{J?}8A6G?p0{LrmT*()Mv?K5!vaYeZ02x2-|Laz zLdkWwD!4qCQ@?RGKdep?!oKIfBh}+VtrE5bVfg;yFa{q#>e{#Ia4kc@?S8(uB{rdj zAa%Y#M|=sw&ghU}ny*Rj2PK0Hq`E`V-M4YsbLW+~oC53pyf0<7q(L`12Nih-U2~#I zl;P=wl8gP|Yq)ECu@A0_WM|RM5$D}*&6+@QP^4EJ?V?wdMiIB$aq&R%$%Im887O*d z4!LC-hq-=baaWIY#Ua?HKKslos@qeEZxvyRe*LsLvFr=x-N$j=Ljm)-8BAoW2xsvJ z1mvk-&1K=oA&6E%f=TW@Ckcr?7ewC=OcK0%Udh{5JOE);IaFob+z0X}PaYn4C5(jr zIdN<^9a#_Gcp^~YB`T@NW)t_;yALE~e7=g_wWfs!xgwiHKus zVv&V*fSuDzo~`=pF*WA5*e>xmCZxpNzZ`B8@H`;+Tz-1?CLMkwpyhbRi5EGwAR?dz zIVd1#CaH**?lzTbxJ@nD!FD5}+>t~plqy^8+DUDoyz12LdKk`d84?y$&ZgRs=@rSE zb|mVQ^s6iurf1=Nxpl|(Vj{V3styyjd09(d(gwanf-Q3%o;L0KgEzso6M(VG%O`^^ z4YqBRIG}{S-{)<$+ZS}`aaxKhH|cyuqmDcd|FG|S!#h_#^9y}nZ+j4~*fxDg8)~-_ zFty5=+E5~)`l(#lvb?|+TI|qcA>U|A+T3$s&MOfXz!8tAgEp{BWbM)qNJ#d1u#h)=obtDu4rfpyv}i7- zy5PxWvTC7IjX@&WF<6ud6I*qq1n8gu(z}s0Ndn7gmKZzr(o3o{byQxgGvp78bxZfM zfzTT6F9qHCz!#S}&n=b=@F0V_Oefu#Pby>UOe+T8vL4RYBoR-b>jXdV21n~ΠYv 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%0AS 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 agXv17^M(vJ!4D1i+*f{}^hLoe^gjS2=P~>M literal 0 HcmV?d00001 diff --git a/docs/configuration.mdx b/docs/configuration.mdx index 22225a004..698638592 100644 --- a/docs/configuration.mdx +++ b/docs/configuration.mdx @@ -123,6 +123,49 @@ mcp-agent uses two configuration files: +## OAuth Configuration + +MCP Agent exposes two complementary OAuth configuration blocks: + +- `authorization` describes how the MCP Agent server validates inbound bearer tokens and publishes protected resource metadata. +- `oauth` configures delegated authorization when the agent connects to downstream MCP servers. + +```yaml +authorization: + enabled: true + issuer_url: https://auth.example.com + resource_server_url: https://agent.example.com/mcp + required_scopes: ["mcp.read", "mcp.write"] + introspection_endpoint: https://auth.example.com/oauth/introspect + introspection_client_id: ${INTROSPECTION_CLIENT_ID} + introspection_client_secret: ${INTROSPECTION_CLIENT_SECRET} + +oauth: + callback_base_url: https://agent.example.com + flow_timeout_seconds: 180 + token_store: + backend: memory # use "redis" for multi-instance deployments + refresh_leeway_seconds: 90 + +mcp: + servers: + github: + transport: streamable_http + url: https://github.mcp.example.com/mcp + auth: + oauth: + enabled: true + scopes: ["repo", "user:email"] + client_id: ${GITHUB_MCP_CLIENT_ID} + client_secret: ${GITHUB_MCP_CLIENT_SECRET} + redirect_uri_options: + - https://agent.example.com/internal/oauth/callback +``` + +- When `authorization.enabled` is true the MCP server advertises `/.well-known/oauth-protected-resource` and enforces bearer tokens using the provided introspection or JWKS configuration. +- `oauth` enables delegated authorization flows; the default in-memory token store is ideal for local development while Redis is recommended for production clusters. +- Downstream servers opt into OAuth via `mcp.servers..auth.oauth`. Supplying a `client_id`/`client_secret` allows immediate usage; support for dynamic client registration is planned as a follow-up. + ## Configuration Reference ### Execution Engine diff --git a/docs/oauth_support_design.md b/docs/oauth_support_design.md new file mode 100644 index 000000000..5aea9b1f2 --- /dev/null +++ b/docs/oauth_support_design.md @@ -0,0 +1,108 @@ +# MCP Agent OAuth Support + +## Goals +- Protect MCP Agent Cloud servers using OAuth 2.1 so MCP clients obtain tokens via standard flows. +- Enable MCP Agent runtimes to authenticate to downstream MCP servers that require OAuth access tokens. +- Provide pluggable token storage for both local development (in-memory) and multi-instance deployments (Redis planned). +- Maintain compatibility with MCP Authorization spec (RFC 8414, RFC 9728, OAuth 2.1 + PKCE, Resource Indicators) and the proposed delegated authorization SEP. + +## Architecture Overview + +### Components +1. **Auth Server Integration** – Configure the FastMCP instance with `AuthSettings` and a custom `TokenVerifier` that calls MCP Agent Cloud auth services. +2. **Protected Resource Metadata** – Serve `/.well-known/oauth-protected-resource` using FastMCP hooks so clients can discover the auth server. +3. **Access Token Validation** – Enforce bearer tokens on every inbound MCP request via `RequireAuthMiddleware`, populating the request context with the authenticated user. +4. **OAuth Token Service** – New `mcp_agent.oauth` package with: + - `TokenStore`/`TokenRecord` abstractions + - `InMemoryTokenStore` and Redis-backed implementation (second pass) + - `TokenManager` orchestration (acquire, refresh, revoke) + - `OAuthHttpxAuth` for attaching tokens to downstream HTTP transports + - `AuthorizationFlowCoordinator` that interacts with the user via MCP `auth/request` +5. **Delegated Authorization UI Flow** – Extend the gateway/session relay so servers can send `auth/request` messages to MCP clients, capturing authorization codes via either: + - Client-returned callback URL (preferred, works with SEP-capable clients) + - MCP Agent hosted callback endpoint (`/internal/oauth/callback/{flow_id}`) as a fallback / native-app style loopback. +6. **Configuration Surface** – Extend `Settings` and per-server `MCPServerAuthSettings` to describe OAuth behaviour (scopes, preferred auth server, redirect URIs, etc.) and global token-store configuration. + +### Key Data Flow +1. **Inbound Requests** + - Client presents bearer token ⇒ `BearerAuthBackend` + `MCPAgentTokenVerifier` introspect token. + - Verified token populates context with `OAuthUserIdentity` (provider + subject + email). + - Context is propagated into workflows/sessions so downstream OAuth flows know the acting user. + +2. **Outbound HTTP (downstream MCP server)** + - `ServerRegistry` detects `auth.oauth` configuration. + - Wraps HTTP transport with `OAuthHttpxAuth` which requests an access token from `TokenManager`. + - `TokenManager` checks store; if missing/expired ⇒ `AuthorizationFlowCoordinator` performs RFC 9728 discovery, PKCE, delegated browser flow through MCP client, exchanges code for tokens, caches result. + - Requests automatically retry after token refresh when a response returns 401/invalid token. + +3. **Token Storage** + - Tokens stored per `(user_identity, resource, authorization_server)` tuple with metadata (scopes, expiry, refresh token, provider claims). + - Store implements optimistic locking to avoid concurrent refresh storms. + - Pluggable backend (`InMemoryTokenStore` initial, Redis follow-up). + +## Module Plan + +``` +src/mcp_agent/oauth/ + __init__.py + identity.py # OAuthUserIdentity, helpers to extract from auth context + records.py # TokenRecord dataclass/pydantic model + store/base.py # TokenStore protocol + store/in_memory.py # Default store + manager.py # TokenManager (get/refresh/invalidate) + flow.py # AuthorizationFlowCoordinator + http/auth.py # OAuthHttpxAuth (httpx.Auth implementation) + metadata.py # RFC 8414 + RFC 9728 discovery helpers + pkce.py # PKCE + state utilities + errors.py # Custom exception hierarchy +``` + +Integration touchpoints: +- `mcp_agent/config.py` – add OAuth settings models. +- `mcp_agent/core/context.py` – add `current_user`, `token_manager`, `token_store`, `oauth_config` fields. +- `mcp_agent/app.py` – initialize token store/manager based on settings. +- `mcp_agent/server/app_server.py` – configure FastMCP auth settings, register callback route, surface user identity, extend relay to handle `auth/request`. +- `mcp_agent/mcp/mcp_server_registry.py` & `mcp_agent/mcp/mcp_connection_manager.py` – wire `OAuthHttpxAuth` into HTTP transports and expose helper for manual token teardown. +- `mcp_agent/mcp/client_proxy.py` – add proxy helpers for `auth/request`. +- `SessionProxy` – add direct request helper for `auth/request` and ensure Temporal flow support. +- `examples/mcp_agent_server/*` – demonstrate configuration changes. +- Tests – new suite exercising token store, metadata discovery, flow orchestration (with mocked HTTP + client responses). + +## OAuth Flow Details +1. **Discovery** + - If downstream server responds 401 with `WWW-Authenticate`, parse for `resource_metadata` ⇒ GET metadata ⇒ determine auth server URL(s). + - Fetch authorization server metadata (RFC 8414). + - Perform optional dynamic client registration when configured and supported. + +2. **Authorization Request** + - Generate PKCE challenge/verifier, secure `state`, choose `redirect_uri`. + - Build authorization URL including `resource` parameter (RFC 8707) + requested scopes. + - Invoke `auth/request` via SessionProxy → MCP client opens browser. + +3. **Callback Handling** + - Preferred: MCP client returns callback URL payload via request result. + - Fallback: Authorization server redirects to `/internal/oauth/callback/{flow_id}`. + - Coordinator validates `state`, extracts `code` (and errors). + +4. **Token Exchange / Storage** + - POST token endpoint with code + PKCE verifier + resource. + - Store access token, refresh token, expiry, scope, provider metadata. + - Associate tokens with user identity for reuse. + +5. **Refresh / Revocation** + - Manager refreshes when expiry within configurable grace window. + - Invalidate token on refresh failure or when server responses indicate revocation. + - Provide method to revoke tokens via authorization server when supported. + +## Open Questions / Follow-ups +- Redis-backed `TokenStore` (requires deployment secrets) – planned second phase. +- How LastMile auth server exposes token introspection + JWKS; need concrete endpoint specs to finalize `MCPAgentTokenVerifier`. +- MCP client adoption of `auth/request` SEP – need capability detection; until widely supported we rely on hosted callback fallback & manual instructions. +- Access control DSL (include/exclude by email/domain) – to be evaluated once token identity payload finalized. + +## Testing Strategy +- Unit tests for token store concurrency + expiry handling. +- Metadata discovery + PKCE generation (pure python tests). +- Integration-style test for delegated flow using mocked HTTP server + fake MCP client (ensures `auth/request` plumbing works end-to-end). +- Tests around server 401 enforcement + WWW-Authenticate header. + diff --git a/src/mcp_agent/app.py b/src/mcp_agent/app.py index fa8946cff..558691071 100644 --- a/src/mcp_agent/app.py +++ b/src/mcp_agent/app.py @@ -3,7 +3,7 @@ import sys import functools -from types import MethodType +from types import MethodType, FunctionType from typing import ( Any, Dict, @@ -40,6 +40,8 @@ from mcp_agent.tracing.telemetry import get_tracer from mcp_agent.utils.common import unwrap from mcp_agent.workflows.llm.llm_selector import ModelSelector +from mcp_agent.oauth.manager import TokenManager +from mcp_agent.oauth.store import InMemoryTokenStore from mcp_agent.workflows.factory import load_agent_specs_from_dir @@ -249,6 +251,23 @@ async def initialize(self): # Store a reference to this app instance in the context for easier access self._context.app = self + # Initialize OAuth token management helpers if configured + oauth_settings = None + try: + if self._context.config: + oauth_settings = self._context.config.oauth + except Exception: + oauth_settings = None + + if oauth_settings: + token_store = InMemoryTokenStore() + token_manager = TokenManager( + token_store=token_store, + settings=oauth_settings, + ) + self._context.token_store = token_store + self._context.token_manager = token_manager + # Provide a safe default bound context for loggers created after init without explicit context try: set_default_bound_context(self._context) @@ -557,6 +576,25 @@ async def wrapper(*args, **kwargs): # Fall back to the original function return await fn(*args, **kwargs) + # Ensure the wrapper shares the original function's globals so that + # string annotations (from __future__ import annotations) continue to + # resolve against the workflow module rather than mcp_agent.app. + original_globals = getattr(fn, "__globals__", None) + if original_globals is not None and wrapper.__globals__ is not original_globals: + rebuilt_wrapper = FunctionType( + wrapper.__code__, + original_globals, + name=wrapper.__name__, + argdefs=wrapper.__defaults__, + closure=wrapper.__closure__, + ) + rebuilt_wrapper.__kwdefaults__ = wrapper.__kwdefaults__ + rebuilt_wrapper.__annotations__ = wrapper.__annotations__ + rebuilt_wrapper.__dict__.update(wrapper.__dict__) + rebuilt_wrapper = functools.update_wrapper(rebuilt_wrapper, fn) + rebuilt_wrapper.__wrapped__ = fn + wrapper = rebuilt_wrapper + return wrapper def _create_workflow_from_function( diff --git a/src/mcp_agent/config.py b/src/mcp_agent/config.py index 638698b4b..d72f972ec 100644 --- a/src/mcp_agent/config.py +++ b/src/mcp_agent/config.py @@ -11,7 +11,15 @@ import warnings from httpx import URL -from pydantic import AliasChoices, BaseModel, ConfigDict, Field, field_validator +from pydantic import ( + AliasChoices, + AnyHttpUrl, + BaseModel, + ConfigDict, + Field, + field_validator, + model_validator, +) from pydantic_settings import BaseSettings, SettingsConfigDict @@ -22,6 +30,79 @@ class MCPServerAuthSettings(BaseModel): """Represents authentication configuration for a server.""" api_key: str | None = None + oauth: Optional["MCPOAuthClientSettings"] = None + + model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True) + + +class MCPAuthorizationServerSettings(BaseModel): + """Configuration for exposing the MCP Agent server as an OAuth protected resource.""" + + enabled: bool = False + issuer_url: AnyHttpUrl | None = None + resource_server_url: AnyHttpUrl | None = None + service_documentation_url: AnyHttpUrl | None = None + required_scopes: List[str] = Field(default_factory=list) + jwks_uri: AnyHttpUrl | None = None + introspection_endpoint: AnyHttpUrl | None = None + introspection_client_id: str | None = None + introspection_client_secret: str | None = None + token_cache_ttl_seconds: int = Field(300, ge=0) + + model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True) + + @model_validator(mode="after") + def _validate_required_urls(self) -> "MCPAuthorizationServerSettings": + if self.enabled: + missing = [] + if self.issuer_url is None: + missing.append("issuer_url") + if self.resource_server_url is None: + missing.append("resource_server_url") + if missing: + raise ValueError( + " | ".join(missing) + " must be set when authorization is enabled" + ) + return self + + +class MCPOAuthClientSettings(BaseModel): + """Configuration for authenticating to downstream OAuth-protected MCP servers.""" + + enabled: bool = False + scopes: List[str] = Field(default_factory=list) + resource: AnyHttpUrl | None = None + authorization_server: AnyHttpUrl | None = None + client_id: str | None = None + client_secret: str | None = None + redirect_uri_options: List[str] = Field(default_factory=list) + extra_authorize_params: Dict[str, str] = Field(default_factory=dict) + extra_token_params: Dict[str, str] = Field(default_factory=dict) + require_pkce: bool = True + use_internal_callback: bool = True + + model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True) + + +class OAuthTokenStoreSettings(BaseModel): + """Settings for OAuth token persistence.""" + + backend: Literal["memory", "redis"] = "memory" + redis_url: str | None = None + redis_prefix: str = "mcp_agent:oauth_tokens" + refresh_leeway_seconds: int = Field(60, ge=0) + + model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True) + + +class OAuthSettings(BaseModel): + """Global OAuth-related settings for MCP Agent.""" + + token_store: OAuthTokenStoreSettings = Field( + default_factory=OAuthTokenStoreSettings + ) + flow_timeout_seconds: int = Field(300, ge=30) + callback_base_url: AnyHttpUrl | None = None model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True) @@ -639,6 +720,12 @@ class Settings(BaseSettings): agents: SubagentSettings | None = SubagentSettings() """Settings for defining and loading subagents for the MCP Agent application""" + authorization: MCPAuthorizationServerSettings | None = None + """Settings for exposing this MCP application as an OAuth protected resource""" + + oauth: OAuthSettings | None = Field(default_factory=OAuthSettings) + """Global OAuth client configuration (token store, delegated auth defaults)""" + def __eq__(self, other): # type: ignore[override] if not isinstance(other, Settings): return NotImplemented diff --git a/src/mcp_agent/core/context.py b/src/mcp_agent/core/context.py index d449c938a..cc7bee78e 100644 --- a/src/mcp_agent/core/context.py +++ b/src/mcp_agent/core/context.py @@ -33,6 +33,7 @@ from mcp_agent.workflows.llm.llm_selector import ModelSelector from mcp_agent.logging.logger import get_logger from mcp_agent.tracing.token_counter import TokenCounter +from mcp_agent.oauth.identity import OAuthUserIdentity if TYPE_CHECKING: @@ -42,6 +43,8 @@ from mcp_agent.executor.workflow_signal import SignalWaitCallback from mcp_agent.executor.workflow_registry import WorkflowRegistry from mcp_agent.app import MCPApp + from mcp_agent.oauth.manager import TokenManager + from mcp_agent.oauth.store import TokenStore else: # Runtime placeholders for the types AgentSpec = Any @@ -50,6 +53,8 @@ SignalWaitCallback = Any WorkflowRegistry = Any MCPApp = Any + TokenManager = Any + TokenStore = Any logger = get_logger(__name__) @@ -93,6 +98,13 @@ class Context(BaseModel): gateway_url: str | None = None gateway_token: str | None = None + # Current authenticated user (set when acting as an MCP server) + current_user: Optional[OAuthUserIdentity] = None + + # OAuth helpers for downstream servers + token_store: Optional[TokenStore] = None + token_manager: Optional[TokenManager] = None + model_config = ConfigDict( extra="allow", arbitrary_types_allowed=True, # Tell Pydantic to defer type evaluation @@ -256,6 +268,14 @@ async def cleanup_context(shutdown_logger: bool = False): shutdown_logger: If True, completely shutdown OTEL infrastructure. If False, just cleanup app-specific resources. """ + global _global_context + + if _global_context and getattr(_global_context, "token_manager", None): + try: + await _global_context.token_manager.aclose() # type: ignore[call-arg] + except Exception: + pass + if shutdown_logger: # Shutdown logging and telemetry completely await LoggingConfig.shutdown() diff --git a/src/mcp_agent/mcp/mcp_server_registry.py b/src/mcp_agent/mcp/mcp_server_registry.py index a28735373..04a8cad08 100644 --- a/src/mcp_agent/mcp/mcp_server_registry.py +++ b/src/mcp_agent/mcp/mcp_server_registry.py @@ -31,6 +31,7 @@ from mcp_agent.logging.logger import get_logger from mcp_agent.mcp.mcp_agent_client_session import MCPAgentClientSession +from mcp_agent.oauth.http import OAuthHttpxAuth from mcp_agent.mcp.mcp_connection_manager import MCPConnectionManager if TYPE_CHECKING: @@ -215,6 +216,24 @@ async def start_server( kwargs["sse_read_timeout"] = sse_read_timeout # For Streamable HTTP, we get an additional callback for session ID + auth_handler = None + oauth_cfg = config.auth.oauth if config.auth else None + if oauth_cfg and oauth_cfg.enabled: + if context is None or getattr(context, "token_manager", None) is None: + logger.warning( + f"{server_name}: OAuth configured but token manager not available; skipping auth" + ) + else: + auth_handler = OAuthHttpxAuth( + token_manager=context.token_manager, + context=context, + server_name=server_name, + server_config=config, + scopes=oauth_cfg.scopes, + ) + if auth_handler: + kwargs["auth"] = auth_handler + async with streamablehttp_client( **kwargs, ) as (read_stream, write_stream, session_id_callback): diff --git a/src/mcp_agent/oauth/__init__.py b/src/mcp_agent/oauth/__init__.py new file mode 100644 index 000000000..7612bd080 --- /dev/null +++ b/src/mcp_agent/oauth/__init__.py @@ -0,0 +1,19 @@ +"""OAuth support utilities for MCP Agent. + +Modules export their own public APIs; this package file avoids importing them +eagerly to sidestep circular dependencies during initialization. +""" + +__all__ = [ + "access_token", + "callbacks", + "errors", + "flow", + "http", + "identity", + "manager", + "metadata", + "pkce", + "records", + "store", +] diff --git a/src/mcp_agent/oauth/access_token.py b/src/mcp_agent/oauth/access_token.py new file mode 100644 index 000000000..fe3d4bab4 --- /dev/null +++ b/src/mcp_agent/oauth/access_token.py @@ -0,0 +1,82 @@ +"""Extended access token model for MCP Agent authorization flows.""" + +from __future__ import annotations + +from datetime import datetime, timezone +from typing import Any, Dict, Iterable, List + +from mcp.server.auth.provider import AccessToken + + +class MCPAccessToken(AccessToken): + """Access token enriched with identity and claim metadata.""" + + subject: str | None = None + email: str | None = None + issuer: str | None = None + resource_indicator: str | None = None + claims: Dict[str, Any] | None = None + + @classmethod + def from_introspection( + cls, + token: str, + payload: Dict[str, Any], + *, + resource_hint: str | None = None, + ) -> "MCPAccessToken": + """Build an access token instance from an OAuth 2.0 introspection response.""" + client_id = _first_non_empty( + payload.get("client_id"), + payload.get("clientId"), + payload.get("cid"), + ) + scope_value = payload.get("scope") or payload.get("scp") + if isinstance(scope_value, str): + scopes: List[str] = [s for s in scope_value.split() if s] + elif isinstance(scope_value, Iterable): + scopes = [str(item) for item in scope_value] + else: + scopes = [] + + audience = payload.get("resource") or payload.get("aud") + if isinstance(audience, (list, tuple)): + audience_value = _first_non_empty(*audience) + else: + audience_value = audience + + resource = resource_hint or audience_value + + expires_at = payload.get("exp") + + return cls( + token=token, + client_id=str(client_id) if client_id is not None else "", + scopes=scopes, + expires_at=expires_at, + resource=resource, + subject=_first_non_empty(payload.get("sub"), payload.get("subject")), + email=_first_non_empty( + payload.get("email"), payload.get("preferred_username") + ), + issuer=payload.get("iss"), + resource_indicator=resource, + claims=payload, + ) + + def is_expired(self, *, leeway_seconds: int = 0) -> bool: + """Return True if token is expired considering optional leeway.""" + if self.expires_at is None: + return False + now = datetime.now(tz=timezone.utc).timestamp() + return now >= (self.expires_at - leeway_seconds) + + +def _first_non_empty(*values: Any) -> Any | None: + for value in values: + if value is None: + continue + if isinstance(value, str) and not value: + continue + return value + return None diff --git a/src/mcp_agent/oauth/callbacks.py b/src/mcp_agent/oauth/callbacks.py new file mode 100644 index 000000000..7cae8c992 --- /dev/null +++ b/src/mcp_agent/oauth/callbacks.py @@ -0,0 +1,53 @@ +"""Callback coordination for delegated OAuth flows.""" + +from __future__ import annotations + +import asyncio +from typing import Any, Dict + + +class OAuthCallbackRegistry: + """Manage asynchronous delivery of OAuth authorization callbacks.""" + + def __init__(self) -> None: + self._pending: Dict[str, asyncio.Future[Dict[str, Any]]] = {} + self._lock = asyncio.Lock() + + async def create_handle(self, flow_id: str) -> asyncio.Future[Dict[str, Any]]: + """Create (or reuse) a future associated with a flow identifier.""" + async with self._lock: + future = self._pending.get(flow_id) + if future is None or future.done(): + loop = asyncio.get_running_loop() + future = loop.create_future() + self._pending[flow_id] = future + return future + + async def deliver(self, flow_id: str, payload: Dict[str, Any]) -> bool: + """Set the result for a pending flow, returning False when no listener exists.""" + async with self._lock: + future = self._pending.get(flow_id) + if future is None: + return False + if not future.done(): + future.set_result(payload) + return True + + async def fail(self, flow_id: str, exc: Exception) -> bool: + async with self._lock: + future = self._pending.get(flow_id) + if future is None: + return False + if not future.done(): + future.set_exception(exc) + return True + + async def discard(self, flow_id: str) -> None: + async with self._lock: + future = self._pending.pop(flow_id, None) + if future and not future.done(): + future.cancel() + + +# Global registry used by server + flow coordinator +callback_registry = OAuthCallbackRegistry() diff --git a/src/mcp_agent/oauth/errors.py b/src/mcp_agent/oauth/errors.py new file mode 100644 index 000000000..3b1b5ce7a --- /dev/null +++ b/src/mcp_agent/oauth/errors.py @@ -0,0 +1,21 @@ +"""Custom exception types for OAuth workflows.""" + + +class OAuthFlowError(Exception): + """Base class for OAuth-related failures.""" + + +class AuthorizationDeclined(OAuthFlowError): + """Raised when the user declines an authorization request.""" + + +class CallbackTimeoutError(OAuthFlowError): + """Raised when the delegated authorization callback is not received in time.""" + + +class TokenRefreshError(OAuthFlowError): + """Raised when refreshing an access token fails irrecoverably.""" + + +class MissingUserIdentityError(OAuthFlowError): + """Raised when an OAuth flow is attempted without a known user identity.""" diff --git a/src/mcp_agent/oauth/flow.py b/src/mcp_agent/oauth/flow.py new file mode 100644 index 000000000..424385538 --- /dev/null +++ b/src/mcp_agent/oauth/flow.py @@ -0,0 +1,218 @@ +"""Delegated OAuth authorization flow coordinator.""" + +from __future__ import annotations + +import asyncio +import time +import uuid +from typing import Any, Dict, Sequence +from urllib.parse import parse_qs, urlparse + +import httpx +from mcp.shared.auth import OAuthMetadata, ProtectedResourceMetadata +from mcp.server.session import ServerSession + +from mcp_agent.config import MCPOAuthClientSettings, OAuthSettings +from mcp_agent.core.context import Context +from mcp_agent.logging.logger import get_logger +from mcp_agent.oauth.callbacks import callback_registry +from mcp_agent.oauth.errors import ( + AuthorizationDeclined, + CallbackTimeoutError, + MissingUserIdentityError, + OAuthFlowError, +) +from mcp_agent.oauth.identity import OAuthUserIdentity +from mcp_agent.oauth.pkce import ( + generate_code_challenge, + generate_code_verifier, + generate_state, +) +from mcp_agent.oauth.records import TokenRecord + +logger = get_logger(__name__) + + +class AuthorizationFlowCoordinator: + """Handles the interactive OAuth Authorization Code flow via MCP clients.""" + + def __init__(self, *, http_client: httpx.AsyncClient, settings: OAuthSettings): + self._http_client = http_client + self._settings = settings + + async def authorize( + self, + *, + context: Context, + user: OAuthUserIdentity, + server_name: str, + oauth_config: MCPOAuthClientSettings, + resource: str, + authorization_server_url: str, + resource_metadata: ProtectedResourceMetadata, + auth_metadata: OAuthMetadata, + scopes: Sequence[str], + ) -> TokenRecord: + if not user: + raise MissingUserIdentityError( + "Cannot begin OAuth flow without authenticated MCP user" + ) + + client_id = oauth_config.client_id + if not client_id: + raise OAuthFlowError( + f"No OAuth client_id configured for server '{server_name}'." + ) + + redirect_options = list(oauth_config.redirect_uri_options or []) + flow_id = uuid.uuid4().hex + internal_redirect = None + if oauth_config.use_internal_callback and self._settings.callback_base_url: + internal_redirect = f"{self._settings.callback_base_url.rstrip('/')}/internal/oauth/callback/{flow_id}" + redirect_options.insert(0, internal_redirect) + + if not redirect_options: + raise OAuthFlowError( + "No redirect URI options configured for OAuth authorization flow" + ) + + redirect_uri = redirect_options[0] + + code_verifier = generate_code_verifier() + code_challenge = generate_code_challenge(code_verifier) + state = generate_state() + scope_param = " ".join(scopes) + + authorize_url = httpx.URL( + str(auth_metadata.authorization_endpoint) + ).include_query_params( + response_type="code", + client_id=client_id, + redirect_uri=redirect_uri, + scope=scope_param, + state=state, + code_challenge=code_challenge, + code_challenge_method="S256", + resource=resource, + **(oauth_config.extra_authorize_params or {}), + ) + + callback_future = None + if internal_redirect is not None: + callback_future = await callback_registry.create_handle(flow_id) + + request_payload = { + "url": str(authorize_url), + "message": f"Authorization required for {server_name}", + "redirect_uri_options": redirect_options, + } + + result = await _send_auth_request(context, request_payload) + + try: + if result and result.get("url"): + callback_data = _parse_callback_params(result["url"]) + if callback_future is not None: + await callback_registry.discard(flow_id) + elif callback_future is not None: + timeout = self._settings.flow_timeout_seconds or 300 + try: + callback_data = await asyncio.wait_for( + callback_future, timeout=timeout + ) + except asyncio.TimeoutError as exc: + raise CallbackTimeoutError( + f"Timed out waiting for OAuth callback after {timeout} seconds" + ) from exc + else: + raise AuthorizationDeclined( + "Authorization request was declined by the user" + ) + finally: + if callback_future is not None: + await callback_registry.discard(flow_id) + + error = callback_data.get("error") + if error: + description = callback_data.get("error_description") or error + raise OAuthFlowError(f"Authorization server returned error: {description}") + + returned_state = callback_data.get("state") + if returned_state != state: + raise OAuthFlowError("State mismatch detected in OAuth callback") + + authorization_code = callback_data.get("code") + if not authorization_code: + raise OAuthFlowError("Authorization callback did not include code") + + token_endpoint = str(auth_metadata.token_endpoint) + data: Dict[str, Any] = { + "grant_type": "authorization_code", + "code": authorization_code, + "redirect_uri": redirect_uri, + "client_id": client_id, + "code_verifier": code_verifier, + "resource": resource, + } + if scope_param: + data["scope"] = scope_param + if oauth_config.extra_token_params: + data.update(oauth_config.extra_token_params) + + auth = None + if oauth_config.client_secret: + data["client_secret"] = oauth_config.client_secret + + token_response = await self._http_client.post( + token_endpoint, data=data, auth=auth + ) + token_response.raise_for_status() + payload = token_response.json() + + access_token = payload.get("access_token") + if not access_token: + raise OAuthFlowError("Token endpoint response missing access_token") + refresh_token = payload.get("refresh_token") + expires_in = payload.get("expires_in") + expires_at = None + if isinstance(expires_in, (int, float)): + expires_at = time.time() + float(expires_in) + + scope_from_payload = payload.get("scope") + if isinstance(scope_from_payload, str) and scope_from_payload.strip(): + effective_scopes = tuple(scope_from_payload.split()) + else: + effective_scopes = tuple(scopes) + + return TokenRecord( + access_token=access_token, + refresh_token=refresh_token, + expires_at=expires_at, + scopes=effective_scopes, + token_type=str(payload.get("token_type", "Bearer")), + resource=resource, + authorization_server=authorization_server_url, + metadata={"raw": payload}, + ) + + +def _parse_callback_params(url: str) -> Dict[str, str]: + parsed = urlparse(url) + params = {} + params.update({k: v[-1] for k, v in parse_qs(parsed.query).items()}) + if parsed.fragment: + params.update({k: v[-1] for k, v in parse_qs(parsed.fragment).items()}) + return params + + +async def _send_auth_request( + context: Context, payload: Dict[str, Any] +) -> Dict[str, Any]: + session = getattr(context, "upstream_session", None) + if session and isinstance(session, ServerSession): + rpc = getattr(session, "rpc", None) + if rpc and hasattr(rpc, "request"): + return await rpc.request("auth/request", payload) + raise AuthorizationDeclined( + "No upstream MCP session available to prompt user for authorization" + ) diff --git a/src/mcp_agent/oauth/http/__init__.py b/src/mcp_agent/oauth/http/__init__.py new file mode 100644 index 000000000..60479ab9e --- /dev/null +++ b/src/mcp_agent/oauth/http/__init__.py @@ -0,0 +1,5 @@ +"""HTTP client helpers for OAuth flows.""" + +from .auth import OAuthHttpxAuth + +__all__ = ["OAuthHttpxAuth"] diff --git a/src/mcp_agent/oauth/http/auth.py b/src/mcp_agent/oauth/http/auth.py new file mode 100644 index 000000000..29b2028ce --- /dev/null +++ b/src/mcp_agent/oauth/http/auth.py @@ -0,0 +1,68 @@ +"""httpx.Auth adapter that acquires tokens via TokenManager.""" + +from __future__ import annotations + +import httpx + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from mcp_agent.oauth.manager import TokenManager + from mcp_agent.core.context import Context + + +class OAuthHttpxAuth(httpx.Auth): + requires_request_body = True + + def __init__( + self, + *, + token_manager: "TokenManager", + context: "Context", + server_name: str, + server_config, + scopes=None, + ) -> None: + self._token_manager = token_manager + self._context = context + self._server_name = server_name + self._server_config = server_config + self._scopes = list(scopes) if scopes is not None else None + + async def async_auth_flow(self, request: httpx.Request): + token_record = await self._token_manager.ensure_access_token( + context=self._context, + server_name=self._server_name, + server_config=self._server_config, + scopes=self._scopes, + ) + request.headers["Authorization"] = ( + f"{token_record.token_type} {token_record.access_token}" + ) + retry_request = request.copy() + response = yield request + + if response.status_code != 401: + return + + user = self._context.current_user + if user is None: + return + + await self._token_manager.invalidate( + user=user, + resource=token_record.resource or "", + authorization_server=token_record.authorization_server, + scopes=token_record.scopes, + ) + + refreshed_record = await self._token_manager.ensure_access_token( + context=self._context, + server_name=self._server_name, + server_config=self._server_config, + scopes=self._scopes, + ) + retry_request.headers["Authorization"] = ( + f"{refreshed_record.token_type} {refreshed_record.access_token}" + ) + yield retry_request diff --git a/src/mcp_agent/oauth/identity.py b/src/mcp_agent/oauth/identity.py new file mode 100644 index 000000000..54c6d6fed --- /dev/null +++ b/src/mcp_agent/oauth/identity.py @@ -0,0 +1,46 @@ +"""Utilities for representing authenticated MCP users.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, Dict + +from .access_token import MCPAccessToken + + +@dataclass(frozen=True) +class OAuthUserIdentity: + """Canonical identifier for an authenticated user within MCP Agent.""" + + provider: str + subject: str + email: str | None = None + claims: Dict[str, Any] | None = None + + @property + def cache_key(self) -> str: + """Return a deterministic cache key for token storage.""" + return f"{self.provider}:{self.subject}" + + @classmethod + def from_access_token( + cls, token: MCPAccessToken | None + ) -> "OAuthUserIdentity" | None: + """Build an identity from an enriched access token.""" + if token is None: + return None + subject = token.subject or _claim(token, "sub") + if not subject: + return None + provider = token.issuer or _claim(token, "iss") or "unknown" + email = ( + token.email or _claim(token, "email") or _claim(token, "preferred_username") + ) + claims = token.claims or {} + return cls(provider=provider, subject=subject, email=email, claims=claims) + + +def _claim(token: MCPAccessToken, key: str) -> Any | None: + if not token.claims: + return None + return token.claims.get(key) diff --git a/src/mcp_agent/oauth/manager.py b/src/mcp_agent/oauth/manager.py new file mode 100644 index 000000000..62d0308b9 --- /dev/null +++ b/src/mcp_agent/oauth/manager.py @@ -0,0 +1,249 @@ +"""Token management for downstream OAuth-protected MCP servers.""" + +from __future__ import annotations + +import asyncio +import time +from collections import defaultdict +from typing import Dict, Iterable, Sequence, TYPE_CHECKING + +import httpx +from httpx import URL + +from mcp_agent.config import MCPOAuthClientSettings, OAuthSettings +from mcp_agent.logging.logger import get_logger +from mcp_agent.oauth.errors import ( + MissingUserIdentityError, + OAuthFlowError, + TokenRefreshError, +) +from mcp_agent.oauth.flow import AuthorizationFlowCoordinator +from mcp_agent.oauth.identity import OAuthUserIdentity +from mcp_agent.oauth.metadata import ( + fetch_authorization_server_metadata, + fetch_resource_metadata, + normalize_resource, + select_authorization_server, +) +from mcp_agent.oauth.records import TokenRecord +from mcp_agent.oauth.store import ( + InMemoryTokenStore, + TokenStore, + TokenStoreKey, + scope_fingerprint, +) + +if TYPE_CHECKING: + from mcp_agent.core.context import Context + +logger = get_logger(__name__) + + +class TokenManager: + """High-level orchestrator for acquiring and refreshing OAuth tokens.""" + + def __init__( + self, + *, + http_client: httpx.AsyncClient | None = None, + token_store: TokenStore | None = None, + settings: OAuthSettings | None = None, + ) -> None: + self._settings = settings or OAuthSettings() + self._token_store = token_store or InMemoryTokenStore() + self._http_client = http_client or httpx.AsyncClient(timeout=30.0) + self._own_http_client = http_client is None + self._flow = AuthorizationFlowCoordinator( + http_client=self._http_client, settings=self._settings + ) + self._locks: Dict[TokenStoreKey, asyncio.Lock] = defaultdict(asyncio.Lock) + self._resource_metadata_cache: Dict[str, tuple[float, object]] = {} + self._auth_metadata_cache: Dict[str, tuple[float, object]] = {} + + async def ensure_access_token( + self, + *, + context: "Context", + server_name: str, + server_config, + scopes: Iterable[str] | None = None, + ) -> TokenRecord: + oauth_config: MCPOAuthClientSettings | None = None + if server_config and server_config.auth: + oauth_config = getattr(server_config.auth, "oauth", None) + if not oauth_config or not oauth_config.enabled: + raise OAuthFlowError( + f"Server '{server_name}' is not configured for OAuth authentication" + ) + + user = context.current_user + if not user: + raise MissingUserIdentityError( + "No authenticated MCP user available for delegated OAuth flow" + ) + + resource_hint = oauth_config.resource + server_url = getattr(server_config, "url", None) + resource = normalize_resource(resource_hint, server_url) + + metadata_url = str(URL(resource).join("/.well-known/oauth-protected-resource")) + resource_metadata = await self._get_resource_metadata(metadata_url) + auth_server_url = select_authorization_server( + resource_metadata, oauth_config.authorization_server + ) + auth_metadata = await self._get_authorization_metadata(auth_server_url) + + scope_list = ( + list(scopes) if scopes is not None else list(oauth_config.scopes or []) + ) + key = TokenStoreKey( + user_key=user.cache_key, + resource=resource, + authorization_server=auth_server_url, + scope_fingerprint=scope_fingerprint(scope_list), + ) + + lock = self._locks[key] + async with lock: + record = await self._token_store.get(key) + leeway = ( + self._settings.token_store.refresh_leeway_seconds + if self._settings and self._settings.token_store + else 60 + ) + if record and not record.is_expired(leeway_seconds=leeway): + return record + + if record and record.refresh_token: + try: + refreshed = await self._refresh_token( + record, + oauth_config=oauth_config, + auth_metadata=auth_metadata, + resource=resource, + scopes=scope_list, + ) + except TokenRefreshError: + await self._token_store.delete(key) + else: + if refreshed: + await self._token_store.set(key, refreshed) + return refreshed + await self._token_store.delete(key) + + # Need to run full authorization flow + record = await self._flow.authorize( + context=context, + user=user, + server_name=server_name, + oauth_config=oauth_config, + resource=resource, + authorization_server_url=auth_server_url, + resource_metadata=resource_metadata, + auth_metadata=auth_metadata, + scopes=scope_list, + ) + await self._token_store.set(key, record) + return record + + async def invalidate( + self, + *, + user: OAuthUserIdentity, + resource: str, + authorization_server: str | None, + scopes: Iterable[str], + ) -> None: + key = TokenStoreKey( + user_key=user.cache_key, + resource=resource, + authorization_server=authorization_server, + scope_fingerprint=scope_fingerprint(scopes), + ) + await self._token_store.delete(key) + + async def _refresh_token( + self, + record: TokenRecord, + *, + oauth_config: MCPOAuthClientSettings, + auth_metadata, + resource: str, + scopes: Sequence[str], + ) -> TokenRecord | None: + if not record.refresh_token: + return None + + token_endpoint = str(auth_metadata.token_endpoint) + data = { + "grant_type": "refresh_token", + "refresh_token": record.refresh_token, + "client_id": oauth_config.client_id, + "resource": resource, + } + if scopes: + data["scope"] = " ".join(scopes) + if oauth_config.client_secret: + data["client_secret"] = oauth_config.client_secret + if oauth_config.extra_token_params: + data.update(oauth_config.extra_token_params) + + try: + response = await self._http_client.post(token_endpoint, data=data) + except httpx.HTTPError as exc: + logger.warning("Refresh token request failed", exc_info=True) + raise TokenRefreshError(str(exc)) from exc + + if response.status_code != 200: + logger.warning( + "Refresh token request returned non-success status", + data={"status_code": response.status_code}, + ) + return None + + payload = response.json() + new_access = payload.get("access_token") + if not new_access: + return None + new_refresh = payload.get("refresh_token", record.refresh_token) + expires_in = payload.get("expires_in") + new_expires = record.expires_at + if isinstance(expires_in, (int, float)): + new_expires = time.time() + float(expires_in) + + scope_from_payload = payload.get("scope") + if isinstance(scope_from_payload, str) and scope_from_payload.strip(): + scopes_tuple = tuple(scope_from_payload.split()) + else: + scopes_tuple = record.scopes + + return TokenRecord( + access_token=new_access, + refresh_token=new_refresh, + expires_at=new_expires, + scopes=scopes_tuple, + token_type=str(payload.get("token_type", record.token_type)), + resource=record.resource, + authorization_server=record.authorization_server, + metadata={"raw": payload}, + ) + + async def _get_resource_metadata(self, url: str): + cached = self._resource_metadata_cache.get(url) + if cached and time.time() - cached[0] < 300: + return cached[1] + metadata = await fetch_resource_metadata(self._http_client, url) + self._resource_metadata_cache[url] = (time.time(), metadata) + return metadata + + async def _get_authorization_metadata(self, url: str): + cached = self._auth_metadata_cache.get(url) + if cached and time.time() - cached[0] < 300: + return cached[1] + metadata = await fetch_authorization_server_metadata(self._http_client, url) + self._auth_metadata_cache[url] = (time.time(), metadata) + return metadata + + async def aclose(self) -> None: + if self._own_http_client: + await self._http_client.aclose() diff --git a/src/mcp_agent/oauth/metadata.py b/src/mcp_agent/oauth/metadata.py new file mode 100644 index 000000000..24ac6b5c8 --- /dev/null +++ b/src/mcp_agent/oauth/metadata.py @@ -0,0 +1,60 @@ +"""Helpers for OAuth metadata discovery.""" + +from __future__ import annotations + +from typing import List + +import httpx +from mcp.shared.auth import OAuthMetadata, ProtectedResourceMetadata + +from mcp_agent.logging.logger import get_logger + +logger = get_logger(__name__) + + +async def fetch_resource_metadata( + client: httpx.AsyncClient, + resource_metadata_url: str, +) -> ProtectedResourceMetadata: + response = await client.get(resource_metadata_url) + response.raise_for_status() + data = response.json() + return ProtectedResourceMetadata.model_validate(data) + + +async def fetch_authorization_server_metadata( + client: httpx.AsyncClient, + metadata_url: str, +) -> OAuthMetadata: + response = await client.get(metadata_url) + response.raise_for_status() + return OAuthMetadata.model_validate(response.json()) + + +def select_authorization_server( + metadata: ProtectedResourceMetadata, + preferred: str | None = None, +) -> str: + candidates: List[str] = list(metadata.authorization_servers or []) + if not candidates: + raise ValueError( + "Protected resource metadata did not include authorization servers" + ) + + if preferred and preferred in candidates: + return preferred + + if preferred: + logger.warning( + "Preferred authorization server not listed; falling back to first entry", + data={"preferred": preferred, "candidates": candidates}, + ) + return candidates[0] + + +def normalize_resource(resource: str | None, fallback: str | None) -> str: + if resource: + return resource.rstrip("/") + if fallback: + return fallback.rstrip("/") + raise ValueError("Unable to determine resource identifier for OAuth flow") diff --git a/src/mcp_agent/oauth/pkce.py b/src/mcp_agent/oauth/pkce.py new file mode 100644 index 000000000..1709dc332 --- /dev/null +++ b/src/mcp_agent/oauth/pkce.py @@ -0,0 +1,27 @@ +"""PKCE utilities.""" + +from __future__ import annotations + +import base64 +import hashlib +import secrets + + +def generate_code_verifier(length: int = 64) -> str: + if length < 43 or length > 128: + raise ValueError("PKCE code verifier length must be between 43 and 128") + # token_urlsafe returns ~1.3 chars per byte; adjust to reach desired length + needed_bytes = int(length * 0.8) + 1 + verifier = secrets.token_urlsafe(needed_bytes) + if len(verifier) < length: + verifier = (verifier + secrets.token_urlsafe(needed_bytes))[:length] + return verifier[:length] + + +def generate_code_challenge(verifier: str) -> str: + digest = hashlib.sha256(verifier.encode()).digest() + return base64.urlsafe_b64encode(digest).rstrip(b"=").decode() + + +def generate_state(length: int = 32) -> str: + return secrets.token_urlsafe(length) diff --git a/src/mcp_agent/oauth/records.py b/src/mcp_agent/oauth/records.py new file mode 100644 index 000000000..2a7c47be0 --- /dev/null +++ b/src/mcp_agent/oauth/records.py @@ -0,0 +1,46 @@ +"""Shared record types for OAuth token management.""" + +from __future__ import annotations + +from datetime import datetime, timezone +from typing import Any, Dict, Tuple + +from pydantic import BaseModel, Field + + +class TokenRecord(BaseModel): + """Persisted token bundle for a user/resource/authorization server combination.""" + + access_token: str + refresh_token: str | None = None + scopes: Tuple[str, ...] = () + expires_at: float | None = None + token_type: str = "Bearer" + resource: str | None = None + authorization_server: str | None = None + obtained_at: float = Field( + default_factory=lambda: datetime.now(tz=timezone.utc).timestamp() + ) + metadata: Dict[str, Any] = Field(default_factory=dict) + + def is_expired(self, *, leeway_seconds: int = 0) -> bool: + if self.expires_at is None: + return False + now = datetime.now(tz=timezone.utc).timestamp() + return now >= (self.expires_at - leeway_seconds) + + def with_tokens( + self, + *, + access_token: str, + refresh_token: str | None, + expires_at: float | None, + ) -> "TokenRecord": + return self.model_copy( + update={ + "access_token": access_token, + "refresh_token": refresh_token, + "expires_at": expires_at, + "obtained_at": datetime.now(tz=timezone.utc).timestamp(), + } + ) diff --git a/src/mcp_agent/oauth/store/__init__.py b/src/mcp_agent/oauth/store/__init__.py new file mode 100644 index 000000000..226953f43 --- /dev/null +++ b/src/mcp_agent/oauth/store/__init__.py @@ -0,0 +1,11 @@ +"""Token store implementations.""" + +from .base import TokenStore, TokenStoreKey, scope_fingerprint +from .in_memory import InMemoryTokenStore + +__all__ = [ + "TokenStore", + "TokenStoreKey", + "scope_fingerprint", + "InMemoryTokenStore", +] diff --git a/src/mcp_agent/oauth/store/base.py b/src/mcp_agent/oauth/store/base.py new file mode 100644 index 000000000..a03f7da83 --- /dev/null +++ b/src/mcp_agent/oauth/store/base.py @@ -0,0 +1,33 @@ +"""Abstract token store definition.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Iterable, Protocol + +from ..records import TokenRecord + + +@dataclass(frozen=True) +class TokenStoreKey: + """Uniquely identifies a cached token.""" + + user_key: str + resource: str + authorization_server: str | None + scope_fingerprint: str + + +def scope_fingerprint(scopes: Iterable[str]) -> str: + """Return a deterministic fingerprint for a scope list.""" + return " ".join(sorted({scope.strip() for scope in scopes if scope})) + + +class TokenStore(Protocol): + """Persistence interface for OAuth tokens.""" + + async def get(self, key: TokenStoreKey) -> TokenRecord | None: ... + + async def set(self, key: TokenStoreKey, record: TokenRecord) -> None: ... + + async def delete(self, key: TokenStoreKey) -> None: ... diff --git a/src/mcp_agent/oauth/store/in_memory.py b/src/mcp_agent/oauth/store/in_memory.py new file mode 100644 index 000000000..d1aa40460 --- /dev/null +++ b/src/mcp_agent/oauth/store/in_memory.py @@ -0,0 +1,30 @@ +"""In-memory token store for local development and testing.""" + +from __future__ import annotations + +import asyncio +from typing import Dict + +from .base import TokenStore, TokenStoreKey +from ..records import TokenRecord + + +class InMemoryTokenStore(TokenStore): + def __init__(self) -> None: + self._records: Dict[TokenStoreKey, TokenRecord] = {} + self._lock = asyncio.Lock() + + async def get(self, key: TokenStoreKey) -> TokenRecord | None: + async with self._lock: + record = self._records.get(key) + if record is None: + return None + return record + + async def set(self, key: TokenStoreKey, record: TokenRecord) -> None: + async with self._lock: + self._records[key] = record + + async def delete(self, key: TokenStoreKey) -> None: + async with self._lock: + self._records.pop(key, None) diff --git a/src/mcp_agent/server/app_server.py b/src/mcp_agent/server/app_server.py index ec56574c1..dfdbccd4c 100644 --- a/src/mcp_agent/server/app_server.py +++ b/src/mcp_agent/server/app_server.py @@ -12,8 +12,13 @@ import asyncio from mcp.server.fastmcp import Context as MCPContext, FastMCP +from mcp.server.fastmcp.server import AuthSettings +from mcp.server.auth.middleware.auth_context import ( + AuthenticatedUser, + auth_context_var, +) from starlette.requests import Request -from starlette.responses import JSONResponse +from starlette.responses import HTMLResponse, JSONResponse from mcp.server.fastmcp.exceptions import ToolError from mcp.server.fastmcp.tools import Tool as FastTool @@ -30,6 +35,9 @@ from mcp_agent.logging.logger import get_logger from mcp_agent.logging.logger import LoggingConfig from mcp_agent.mcp.mcp_server_registry import ServerRegistry +from mcp_agent.oauth.identity import OAuthUserIdentity +from mcp_agent.oauth.callbacks import callback_registry +from mcp_agent.server.token_verifier import MCPAgentTokenVerifier if TYPE_CHECKING: from mcp_agent.core.context import Context @@ -178,6 +186,32 @@ def _set_upstream_from_request_ctx_if_available(ctx: MCPContext) -> None: # ctx.session property might raise ValueError if context not available pass + # Capture authenticated user information if available + identity: OAuthUserIdentity | None = None + try: + auth_user = auth_context_var.get() + except LookupError: + auth_user = None + + if isinstance(auth_user, AuthenticatedUser): + access_token = getattr(auth_user, "access_token", None) + if access_token is not None: + # Prefer enriched token instances but fall back to raw data if necessary + try: + from mcp_agent.oauth.access_token import MCPAccessToken + + if isinstance(access_token, MCPAccessToken): + identity = OAuthUserIdentity.from_access_token(access_token) + else: + token_dict = getattr(access_token, "model_dump", None) + if callable(token_dict): + maybe_token = MCPAccessToken.model_validate( + access_token.model_dump() + ) + identity = OAuthUserIdentity.from_access_token(maybe_token) + except Exception: + identity = None + if session is not None: app: MCPApp | None = _get_attached_app(ctx.fastmcp) if app is not None and getattr(app, "context", None) is not None: @@ -185,9 +219,15 @@ def _set_upstream_from_request_ctx_if_available(ctx: MCPContext) -> None: # Previously captured; no need to keep old value # Use direct assignment for Pydantic model app.context.upstream_session = session + app.context.current_user = identity return else: return + else: + # Update identity even if we failed to resolve a session + app: MCPApp | None = _get_attached_app(ctx.fastmcp) + if app is not None and getattr(app, "context", None) is not None: + app.context.current_user = identity def _resolve_workflows_and_context( @@ -322,6 +362,34 @@ def create_mcp_server_for_app(app: MCPApp, **kwargs: Any) -> FastMCP: A configured FastMCP server instance """ + auth_settings_config = None + try: + if app.context and app.context.config: + auth_settings_config = app.context.config.authorization + except Exception: + auth_settings_config = None + + effective_auth_settings: AuthSettings | None = None + token_verifier: MCPAgentTokenVerifier | None = None + owns_token_verifier = False + if auth_settings_config and auth_settings_config.enabled: + try: + effective_auth_settings = AuthSettings( + issuer_url=auth_settings_config.issuer_url, # type: ignore[arg-type] + resource_server_url=auth_settings_config.resource_server_url, # type: ignore[arg-type] + service_documentation_url=auth_settings_config.service_documentation_url, # type: ignore[arg-type] + required_scopes=auth_settings_config.required_scopes or None, + ) + token_verifier = MCPAgentTokenVerifier(auth_settings_config) + except Exception as exc: + logger.error( + "Failed to configure authorization server integration", + exc_info=True, + data={"error": str(exc)}, + ) + effective_auth_settings = None + token_verifier = None + # Create a lifespan function specific to this app @asynccontextmanager async def app_specific_lifespan(mcp: FastMCP) -> AsyncIterator[ServerContext]: @@ -341,7 +409,11 @@ async def app_specific_lifespan(mcp: FastMCP) -> AsyncIterator[ServerContext]: yield server_context finally: # Don't clean up the MCPApp here - let the caller handle that - pass + if owns_token_verifier and token_verifier is not None: + try: + await token_verifier.aclose() + except Exception: + pass # Helper: install internal HTTP routes (not MCP tools) def _install_internal_routes(mcp_server: FastMCP) -> None: @@ -358,6 +430,41 @@ def _get_fallback_upstream_session() -> Any | None: return None return None + @mcp_server.custom_route( + "/internal/oauth/callback/{flow_id}", + methods=["GET", "POST"], + include_in_schema=False, + ) + async def _oauth_callback(request: Request): + flow_id = request.path_params.get("flow_id") + if not flow_id: + return JSONResponse({"error": "missing_flow_id"}, status_code=400) + + payload: Dict[str, Any] = {} + try: + payload.update({k: v for k, v in request.query_params.multi_items()}) + except Exception: + payload.update(dict(request.query_params)) + + if request.method.upper() == "POST": + content_type = request.headers.get("content-type", "") + try: + if "application/json" in content_type: + body_data = await request.json() + else: + form = await request.form() + body_data = {k: v for k, v in form.multi_items()} + except Exception: + body_data = {} + payload.update(body_data) + + delivered = await callback_registry.deliver(flow_id, payload) + if not delivered: + return JSONResponse({"error": "unknown_flow"}, status_code=404) + + html = """

Authorization complete.

You may close this window and return to MCP Agent.

""" + return HTMLResponse(html) + @mcp_server.custom_route( "/internal/session/by-run/{execution_id}/notify", methods=["POST"], @@ -1039,6 +1146,11 @@ async def _internal_human_prompts(request: Request): except Exception: pass else: + if "auth" not in kwargs and effective_auth_settings is not None: + kwargs["auth"] = effective_auth_settings + if "token_verifier" not in kwargs and token_verifier is not None: + kwargs["token_verifier"] = token_verifier + owns_token_verifier = True mcp = FastMCP( name=app.name or "mcp_agent_server", # TODO: saqadri (MAC) - create a much more detailed description diff --git a/src/mcp_agent/server/token_verifier.py b/src/mcp_agent/server/token_verifier.py new file mode 100644 index 000000000..324f389b6 --- /dev/null +++ b/src/mcp_agent/server/token_verifier.py @@ -0,0 +1,138 @@ +"""Token verification for MCP Agent Cloud authorization server.""" + +from __future__ import annotations + +import asyncio +from datetime import datetime, timezone +from typing import Any, Dict + +import httpx + +from mcp.server.auth.provider import AccessToken +from mcp.server.auth.provider import TokenVerifier + +from mcp_agent.config import MCPAuthorizationServerSettings +from mcp_agent.logging.logger import get_logger +from mcp_agent.oauth.access_token import MCPAccessToken + +logger = get_logger(__name__) + + +class MCPAgentTokenVerifier(TokenVerifier): + """Verify bearer tokens issued by the MCP Agent Cloud authorization server.""" + + def __init__(self, settings: MCPAuthorizationServerSettings): + if not settings.introspection_endpoint: + raise ValueError( + "introspection_endpoint must be configured to verify tokens" + ) + self._settings = settings + timeout = httpx.Timeout(10.0) + self._client = httpx.AsyncClient(timeout=timeout) + self._cache: Dict[str, MCPAccessToken] = {} + self._lock = asyncio.Lock() + + async def verify_token(self, token: str) -> AccessToken | None: # type: ignore[override] + cached = self._cache.get(token) + if cached and not cached.is_expired(leeway_seconds=30): + return cached + + async with self._lock: + # Double-check cache after acquiring lock to avoid duplicate refresh + cached = self._cache.get(token) + if cached and not cached.is_expired(leeway_seconds=30): + return cached + + verified = await self._introspect(token) + if verified: + self._cache[token] = verified + else: + self._cache.pop(token, None) + return verified + + async def _introspect(self, token: str) -> MCPAccessToken | None: + data = {"token": token} + auth = None + if ( + self._settings.introspection_client_id + and self._settings.introspection_client_secret + ): + auth = httpx.BasicAuth( + self._settings.introspection_client_id, + self._settings.introspection_client_secret, + ) + + try: + response = await self._client.post( + str(self._settings.introspection_endpoint), + data=data, + auth=auth, + ) + except httpx.HTTPError as exc: + logger.warning(f"Token introspection request failed: {exc}") + return None + + if response.status_code != 200: + logger.warning( + "Token introspection returned non-success status", + data={"status_code": response.status_code}, + ) + return None + + try: + payload: Dict[str, Any] = response.json() + except ValueError: + logger.warning("Token introspection response was not valid JSON") + return None + + if not payload.get("active"): + return None + + if self._settings.issuer_url and payload.get("iss"): + if str(payload.get("iss")) != str(self._settings.issuer_url): + logger.warning( + "Token issuer mismatch", + data={ + "expected": str(self._settings.issuer_url), + "actual": payload.get("iss"), + }, + ) + return None + + token_model = MCPAccessToken.from_introspection( + token, + payload, + resource_hint=str(self._settings.resource_server_url) + if self._settings.resource_server_url + else None, + ) + + # Respect cache TTL limit if configured + ttl_seconds = max(0, self._settings.token_cache_ttl_seconds or 0) + if ttl_seconds and token_model.expires_at is not None: + now_ts = datetime.now(tz=timezone.utc).timestamp() + cache_limit = now_ts + ttl_seconds + token_model.expires_at = min(token_model.expires_at, cache_limit) + + # Optionally enforce required scopes + required_scopes = self._settings.required_scopes or [] + missing = [ + scope for scope in required_scopes if scope not in token_model.scopes + ] + if missing: + logger.warning( + "Token missing required scopes", + data={"missing_scopes": missing}, + ) + return None + + return token_model + + async def aclose(self) -> None: + await self._client.aclose() + + async def __aenter__(self) -> "MCPAgentTokenVerifier": + return self + + async def __aexit__(self, exc_type, exc, tb) -> None: + await self.aclose() diff --git a/tests/test_oauth_utils.py b/tests/test_oauth_utils.py new file mode 100644 index 000000000..87488c41a --- /dev/null +++ b/tests/test_oauth_utils.py @@ -0,0 +1,85 @@ +import time +import pathlib +import sys + +import pytest + +PROJECT_ROOT = pathlib.Path(__file__).resolve().parents[1] +SRC_ROOT = PROJECT_ROOT / "src" +if str(SRC_ROOT) not in sys.path: + sys.path.insert(0, str(SRC_ROOT)) + +try: + from mcp_agent.oauth.metadata import normalize_resource, select_authorization_server + from mcp_agent.oauth.records import TokenRecord + from mcp_agent.oauth.store import ( + InMemoryTokenStore, + TokenStoreKey, + scope_fingerprint, + ) + from mcp.shared.auth import ProtectedResourceMetadata +except ModuleNotFoundError: # pragma: no cover - optional dependency + pytest.skip("MCP SDK not installed", allow_module_level=True) + + +def test_scope_fingerprint_ordering(): + scopes = ["email", "profile", "email"] + fingerprint = scope_fingerprint(scopes) + assert fingerprint == "email profile" + + +def test_token_record_expiry(): + record = TokenRecord( + access_token="tok", + expires_at=time.time() + 5, + ) + assert not record.is_expired(leeway_seconds=0) + assert record.is_expired(leeway_seconds=10) + + +@pytest.mark.asyncio +async def test_in_memory_token_store_round_trip(): + store = InMemoryTokenStore() + key = TokenStoreKey( + user_key="provider:subject", + resource="https://example.com", + authorization_server="https://auth.example.com", + scope_fingerprint="scope", + ) + record = TokenRecord(access_token="abc123") + + await store.set(key, record) + fetched = await store.get(key) + assert fetched.access_token == record.access_token + await store.delete(key) + assert await store.get(key) is None + + +def test_select_authorization_server_prefers_explicit(): + metadata = ProtectedResourceMetadata( + resource="https://example.com", + authorization_servers=[ + "https://auth1.example.com", + "https://auth2.example.com", + ], + ) + assert ( + select_authorization_server(metadata, "https://auth2.example.com") + == "https://auth2.example.com" + ) + assert ( + select_authorization_server(metadata, "https://unknown.example.com") + == "https://auth1.example.com" + ) + + +def test_normalize_resource_with_fallback(): + assert ( + normalize_resource("https://example.com/api", None) == "https://example.com/api" + ) + assert ( + normalize_resource(None, "https://fallback.example.com") + == "https://fallback.example.com" + ) + with pytest.raises(ValueError): + normalize_resource(None, None) From efb63e1d4caf7c5d6b1602344f7f773065c4a9a8 Mon Sep 17 00:00:00 2001 From: Roman van der Krogt Date: Wed, 24 Sep 2025 21:29:41 +0100 Subject: [PATCH 05/11] add audience validation --- src/mcp_agent/config.py | 11 ++ src/mcp_agent/oauth/access_token.py | 43 ++++- src/mcp_agent/oauth/metadata.py | 2 +- src/mcp_agent/server/token_verifier.py | 64 ++++++- tests/test_audience_validation.py | 250 +++++++++++++++++++++++++ tests/test_oauth_utils.py | 7 +- 6 files changed, 366 insertions(+), 11 deletions(-) create mode 100644 tests/test_audience_validation.py diff --git a/src/mcp_agent/config.py b/src/mcp_agent/config.py index d72f972ec..59d8ef84d 100644 --- a/src/mcp_agent/config.py +++ b/src/mcp_agent/config.py @@ -49,6 +49,14 @@ class MCPAuthorizationServerSettings(BaseModel): introspection_client_secret: str | None = None token_cache_ttl_seconds: int = Field(300, ge=0) + # RFC 9068 audience validation settings + # TODO: this should really depend on the app_id, or config_id so that we can enforce unique values. + # To be removed and replaced with a fixed value once we have app_id/config_id support + expected_audiences: List[str] = Field(default_factory=list) + """List of audience values this resource server accepts. + MUST be configured to comply with RFC 9068 audience validation. + Audience validation is always enforced when authorization is enabled.""" + model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True) @model_validator(mode="after") @@ -59,6 +67,9 @@ def _validate_required_urls(self) -> "MCPAuthorizationServerSettings": missing.append("issuer_url") if self.resource_server_url is None: missing.append("resource_server_url") + # Validate audience configuration for RFC 9068 compliance + if not self.expected_audiences: + missing.append("expected_audiences (required for RFC 9068 compliance)") if missing: raise ValueError( " | ".join(missing) + " must be set when authorization is enabled" diff --git a/src/mcp_agent/oauth/access_token.py b/src/mcp_agent/oauth/access_token.py index fe3d4bab4..0ec75a190 100644 --- a/src/mcp_agent/oauth/access_token.py +++ b/src/mcp_agent/oauth/access_token.py @@ -16,6 +16,7 @@ class MCPAccessToken(AccessToken): issuer: str | None = None resource_indicator: str | None = None claims: Dict[str, Any] | None = None + audiences: List[str] | None = None @classmethod def from_introspection( @@ -39,12 +40,9 @@ def from_introspection( else: scopes = [] - audience = payload.get("resource") or payload.get("aud") - if isinstance(audience, (list, tuple)): - audience_value = _first_non_empty(*audience) - else: - audience_value = audience - + # Enhanced audience extraction for RFC 9068 compliance + audiences = _extract_all_audiences(payload) + audience_value = audiences[0] if audiences else None resource = resource_hint or audience_value expires_at = payload.get("exp") @@ -61,6 +59,7 @@ def from_introspection( ), issuer=payload.get("iss"), resource_indicator=resource, + audiences=audiences, claims=payload, ) @@ -71,6 +70,38 @@ def is_expired(self, *, leeway_seconds: int = 0) -> bool: now = datetime.now(tz=timezone.utc).timestamp() return now >= (self.expires_at - leeway_seconds) + def validate_audience(self, expected_audiences: List[str]) -> bool: + """Validate this token's audience claims against expected values per RFC 9068.""" + if not self.audiences: + return False + if not expected_audiences: + return False + + return bool(set(expected_audiences).intersection(set(self.audiences))) + + +def _extract_all_audiences(payload: Dict[str, Any]) -> List[str]: + """Extract all audience values from token payload per RFC 9068.""" + audiences = [] + + # Extract from 'aud' claim + aud_claim = payload.get("aud") + if aud_claim: + if isinstance(aud_claim, str): + audiences.append(aud_claim) + elif isinstance(aud_claim, (list, tuple)): + audiences.extend([str(aud) for aud in aud_claim if aud]) + + # Extract from 'resource' claim (OAuth 2.0 resource indicators) + resource_claim = payload.get("resource") + if resource_claim: + if isinstance(resource_claim, str): + audiences.append(resource_claim) + elif isinstance(resource_claim, (list, tuple)): + audiences.extend([str(res) for res in resource_claim if res]) + + return list(set(audiences)) # Remove duplicates + def _first_non_empty(*values: Any) -> Any | None: for value in values: diff --git a/src/mcp_agent/oauth/metadata.py b/src/mcp_agent/oauth/metadata.py index 24ac6b5c8..c4986b011 100644 --- a/src/mcp_agent/oauth/metadata.py +++ b/src/mcp_agent/oauth/metadata.py @@ -35,7 +35,7 @@ def select_authorization_server( metadata: ProtectedResourceMetadata, preferred: str | None = None, ) -> str: - candidates: List[str] = list(metadata.authorization_servers or []) + candidates: List[str] = [str(url) for url in (metadata.authorization_servers or [])] if not candidates: raise ValueError( "Protected resource metadata did not include authorization servers" diff --git a/src/mcp_agent/server/token_verifier.py b/src/mcp_agent/server/token_verifier.py index 324f389b6..799341585 100644 --- a/src/mcp_agent/server/token_verifier.py +++ b/src/mcp_agent/server/token_verifier.py @@ -4,7 +4,7 @@ import asyncio from datetime import datetime, timezone -from typing import Any, Dict +from typing import Any, Dict, List import httpx @@ -99,6 +99,18 @@ async def _introspect(self, token: str) -> MCPAccessToken | None: ) return None + # RFC 9068 Audience Validation (always enforced) + token_audiences = self._extract_audiences(payload) + if not self._validate_audiences(token_audiences): + logger.warning( + "Token audience validation failed", + data={ + "token_audiences": token_audiences, + "expected_audiences": self._settings.expected_audiences, + }, + ) + return None + token_model = MCPAccessToken.from_introspection( token, payload, @@ -128,6 +140,56 @@ async def _introspect(self, token: str) -> MCPAccessToken | None: return token_model + def _extract_audiences(self, payload: Dict[str, Any]) -> List[str]: + """Extract audience values from token payload according to RFC 9068.""" + audiences = [] + + # Check both 'aud' and 'resource' claims (OAuth 2.0 resource indicators) + aud_claim = payload.get("aud") + resource_claim = payload.get("resource") + + # Handle 'aud' claim (can be string or array) + if aud_claim: + if isinstance(aud_claim, str): + audiences.append(aud_claim) + elif isinstance(aud_claim, (list, tuple)): + audiences.extend([str(aud) for aud in aud_claim if aud]) + + # Handle 'resource' claim (OAuth 2.0 resource indicator) + if resource_claim: + if isinstance(resource_claim, str): + audiences.append(resource_claim) + elif isinstance(resource_claim, (list, tuple)): + audiences.extend([str(res) for res in resource_claim if res]) + + return list(set(audiences)) # Remove duplicates + + def _validate_audiences(self, token_audiences: List[str]) -> bool: + """Validate token audiences against expected values per RFC 9068.""" + if not token_audiences: + logger.warning("Token contains no audience claims") + return False + + if not self._settings.expected_audiences: + logger.warning("No expected audiences configured for validation") + return False + + # RFC 9068: Token MUST contain at least one expected audience + valid_audiences = set(self._settings.expected_audiences) + token_audience_set = set(token_audiences) + + if not valid_audiences.intersection(token_audience_set): + logger.warning( + "Token audience validation failed - no matching audiences", + data={ + "token_audiences": list(token_audience_set), + "valid_audiences": list(valid_audiences), + }, + ) + return False + + return True + async def aclose(self) -> None: await self._client.aclose() diff --git a/tests/test_audience_validation.py b/tests/test_audience_validation.py new file mode 100644 index 000000000..058774fe1 --- /dev/null +++ b/tests/test_audience_validation.py @@ -0,0 +1,250 @@ +"""Test audience validation functionality for RFC 9068 compliance.""" + +import pytest +from unittest.mock import Mock, AsyncMock +import httpx +from mcp_agent.config import MCPAuthorizationServerSettings +from mcp_agent.server.token_verifier import MCPAgentTokenVerifier +from mcp_agent.oauth.access_token import MCPAccessToken, _extract_all_audiences + + +@pytest.mark.asyncio +async def test_audience_validation_success(): + """Test successful audience validation with matching audiences.""" + settings = MCPAuthorizationServerSettings( + enabled=True, + issuer_url="https://auth.example.com", + resource_server_url="https://api.example.com", + introspection_endpoint="https://auth.example.com/introspect", + expected_audiences=["https://api.example.com", "api.example.com"], + ) + + # Mock successful introspection response with valid audience + payload = { + "active": True, + "aud": ["https://api.example.com", "other.example.com"], + "sub": "user123", + "exp": 1234567890, + "iss": "https://auth.example.com/", + } + + token = MCPAccessToken.from_introspection("test_token", payload) + assert token.validate_audience(settings.expected_audiences) is True + + +@pytest.mark.asyncio +async def test_audience_validation_failure(): + """Test audience validation failure with non-matching audiences.""" + settings = MCPAuthorizationServerSettings( + enabled=True, + issuer_url="https://auth.example.com", + resource_server_url="https://api.example.com", + introspection_endpoint="https://auth.example.com/introspect", + expected_audiences=["https://api.example.com"], + ) + + payload = { + "active": True, + "aud": ["https://malicious.example.com"], # Wrong audience + "sub": "user123", + "exp": 1234567890, + "iss": "https://auth.example.com/", + } + + token = MCPAccessToken.from_introspection("test_token", payload) + assert token.validate_audience(settings.expected_audiences) is False + + +@pytest.mark.asyncio +async def test_resource_claim_audience_validation(): + """Test audience validation using OAuth 2.0 resource indicators.""" + settings = MCPAuthorizationServerSettings( + enabled=True, + issuer_url="https://auth.example.com", + resource_server_url="https://api.example.com", + introspection_endpoint="https://auth.example.com/introspect", + expected_audiences=["https://api.example.com"], + ) + + # Token with resource claim instead of aud claim + payload = { + "active": True, + "resource": "https://api.example.com", # OAuth 2.0 resource indicator + "sub": "user123", + "exp": 1234567890, + "iss": "https://auth.example.com/", + } + + token = MCPAccessToken.from_introspection("test_token", payload) + assert token.validate_audience(settings.expected_audiences) is True + + +@pytest.mark.asyncio +async def test_multiple_audiences_extraction(): + """Test extraction of multiple audiences from both aud and resource claims.""" + payload = { + "aud": ["https://api1.example.com", "https://api2.example.com"], + "resource": "https://api3.example.com", + } + + audiences = _extract_all_audiences(payload) + expected = {"https://api1.example.com", "https://api2.example.com", "https://api3.example.com"} + assert set(audiences) == expected + + +@pytest.mark.asyncio +async def test_audience_extraction_string_values(): + """Test extraction when aud and resource are strings rather than arrays.""" + payload = { + "aud": "https://api1.example.com", + "resource": "https://api2.example.com", + } + + audiences = _extract_all_audiences(payload) + expected = {"https://api1.example.com", "https://api2.example.com"} + assert set(audiences) == expected + + +@pytest.mark.asyncio +async def test_empty_audience_validation(): + """Test validation fails when no audiences are present.""" + payload = { + "active": True, + "sub": "user123", + "exp": 1234567890, + "iss": "https://auth.example.com/", + # No aud or resource claims + } + + token = MCPAccessToken.from_introspection("test_token", payload) + assert token.validate_audience(["https://api.example.com"]) is False + + +def test_configuration_validation(): + """Test that configuration validation always enforces audience settings.""" + # Should raise error when no audiences configured (always enforced now) + with pytest.raises(ValueError, match="expected_audiences.*required for RFC 9068"): + MCPAuthorizationServerSettings( + enabled=True, + issuer_url="https://auth.example.com", + resource_server_url="https://api.example.com", + expected_audiences=[], # Empty list should always fail + ) + + # Should succeed with proper configuration + settings = MCPAuthorizationServerSettings( + enabled=True, + issuer_url="https://auth.example.com", + resource_server_url="https://api.example.com", + expected_audiences=["https://api.example.com"], + ) + assert "https://api.example.com" in settings.expected_audiences + + + + +@pytest.mark.asyncio +async def test_token_verifier_audience_validation_integration(): + """Test full integration of audience validation in token verifier.""" + settings = MCPAuthorizationServerSettings( + enabled=True, + issuer_url="https://auth.example.com", + resource_server_url="https://api.example.com", + introspection_endpoint="https://auth.example.com/introspect", + introspection_client_id="test-client", + introspection_client_secret="test-secret", + expected_audiences=["https://api.example.com"], + ) + + verifier = MCPAgentTokenVerifier(settings) + + # Mock HTTP client + mock_client = Mock(spec=httpx.AsyncClient) + + # Mock successful response with valid audience + valid_response = Mock() + valid_response.status_code = 200 + valid_response.json.return_value = { + "active": True, + "aud": "https://api.example.com", + "sub": "user123", + "exp": 1234567890, + "iss": "https://auth.example.com/", + } + mock_client.post = AsyncMock(return_value=valid_response) + verifier._client = mock_client + + # Should succeed with valid audience + token = await verifier._introspect("valid_token") + assert token is not None + assert "https://api.example.com" in token.audiences + + # Mock response with invalid audience + invalid_response = Mock() + invalid_response.status_code = 200 + invalid_response.json.return_value = { + "active": True, + "aud": "https://malicious.example.com", # Wrong audience + "sub": "user123", + "exp": 1234567890, + "iss": "https://auth.example.com/", + } + mock_client.post = AsyncMock(return_value=invalid_response) + + # Should fail with invalid audience + token = await verifier._introspect("invalid_token") + assert token is None + + + + +def test_audience_extraction_edge_cases(): + """Test audience extraction handles edge cases properly.""" + # Empty payload + assert _extract_all_audiences({}) == [] + + # None values + assert _extract_all_audiences({"aud": None, "resource": None}) == [] + + # Mixed empty and valid values + payload = { + "aud": ["", "https://valid.com", None], + "resource": ["https://another.com", ""] + } + audiences = _extract_all_audiences(payload) + expected = {"https://valid.com", "https://another.com"} + assert set(audiences) == expected + + # Duplicate values should be removed + payload = { + "aud": ["https://api.com", "https://api.com"], + "resource": "https://api.com" + } + audiences = _extract_all_audiences(payload) + assert audiences == ["https://api.com"] + + +@pytest.mark.asyncio +async def test_partial_audience_match(): + """Test that partial audience matches are sufficient for validation.""" + settings = MCPAuthorizationServerSettings( + enabled=True, + issuer_url="https://auth.example.com", + resource_server_url="https://api.example.com", + introspection_endpoint="https://auth.example.com/introspect", + expected_audiences=["https://api.example.com", "https://other-api.com"], + strict_audience_validation=True, + ) + + # Token has one matching and one non-matching audience + payload = { + "active": True, + "aud": ["https://api.example.com", "https://unrelated.com"], + "sub": "user123", + "exp": 1234567890, + "iss": "https://auth.example.com/", + } + + token = MCPAccessToken.from_introspection("test_token", payload) + # Should succeed because at least one audience matches + assert token.validate_audience(settings.expected_audiences) is True \ No newline at end of file diff --git a/tests/test_oauth_utils.py b/tests/test_oauth_utils.py index 87488c41a..cd3de139f 100644 --- a/tests/test_oauth_utils.py +++ b/tests/test_oauth_utils.py @@ -63,13 +63,14 @@ def test_select_authorization_server_prefers_explicit(): "https://auth2.example.com", ], ) + # URLs get normalized with trailing slashes by pydantic assert ( - select_authorization_server(metadata, "https://auth2.example.com") - == "https://auth2.example.com" + select_authorization_server(metadata, "https://auth2.example.com/") + == "https://auth2.example.com/" ) assert ( select_authorization_server(metadata, "https://unknown.example.com") - == "https://auth1.example.com" + == "https://auth1.example.com/" # Falls back to first, which gets normalized ) From 6cd9b407573c6f0795fdf8febbdedb79b40fd5ba Mon Sep 17 00:00:00 2001 From: Roman van der Krogt Date: Thu, 25 Sep 2025 22:01:26 +0100 Subject: [PATCH 06/11] add comfigured token support; add workflow_pre_auth; oauth example against github --- examples/oauth/preconfigured/README.md | 402 +++++++++++++++++ examples/oauth/preconfigured/main.py | 188 ++++++++ .../oauth/preconfigured/mcp_agent.config.yaml | 115 +++++ .../mcp_agent.secrets.yaml.example | 41 ++ examples/oauth/preconfigured/oauth_demo.py | 384 ++++++++++++++++ examples/oauth/preconfigured/requirements.txt | 37 ++ .../oauth/preconfigured/workflow_example.py | 427 ++++++++++++++++++ examples/oauth/workflow_pre_auth/client.py | 193 ++++++++ examples/oauth/workflow_pre_auth/main.py | 139 ++++++ src/mcp_agent/app.py | 44 ++ src/mcp_agent/config.py | 5 + src/mcp_agent/oauth/http/auth.py | 24 +- src/mcp_agent/oauth/manager.py | 139 ++++-- src/mcp_agent/server/app_server.py | 152 +++++++ 14 files changed, 2252 insertions(+), 38 deletions(-) create mode 100644 examples/oauth/preconfigured/README.md create mode 100644 examples/oauth/preconfigured/main.py create mode 100644 examples/oauth/preconfigured/mcp_agent.config.yaml create mode 100644 examples/oauth/preconfigured/mcp_agent.secrets.yaml.example create mode 100644 examples/oauth/preconfigured/oauth_demo.py create mode 100644 examples/oauth/preconfigured/requirements.txt create mode 100644 examples/oauth/preconfigured/workflow_example.py create mode 100644 examples/oauth/workflow_pre_auth/client.py create mode 100644 examples/oauth/workflow_pre_auth/main.py diff --git a/examples/oauth/preconfigured/README.md b/examples/oauth/preconfigured/README.md new file mode 100644 index 000000000..846eded46 --- /dev/null +++ b/examples/oauth/preconfigured/README.md @@ -0,0 +1,402 @@ +# OAuth MCP Agent Example + +This example demonstrates how to build MCP agents that use OAuth authentication to access OAuth-protected MCP servers, specifically showing integration with the GitHub MCP server. + +## 📋 Overview + +This example includes: + +- **Basic OAuth Integration** - Connect to OAuth-protected MCP servers +- **GitHub Organization Search** - Use the `search_orgs` tool from GitHub MCP server +- **Workflow Pre-Authorization** - Demonstrate the new `workflow_pre_auth` endpoint +- **Interactive OAuth Flow** - Complete OAuth setup and token management +- **Production-Ready Configuration** - Comprehensive config with security best practices + +## 🚀 Quick Start + +### 1. Prerequisites + +```bash +# Install Python dependencies +pip install -r requirements.txt + +# Install GitHub MCP server +uvx install github-mcp-server + +# Optional: Install additional MCP servers +npm install -g @modelcontextprotocol/server-filesystem +uvx install mcp-server-fetch +``` + +### 2. Set Up GitHub OAuth App + +1. Go to [GitHub Settings → Developer settings → OAuth Apps](https://github.com/settings/applications/new) +2. Click **"New OAuth App"** +3. Fill in the details: + - **Application name**: `MCP Agent OAuth Example` + - **Homepage URL**: `https://github.com/yourusername/your-repo` + - **Authorization callback URL**: `http://localhost:8080/oauth/callback` +4. Click **"Register application"** +5. Copy the **Client ID** and generate a **Client Secret** + +### 3. Configure Secrets + +```bash +# Copy the secrets template +cp mcp_agent.secrets.yaml.example mcp_agent.secrets.yaml + +# Edit with your credentials +nano mcp_agent.secrets.yaml +``` + +Add your GitHub OAuth app credentials: + +```yaml +mcp: + servers: + github: + auth: + oauth: + client_id: "your_github_oauth_app_client_id_here" + client_secret: "your_github_oauth_app_client_secret_here" + access_token: "your_github_access_token_here" # Optional: skip OAuth flow +``` + +### 4. Run the Examples + +#### Basic OAuth Example +```bash +python main.py +``` + +#### Interactive OAuth Setup +```bash +python oauth_demo.py +``` + +#### Workflow with Pre-Authorization +```bash +python workflow_example.py +``` + +## 📁 File Structure + +``` +examples/oauth/ +├── README.md # This file +├── main.py # Basic OAuth MCP agent +├── workflow_example.py # Workflow with pre-auth demo +├── oauth_demo.py # Interactive OAuth flow +├── mcp_agent.config.yaml # Agent configuration +├── mcp_agent.secrets.yaml.example # Secrets template +└── requirements.txt # Python dependencies +``` + +## 🔐 Authentication Methods + +### Method 1: OAuth Flow (Recommended) + +Full OAuth 2.0 flow with refresh tokens: + +1. **Run Interactive Setup**: + ```bash + GITHUB_CLIENT_ID=your_id GITHUB_CLIENT_SECRET=your_secret python oauth_demo.py + ``` + +2. **Follow Browser Flow**: Authorize the application in your browser + +3. **Token Storage**: Tokens are automatically stored for reuse + +### Method 2: Personal Access Token (Development) + +For development and testing, you can use a GitHub Personal Access Token: + +1. Go to [GitHub Settings → Developer settings → Personal access tokens](https://github.com/settings/tokens) +2. Generate a token with scopes: `read:org`, `public_repo`, `user:email` +3. Configure in `mcp_agent.secrets.yaml`: + +```yaml +mcp: + servers: + github: + auth: + api_key: "ghp_your_personal_access_token_here" +``` + +## 🔄 Workflow Pre-Authorization + +The `workflow_pre_auth` endpoint allows you to pre-store OAuth tokens for workflows: + +### 1. Start MCP Agent Server + +```bash +mcp-agent server --config mcp_agent.config.yaml +``` + +### 2. Pre-Authorize Tokens + +```bash +curl -X POST http://localhost:8080/tools/workflows-pre-auth \ + -H "Content-Type: application/json" \ + -d '{ + "workflow_name": "github_analysis_workflow", + "tokens": [ + { + "access_token": "your_github_access_token", + "refresh_token": "your_refresh_token", + "server_name": "github", + "scopes": ["read:org", "public_repo"], + "authorization_server": "https://github.com/login/oauth/authorize" + } + ] + }' +``` + +### 3. Run Workflow + +```bash +curl -X POST http://localhost:8080/tools/workflows-run \ + -H "Content-Type: application/json" \ + -d '{ + "workflow_name": "analyze_github_ecosystem", + "run_parameters": { + "focus_areas": ["AI/ML", "cloud", "security"], + "include_details": true + } + }' +``` + +## 🛠 Examples Explained + +### main.py - Basic OAuth Integration + +Demonstrates: +- Connecting to GitHub MCP server with OAuth +- Using the `search_orgs` tool +- Error handling and token management +- Both single-use and persistent connections + +Key features: +```python +async with gen_client("github", server_registry=context.server_registry) as github_client: + result = await github_client.call_tool("search_orgs", { + "query": "microsoft", + "perPage": 10, + "sort": "best-match" + }) +``` + +### workflow_example.py - Advanced Workflow + +Demonstrates: +- Custom agent (`GitHubOrganizationAnalyzer`) +- Workflow with `@app.async_tool` decorator +- Pre-authorization token usage +- Comprehensive GitHub ecosystem analysis + +Key features: +```python +@app.async_tool +async def analyze_github_ecosystem( + app_ctx: Context, + focus_areas: List[str], + include_details: bool = True +) -> Dict[str, Any]: + # Uses pre-authorized tokens automatically + analyzer = GitHubOrganizationAnalyzer(context=app_ctx) + return await analyzer.analyze_organizations(queries, include_details) +``` + +### oauth_demo.py - Interactive OAuth Setup + +Demonstrates: +- Complete OAuth 2.0 flow +- Local callback server +- Token testing and validation +- Token persistence + +Key features: +- Automatic browser opening +- CSRF protection with state parameter +- Token testing with GitHub API +- Export tokens for MCP agent use + +## ⚙ Configuration Details + +### OAuth Configuration + +```yaml +oauth: + token_store: + backend: memory # or 'redis' for production + refresh_leeway_seconds: 60 + flow_timeout_seconds: 300 + callback_base_url: http://localhost:8080 + +mcp: + servers: + github: + auth: + oauth: + enabled: true + scopes: ["read:org", "public_repo", "user:email"] + authorization_server: "https://github.com/login/oauth/authorize" + resource: "https://api.github.com" +``` + +### GitHub Scopes Required + +| Scope | Purpose | Required | +|-------|---------|----------| +| `read:org` | Search organizations | ✅ Yes | +| `public_repo` | Access public repositories | ✅ Yes | +| `user:email` | User information | ⚠ Recommended | +| `repo` | Private repositories | ❌ Optional | + +## 🔧 Production Deployment + +### Redis Token Storage + +For production with multiple processes: + +```yaml +oauth: + token_store: + backend: redis + redis_url: "redis://localhost:6379" + redis_prefix: "mcp_agent:oauth_tokens" +``` + +### Environment Variables + +```bash +export GITHUB_CLIENT_ID="your_client_id" +export GITHUB_CLIENT_SECRET="your_client_secret" +export REDIS_URL="redis://localhost:6379" +export OPENAI_API_KEY="your_openai_key" +``` + +### Security Best Practices + +1. **Never commit secrets** - Use `.gitignore` for `mcp_agent.secrets.yaml` +2. **Rotate tokens regularly** - Set up token refresh workflows +3. **Minimal scopes** - Only request necessary permissions +4. **Secure storage** - Use Redis or encrypted storage in production +5. **HTTPS callbacks** - Use HTTPS URLs for production OAuth callbacks + +## 🐛 Troubleshooting + +### Common Issues + +#### OAuth Flow Fails +``` +Error: OAuth error: access_denied +``` +**Solution**: Check callback URL matches OAuth app configuration + +#### Token Test Fails +``` +Error: Token test failed: 401 +``` +**Solution**: Verify token scopes and GitHub app permissions + +#### MCP Server Connection Fails +``` +Error: GitHub MCP server not found +``` +**Solution**: Install GitHub MCP server with `uvx install github-mcp-server` + +#### Import Errors +``` +ImportError: No module named 'mcp_agent' +``` +**Solution**: Install with `pip install mcp-agent[oauth]` + +### Debug Mode + +Enable detailed logging: + +```yaml +logger: + level: debug + debug_oauth: true +``` + +### Testing Tokens + +Test your GitHub token manually: + +```bash +curl -H "Authorization: Bearer YOUR_TOKEN" https://api.github.com/user +``` + +## 📚 Advanced Usage + +### Multiple OAuth Providers + +```yaml +mcp: + servers: + github: + auth: + oauth: + client_id: "github_client_id" + # ... GitHub config + + slack: + auth: + oauth: + client_id: "slack_client_id" + # ... Slack config +``` + +### Custom Token Refresh + +```python +async def refresh_github_token(old_token: str) -> str: + # Custom token refresh logic + async with aiohttp.ClientSession() as session: + # ... refresh implementation + return new_token +``` + +### Workflow Chaining + +```python +@app.async_tool +async def multi_step_analysis(app_ctx: Context, orgs: List[str]): + # Step 1: Search organizations + github_results = await search_organizations(orgs) + + # Step 2: Analyze with different service + analysis = await analyze_with_ai(github_results) + + # Step 3: Store results + await store_results(analysis) + + return analysis +``` + +## 🤝 Contributing + +1. Fork the repository +2. Create your feature branch +3. Add tests for new functionality +4. Ensure all examples work +5. Submit a pull request + +## 📄 License + +This example is part of the MCP Agent project and follows the same license terms. + +## 🔗 Related Resources + +- [MCP Agent Documentation](../../README.md) +- [GitHub MCP Server](https://github.com/github/github-mcp-server) +- [OAuth 2.0 Specification](https://tools.ietf.org/html/rfc6749) +- [GitHub OAuth Apps](https://docs.github.com/en/developers/apps/building-oauth-apps) +- [Model Context Protocol](https://modelcontextprotocol.io) + +--- + +For questions or issues with this example, please check the [main repository issues](../../issues) or create a new issue with the `oauth-example` label. \ No newline at end of file diff --git a/examples/oauth/preconfigured/main.py b/examples/oauth/preconfigured/main.py new file mode 100644 index 000000000..64d228151 --- /dev/null +++ b/examples/oauth/preconfigured/main.py @@ -0,0 +1,188 @@ +""" +OAuth MCP Agent Example + +This example demonstrates how to use an MCP agent with OAuth authentication +to access the GitHub MCP server and search for organizations. + +Features demonstrated: +- OAuth flow setup and configuration +- Connecting to GitHub MCP server with OAuth +- Using the search_orgs tool +- Error handling and token refresh +""" + +import asyncio +import json +import logging +from typing import Any, Dict, List + +from mcp_agent.app import MCPApp +from mcp_agent.mcp.gen_client import gen_client +from mcp_agent.mcp.mcp_agent_client_session import MCPAgentClientSession +from mcp_agent.mcp.mcp_connection_manager import MCPConnectionManager + +# Create the MCP app with OAuth configuration +app = MCPApp(name="oauth_github_example") + +async def search_github_orgs(query: str, limit: int = 5) -> List[Dict[str, Any]]: + """ + Search for GitHub organizations using the GitHub MCP server with OAuth. + + Args: + query: Search query (e.g., 'microsoft', 'location:california') + limit: Maximum number of results to return + + Returns: + List of organization data from GitHub + """ + async with app.run() as github_app: + context = github_app.context + logger = github_app.logger + + logger.info(f"Searching GitHub organizations for: '{query}'") + + try: + # Connect to the GitHub MCP server with OAuth + async with gen_client( + "github", + server_registry=context.server_registry, + context=context + ) as github_client: + logger.info("Connected to GitHub MCP server with OAuth") + + # List available tools to verify connection + tools_result = await github_client.list_tools() + logger.info(f"Available tools: {len(tools_result.tools)} tools found") + + # Find the search_orgs tool + search_orgs_tool = None + for tool in tools_result.tools: + if tool.name == "search_orgs": + search_orgs_tool = tool + break + + if not search_orgs_tool: + logger.error("search_orgs tool not found") + return [] + + logger.info(f"Found search_orgs tool: {search_orgs_tool.description}") + + # Call the search_orgs tool + result = await github_client.call_tool( + "search_orgs", + { + "query": query, + "perPage": min(limit, 100), # GitHub API max is 100 + "sort": "best-match", + "order": "desc" + } + ) + + logger.info(f"Search completed, processing results...") + + # Parse and return the results + if result.content: + # The result content should contain the organization data + organizations = [] + for content_item in result.content: + if hasattr(content_item, 'text'): + try: + # Try to parse as JSON if it's structured data + data = json.loads(content_item.text) + if isinstance(data, dict) and 'items' in data: + organizations.extend(data['items'][:limit]) + elif isinstance(data, list): + organizations.extend(data[:limit]) + else: + organizations.append(data) + except json.JSONDecodeError: + # If not JSON, treat as text description + organizations.append({"description": content_item.text}) + + logger.info(f"Found {len(organizations)} organizations") + return organizations[:limit] + + return [] + + except Exception as e: + logger.error(f"Error searching GitHub organizations: {e}") + # Check if it's an OAuth-related error + if "authentication" in str(e).lower() or "oauth" in str(e).lower(): + logger.error( + "Authentication failed. Please check your OAuth configuration " + "and ensure your GitHub token is valid." + ) + raise + + +async def demonstrate_org_search(): + """ + Demonstrate searching for different types of organizations. + """ + search_queries = [ + "microsoft", + # "location:california", + # "created:>=2020-01-01", + # "language:python", + # "repositories:>100" + ] + + for query in search_queries: + print(f"\n{'='*50}") + print(f"Searching for: {query}") + print('='*50) + + try: + orgs = await search_github_orgs(query, limit=3) + + if orgs: + for i, org in enumerate(orgs, 1): + print(f"\n{i}. {org.get('login', 'Unknown')}") + if 'description' in org and org['description']: + print(f" Description: {org['description']}") + if 'html_url' in org: + print(f" URL: {org['html_url']}") + if 'public_repos' in org: + print(f" Public repos: {org['public_repos']}") + if 'location' in org and org['location']: + print(f" Location: {org['location']}") + else: + print("No organizations found.") + + except Exception as e: + print(f"Error: {e}") + continue + + + +async def main(): + """ + Main function demonstrating various OAuth MCP agent usage patterns. + """ + print("OAuth MCP Agent Example - GitHub Organization Search") + print("=" * 60) + + try: + # Demonstrate basic organization search + await demonstrate_org_search() + + except Exception as e: + print(f"\nExample failed with error: {e}") + print("\nPlease ensure:") + print("1. You have configured your GitHub OAuth app correctly") + print("2. Your mcp_agent.secrets.yaml file contains valid OAuth credentials") + print("3. The GitHub MCP server is properly installed and accessible") + print("4. Your OAuth token has the required scopes (read:org)") + + # Log the full error for debugging + logging.exception("Full error details:") + + +if __name__ == "__main__": + # Set up logging to show detailed information + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" + ) + + asyncio.run(main()) \ No newline at end of file diff --git a/examples/oauth/preconfigured/mcp_agent.config.yaml b/examples/oauth/preconfigured/mcp_agent.config.yaml new file mode 100644 index 000000000..61fa80456 --- /dev/null +++ b/examples/oauth/preconfigured/mcp_agent.config.yaml @@ -0,0 +1,115 @@ +$schema: ../../schema/mcp-agent.config.schema.json + +# OAuth MCP Agent Configuration +# This configuration demonstrates how to set up OAuth authentication +# for accessing OAuth-protected MCP servers like the GitHub MCP server + +execution_engine: asyncio + +# Logging configuration +logger: + type: console + level: debug + path: "./mcp-agent.log" + # Enable detailed OAuth and authentication logging + debug_oauth: true + +# OpenTelemetry tracing (optional) +tracing: + enabled: true + service_name: "OAuth-MCP-Agent-Example" + exporters: ["console"] + +# OAuth-specific configuration +oauth: + # Token store configuration + token_store: + backend: memory # Use 'redis' for production with multiple processes + refresh_leeway_seconds: 60 # Refresh tokens 60 seconds before expiry + + # OAuth flow timeout (5 minutes) + flow_timeout_seconds: 300 + + # Callback base URL for OAuth flows (adjust if running behind proxy) + callback_base_url: http://localhost:8080 + +# MCP server configurations +mcp: + servers: + # GitHub MCP Server with OAuth authentication + github: + # Use the remote GitHub MCP server + transport: "streamable_http" + url: "https://api.githubcopilot.com/mcp/" + + # OAuth authentication configuration + auth: + oauth: + enabled: true + # Required scopes for GitHub MCP server functionality + scopes: + - "read:org" # Required for search_orgs tool + - "public_repo" # Access to public repositories + - "user:email" # User information access + + # GitHub OAuth endpoints + authorization_server: "https://github.com/login/oauth" + resource: "https://api.githubcopilot.com/mcp" + + # Use internal callback handling (recommended) + use_internal_callback: true + + # Example: Additional MCP server (filesystem for local operations) + filesystem: + command: "npx" + args: ["-y", "@modelcontextprotocol/server-filesystem", "."] + # No auth required for local filesystem server + + # Example: Fetch server (no auth required) + fetch: + command: "uvx" + args: ["mcp-server-fetch"] + +# Authorization server configuration (if exposing this agent as an MCP server) +authorization: + enabled: false # Set to true if you want to expose this agent with OAuth protection + # issuer_url: "https://your-oauth-provider.com" + # resource_server_url: "https://your-agent-server.com" + # required_scopes: ["agent:read", "agent:execute"] + +# Model configuration (for LLM-based agents) +openai: + # API keys are stored in mcp_agent.secrets.yaml + model: "gpt-4" + temperature: 0.1 + max_tokens: 2000 + +anthropic: + # API keys are stored in mcp_agent.secrets.yaml + model: "claude-3-sonnet-20240229" + max_tokens: 2000 + +# Agent-specific settings +agents: + # Configuration for the GitHubOrganizationAnalyzer agent + default_timeout: 30 + max_retries: 3 + + # GitHub-specific settings + github: + max_orgs_per_query: 10 + default_search_sort: "best-match" + include_detailed_analysis: true + +# Workflow configuration +workflows: + # Default workflow timeout (30 minutes) + default_timeout_minutes: 30 + + # Enable workflow pre-authorization + enable_pre_auth: true + + # Workflow-specific settings + github_analysis: + max_concurrent_searches: 5 + analysis_depth: "detailed" # "basic" or "detailed" diff --git a/examples/oauth/preconfigured/mcp_agent.secrets.yaml.example b/examples/oauth/preconfigured/mcp_agent.secrets.yaml.example new file mode 100644 index 000000000..1feea2c6f --- /dev/null +++ b/examples/oauth/preconfigured/mcp_agent.secrets.yaml.example @@ -0,0 +1,41 @@ +$schema: ../../schema/mcp-agent.config.schema.json + +# OAuth MCP Agent Secrets Template +# +# This file contains sensitive configuration like API keys and OAuth credentials. +# Copy this file to mcp_agent.secrets.yaml and fill in your actual values. +# + +# OpenAI API configuration +openai: + api_key: "sk-your-openai-api-key-here" + +# Anthropic API configuration +anthropic: + api_key: "sk-ant-api03-your-anthropic-api-key-here" + +# GitHub OAuth App Configuration +# To set up a GitHub OAuth app: +# 1. Go to GitHub Settings > Developer settings > OAuth Apps +# 2. Click "New OAuth App" +# 3. Fill in the application details: +# - Application name: "MCP Agent OAuth Example" +# - Homepage URL: "https://github.com/your-username/your-repo" +# - Authorization callback URL: "http://localhost:8080/oauth/callback" +# 4. Click "Register application" +# 5. Copy the Client ID and generate a Client Secret +# 6. Fill in the values below + +mcp: + servers: + github: + auth: + oauth: + # GitHub OAuth App credentials + client_id: "your-github-client-id-here" + client_secret: "your-github-client-secret-here" + + # Optional: Pre-configured access token (from oauth_demo.py or manual setup) + # If you have a valid access token, you can specify it here to skip the OAuth flow + access_token: "your_github_access_token_here" + # refresh_token: "your_refresh_token_here" # If available diff --git a/examples/oauth/preconfigured/oauth_demo.py b/examples/oauth/preconfigured/oauth_demo.py new file mode 100644 index 000000000..9fb41d80b --- /dev/null +++ b/examples/oauth/preconfigured/oauth_demo.py @@ -0,0 +1,384 @@ +""" +Standalone OAuth Flow Demonstration + +This script demonstrates the OAuth flow for authenticating with GitHub +and storing tokens for use with MCP agents. This is useful for: +- Understanding the OAuth process +- Testing token acquisition and storage +- Debugging authentication issues +- Setting up tokens for the first time + +Run this script interactively to authenticate with GitHub and store tokens. +""" + +import asyncio +import json +import os +import secrets +import time +import urllib.parse +import webbrowser +from typing import Any, Dict, Optional + +import aiohttp +from aiohttp import web + + +class GitHubOAuthDemo: + """ + Demonstration of GitHub OAuth flow for MCP agent authentication. + """ + + def __init__(self, client_id: str, client_secret: str, redirect_uri: str = None): + """ + Initialize OAuth demo. + + Args: + client_id: GitHub OAuth app client ID + client_secret: GitHub OAuth app client secret + redirect_uri: OAuth redirect URI (defaults to localhost) + """ + self.client_id = client_id + self.client_secret = client_secret + self.redirect_uri = redirect_uri or "http://localhost:8080/oauth/callback" + self.state = secrets.token_urlsafe(32) # CSRF protection + self.access_token: Optional[str] = None + self.refresh_token: Optional[str] = None + self.token_expires_at: Optional[float] = None + + def get_authorization_url(self, scopes: list = None) -> str: + """ + Generate the GitHub authorization URL. + + Args: + scopes: List of OAuth scopes to request + + Returns: + Authorization URL for the user to visit + """ + if scopes is None: + scopes = ["read:org", "public_repo"] # Default scopes for GitHub MCP server + + params = { + "client_id": self.client_id, + "redirect_uri": self.redirect_uri, + "scope": " ".join(scopes), + "state": self.state, + "response_type": "code", + } + + base_url = "https://github.com/login/oauth/authorize" + return f"{base_url}?{urllib.parse.urlencode(params)}" + + async def exchange_code_for_token(self, code: str, state: str) -> Dict[str, Any]: + """ + Exchange authorization code for access token. + + Args: + code: Authorization code from GitHub + state: State parameter for CSRF protection + + Returns: + Token response data + + Raises: + ValueError: If state doesn't match or token exchange fails + """ + if state != self.state: + raise ValueError("State parameter mismatch - possible CSRF attack") + + token_url = "https://github.com/login/oauth/access_token" + data = { + "client_id": self.client_id, + "client_secret": self.client_secret, + "code": code, + "redirect_uri": self.redirect_uri, + } + + headers = { + "Accept": "application/json", + "User-Agent": "MCP-Agent-OAuth-Demo/1.0" + } + + async with aiohttp.ClientSession() as session: + async with session.post(token_url, data=data, headers=headers) as response: + if response.status != 200: + raise ValueError(f"Token exchange failed: {response.status}") + + token_data = await response.json() + + if "error" in token_data: + raise ValueError(f"Token error: {token_data['error_description']}") + + self.access_token = token_data.get("access_token") + self.refresh_token = token_data.get("refresh_token") + + # Calculate expiration time + expires_in = token_data.get("expires_in") + if expires_in: + self.token_expires_at = time.time() + expires_in + else: + # GitHub tokens typically don't expire, but set a far future date + self.token_expires_at = time.time() + (365 * 24 * 3600) # 1 year + + return token_data + + async def test_token(self) -> Dict[str, Any]: + """ + Test the access token by making a simple GitHub API call. + + Returns: + User information from GitHub API + """ + if not self.access_token: + raise ValueError("No access token available") + + headers = { + "Authorization": f"Bearer {self.access_token}", + "Accept": "application/vnd.github.v3+json", + "User-Agent": "MCP-Agent-OAuth-Demo/1.0" + } + + async with aiohttp.ClientSession() as session: + # Test with a simple user info call + async with session.get("https://api.github.com/user", headers=headers) as response: + if response.status != 200: + raise ValueError(f"Token test failed: {response.status}") + + user_data = await response.json() + return user_data + + def get_token_for_mcp_agent(self) -> Dict[str, Any]: + """ + Get token data in the format expected by MCP agent workflow_pre_auth. + + Returns: + Token data dictionary for MCP agent + """ + if not self.access_token: + raise ValueError("No access token available") + + return { + "access_token": self.access_token, + "refresh_token": self.refresh_token, + "server_name": "github", + "scopes": ["read:org", "public_repo"], + "expires_at": self.token_expires_at, + "authorization_server": "https://github.com/login/oauth/authorize", + "token_type": "Bearer" + } + + async def save_token_to_file(self, filename: str = "github_oauth_token.json"): + """ + Save the token to a JSON file for later use. + + Args: + filename: File to save token data + """ + token_data = self.get_token_for_mcp_agent() + + with open(filename, 'w') as f: + json.dump(token_data, f, indent=2) + + print(f"Token saved to {filename}") + print("You can now use this token with the MCP agent workflow_pre_auth endpoint.") + + async def run_oauth_flow(self, scopes: list = None) -> Dict[str, Any]: + """ + Run the complete OAuth flow interactively. + + Args: + scopes: OAuth scopes to request + + Returns: + Complete token data + """ + print("Starting GitHub OAuth flow...") + print("=" * 50) + + # Step 1: Generate authorization URL + auth_url = self.get_authorization_url(scopes) + print(f"\n1. Please visit this URL to authorize the application:") + print(f" {auth_url}") + print("\n2. After authorization, you'll be redirected to a callback URL.") + + # Step 2: Start local server to handle callback + callback_received = asyncio.Event() + callback_data = {} + + async def handle_callback(request): + nonlocal callback_data + try: + code = request.query.get('code') + state = request.query.get('state') + error = request.query.get('error') + + if error: + callback_data['error'] = error + callback_data['error_description'] = request.query.get('error_description', '') + else: + callback_data['code'] = code + callback_data['state'] = state + + callback_received.set() + + # Return a simple success page + html = """ + + +

OAuth Authorization Complete

+

You can close this window and return to the terminal.

+ + + + """ + return web.Response(text=html, content_type='text/html') + + except Exception as e: + print(f"Error in callback handler: {e}") + return web.Response(text=f"Error: {e}", status=500) + + # Start local server + app = web.Application() + app.router.add_get('/oauth/callback', handle_callback) + + runner = web.AppRunner(app) + await runner.setup() + site = web.TCPSite(runner, 'localhost', 8080) + await site.start() + + print("\n3. Local callback server started on http://localhost:8080") + print(" Opening browser to authorization URL...") + + # Open browser automatically + try: + webbrowser.open(auth_url) + except Exception: + print(" (Could not open browser automatically)") + + print("\n4. Waiting for authorization callback...") + + # Wait for callback with timeout + try: + await asyncio.wait_for(callback_received.wait(), timeout=300) # 5 minute timeout + except asyncio.TimeoutError: + print(" Timeout waiting for authorization callback") + await runner.cleanup() + raise ValueError("OAuth flow timeout") + + await runner.cleanup() + + # Step 3: Handle callback result + if 'error' in callback_data: + raise ValueError(f"OAuth error: {callback_data['error']} - {callback_data.get('error_description', '')}") + + code = callback_data.get('code') + state = callback_data.get('state') + + if not code: + raise ValueError("No authorization code received") + + print("5. Authorization code received, exchanging for access token...") + + # Step 4: Exchange code for token + token_data = await self.exchange_code_for_token(code, state) + print(" ✓ Access token obtained successfully") + + # Step 5: Test the token + print("6. Testing access token...") + try: + user_info = await self.test_token() + username = user_info.get('login', 'unknown') + print(f" ✓ Token test successful - authenticated as: {username}") + except Exception as e: + print(f" ⚠ Token test failed: {e}") + + return self.get_token_for_mcp_agent() + + +async def main(): + """ + Main interactive OAuth demonstration. + """ + print("GitHub OAuth Demo for MCP Agent") + print("=" * 40) + + # Check for environment variables + client_id = os.getenv('GITHUB_CLIENT_ID') + client_secret = os.getenv('GITHUB_CLIENT_SECRET') + + if not client_id or not client_secret: + print("\nTo use this demo, you need to set up a GitHub OAuth App:") + print("1. Go to GitHub Settings > Developer settings > OAuth Apps") + print("2. Click 'New OAuth App'") + print("3. Set Authorization callback URL to: http://localhost:8080/oauth/callback") + print("4. Set environment variables:") + print(" export GITHUB_CLIENT_ID='your_client_id'") + print(" export GITHUB_CLIENT_SECRET='your_client_secret'") + print("\nAlternatively, you can pass them as command line arguments.") + return + + try: + # Create OAuth demo instance + oauth_demo = GitHubOAuthDemo(client_id, client_secret) + + # Run the OAuth flow + scopes = ["read:org", "public_repo", "user:email"] + token_data = await oauth_demo.run_oauth_flow(scopes) + + print(token_data) + + print("\n" + "=" * 50) + print("OAuth Flow Completed Successfully!") + print("=" * 50) + + print(f"\nToken Details:") + print(f" Access Token: {token_data['access_token'][:20]}...") + print(f" Expires At: {time.ctime(token_data['expires_at'])}") + print(f" Scopes: {', '.join(token_data['scopes'])}") + + # Save token to file + save_choice = input("\nSave token to file? (y/n): ").lower().strip() + if save_choice in ['y', 'yes']: + filename = input("Enter filename (default: github_oauth_token.json): ").strip() + if not filename: + filename = "github_oauth_token.json" + await oauth_demo.save_token_to_file(filename) + + # Show usage instructions + print("\n" + "=" * 50) + print("Next Steps:") + print("=" * 50) + print("1. Use this token with the MCP agent workflow_pre_auth endpoint:") + + example_usage = { + "workflow_name": "github_analysis_workflow", + "tokens": [token_data] + } + print(f" {json.dumps(example_usage, indent=2)}") + + print("\n2. Or configure it in your mcp_agent.secrets.yaml:") + secrets_example = { + "mcp": { + "servers": { + "github": { + "auth": { + "oauth": { + "access_token": token_data['access_token'], + "refresh_token": token_data.get('refresh_token'), + "scopes": token_data['scopes'] + } + } + } + } + } + } + print(f" {json.dumps(secrets_example, indent=2)}") + + except Exception as e: + print(f"\nOAuth flow failed: {e}") + print("Please check your GitHub OAuth app configuration and try again.") + + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git a/examples/oauth/preconfigured/requirements.txt b/examples/oauth/preconfigured/requirements.txt new file mode 100644 index 000000000..12966f2cf --- /dev/null +++ b/examples/oauth/preconfigured/requirements.txt @@ -0,0 +1,37 @@ +# OAuth MCP Agent Example Requirements +# +# This file specifies the Python dependencies needed to run the OAuth examples. +# Install with: pip install -r requirements.txt + +# Core MCP Agent with OAuth support +mcp-agent[oauth,cli]>=0.1.27 + +# Additional dependencies for OAuth flow and HTTP handling +aiohttp>=3.11.13 +# For OAuth flow demonstration and token management +urllib3>=2.0.0 + +# GitHub MCP Server (install separately with uvx or npm) +# Note: The GitHub MCP server is installed via uvx, not pip +# Run: uvx install github-mcp-server + +# Optional: Enhanced JSON handling +ujson>=5.0.0 + +# Optional: Enhanced async support +trio>=0.30.0 + +# Optional: Redis for production token storage +redis>=4.0.0 + +# Development and testing dependencies (optional) +pytest>=7.4.0 +pytest-asyncio>=0.21.1 + +# For the interactive OAuth demo +webbrowser # Standard library - no explicit install needed + +# Note: Additional MCP servers can be installed as needed: +# - Filesystem server: npm install -g @modelcontextprotocol/server-filesystem +# - Fetch server: uvx install mcp-server-fetch +# - Other servers: See https://github.com/modelcontextprotocol/servers \ No newline at end of file diff --git a/examples/oauth/preconfigured/workflow_example.py b/examples/oauth/preconfigured/workflow_example.py new file mode 100644 index 000000000..47521f584 --- /dev/null +++ b/examples/oauth/preconfigured/workflow_example.py @@ -0,0 +1,427 @@ +""" +OAuth Workflow Pre-Authorization Example + +This example demonstrates how to use the workflow_pre_auth endpoint to +pre-store OAuth tokens for a workflow, then execute the workflow to +access GitHub MCP server tools. + +Features demonstrated: +- Using the workflow_pre_auth endpoint to store OAuth tokens +- Creating a workflow that uses pre-authorized tokens +- Accessing multiple MCP servers with different tokens +- Error handling for token expiration and OAuth issues +""" + +import asyncio +import json +import time +from typing import Any, Dict, List + +from mcp_agent.app import MCPApp +from mcp_agent.agents.agent import Agent +from mcp_agent.core.context import Context + + +class GitHubOrganizationAnalyzer(Agent): + """ + An agent that analyzes GitHub organizations using pre-authorized OAuth tokens. + """ + + def __init__(self, context: Context): + super().__init__(context=context) + self.name = "github_org_analyzer" + + async def analyze_organizations( + self, + queries: List[str], + detailed_analysis: bool = True + ) -> Dict[str, Any]: + """ + Analyze multiple organizations based on search queries. + + Args: + queries: List of search queries for organizations + detailed_analysis: Whether to fetch detailed information + + Returns: + Analysis results for all organizations + """ + logger = self.context.logger + results = {"organizations": [], "summary": {}, "errors": []} + + try: + # The OAuth tokens should be pre-authorized for this workflow + # and available through the context + logger.info(f"Starting analysis of {len(queries)} organization queries") + + for query in queries: + try: + orgs = await self._search_organizations(query) + + for org in orgs: + org_analysis = { + "query": query, + "organization": org.get("login", "unknown"), + "description": org.get("description", ""), + "url": org.get("html_url", ""), + "public_repos": org.get("public_repos", 0), + "followers": org.get("followers", 0), + "location": org.get("location", ""), + "created_at": org.get("created_at", ""), + } + + if detailed_analysis: + # Add more detailed analysis + org_analysis.update( + await self._analyze_organization_details(org) + ) + + results["organizations"].append(org_analysis) + + except Exception as e: + error_msg = f"Error processing query '{query}': {e}" + logger.error(error_msg) + results["errors"].append(error_msg) + + # Generate summary + results["summary"] = self._generate_summary(results["organizations"]) + + logger.info(f"Analysis completed: {len(results['organizations'])} organizations analyzed") + return results + + except Exception as e: + logger.error(f"Organization analysis failed: {e}") + raise + + async def _search_organizations(self, query: str) -> List[Dict[str, Any]]: + """Search for organizations using the GitHub MCP server.""" + from mcp_agent.mcp.gen_client import gen_client + + async with gen_client( + "github", + server_registry=self.context.server_registry, + context=self.context + ) as github_client: + result = await github_client.call_tool( + "search_orgs", + { + "query": query, + "perPage": 10, + "sort": "best-match", + "order": "desc" + } + ) + + organizations = [] + if result.content: + for content_item in result.content: + if hasattr(content_item, 'text'): + try: + data = json.loads(content_item.text) + if isinstance(data, dict) and 'items' in data: + organizations.extend(data['items']) + elif isinstance(data, list): + organizations.extend(data) + except json.JSONDecodeError: + pass + + return organizations + + async def _analyze_organization_details(self, org: Dict[str, Any]) -> Dict[str, Any]: + """Analyze detailed information about an organization.""" + details = { + "activity_score": self._calculate_activity_score(org), + "size_category": self._categorize_size(org.get("public_repos", 0)), + "age_years": self._calculate_age(org.get("created_at", "")), + } + + return details + + def _calculate_activity_score(self, org: Dict[str, Any]) -> float: + """Calculate a simple activity score based on available metrics.""" + repos = org.get("public_repos", 0) + followers = org.get("followers", 0) + + # Simple scoring algorithm + score = (repos * 0.1) + (followers * 0.01) + return min(score, 100.0) # Cap at 100 + + def _categorize_size(self, repo_count: int) -> str: + """Categorize organization size based on repository count.""" + if repo_count < 10: + return "small" + elif repo_count < 50: + return "medium" + elif repo_count < 200: + return "large" + else: + return "enterprise" + + def _calculate_age(self, created_at: str) -> float: + """Calculate organization age in years.""" + if not created_at: + return 0.0 + + try: + from datetime import datetime + created = datetime.fromisoformat(created_at.replace("Z", "+00:00")) + now = datetime.now(created.tzinfo) + return (now - created).days / 365.25 + except Exception: + return 0.0 + + def _generate_summary(self, organizations: List[Dict[str, Any]]) -> Dict[str, Any]: + """Generate summary statistics from organization analysis.""" + if not organizations: + return {"total": 0, "message": "No organizations analyzed"} + + total_repos = sum(org.get("public_repos", 0) for org in organizations) + total_followers = sum(org.get("followers", 0) for org in organizations) + + size_categories = {} + for org in organizations: + category = org.get("size_category", "unknown") + size_categories[category] = size_categories.get(category, 0) + 1 + + return { + "total_organizations": len(organizations), + "total_public_repos": total_repos, + "total_followers": total_followers, + "average_repos_per_org": total_repos / len(organizations), + "size_distribution": size_categories, + "top_organizations": sorted( + organizations, + key=lambda x: x.get("activity_score", 0), + reverse=True + )[:5] + } + + +# Create workflow using the @app.async_tool decorator +app = MCPApp(name="oauth_workflow_example") + + +@app.async_tool +async def analyze_github_ecosystem( + app_ctx: Context, + focus_areas: List[str], + include_details: bool = True +) -> Dict[str, Any]: + """ + Analyze the GitHub ecosystem based on focus areas. + + This workflow demonstrates using pre-authorized OAuth tokens + to analyze organizations across different domains. + + Args: + focus_areas: Areas to focus on (e.g., ["AI/ML", "cloud", "security"]) + include_details: Whether to include detailed analysis + + Returns: + Comprehensive analysis of the GitHub ecosystem + """ + logger = app_ctx.logger + logger.info(f"Starting GitHub ecosystem analysis for: {focus_areas}") + + # Create the analyzer agent + analyzer = GitHubOrganizationAnalyzer(context=app_ctx) + + # Map focus areas to search queries + query_mapping = { + "AI/ML": ["machine-learning", "artificial-intelligence", "deep-learning", "tensorflow", "pytorch"], + "cloud": ["cloud-computing", "aws", "azure", "kubernetes", "docker"], + "security": ["cybersecurity", "security", "encryption", "vulnerability"], + "web": ["web-development", "javascript", "react", "vue", "angular"], + "mobile": ["mobile-development", "android", "ios", "react-native", "flutter"], + "data": ["data-science", "analytics", "big-data", "database", "sql"], + "devtools": ["developer-tools", "ci-cd", "testing", "monitoring", "automation"] + } + + all_queries = [] + for area in focus_areas: + queries = query_mapping.get(area.lower(), [area.lower()]) + all_queries.extend(queries) + + # Remove duplicates while preserving order + unique_queries = list(dict.fromkeys(all_queries)) + + logger.info(f"Executing {len(unique_queries)} organization searches") + + try: + # Perform the analysis + analysis_results = await analyzer.analyze_organizations( + queries=unique_queries, + detailed_analysis=include_details + ) + + # Add ecosystem-level insights + ecosystem_analysis = { + "focus_areas": focus_areas, + "timestamp": time.time(), + "queries_executed": unique_queries, + "results": analysis_results, + "insights": _generate_ecosystem_insights(analysis_results) + } + + logger.info("GitHub ecosystem analysis completed successfully") + return ecosystem_analysis + + except Exception as e: + logger.error(f"Ecosystem analysis failed: {e}") + raise + + +def _generate_ecosystem_insights(results: Dict[str, Any]) -> Dict[str, Any]: + """Generate high-level insights from the ecosystem analysis.""" + organizations = results.get("organizations", []) + summary = results.get("summary", {}) + + if not organizations: + return {"message": "No data available for insights"} + + # Find trends and patterns + insights = { + "dominant_languages": _analyze_language_trends(organizations), + "geographic_distribution": _analyze_geographic_distribution(organizations), + "maturity_analysis": _analyze_organization_maturity(organizations), + "activity_patterns": _analyze_activity_patterns(organizations) + } + + return insights + + +def _analyze_language_trends(organizations: List[Dict[str, Any]]) -> Dict[str, Any]: + """Analyze programming language trends from organization data.""" + # This is a simplified example - in a real implementation, + # you might use additional GitHub API calls to get language data + return { + "message": "Language trend analysis would require additional API calls", + "suggestion": "Use repository listing and language detection APIs" + } + + +def _analyze_geographic_distribution(organizations: List[Dict[str, Any]]) -> Dict[str, Any]: + """Analyze geographic distribution of organizations.""" + locations = {} + for org in organizations: + location = org.get("location", "").strip() + if location: + locations[location] = locations.get(location, 0) + 1 + + return { + "total_with_location": len([org for org in organizations if org.get("location")]), + "top_locations": dict(sorted(locations.items(), key=lambda x: x[1], reverse=True)[:10]) + } + + +def _analyze_organization_maturity(organizations: List[Dict[str, Any]]) -> Dict[str, Any]: + """Analyze the maturity of organizations.""" + mature_count = sum(1 for org in organizations if org.get("age_years", 0) > 5) + established_count = sum(1 for org in organizations if 2 <= org.get("age_years", 0) <= 5) + new_count = sum(1 for org in organizations if org.get("age_years", 0) < 2) + + return { + "mature_orgs": mature_count, # > 5 years + "established_orgs": established_count, # 2-5 years + "new_orgs": new_count, # < 2 years + "maturity_ratio": mature_count / len(organizations) if organizations else 0 + } + + +def _analyze_activity_patterns(organizations: List[Dict[str, Any]]) -> Dict[str, Any]: + """Analyze activity patterns across organizations.""" + if not organizations: + return {} + + activity_scores = [org.get("activity_score", 0) for org in organizations] + + return { + "average_activity": sum(activity_scores) / len(activity_scores), + "high_activity_count": sum(1 for score in activity_scores if score > 75), + "low_activity_count": sum(1 for score in activity_scores if score < 25), + "activity_distribution": { + "high": sum(1 for score in activity_scores if score > 75), + "medium": sum(1 for score in activity_scores if 25 <= score <= 75), + "low": sum(1 for score in activity_scores if score < 25) + } + } + + +async def demonstrate_pre_auth_workflow(): + """ + Demonstrate the workflow with pre-authorization. + """ + print("OAuth Workflow Pre-Authorization Example") + print("=" * 50) + + # Note: In a real scenario, you would use the MCP agent server + # to call the workflow_pre_auth endpoint before running the workflow + print("\n1. Pre-authorization step:") + print(" Before running this workflow, you should pre-authorize OAuth tokens:") + print(" Use the workflow_pre_auth endpoint with the following structure:") + + example_tokens = [ + { + "access_token": "github_oauth_access_token_here", + "refresh_token": "github_oauth_refresh_token_here", + "server_name": "github", + "scopes": ["read:org", "public_repo"], + "authorization_server": "https://github.com/login/oauth/authorize" + } + ] + + print(f" Token structure: {json.dumps(example_tokens, indent=2)}") + + print("\n2. Running workflow with pre-authorized tokens:") + + try: + async with app.run() as workflow_app: + # Simulate workflow execution + # In practice, this would be called through the MCP agent server + context = workflow_app.context + + result = await analyze_github_ecosystem( + app_ctx=context, + focus_areas=["AI/ML", "cloud", "security"], + include_details=True + ) + + print(f"\n3. Workflow Results:") + print(f" - Focus areas analyzed: {result['focus_areas']}") + print(f" - Queries executed: {len(result['queries_executed'])}") + print(f" - Organizations found: {result['results']['summary'].get('total_organizations', 0)}") + + if result['results']['errors']: + print(f" - Errors encountered: {len(result['results']['errors'])}") + + print(f"\n4. Ecosystem Insights:") + insights = result['insights'] + if 'geographic_distribution' in insights: + top_locations = insights['geographic_distribution'].get('top_locations', {}) + if top_locations: + print(f" - Top locations: {list(top_locations.keys())[:3]}") + + if 'maturity_analysis' in insights: + maturity = insights['maturity_analysis'] + print(f" - Mature organizations: {maturity.get('mature_orgs', 0)}") + print(f" - Maturity ratio: {maturity.get('maturity_ratio', 0):.2%}") + + except Exception as e: + print(f" Workflow failed: {e}") + print("\n This is expected if OAuth tokens are not properly configured.") + print(" To run this example successfully:") + print(" 1. Set up a GitHub OAuth app") + print(" 2. Configure mcp_agent.config.yaml with OAuth settings") + print(" 3. Use workflow_pre_auth to store valid tokens") + print(" 4. Run the workflow through the MCP agent server") + + +async def main(): + """ + Main function demonstrating the workflow pre-authorization pattern. + """ + await demonstrate_pre_auth_workflow() + + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git a/examples/oauth/workflow_pre_auth/client.py b/examples/oauth/workflow_pre_auth/client.py new file mode 100644 index 000000000..ce80b488b --- /dev/null +++ b/examples/oauth/workflow_pre_auth/client.py @@ -0,0 +1,193 @@ +import argparse +import asyncio +import json +import time +import os + +from datetime import timedelta +from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream +from mcp import ClientSession +from mcp.types import CallToolResult, LoggingMessageNotificationParams +from mcp_agent.app import MCPApp +from mcp_agent.config import MCPServerSettings +from mcp_agent.core.context import Context +from mcp_agent.executor.workflow import WorkflowExecution +from mcp_agent.mcp.gen_client import gen_client +from mcp_agent.mcp.mcp_agent_client_session import MCPAgentClientSession +from mcp_agent.human_input.console_handler import console_input_callback +from mcp_agent.elicitation.handler import console_elicitation_callback + +from rich import print + +try: + from exceptiongroup import ExceptionGroup as _ExceptionGroup # Python 3.10 backport +except Exception: # pragma: no cover + _ExceptionGroup = None # type: ignore +try: + from anyio import BrokenResourceError as _BrokenResourceError +except Exception: # pragma: no cover + _BrokenResourceError = None # type: ignore + +# Get GitHub access token from environment or ask user +access_token = os.getenv('GITHUB_ACCESS_TOKEN') + +if not access_token: + print("\nGitHub access token not found in environment variable GITHUB_ACCESS_TOKEN") + print("\nTo get a GitHub access token:") + print("1. Run the oauth_demo.py script from examples/oauth/ to get a fresh token") + print("2. Or go to GitHub Settings > Developer settings > Personal access tokens") + print("3. Create a token with 'read:org' and 'public_repo' scopes") + print("\nThen set the token:") + print("export GITHUB_ACCESS_TOKEN='your_token_here'") + +# Verify token format +if not access_token.startswith(('gho_', 'ghp_', 'github_pat_')): + print(f"Warning: Token doesn't look like a GitHub token (got: {access_token[:10]}...)") + print("GitHub tokens usually start with 'gho_', 'ghp_', or 'github_pat_'") + + +async def main(): + # Create MCPApp to get the server registry + app = MCPApp( + name="workflow_mcp_client", + human_input_callback=console_input_callback, + elicitation_callback=console_elicitation_callback, + ) + async with app.run() as client_app: + logger = client_app.logger + context = client_app.context + + # Connect to the workflow server + logger.info("Connecting to workflow server...") + + # Override the server configuration to point to our local script + context.server_registry.registry["basic_agent_server"] = MCPServerSettings( + name="basic_agent_server", + description="Local workflow server running the basic agent example", + command="uv", + args=["run", "main.py"], + ) + + # Define a logging callback to receive server-side log notifications + async def on_server_log(params: LoggingMessageNotificationParams) -> None: + level = params.level.upper() + name = params.logger or "server" + print(f"[SERVER LOG] [{level}] [{name}] {params.data}") + + # Provide a client session factory that installs our logging callback + # and prints non-logging notifications to the console + class ConsolePrintingClientSession(MCPAgentClientSession): + async def _received_notification(self, notification): # type: ignore[override] + try: + method = getattr(notification.root, "method", None) + except Exception: + method = None + + # Avoid duplicating server log prints (handled by logging_callback) + if method and method != "notifications/message": + try: + data = notification.model_dump() + except Exception: + data = str(notification) + print(f"[SERVER NOTIFY] {method}: {data}") + + return await super()._received_notification(notification) + + def make_session( + read_stream: MemoryObjectReceiveStream, + write_stream: MemoryObjectSendStream, + read_timeout_seconds: timedelta | None, + context: Context | None = None, + ) -> ClientSession: + return ConsolePrintingClientSession( + read_stream=read_stream, + write_stream=write_stream, + read_timeout_seconds=read_timeout_seconds, + logging_callback=on_server_log, + context=context, + ) + + try: + async with gen_client( + "basic_agent_server", + context.server_registry, + client_session_factory=make_session, + ) as server: + # List available tools + tools_result = await server.list_tools() + logger.info( + "Available tools:", + data={"tools": [tool.name for tool in tools_result.tools]}, + ) + + await server.call_tool("workflows-pre-auth", + arguments={ + "workflow_name": "github_org_search", + "tokens": [ + { + "access_token": access_token, + "server_name": "github", + "scopes": ["read:org", "public_repo", "user:email"], + "authorization_server": "https://github.com/login/oauth", + "token_type": "Bearer" + } + ] + }) + + print(await server.call_tool("github_org_search", {"query": "last mile ai"})) + except Exception as e: + # Tolerate benign shutdown races from stdio client (BrokenResourceError within ExceptionGroup) + if _ExceptionGroup is not None and isinstance(e, _ExceptionGroup): + subs = getattr(e, "exceptions", []) or [] + if ( + _BrokenResourceError is not None + and subs + and all(isinstance(se, _BrokenResourceError) for se in subs) + ): + logger.debug("Ignored BrokenResourceError from stdio shutdown") + else: + raise + elif _BrokenResourceError is not None and isinstance( + e, _BrokenResourceError + ): + logger.debug("Ignored BrokenResourceError from stdio shutdown") + elif "BrokenResourceError" in str(e): + logger.debug( + "Ignored BrokenResourceError from stdio shutdown (string match)" + ) + else: + raise + # Nudge cleanup of subprocess transports before the loop closes to avoid + # 'Event loop is closed' from BaseSubprocessTransport.__del__ on GC. + try: + await asyncio.sleep(0) + except Exception: + pass + try: + import gc + + gc.collect() + except Exception: + pass + + +def _tool_result_to_json(tool_result: CallToolResult): + if tool_result.content and len(tool_result.content) > 0: + text = tool_result.content[0].text + try: + # Try to parse the response as JSON if it's a string + import json + + return json.loads(text) + except (json.JSONDecodeError, TypeError): + # If it's not valid JSON, just use the text + return None + + +if __name__ == "__main__": + start = time.time() + asyncio.run(main()) + end = time.time() + t = end - start + + print(f"Total run time: {t:.2f}s") diff --git a/examples/oauth/workflow_pre_auth/main.py b/examples/oauth/workflow_pre_auth/main.py new file mode 100644 index 000000000..f725875f4 --- /dev/null +++ b/examples/oauth/workflow_pre_auth/main.py @@ -0,0 +1,139 @@ +""" +Workflow MCP Server Example + +This example demonstrates three approaches to creating agents and workflows: +1. Traditional workflow-based approach with manual agent creation +2. Programmatic agent configuration using AgentConfig +3. Declarative agent configuration using FastMCPApp decorators +""" + +import argparse +import asyncio +import json +import os +from typing import Dict, Any, Optional +from pydantic import AnyHttpUrl + +from mcp.server.fastmcp import FastMCP +from mcp_agent.core.context import Context as AppContext + +from mcp_agent.app import MCPApp +from mcp_agent.server.app_server import create_mcp_server_for_app +from mcp_agent.agents.agent import Agent +from mcp_agent.workflows.llm.augmented_llm import RequestParams +from mcp_agent.workflows.llm.llm_selector import ModelPreferences +from mcp_agent.workflows.llm.augmented_llm_anthropic import AnthropicAugmentedLLM +from mcp_agent.workflows.llm.augmented_llm_openai import OpenAIAugmentedLLM +from mcp_agent.workflows.parallel.parallel_llm import ParallelLLM +from mcp_agent.executor.workflow import Workflow, WorkflowResult +from mcp_agent.tracing.token_counter import TokenNode +from mcp_agent.human_input.console_handler import console_input_callback +from mcp_agent.elicitation.handler import console_elicitation_callback +from mcp_agent.mcp.gen_client import gen_client +from mcp_agent.config import MCPServerSettings, Settings, LoggerSettings, MCPSettings, MCPServerAuthSettings, \ + MCPOAuthClientSettings + +# Note: This is purely optional: +# if not provided, a default FastMCP server will be created by MCPApp using create_mcp_server_for_app() +mcp = FastMCP(name="basic_agent_server", instructions="My basic agent server example.") + + +class MCPServerOAuthSettings: + pass + + +settings = Settings( + execution_engine="asyncio", + logger=LoggerSettings(level="info"), + mcp=MCPSettings( + servers={ + "github": MCPServerSettings( + name="github", + transport="streamable_http", + url="https://api.githubcopilot.com/mcp/", + auth=MCPServerAuthSettings( + oauth=MCPOAuthClientSettings( + enabled=True, + scopes= [ + "read:org", # Required for search_orgs tool + "public_repo", # Access to public repositories + "user:email" # User information access + ], + authorization_server=AnyHttpUrl("https://github.com/login/oauth"), + resource=AnyHttpUrl("https://api.githubcopilot.com/mcp") + ) + ) + ) + } + ), + ) + +# Define the MCPApp instance. The server created for this app will advertise the +# MCP logging capability and forward structured logs upstream to connected clients. +app = MCPApp( + name="basic_agent_server", + description="Basic agent server example", + mcp=mcp, + settings=settings, +) + + +@app.tool(name="github_org_search") +async def github_org_search(query: str, app_ctx: Optional[AppContext] = None) -> str: + from mcp_agent.mcp.gen_client import gen_client + + try: + async with gen_client( + "github", + server_registry=app_ctx.server_registry, + context=app_ctx + ) as github_client: + result = await github_client.call_tool( + "search_orgs", + { + "query": query, + "perPage": 10, + "sort": "best-match", + "order": "desc" + } + ) + + organizations = [] + if result.content: + for content_item in result.content: + if hasattr(content_item, 'text'): + try: + data = json.loads(content_item.text) + if isinstance(data, dict) and 'items' in data: + organizations.extend(data['items']) + elif isinstance(data, list): + organizations.extend(data) + except json.JSONDecodeError: + pass + + return str(organizations) + except Exception as e: + import traceback + return f"Error: {traceback.format_exc()}" + +async def main(): + async with app.run() as agent_app: + # Log registered workflows and agent configurations + agent_app.logger.info(f"Creating MCP server for {agent_app.name}") + + agent_app.logger.info("Registered workflows:") + for workflow_id in agent_app.workflows: + agent_app.logger.info(f" - {workflow_id}") + + # Create the MCP server that exposes both workflows and agent configurations, + # optionally using custom FastMCP settings + mcp_server = create_mcp_server_for_app(agent_app) + agent_app.logger.info(f"MCP Server settings: {mcp_server.settings}") + + # Run the server + await mcp_server.run_stdio_async() + # await mcp_server.run_sse_async() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/src/mcp_agent/app.py b/src/mcp_agent/app.py index 558691071..2c3336a0d 100644 --- a/src/mcp_agent/app.py +++ b/src/mcp_agent/app.py @@ -260,6 +260,7 @@ async def initialize(self): oauth_settings = None if oauth_settings: + self.logger.debug("Initializing OAuth token management") token_store = InMemoryTokenStore() token_manager = TokenManager( token_store=token_store, @@ -268,6 +269,11 @@ async def initialize(self): self._context.token_store = token_store self._context.token_manager = token_manager + # Check for pre-configured tokens and store them with synthetic users + await self._initialize_preconfigured_tokens(token_manager) + else: + self.logger.debug("No OAuth settings found, skipping OAuth initialization") + # Provide a safe default bound context for loggers created after init without explicit context try: set_default_bound_context(self._context) @@ -345,6 +351,44 @@ async def initialize(self): }, ) + async def _initialize_preconfigured_tokens(self, token_manager): + """Check for pre-configured OAuth tokens and store them with a single synthetic user.""" + + mcp_config = getattr(self._context.config, 'mcp', None) + if not mcp_config or not getattr(mcp_config, 'servers', None): + self.logger.debug("No MCP servers found in config, skipping token initialization") + return + + servers = mcp_config.servers + self.logger.debug(f"Found MCP servers in config: {list(servers.keys())}") + + servers_with_tokens = [] + + # First pass: check which servers have pre-configured tokens + for server_name, server_config in servers.items(): + if not hasattr(server_config, 'auth') or not server_config.auth: + self.logger.debug(f"Server '{server_name}' has no auth config, skipping") + continue + + oauth_config = getattr(server_config.auth, 'oauth', None) + + if not oauth_config or not oauth_config.enabled or not oauth_config.access_token: + continue + + self.logger.debug(f"Server '{server_name}' has pre-configured OAuth token") + servers_with_tokens.append((server_name, server_config)) + + # If we have any servers with pre-configured tokens, create a single synthetic user + if servers_with_tokens: + synthetic_user = token_manager.create_default_user_for_preconfigured_tokens() + self._context.current_user = synthetic_user + self.logger.info(f"Created synthetic user for pre-configured OAuth tokens: {synthetic_user.cache_key}") + + # Second pass: store all tokens using the same synthetic user + for server_name, server_config in servers_with_tokens: + self.logger.info(f"Storing pre-configured OAuth token for server: {server_name}") + await token_manager.store_preconfigured_token(server_name, server_config, synthetic_user) + async def get_token_node(self): """Return the root app token node, if available.""" if not self._context or not getattr(self._context, "token_counter", None): diff --git a/src/mcp_agent/config.py b/src/mcp_agent/config.py index 59d8ef84d..ddc14ea8a 100644 --- a/src/mcp_agent/config.py +++ b/src/mcp_agent/config.py @@ -86,6 +86,11 @@ class MCPOAuthClientSettings(BaseModel): authorization_server: AnyHttpUrl | None = None client_id: str | None = None client_secret: str | None = None + # Support for pre-configured access tokens (bypasses OAuth flow) + access_token: str | None = None + refresh_token: str | None = None + expires_at: float | None = None + token_type: str = "Bearer" redirect_uri_options: List[str] = Field(default_factory=list) extra_authorize_params: Dict[str, str] = Field(default_factory=dict) extra_token_params: Dict[str, str] = Field(default_factory=dict) diff --git a/src/mcp_agent/oauth/http/auth.py b/src/mcp_agent/oauth/http/auth.py index 29b2028ce..8fba21757 100644 --- a/src/mcp_agent/oauth/http/auth.py +++ b/src/mcp_agent/oauth/http/auth.py @@ -30,16 +30,18 @@ def __init__( self._scopes = list(scopes) if scopes is not None else None async def async_auth_flow(self, request: httpx.Request): - token_record = await self._token_manager.ensure_access_token( - context=self._context, - server_name=self._server_name, - server_config=self._server_config, - scopes=self._scopes, - ) + try: + token_record = await self._token_manager.ensure_access_token( + context=self._context, + server_name=self._server_name, + server_config=self._server_config, + scopes=self._scopes, + ) + except Exception as e: + raise request.headers["Authorization"] = ( f"{token_record.token_type} {token_record.access_token}" ) - retry_request = request.copy() response = yield request if response.status_code != 401: @@ -62,6 +64,14 @@ async def async_auth_flow(self, request: httpx.Request): server_config=self._server_config, scopes=self._scopes, ) + + # Create a new request with the refreshed token + retry_request = httpx.Request( + method=request.method, + url=request.url, + headers=request.headers.copy(), + content=request.content, + ) retry_request.headers["Authorization"] = ( f"{refreshed_record.token_type} {refreshed_record.access_token}" ) diff --git a/src/mcp_agent/oauth/manager.py b/src/mcp_agent/oauth/manager.py index 62d0308b9..d2bd3d6b2 100644 --- a/src/mcp_agent/oauth/manager.py +++ b/src/mcp_agent/oauth/manager.py @@ -39,6 +39,17 @@ logger = get_logger(__name__) +def create_default_user_for_preconfigured_tokens() -> "OAuthUserIdentity": + """Create a synthetic user identity for pre-configured tokens.""" + from mcp_agent.oauth.identity import OAuthUserIdentity + + return OAuthUserIdentity( + provider="mcp-agent", + subject="preconfigured-tokens", + claims={"token_source": "preconfigured", "description": "Synthetic user for pre-configured OAuth tokens"} + ) + + class TokenManager: """High-level orchestrator for acquiring and refreshing OAuth tokens.""" @@ -60,6 +71,44 @@ def __init__( self._resource_metadata_cache: Dict[str, tuple[float, object]] = {} self._auth_metadata_cache: Dict[str, tuple[float, object]] = {} + async def store_preconfigured_token( + self, + server_name: str, + server_config, + synthetic_user: "OAuthUserIdentity" + ) -> None: + """Store a pre-configured token in the token store.""" + oauth_config = server_config.auth.oauth + + # Create token record + resource_str = str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) + auth_server_str = str(oauth_config.authorization_server) if oauth_config.authorization_server else None + + from datetime import datetime, timezone + record = TokenRecord( + access_token=oauth_config.access_token, + refresh_token=oauth_config.refresh_token, + scopes=tuple(oauth_config.scopes or []), + expires_at=oauth_config.expires_at, + token_type=oauth_config.token_type, + resource=resource_str, + authorization_server=auth_server_str, + obtained_at=datetime.now(tz=timezone.utc).timestamp(), + metadata={"server_name": server_name, "pre_configured": True} + ) + + # Create storage key + key = TokenStoreKey( + user_key=synthetic_user.cache_key, + resource=resource_str or "", + authorization_server=auth_server_str, + scope_fingerprint=scope_fingerprint(oauth_config.scopes or []) + ) + + # Store the token + logger.debug(f"Storing token with key: user_key={key.user_key}, resource={key.resource}, auth_server={key.authorization_server}, scope_fingerprint={key.scope_fingerprint}") + await self._token_store.set(key, record) + async def ensure_access_token( self, *, @@ -79,33 +128,26 @@ async def ensure_access_token( user = context.current_user if not user: raise MissingUserIdentityError( - "No authenticated MCP user available for delegated OAuth flow" + "No authenticated MCP user available for OAuth flow (neither interactive nor pre-configured)" ) - resource_hint = oauth_config.resource - server_url = getattr(server_config, "url", None) - resource = normalize_resource(resource_hint, server_url) - - metadata_url = str(URL(resource).join("/.well-known/oauth-protected-resource")) - resource_metadata = await self._get_resource_metadata(metadata_url) - auth_server_url = select_authorization_server( - resource_metadata, oauth_config.authorization_server - ) - auth_metadata = await self._get_authorization_metadata(auth_server_url) + # Use the same key construction logic as store_preconfigured_token to ensure consistency + resource_str = str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) + auth_server_str = str(oauth_config.authorization_server) if oauth_config.authorization_server else None + scope_list = list(scopes) if scopes is not None else list(oauth_config.scopes or []) - scope_list = ( - list(scopes) if scopes is not None else list(oauth_config.scopes or []) - ) key = TokenStoreKey( user_key=user.cache_key, - resource=resource, - authorization_server=auth_server_url, - scope_fingerprint=scope_fingerprint(scope_list), + resource=resource_str, + authorization_server=auth_server_str, + scope_fingerprint=scope_fingerprint(scope_list) ) + logger.debug(f"Looking for token with key: user_key={key.user_key}, resource={key.resource}, auth_server={key.authorization_server}, scope_fingerprint={key.scope_fingerprint}") lock = self._locks[key] async with lock: record = await self._token_store.get(key) + logger.debug(f"Found existing record: {record is not None}") leeway = ( self._settings.token_store.refresh_leeway_seconds if self._settings and self._settings.token_store @@ -114,7 +156,22 @@ async def ensure_access_token( if record and not record.is_expired(leeway_seconds=leeway): return record + # If token exists but expired, try to refresh it if record and record.refresh_token: + # For refresh, we need OAuth metadata + resource_hint = str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) + server_url = getattr(server_config, "url", None) + resource = normalize_resource(resource_hint, server_url) + + # Get OAuth metadata for token refresh + parsed_resource = URL(resource) + metadata_url = str(parsed_resource.copy_with(path="/.well-known/oauth-protected-resource" + parsed_resource.path)) + resource_metadata = await self._get_resource_metadata(metadata_url) + auth_server_url = select_authorization_server( + resource_metadata, str(oauth_config.authorization_server) + ) + auth_metadata = await self._get_authorization_metadata(auth_server_url) + try: refreshed = await self._refresh_token( record, @@ -131,19 +188,37 @@ async def ensure_access_token( return refreshed await self._token_store.delete(key) - # Need to run full authorization flow - record = await self._flow.authorize( - context=context, - user=user, - server_name=server_name, - oauth_config=oauth_config, - resource=resource, - authorization_server_url=auth_server_url, - resource_metadata=resource_metadata, - auth_metadata=auth_metadata, - scopes=scope_list, - ) - await self._token_store.set(key, record) + # Need to run full authorization flow - only if no token found or refresh failed + if not record: + resource_hint = str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) + server_url = getattr(server_config, "url", None) + resource = normalize_resource(resource_hint, server_url) + + # Get OAuth metadata for full authorization flow + parsed_resource = URL(resource) + metadata_url = str(parsed_resource.copy_with(path="/.well-known/oauth-protected-resource" + parsed_resource.path)) + resource_metadata = await self._get_resource_metadata(metadata_url) + auth_server_url = select_authorization_server( + resource_metadata, str(oauth_config.authorization_server) + ) + auth_metadata = await self._get_authorization_metadata(auth_server_url) + + record = await self._flow.authorize( + context=context, + user=user, + server_name=server_name, + oauth_config=oauth_config, + resource=resource, + authorization_server_url=auth_server_url, + resource_metadata=resource_metadata, + auth_metadata=auth_metadata, + scopes=scope_list, + ) + await self._token_store.set(key, record) + return record + + # If we reach here, we have an expired token with no refresh token + # Return it anyway - the caller will handle 401s return record async def invalidate( @@ -240,7 +315,9 @@ async def _get_authorization_metadata(self, url: str): cached = self._auth_metadata_cache.get(url) if cached and time.time() - cached[0] < 300: return cached[1] - metadata = await fetch_authorization_server_metadata(self._http_client, url) + # Construct OAuth authorization server metadata URL + metadata_url = url.rstrip('/') + '/.well-known/oauth-authorization-server' + metadata = await fetch_authorization_server_metadata(self._http_client, metadata_url) self._auth_metadata_cache[url] = (time.time(), metadata) return metadata diff --git a/src/mcp_agent/server/app_server.py b/src/mcp_agent/server/app_server.py index dfdbccd4c..526e84935 100644 --- a/src/mcp_agent/server/app_server.py +++ b/src/mcp_agent/server/app_server.py @@ -37,6 +37,7 @@ from mcp_agent.mcp.mcp_server_registry import ServerRegistry from mcp_agent.oauth.identity import OAuthUserIdentity from mcp_agent.oauth.callbacks import callback_registry +from mcp_agent.oauth.manager import create_default_user_for_preconfigured_tokens from mcp_agent.server.token_verifier import MCPAgentTokenVerifier if TYPE_CHECKING: @@ -1493,6 +1494,157 @@ async def cancel_workflow( return result + @mcp.tool(name="workflows-pre-auth") + async def workflow_pre_auth( + ctx: MCPContext, workflow_name: str, tokens: List[Dict[str, Any]] + ) -> Dict[str, Any]: + """ + Pre-authorize OAuth tokens for a workflow to use with MCP servers. + + Stores OAuth tokens that the workflow can use when connecting to various MCP servers. + This allows workflows to authenticate with external services without requiring + interactive OAuth flows during execution. + + Args: + workflow_name: The name of the workflow that will use these tokens. + tokens: List of OAuth token objects, each containing: + - access_token (str): The OAuth access token + - refresh_token (str, optional): The OAuth refresh token + - server_name (str): Name/identifier of the MCP server + - scopes (List[str], optional): List of OAuth scopes + - expires_at (float, optional): Token expiration timestamp + - authorization_server (str, optional): Authorization server URL + + Returns: + Dictionary with success status and count of stored tokens. + """ + # Ensure upstream session is available for any logs + try: + _set_upstream_from_request_ctx_if_available(ctx) + except Exception: + pass + + workflows_dict, app_context = _resolve_workflows_and_context(ctx) + if not workflows_dict or not app_context: + raise ToolError("Server context not available for MCPApp Server.") + + if workflow_name not in workflows_dict: + raise ToolError(f"Workflow '{workflow_name}' not found.") + + if not app_context.token_store: + raise ToolError("Token storage not available.") + + if not tokens: + raise ToolError("At least one token must be provided.") + + stored_count = 0 + errors = [] + + try: + for i, token_data in enumerate(tokens): + try: + # Validate required fields + if not isinstance(token_data, dict): + errors.append(f"Token {i}: must be a dictionary") + continue + + access_token = token_data.get("access_token") + server_name = token_data.get("server_name") + + if not access_token: + errors.append( + f"Token {i}: missing required 'access_token' field" + ) + continue + + if not server_name: + errors.append( + f"Token {i}: missing required 'server_name' field" + ) + continue + + # Create TokenRecord + from mcp_agent.oauth.records import TokenRecord + from mcp_agent.oauth.store.base import ( + TokenStoreKey, + scope_fingerprint, + ) + + scopes = token_data.get("scopes", []) + if isinstance(scopes, str): + scopes = [scopes] + elif not isinstance(scopes, list): + scopes = [] + + token_record = TokenRecord( + access_token=access_token, + refresh_token=token_data.get("refresh_token"), + scopes=tuple(scopes), + expires_at=token_data.get("expires_at"), + token_type=token_data.get("token_type", "Bearer"), + resource=server_name, + authorization_server=token_data.get("authorization_server"), + metadata={"workflow_name": workflow_name}, + ) + + # Ensure we have a user context for token storage + if not app_context.current_user: + # Create synthetic user if none exists + synthetic_user = create_default_user_for_preconfigured_tokens() + app_context.current_user = synthetic_user + logger.info(f"Created synthetic user for workflow pre-auth: {synthetic_user.cache_key}") + + # Create storage key using current user + store_key = TokenStoreKey( + user_key=app_context.current_user.cache_key, + resource=server_name, + authorization_server=token_data.get("authorization_server"), + scope_fingerprint=scope_fingerprint(scopes), + ) + + # Store the token + await app_context.token_store.set(store_key, token_record) + stored_count += 1 + + logger.info( + f"Stored OAuth token for workflow '{workflow_name}' and server '{server_name}'" + ) + + except Exception as e: + errors.append(f"Token {i}: {str(e)}") + logger.error( + f"Error storing token {i} for workflow '{workflow_name}': {e}" + ) + + if errors and stored_count == 0: + raise ToolError( + f"Failed to store any tokens. Errors: {'; '.join(errors)}" + ) + + result = { + "success": True, + "workflow_name": workflow_name, + "stored_tokens": stored_count, + "total_tokens": len(tokens), + } + + if errors: + result["errors"] = errors + result["partial_success"] = True + + logger.info( + f"Pre-authorization completed for workflow '{workflow_name}': " + f"{stored_count}/{len(tokens)} tokens stored" + ) + + return result + + except Exception as e: + logger.error( + f"Error in workflow pre-authorization for '{workflow_name}': {e}" + ) + raise ToolError(f"Failed to store tokens: {str(e)}") + # endregion return mcp From 1ddb4600fae7b31085ce3be4d9e079abc68c0c6b Mon Sep 17 00:00:00 2001 From: Roman van der Krogt Date: Fri, 26 Sep 2025 14:28:39 +0100 Subject: [PATCH 07/11] working oauth example with workflow_pre_auth --- examples/oauth/workflow_pre_auth/client.py | 11 +++-- examples/oauth/workflow_pre_auth/main.py | 7 +++ src/mcp_agent/oauth/manager.py | 12 +++-- src/mcp_agent/server/app_server.py | 57 ++++++++++++++++------ 4 files changed, 64 insertions(+), 23 deletions(-) diff --git a/examples/oauth/workflow_pre_auth/client.py b/examples/oauth/workflow_pre_auth/client.py index ce80b488b..a8014d3db 100644 --- a/examples/oauth/workflow_pre_auth/client.py +++ b/examples/oauth/workflow_pre_auth/client.py @@ -113,6 +113,12 @@ def make_session( context.server_registry, client_session_factory=make_session, ) as server: + try: + await server.set_logging_level("info") + except Exception: + # Older servers may not support logging capability + print("[client] Server does not support logging/setLevel") + # List available tools tools_result = await server.list_tools() logger.info( @@ -127,14 +133,11 @@ def make_session( { "access_token": access_token, "server_name": "github", - "scopes": ["read:org", "public_repo", "user:email"], - "authorization_server": "https://github.com/login/oauth", - "token_type": "Bearer" } ] }) - print(await server.call_tool("github_org_search", {"query": "last mile ai"})) + print(await server.call_tool("github_org_search", {"query": "lastmileai"})) except Exception as e: # Tolerate benign shutdown races from stdio client (BrokenResourceError within ExceptionGroup) if _ExceptionGroup is not None and isinstance(e, _ExceptionGroup): diff --git a/examples/oauth/workflow_pre_auth/main.py b/examples/oauth/workflow_pre_auth/main.py index f725875f4..01194ef42 100644 --- a/examples/oauth/workflow_pre_auth/main.py +++ b/examples/oauth/workflow_pre_auth/main.py @@ -82,6 +82,13 @@ class MCPServerOAuthSettings: async def github_org_search(query: str, app_ctx: Optional[AppContext] = None) -> str: from mcp_agent.mcp.gen_client import gen_client + # Use the context's app if available for proper logging with upstream_session + _app = app_ctx.app if app_ctx else app + # Ensure the app's logger is bound to the current context with upstream_session + if _app._logger and hasattr(_app._logger, "_bound_context"): + _app._logger._bound_context = app_ctx + logger = _app.logger + try: async with gen_client( "github", diff --git a/src/mcp_agent/oauth/manager.py b/src/mcp_agent/oauth/manager.py index d2bd3d6b2..9a74c89ae 100644 --- a/src/mcp_agent/oauth/manager.py +++ b/src/mcp_agent/oauth/manager.py @@ -127,9 +127,15 @@ async def ensure_access_token( user = context.current_user if not user: - raise MissingUserIdentityError( - "No authenticated MCP user available for OAuth flow (neither interactive nor pre-configured)" - ) + # TODO: with a proper oauth flow, we should always have a user in the context; since we don't have a server + # yet, mock a user if necessary. In the future, should be replaced by: something like: + # raise MissingUserIdentityError("No authenticated MCP user available for OAuth flow (neither + # interactive nor pre-configured)") + + # Create synthetic user if none exists + user = create_default_user_for_preconfigured_tokens() + context.current_user = user + logger.info(f"Created synthetic user for token access: {user.cache_key}") # Use the same key construction logic as store_preconfigured_token to ensure consistency resource_str = str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) diff --git a/src/mcp_agent/server/app_server.py b/src/mcp_agent/server/app_server.py index 526e84935..f2b03e923 100644 --- a/src/mcp_agent/server/app_server.py +++ b/src/mcp_agent/server/app_server.py @@ -24,6 +24,7 @@ from mcp_agent.app import MCPApp from mcp_agent.agents.agent import Agent +from mcp_agent.config import MCPOAuthClientSettings from mcp_agent.core.context_dependent import ContextDependent from mcp_agent.executor.workflow import Workflow from mcp_agent.executor.workflow_registry import ( @@ -1563,6 +1564,32 @@ async def workflow_pre_auth( ) continue + server_config = app_context.server_registry.get_server_config(server_name) + if not server_config: + errors.append( + f"Token {i}: server '{server_name}' not recognized" + ) + continue + + oauth_config: MCPOAuthClientSettings | None = None + if server_config and server_config.auth: + oauth_config = getattr(server_config.auth, "oauth", None) + if not oauth_config or not oauth_config.enabled: + errors.append( + f"Token {i}: Server '{server_name}' is not configured for OAuth authentication" + ) + continue + + # Ensure we have a user context for token storage + # TODO: This is a temporary workaround until we have proper oauth service, so that we have a user + # in the context from the oauth token + if not app_context.current_user: + # Create synthetic user if none exists + synthetic_user = create_default_user_for_preconfigured_tokens() + app_context.current_user = synthetic_user + logger.info(f"Created synthetic user for workflow pre-auth: {synthetic_user.cache_key}") + logger.info(f"{id(app_context)}: {app_context}") + # Create TokenRecord from mcp_agent.oauth.records import TokenRecord from mcp_agent.oauth.store.base import ( @@ -1570,38 +1597,36 @@ async def workflow_pre_auth( scope_fingerprint, ) - scopes = token_data.get("scopes", []) - if isinstance(scopes, str): - scopes = [scopes] - elif not isinstance(scopes, list): - scopes = [] + resource_str = str(oauth_config.resource) if oauth_config.resource \ + else getattr(server_config, "url", None) + auth_server_str = str(oauth_config.authorization_server) if oauth_config.authorization_server \ + else None + scope_list = list(oauth_config.scopes or []) token_record = TokenRecord( access_token=access_token, refresh_token=token_data.get("refresh_token"), - scopes=tuple(scopes), + scopes=tuple(scope_list), expires_at=token_data.get("expires_at"), token_type=token_data.get("token_type", "Bearer"), resource=server_name, - authorization_server=token_data.get("authorization_server"), + authorization_server=auth_server_str, metadata={"workflow_name": workflow_name}, ) - # Ensure we have a user context for token storage - if not app_context.current_user: - # Create synthetic user if none exists - synthetic_user = create_default_user_for_preconfigured_tokens() - app_context.current_user = synthetic_user - logger.info(f"Created synthetic user for workflow pre-auth: {synthetic_user.cache_key}") + str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) # Create storage key using current user store_key = TokenStoreKey( user_key=app_context.current_user.cache_key, - resource=server_name, - authorization_server=token_data.get("authorization_server"), - scope_fingerprint=scope_fingerprint(scopes), + resource=resource_str, + authorization_server=auth_server_str, + scope_fingerprint=scope_fingerprint(scope_list), ) + logger.debug( + f"Storing token with key: user_key={store_key.user_key}, resource={store_key.resource}, auth_server={store_key.authorization_server}, scope_fingerprint={store_key.scope_fingerprint}") + # Store the token await app_context.token_store.set(store_key, token_record) stored_count += 1 From 9500f8a714f49857d7deff2520604608203611a7 Mon Sep 17 00:00:00 2001 From: Roman van der Krogt Date: Fri, 26 Sep 2025 21:04:16 +0100 Subject: [PATCH 08/11] fixes to oauth discovery; add dynamic oath example --- examples/oauth/README.md | 19 +++ examples/oauth/dynamic_auth/client.py | 185 +++++++++++++++++++++ examples/oauth/dynamic_auth/main.py | 156 +++++++++++++++++ examples/oauth/dynamic_auth/worker.py | 31 ++++ examples/oauth/workflow_pre_auth/worker.py | 31 ++++ src/mcp_agent/oauth/flow.py | 31 ++-- src/mcp_agent/oauth/manager.py | 4 +- src/mcp_agent/server/app_server.py | 19 +++ 8 files changed, 463 insertions(+), 13 deletions(-) create mode 100644 examples/oauth/README.md create mode 100644 examples/oauth/dynamic_auth/client.py create mode 100644 examples/oauth/dynamic_auth/main.py create mode 100644 examples/oauth/dynamic_auth/worker.py create mode 100644 examples/oauth/workflow_pre_auth/worker.py diff --git a/examples/oauth/README.md b/examples/oauth/README.md new file mode 100644 index 000000000..dd966ba1f --- /dev/null +++ b/examples/oauth/README.md @@ -0,0 +1,19 @@ +# OAUTH scenarios + +## preconfigured + +In this case, a token is hard-coded into the configuration. +This is useful for testing or when the token is static. + +## workflow_pre_auth + +In this case, the client can call a `workflows_pre_auth` tool before calling a workflow to seed the tokens. +This is useful when the client can do the auth step, but the workflow cannot (e.g. because it runs async). +There is a slight hack employed here: since we don't have oauth for the mcp app, we do not have a user. +Since we need a user to store the token against, we create a synthetic user and use that. + +## dynamic_auth + +In this case, no tokens are provided, and the calls comes back to the client to do the auth step. +Currently implemented as an elicitation request (to align with the future elicit URL scheme). +I have not achieved full end-to-end flow here. \ No newline at end of file diff --git a/examples/oauth/dynamic_auth/client.py b/examples/oauth/dynamic_auth/client.py new file mode 100644 index 000000000..1a0374b57 --- /dev/null +++ b/examples/oauth/dynamic_auth/client.py @@ -0,0 +1,185 @@ +import argparse +import asyncio +import json +import time +import os + +from datetime import timedelta +from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream +from mcp import ClientSession +from mcp.types import CallToolResult, LoggingMessageNotificationParams +from mcp_agent.app import MCPApp +from mcp_agent.config import MCPServerSettings +from mcp_agent.core.context import Context +from mcp_agent.executor.workflow import WorkflowExecution +from mcp_agent.mcp.gen_client import gen_client +from mcp_agent.mcp.mcp_agent_client_session import MCPAgentClientSession +from mcp_agent.human_input.console_handler import console_input_callback +from mcp_agent.elicitation.handler import console_elicitation_callback + +from rich import print + +try: + from exceptiongroup import ExceptionGroup as _ExceptionGroup # Python 3.10 backport +except Exception: # pragma: no cover + _ExceptionGroup = None # type: ignore +try: + from anyio import BrokenResourceError as _BrokenResourceError +except Exception: # pragma: no cover + _BrokenResourceError = None # type: ignore + +# Get GitHub access token from environment or ask user +access_token = os.getenv('GITHUB_ACCESS_TOKEN') + +if not access_token: + print("\nGitHub access token not found in environment variable GITHUB_ACCESS_TOKEN") + print("\nTo get a GitHub access token:") + print("1. Run the oauth_demo.py script from examples/oauth/ to get a fresh token") + print("2. Or go to GitHub Settings > Developer settings > Personal access tokens") + print("3. Create a token with 'read:org' and 'public_repo' scopes") + print("\nThen set the token:") + print("export GITHUB_ACCESS_TOKEN='your_token_here'") + +# Verify token format +if not access_token.startswith(('gho_', 'ghp_', 'github_pat_')): + print(f"Warning: Token doesn't look like a GitHub token (got: {access_token[:10]}...)") + print("GitHub tokens usually start with 'gho_', 'ghp_', or 'github_pat_'") + + +async def main(): + # Create MCPApp to get the server registry + app = MCPApp( + name="workflow_mcp_client", + human_input_callback=console_input_callback, + elicitation_callback=console_elicitation_callback, + ) + async with app.run() as client_app: + logger = client_app.logger + context = client_app.context + + # Connect to the workflow server + logger.info("Connecting to workflow server...") + + # Override the server configuration to point to our local script + context.server_registry.registry["basic_agent_server"] = MCPServerSettings( + name="basic_agent_server", + description="Local workflow server running the basic agent example", + transport="sse", + url="http://127.0.0.1:8000/sse", + ) + + # Define a logging callback to receive server-side log notifications + async def on_server_log(params: LoggingMessageNotificationParams) -> None: + level = params.level.upper() + name = params.logger or "server" + print(f"[SERVER LOG] [{level}] [{name}] {params.data}") + + # Provide a client session factory that installs our logging callback + # and prints non-logging notifications to the console + class ConsolePrintingClientSession(MCPAgentClientSession): + async def _received_notification(self, notification): # type: ignore[override] + try: + method = getattr(notification.root, "method", None) + except Exception: + method = None + + # Avoid duplicating server log prints (handled by logging_callback) + if method and method != "notifications/message": + try: + data = notification.model_dump() + except Exception: + data = str(notification) + print(f"[SERVER NOTIFY] {method}: {data}") + + return await super()._received_notification(notification) + + def make_session( + read_stream: MemoryObjectReceiveStream, + write_stream: MemoryObjectSendStream, + read_timeout_seconds: timedelta | None, + context: Context | None = None, + ) -> ClientSession: + return ConsolePrintingClientSession( + read_stream=read_stream, + write_stream=write_stream, + read_timeout_seconds=read_timeout_seconds, + logging_callback=on_server_log, + context=context, + ) + + try: + async with gen_client( + "basic_agent_server", + context.server_registry, + client_session_factory=make_session, + ) as server: + try: + await server.set_logging_level("info") + except Exception: + # Older servers may not support logging capability + print("[client] Server does not support logging/setLevel") + + # List available tools + tools_result = await server.list_tools() + logger.info( + "Available tools:", + data={"tools": [tool.name for tool in tools_result.tools]}, + ) + + print(await server.call_tool("github_org_search", {"query": "lastmileai"})) + except Exception as e: + # Tolerate benign shutdown races from stdio client (BrokenResourceError within ExceptionGroup) + if _ExceptionGroup is not None and isinstance(e, _ExceptionGroup): + subs = getattr(e, "exceptions", []) or [] + if ( + _BrokenResourceError is not None + and subs + and all(isinstance(se, _BrokenResourceError) for se in subs) + ): + logger.debug("Ignored BrokenResourceError from stdio shutdown") + else: + raise + elif _BrokenResourceError is not None and isinstance( + e, _BrokenResourceError + ): + logger.debug("Ignored BrokenResourceError from stdio shutdown") + elif "BrokenResourceError" in str(e): + logger.debug( + "Ignored BrokenResourceError from stdio shutdown (string match)" + ) + else: + raise + # Nudge cleanup of subprocess transports before the loop closes to avoid + # 'Event loop is closed' from BaseSubprocessTransport.__del__ on GC. + try: + await asyncio.sleep(0) + except Exception: + pass + try: + import gc + + gc.collect() + except Exception: + pass + + +def _tool_result_to_json(tool_result: CallToolResult): + if tool_result.content and len(tool_result.content) > 0: + text = tool_result.content[0].text + try: + # Try to parse the response as JSON if it's a string + import json + + return json.loads(text) + except (json.JSONDecodeError, TypeError): + # If it's not valid JSON, just use the text + return None + + +if __name__ == "__main__": + start = time.time() + asyncio.run(main()) + end = time.time() + t = end - start + + print(f"Total run time: {t:.2f}s") diff --git a/examples/oauth/dynamic_auth/main.py b/examples/oauth/dynamic_auth/main.py new file mode 100644 index 000000000..8dbae64a1 --- /dev/null +++ b/examples/oauth/dynamic_auth/main.py @@ -0,0 +1,156 @@ +""" +Workflow MCP Server Example + +This example demonstrates three approaches to creating agents and workflows: +1. Traditional workflow-based approach with manual agent creation +2. Programmatic agent configuration using AgentConfig +3. Declarative agent configuration using FastMCPApp decorators +""" + +import asyncio +import json +import os +from pydantic import AnyHttpUrl + +from mcp.server.fastmcp import FastMCP + +from mcp_agent.app import MCPApp +from mcp_agent.server.app_server import create_mcp_server_for_app + +from mcp_agent.config import MCPServerSettings, Settings, LoggerSettings, MCPSettings, MCPServerAuthSettings, \ + MCPOAuthClientSettings, OAuthSettings, OAuthTokenStoreSettings, TemporalSettings + +# Note: This is purely optional: +# if not provided, a default FastMCP server will be created by MCPApp using create_mcp_server_for_app() +mcp = FastMCP(name="basic_agent_server", instructions="My basic agent server example.") + +client_id = os.getenv('GITHUB_CLIENT_ID') + +settings = Settings( + execution_engine="temporal", + temporal=TemporalSettings( + host="localhost:7233", + namespace="default", + task_queue="mcp-agent", + max_concurrent_activities=10, + ), + logger=LoggerSettings(level="info"), + oauth=OAuthSettings( + callback_base_url=AnyHttpUrl("http://localhost:8080"), + flow_timeout_seconds=300, + token_store=OAuthTokenStoreSettings(refresh_leeway_seconds=60), + ), + mcp=MCPSettings( + servers={ + "github": MCPServerSettings( + name="github", + transport="streamable_http", + url="https://api.githubcopilot.com/mcp/", + auth=MCPServerAuthSettings( + oauth=MCPOAuthClientSettings( + client_id=client_id, + use_internal_callback=True, + enabled=True, + scopes= [ + "read:org", # Required for search_orgs tool + "public_repo", # Access to public repositories + "user:email" # User information access + ], + authorization_server=AnyHttpUrl("https://github.com/login/oauth"), + resource=AnyHttpUrl("https://api.githubcopilot.com/mcp") + ) + ) + ) + } + ), + ) + +# Define the MCPApp instance. The server created for this app will advertise the +# MCP logging capability and forward structured logs upstream to connected clients. +app = MCPApp( + name="basic_agent_server", + description="Basic agent server example", + mcp=mcp, + settings=settings, +) + + +@app.workflow_task(name="github_org_search_activity") +async def github_org_search_activity(query: str) -> str: + from mcp_agent.mcp.gen_client import gen_client + + print("running activity)") + try: + async with gen_client( + "github", + server_registry=app.context.server_registry, + context=app.context + ) as github_client: + print("got client") + result = await github_client.call_tool( + "search_orgs", + { + "query": query, + "perPage": 10, + "sort": "best-match", + "order": "desc" + } + ) + + organizations = [] + if result.content: + for content_item in result.content: + if hasattr(content_item, 'text'): + try: + data = json.loads(content_item.text) + if isinstance(data, dict) and 'items' in data: + organizations.extend(data['items']) + elif isinstance(data, list): + organizations.extend(data) + except json.JSONDecodeError: + pass + + print(f"Organizations: {organizations}") + return str(organizations) + except Exception as e: + import traceback + traceback.print_exc() + return f"Error: {e}" + +@app.tool(name="github_org_search") +async def github_org_search(query: str) -> str: + if app._logger and hasattr(app._logger, "_bound_context"): + app._logger._bound_context = app.context + logger = app.logger + + result = await app.executor.execute(github_org_search_activity, query) + print(f"Result: {result}, {type(result)}") + + return "ok!" + # try: + # return await app.executor.execute(github_org_search_activity, query) + # except Exception as e: + # import traceback + # traceback.print_exc() + # return f"Error: {e}" + +async def main(): + async with app.run() as agent_app: + # Log registered workflows and agent configurations + agent_app.logger.info(f"Creating MCP server for {agent_app.name}") + + agent_app.logger.info("Registered workflows:") + for workflow_id in agent_app.workflows: + agent_app.logger.info(f" - {workflow_id}") + + # Create the MCP server that exposes both workflows and agent configurations, + # optionally using custom FastMCP settings + mcp_server = create_mcp_server_for_app(agent_app) + agent_app.logger.info(f"MCP Server settings: {mcp_server.settings}") + + # Run the server + await mcp_server.run_sse_async() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/oauth/dynamic_auth/worker.py b/examples/oauth/dynamic_auth/worker.py new file mode 100644 index 000000000..39b2a3c67 --- /dev/null +++ b/examples/oauth/dynamic_auth/worker.py @@ -0,0 +1,31 @@ +""" +Worker script for the Temporal workflow example. +This script starts a Temporal worker that can execute workflows and activities. +Run this script in a separate terminal window before running the main.py script. + +This leverages the TemporalExecutor's start_worker method to handle the worker setup. +""" + +import asyncio +import logging + + +from mcp_agent.executor.temporal import create_temporal_worker_for_app + +from main import app + +# Initialize logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +async def main(): + """ + Start a Temporal worker for the example workflows using the app's executor. + """ + async with create_temporal_worker_for_app(app) as worker: + await worker.run() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/oauth/workflow_pre_auth/worker.py b/examples/oauth/workflow_pre_auth/worker.py new file mode 100644 index 000000000..39b2a3c67 --- /dev/null +++ b/examples/oauth/workflow_pre_auth/worker.py @@ -0,0 +1,31 @@ +""" +Worker script for the Temporal workflow example. +This script starts a Temporal worker that can execute workflows and activities. +Run this script in a separate terminal window before running the main.py script. + +This leverages the TemporalExecutor's start_worker method to handle the worker setup. +""" + +import asyncio +import logging + + +from mcp_agent.executor.temporal import create_temporal_worker_for_app + +from main import app + +# Initialize logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +async def main(): + """ + Start a Temporal worker for the example workflows using the app's executor. + """ + async with create_temporal_worker_for_app(app) as worker: + await worker.run() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/src/mcp_agent/oauth/flow.py b/src/mcp_agent/oauth/flow.py index 424385538..95ec90169 100644 --- a/src/mcp_agent/oauth/flow.py +++ b/src/mcp_agent/oauth/flow.py @@ -68,7 +68,7 @@ async def authorize( flow_id = uuid.uuid4().hex internal_redirect = None if oauth_config.use_internal_callback and self._settings.callback_base_url: - internal_redirect = f"{self._settings.callback_base_url.rstrip('/')}/internal/oauth/callback/{flow_id}" + internal_redirect = f"{str(self._settings.callback_base_url).rstrip('/')}/internal/oauth/callback/{flow_id}" redirect_options.insert(0, internal_redirect) if not redirect_options: @@ -83,18 +83,24 @@ async def authorize( state = generate_state() scope_param = " ".join(scopes) + params = { + "response_type":"code", + "client_id":client_id, + "redirect_uri":redirect_uri, + "scope":scope_param, + "state":state, + "code_challenge":code_challenge, + "code_challenge_method":"S256", + "resource":resource, + } + + # add extra params if any + if oauth_config.extra_authorize_params: + params.update(oauth_config.extra_authorize_params) + + import urllib.parse authorize_url = httpx.URL( - str(auth_metadata.authorization_endpoint) - ).include_query_params( - response_type="code", - client_id=client_id, - redirect_uri=redirect_uri, - scope=scope_param, - state=state, - code_challenge=code_challenge, - code_challenge_method="S256", - resource=resource, - **(oauth_config.extra_authorize_params or {}), + str(auth_metadata.authorization_endpoint) +"?" + urllib.parse.urlencode(params) ) callback_future = None @@ -209,6 +215,7 @@ async def _send_auth_request( context: Context, payload: Dict[str, Any] ) -> Dict[str, Any]: session = getattr(context, "upstream_session", None) + if session and isinstance(session, ServerSession): rpc = getattr(session, "rpc", None) if rpc and hasattr(rpc, "request"): diff --git a/src/mcp_agent/oauth/manager.py b/src/mcp_agent/oauth/manager.py index 9a74c89ae..d00dfe331 100644 --- a/src/mcp_agent/oauth/manager.py +++ b/src/mcp_agent/oauth/manager.py @@ -322,7 +322,9 @@ async def _get_authorization_metadata(self, url: str): if cached and time.time() - cached[0] < 300: return cached[1] # Construct OAuth authorization server metadata URL - metadata_url = url.rstrip('/') + '/.well-known/oauth-authorization-server' + parsed_url = URL(url) + metadata_url = str( + parsed_url.copy_with(path="/.well-known/oauth-authorization-server" + parsed_url.path)) metadata = await fetch_authorization_server_metadata(self._http_client, metadata_url) self._auth_metadata_cache[url] = (time.time(), metadata) return metadata diff --git a/src/mcp_agent/server/app_server.py b/src/mcp_agent/server/app_server.py index f2b03e923..6205933b6 100644 --- a/src/mcp_agent/server/app_server.py +++ b/src/mcp_agent/server/app_server.py @@ -10,6 +10,7 @@ import os import secrets import asyncio +from pydantic import BaseModel, Field from mcp.server.fastmcp import Context as MCPContext, FastMCP from mcp.server.fastmcp.server import AuthSettings @@ -717,6 +718,24 @@ async def _handle_specific_request( result = await session.send_request( request=req, result_type=EmptyResult ) # type: ignore[attr-defined] + return result.model_dump(by_alias=True, mode="json", exclude_none=True) + elif method == "auth/request": + # TODO: special handling of auth request, should be replaced by future URL elicitation + class AuthToken(BaseModel): + token: str = Field(description="The access token") + + req = ElicitRequest( + method="elicitation/create", + params=ElicitRequestParams( + message=params["message"] + "\n\n" + params["url"] , + requestedSchema=AuthToken.model_json_schema(), + ), + ) + + result = await session.send_request( + request=req, result_type=ElicitResult + ) # type: ignore[attr-defined] + return result.model_dump(by_alias=True, mode="json", exclude_none=True) else: raise ValueError(f"unsupported method: {method}") From 5240bada87b1861f57592af0a666f9f3caa712ee Mon Sep 17 00:00:00 2001 From: Roman van der Krogt Date: Mon, 29 Sep 2025 20:52:36 +0100 Subject: [PATCH 09/11] full e2e workflow --- examples/oauth/dynamic_auth/client.py | 22 ------------- examples/oauth/dynamic_auth/main.py | 31 ++++++++++++------- examples/oauth/preconfigured/main.py | 4 +-- examples/oauth/preconfigured/oauth_demo.py | 6 ++-- .../oauth/preconfigured/workflow_example.py | 5 ++- examples/oauth/workflow_pre_auth/client.py | 3 -- examples/oauth/workflow_pre_auth/main.py | 18 ++--------- src/mcp_agent/oauth/callbacks.py | 1 + src/mcp_agent/oauth/flow.py | 26 +++++++++++----- src/mcp_agent/oauth/http/auth.py | 2 +- src/mcp_agent/oauth/manager.py | 1 - src/mcp_agent/server/app_server.py | 23 +++++++++++--- 12 files changed, 67 insertions(+), 75 deletions(-) diff --git a/examples/oauth/dynamic_auth/client.py b/examples/oauth/dynamic_auth/client.py index 1a0374b57..4e7b67c3a 100644 --- a/examples/oauth/dynamic_auth/client.py +++ b/examples/oauth/dynamic_auth/client.py @@ -1,8 +1,5 @@ -import argparse import asyncio -import json import time -import os from datetime import timedelta from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream @@ -11,7 +8,6 @@ from mcp_agent.app import MCPApp from mcp_agent.config import MCPServerSettings from mcp_agent.core.context import Context -from mcp_agent.executor.workflow import WorkflowExecution from mcp_agent.mcp.gen_client import gen_client from mcp_agent.mcp.mcp_agent_client_session import MCPAgentClientSession from mcp_agent.human_input.console_handler import console_input_callback @@ -28,24 +24,6 @@ except Exception: # pragma: no cover _BrokenResourceError = None # type: ignore -# Get GitHub access token from environment or ask user -access_token = os.getenv('GITHUB_ACCESS_TOKEN') - -if not access_token: - print("\nGitHub access token not found in environment variable GITHUB_ACCESS_TOKEN") - print("\nTo get a GitHub access token:") - print("1. Run the oauth_demo.py script from examples/oauth/ to get a fresh token") - print("2. Or go to GitHub Settings > Developer settings > Personal access tokens") - print("3. Create a token with 'read:org' and 'public_repo' scopes") - print("\nThen set the token:") - print("export GITHUB_ACCESS_TOKEN='your_token_here'") - -# Verify token format -if not access_token.startswith(('gho_', 'ghp_', 'github_pat_')): - print(f"Warning: Token doesn't look like a GitHub token (got: {access_token[:10]}...)") - print("GitHub tokens usually start with 'gho_', 'ghp_', or 'github_pat_'") - - async def main(): # Create MCPApp to get the server registry app = MCPApp( diff --git a/examples/oauth/dynamic_auth/main.py b/examples/oauth/dynamic_auth/main.py index 8dbae64a1..3eb54728c 100644 --- a/examples/oauth/dynamic_auth/main.py +++ b/examples/oauth/dynamic_auth/main.py @@ -24,7 +24,21 @@ # if not provided, a default FastMCP server will be created by MCPApp using create_mcp_server_for_app() mcp = FastMCP(name="basic_agent_server", instructions="My basic agent server example.") + +# Get client id and secret from environment variables client_id = os.getenv('GITHUB_CLIENT_ID') +client_secret = os.getenv('GITHUB_CLIENT_SECRET') + +if not client_id or not client_secret: + print("\nGitHub client id and/or secret not found in GITHUB_CLIENT_Id and GITHUB_CLIENT_SECRET " + "environment variables.") + print("\nTo create these:") + print("\n1. Open your profile on github.com and navigate to 'Developer Settings'") + print("\n2. Create a new OAuth app and create a client secret for it.") + print("\n3. Create environment variables:") + print("\nexport GITHUB_CLIENT_ID='your_client_id_here'") + print("\nexport GITHUB_CLIENT_SECRET='your_client_secret_here'") + settings = Settings( execution_engine="temporal", @@ -36,7 +50,7 @@ ), logger=LoggerSettings(level="info"), oauth=OAuthSettings( - callback_base_url=AnyHttpUrl("http://localhost:8080"), + callback_base_url=AnyHttpUrl("http://localhost:8000"), flow_timeout_seconds=300, token_store=OAuthTokenStoreSettings(refresh_leeway_seconds=60), ), @@ -49,6 +63,7 @@ auth=MCPServerAuthSettings( oauth=MCPOAuthClientSettings( client_id=client_id, + client_secret=client_secret, use_internal_callback=True, enabled=True, scopes= [ @@ -121,18 +136,12 @@ async def github_org_search_activity(query: str) -> str: async def github_org_search(query: str) -> str: if app._logger and hasattr(app._logger, "_bound_context"): app._logger._bound_context = app.context - logger = app.logger result = await app.executor.execute(github_org_search_activity, query) - print(f"Result: {result}, {type(result)}") - - return "ok!" - # try: - # return await app.executor.execute(github_org_search_activity, query) - # except Exception as e: - # import traceback - # traceback.print_exc() - # return f"Error: {e}" + print(f"Result: {result}") + + return result + async def main(): async with app.run() as agent_app: diff --git a/examples/oauth/preconfigured/main.py b/examples/oauth/preconfigured/main.py index 64d228151..c20e164e7 100644 --- a/examples/oauth/preconfigured/main.py +++ b/examples/oauth/preconfigured/main.py @@ -18,8 +18,6 @@ from mcp_agent.app import MCPApp from mcp_agent.mcp.gen_client import gen_client -from mcp_agent.mcp.mcp_agent_client_session import MCPAgentClientSession -from mcp_agent.mcp.mcp_connection_manager import MCPConnectionManager # Create the MCP app with OAuth configuration app = MCPApp(name="oauth_github_example") @@ -78,7 +76,7 @@ async def search_github_orgs(query: str, limit: int = 5) -> List[Dict[str, Any]] } ) - logger.info(f"Search completed, processing results...") + logger.info("Search completed, processing results...") # Parse and return the results if result.content: diff --git a/examples/oauth/preconfigured/oauth_demo.py b/examples/oauth/preconfigured/oauth_demo.py index 9fb41d80b..4a4c47c58 100644 --- a/examples/oauth/preconfigured/oauth_demo.py +++ b/examples/oauth/preconfigured/oauth_demo.py @@ -198,7 +198,7 @@ async def run_oauth_flow(self, scopes: list = None) -> Dict[str, Any]: # Step 1: Generate authorization URL auth_url = self.get_authorization_url(scopes) - print(f"\n1. Please visit this URL to authorize the application:") + print("\n1. Please visit this URL to authorize the application:") print(f" {auth_url}") print("\n2. After authorization, you'll be redirected to a callback URL.") @@ -281,7 +281,7 @@ async def handle_callback(request): print("5. Authorization code received, exchanging for access token...") # Step 4: Exchange code for token - token_data = await self.exchange_code_for_token(code, state) + await self.exchange_code_for_token(code, state) print(" ✓ Access token obtained successfully") # Step 5: Test the token @@ -332,7 +332,7 @@ async def main(): print("OAuth Flow Completed Successfully!") print("=" * 50) - print(f"\nToken Details:") + print("\nToken Details:") print(f" Access Token: {token_data['access_token'][:20]}...") print(f" Expires At: {time.ctime(token_data['expires_at'])}") print(f" Scopes: {', '.join(token_data['scopes'])}") diff --git a/examples/oauth/preconfigured/workflow_example.py b/examples/oauth/preconfigured/workflow_example.py index 47521f584..59948bf7b 100644 --- a/examples/oauth/preconfigured/workflow_example.py +++ b/examples/oauth/preconfigured/workflow_example.py @@ -274,7 +274,6 @@ async def analyze_github_ecosystem( def _generate_ecosystem_insights(results: Dict[str, Any]) -> Dict[str, Any]: """Generate high-level insights from the ecosystem analysis.""" organizations = results.get("organizations", []) - summary = results.get("summary", {}) if not organizations: return {"message": "No data available for insights"} @@ -386,7 +385,7 @@ async def demonstrate_pre_auth_workflow(): include_details=True ) - print(f"\n3. Workflow Results:") + print("\n3. Workflow Results:") print(f" - Focus areas analyzed: {result['focus_areas']}") print(f" - Queries executed: {len(result['queries_executed'])}") print(f" - Organizations found: {result['results']['summary'].get('total_organizations', 0)}") @@ -394,7 +393,7 @@ async def demonstrate_pre_auth_workflow(): if result['results']['errors']: print(f" - Errors encountered: {len(result['results']['errors'])}") - print(f"\n4. Ecosystem Insights:") + print("\n4. Ecosystem Insights:") insights = result['insights'] if 'geographic_distribution' in insights: top_locations = insights['geographic_distribution'].get('top_locations', {}) diff --git a/examples/oauth/workflow_pre_auth/client.py b/examples/oauth/workflow_pre_auth/client.py index a8014d3db..873fdb364 100644 --- a/examples/oauth/workflow_pre_auth/client.py +++ b/examples/oauth/workflow_pre_auth/client.py @@ -1,6 +1,4 @@ -import argparse import asyncio -import json import time import os @@ -11,7 +9,6 @@ from mcp_agent.app import MCPApp from mcp_agent.config import MCPServerSettings from mcp_agent.core.context import Context -from mcp_agent.executor.workflow import WorkflowExecution from mcp_agent.mcp.gen_client import gen_client from mcp_agent.mcp.mcp_agent_client_session import MCPAgentClientSession from mcp_agent.human_input.console_handler import console_input_callback diff --git a/examples/oauth/workflow_pre_auth/main.py b/examples/oauth/workflow_pre_auth/main.py index 01194ef42..18634378e 100644 --- a/examples/oauth/workflow_pre_auth/main.py +++ b/examples/oauth/workflow_pre_auth/main.py @@ -7,11 +7,9 @@ 3. Declarative agent configuration using FastMCPApp decorators """ -import argparse import asyncio import json -import os -from typing import Dict, Any, Optional +from typing import Optional from pydantic import AnyHttpUrl from mcp.server.fastmcp import FastMCP @@ -19,16 +17,6 @@ from mcp_agent.app import MCPApp from mcp_agent.server.app_server import create_mcp_server_for_app -from mcp_agent.agents.agent import Agent -from mcp_agent.workflows.llm.augmented_llm import RequestParams -from mcp_agent.workflows.llm.llm_selector import ModelPreferences -from mcp_agent.workflows.llm.augmented_llm_anthropic import AnthropicAugmentedLLM -from mcp_agent.workflows.llm.augmented_llm_openai import OpenAIAugmentedLLM -from mcp_agent.workflows.parallel.parallel_llm import ParallelLLM -from mcp_agent.executor.workflow import Workflow, WorkflowResult -from mcp_agent.tracing.token_counter import TokenNode -from mcp_agent.human_input.console_handler import console_input_callback -from mcp_agent.elicitation.handler import console_elicitation_callback from mcp_agent.mcp.gen_client import gen_client from mcp_agent.config import MCPServerSettings, Settings, LoggerSettings, MCPSettings, MCPServerAuthSettings, \ MCPOAuthClientSettings @@ -80,14 +68,12 @@ class MCPServerOAuthSettings: @app.tool(name="github_org_search") async def github_org_search(query: str, app_ctx: Optional[AppContext] = None) -> str: - from mcp_agent.mcp.gen_client import gen_client # Use the context's app if available for proper logging with upstream_session _app = app_ctx.app if app_ctx else app # Ensure the app's logger is bound to the current context with upstream_session if _app._logger and hasattr(_app._logger, "_bound_context"): _app._logger._bound_context = app_ctx - logger = _app.logger try: async with gen_client( @@ -119,7 +105,7 @@ async def github_org_search(query: str, app_ctx: Optional[AppContext] = None) -> pass return str(organizations) - except Exception as e: + except Exception: import traceback return f"Error: {traceback.format_exc()}" diff --git a/src/mcp_agent/oauth/callbacks.py b/src/mcp_agent/oauth/callbacks.py index 7cae8c992..8bfa99957 100644 --- a/src/mcp_agent/oauth/callbacks.py +++ b/src/mcp_agent/oauth/callbacks.py @@ -28,6 +28,7 @@ async def deliver(self, flow_id: str, payload: Dict[str, Any]) -> bool: async with self._lock: future = self._pending.get(flow_id) if future is None: + # print all entries in _pending for debugging return False if not future.done(): future.set_result(payload) diff --git a/src/mcp_agent/oauth/flow.py b/src/mcp_agent/oauth/flow.py index 95ec90169..a93dd69ea 100644 --- a/src/mcp_agent/oauth/flow.py +++ b/src/mcp_agent/oauth/flow.py @@ -5,6 +5,7 @@ import asyncio import time import uuid +from json import JSONDecodeError from typing import Any, Dict, Sequence from urllib.parse import parse_qs, urlparse @@ -111,6 +112,7 @@ async def authorize( "url": str(authorize_url), "message": f"Authorization required for {server_name}", "redirect_uri_options": redirect_options, + "flow_id": flow_id } result = await _send_auth_request(context, request_payload) @@ -120,6 +122,10 @@ async def authorize( callback_data = _parse_callback_params(result["url"]) if callback_future is not None: await callback_registry.discard(flow_id) + elif result and result.get("code"): + callback_data = result + if callback_future is not None: + await callback_registry.discard(flow_id) elif callback_future is not None: timeout = self._settings.flow_timeout_seconds or 300 try: @@ -170,21 +176,25 @@ async def authorize( data["client_secret"] = oauth_config.client_secret token_response = await self._http_client.post( - token_endpoint, data=data, auth=auth + token_endpoint, data=data, auth=auth, headers={"Accept": "application/json"} ) token_response.raise_for_status() - payload = token_response.json() - access_token = payload.get("access_token") + try: + callback_data = token_response.json() + except JSONDecodeError: + callback_data = _parse_callback_params("?" + token_response.text) + + access_token = callback_data.get("access_token") if not access_token: raise OAuthFlowError("Token endpoint response missing access_token") - refresh_token = payload.get("refresh_token") - expires_in = payload.get("expires_in") + refresh_token = callback_data.get("refresh_token") + expires_in = callback_data.get("expires_in") expires_at = None if isinstance(expires_in, (int, float)): expires_at = time.time() + float(expires_in) - scope_from_payload = payload.get("scope") + scope_from_payload = callback_data.get("scope") if isinstance(scope_from_payload, str) and scope_from_payload.strip(): effective_scopes = tuple(scope_from_payload.split()) else: @@ -195,10 +205,10 @@ async def authorize( refresh_token=refresh_token, expires_at=expires_at, scopes=effective_scopes, - token_type=str(payload.get("token_type", "Bearer")), + token_type=str(callback_data.get("token_type", "Bearer")), resource=resource, authorization_server=authorization_server_url, - metadata={"raw": payload}, + metadata={"raw": token_response.text}, ) diff --git a/src/mcp_agent/oauth/http/auth.py b/src/mcp_agent/oauth/http/auth.py index 8fba21757..a061e02ff 100644 --- a/src/mcp_agent/oauth/http/auth.py +++ b/src/mcp_agent/oauth/http/auth.py @@ -37,7 +37,7 @@ async def async_auth_flow(self, request: httpx.Request): server_config=self._server_config, scopes=self._scopes, ) - except Exception as e: + except Exception: raise request.headers["Authorization"] = ( f"{token_record.token_type} {token_record.access_token}" diff --git a/src/mcp_agent/oauth/manager.py b/src/mcp_agent/oauth/manager.py index d00dfe331..36e3577ea 100644 --- a/src/mcp_agent/oauth/manager.py +++ b/src/mcp_agent/oauth/manager.py @@ -13,7 +13,6 @@ from mcp_agent.config import MCPOAuthClientSettings, OAuthSettings from mcp_agent.logging.logger import get_logger from mcp_agent.oauth.errors import ( - MissingUserIdentityError, OAuthFlowError, TokenRefreshError, ) diff --git a/src/mcp_agent/server/app_server.py b/src/mcp_agent/server/app_server.py index 6205933b6..dd4027e93 100644 --- a/src/mcp_agent/server/app_server.py +++ b/src/mcp_agent/server/app_server.py @@ -39,9 +39,11 @@ from mcp_agent.mcp.mcp_server_registry import ServerRegistry from mcp_agent.oauth.identity import OAuthUserIdentity from mcp_agent.oauth.callbacks import callback_registry +from mcp_agent.oauth.errors import ( + CallbackTimeoutError, +) from mcp_agent.oauth.manager import create_default_user_for_preconfigured_tokens from mcp_agent.server.token_verifier import MCPAgentTokenVerifier - if TYPE_CHECKING: from mcp_agent.core.context import Context @@ -722,12 +724,15 @@ async def _handle_specific_request( elif method == "auth/request": # TODO: special handling of auth request, should be replaced by future URL elicitation class AuthToken(BaseModel): - token: str = Field(description="The access token") + confirmation: str = Field(description="Please press enter to confirm this message has been received") + + flow_id = params["flow_id"] + callback_future = await callback_registry.create_handle(flow_id) req = ElicitRequest( method="elicitation/create", params=ElicitRequestParams( - message=params["message"] + "\n\n" + params["url"] , + message=params["message"] + "\n\n" + params["url"], requestedSchema=AuthToken.model_json_schema(), ), ) @@ -736,7 +741,17 @@ class AuthToken(BaseModel): request=req, result_type=ElicitResult ) # type: ignore[attr-defined] - return result.model_dump(by_alias=True, mode="json", exclude_none=True) + timeout = 300 + try: + callback_data = await asyncio.wait_for( + callback_future, timeout=timeout + ) + except asyncio.TimeoutError as exc: + raise CallbackTimeoutError( + f"Timed out waiting for OAuth callback after {timeout} seconds" + ) from exc + + return callback_data else: raise ValueError(f"unsupported method: {method}") From fc4a27c9a8fecae6e4778501c9cb3550b067c5c8 Mon Sep 17 00:00:00 2001 From: Roman van der Krogt Date: Tue, 30 Sep 2025 16:52:00 +0100 Subject: [PATCH 10/11] improve how we're dealing with no oauth user --- examples/oauth/preconfigured/oauth_demo.py | 6 ++-- examples/oauth/workflow_pre_auth/client.py | 29 ++++++++++++-------- examples/oauth/workflow_pre_auth/main.py | 4 +-- src/mcp_agent/oauth/manager.py | 32 ++++++++++++---------- src/mcp_agent/server/app_server.py | 27 ++++++------------ 5 files changed, 48 insertions(+), 50 deletions(-) diff --git a/examples/oauth/preconfigured/oauth_demo.py b/examples/oauth/preconfigured/oauth_demo.py index 4a4c47c58..913d6622b 100644 --- a/examples/oauth/preconfigured/oauth_demo.py +++ b/examples/oauth/preconfigured/oauth_demo.py @@ -40,7 +40,7 @@ def __init__(self, client_id: str, client_secret: str, redirect_uri: str = None) """ self.client_id = client_id self.client_secret = client_secret - self.redirect_uri = redirect_uri or "http://localhost:8080/oauth/callback" + self.redirect_uri = redirect_uri or "http://localhost:8080/internal/oauth/callback" self.state = secrets.token_urlsafe(32) # CSRF protection self.access_token: Optional[str] = None self.refresh_token: Optional[str] = None @@ -240,7 +240,7 @@ async def handle_callback(request): # Start local server app = web.Application() - app.router.add_get('/oauth/callback', handle_callback) + app.router.add_get('/internal/oauth/callback', handle_callback) runner = web.AppRunner(app) await runner.setup() @@ -311,7 +311,7 @@ async def main(): print("\nTo use this demo, you need to set up a GitHub OAuth App:") print("1. Go to GitHub Settings > Developer settings > OAuth Apps") print("2. Click 'New OAuth App'") - print("3. Set Authorization callback URL to: http://localhost:8080/oauth/callback") + print("3. Set Authorization callback URL to: http://localhost:8080/internal/oauth/callback") print("4. Set environment variables:") print(" export GITHUB_CLIENT_ID='your_client_id'") print(" export GITHUB_CLIENT_SECRET='your_client_secret'") diff --git a/examples/oauth/workflow_pre_auth/client.py b/examples/oauth/workflow_pre_auth/client.py index 873fdb364..cc8fd23bd 100644 --- a/examples/oauth/workflow_pre_auth/client.py +++ b/examples/oauth/workflow_pre_auth/client.py @@ -1,6 +1,7 @@ import asyncio import time import os +import sys from datetime import timedelta from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream @@ -61,8 +62,10 @@ async def main(): context.server_registry.registry["basic_agent_server"] = MCPServerSettings( name="basic_agent_server", description="Local workflow server running the basic agent example", - command="uv", - args=["run", "main.py"], + transport="sse", + url="http://127.0.0.1:8000/sse", + # command="uv", + # args=["run", "main.py"], ) # Define a logging callback to receive server-side log notifications @@ -123,16 +126,18 @@ def make_session( data={"tools": [tool.name for tool in tools_result.tools]}, ) - await server.call_tool("workflows-pre-auth", - arguments={ - "workflow_name": "github_org_search", - "tokens": [ - { - "access_token": access_token, - "server_name": "github", - } - ] - }) + if len(sys.argv) < 2 or sys.argv[1] != "--skip-pre-auth": + print("Performing pre-auth") + await server.call_tool("workflows-pre-auth", + arguments={ + "workflow_name": "github_org_search", + "tokens": [ + { + "access_token": access_token, + "server_name": "github", + } + ] + }) print(await server.call_tool("github_org_search", {"query": "lastmileai"})) except Exception as e: diff --git a/examples/oauth/workflow_pre_auth/main.py b/examples/oauth/workflow_pre_auth/main.py index 18634378e..415803ba0 100644 --- a/examples/oauth/workflow_pre_auth/main.py +++ b/examples/oauth/workflow_pre_auth/main.py @@ -124,8 +124,8 @@ async def main(): agent_app.logger.info(f"MCP Server settings: {mcp_server.settings}") # Run the server - await mcp_server.run_stdio_async() - # await mcp_server.run_sse_async() + #await mcp_server.run_stdio_async() + await mcp_server.run_sse_async() if __name__ == "__main__": diff --git a/src/mcp_agent/oauth/manager.py b/src/mcp_agent/oauth/manager.py index 36e3577ea..7dbcb12eb 100644 --- a/src/mcp_agent/oauth/manager.py +++ b/src/mcp_agent/oauth/manager.py @@ -38,13 +38,13 @@ logger = get_logger(__name__) -def create_default_user_for_preconfigured_tokens() -> "OAuthUserIdentity": +def create_default_user_for_preconfigured_tokens(session_id: str | None = None) -> "OAuthUserIdentity": """Create a synthetic user identity for pre-configured tokens.""" from mcp_agent.oauth.identity import OAuthUserIdentity return OAuthUserIdentity( provider="mcp-agent", - subject="preconfigured-tokens", + subject=f"preconfigured-tokens-{session_id}" if session_id else "preconfigured-tokens", claims={"token_source": "preconfigured", "description": "Synthetic user for pre-configured OAuth tokens"} ) @@ -125,22 +125,28 @@ async def ensure_access_token( ) user = context.current_user - if not user: - # TODO: with a proper oauth flow, we should always have a user in the context; since we don't have a server - # yet, mock a user if necessary. In the future, should be replaced by: something like: - # raise MissingUserIdentityError("No authenticated MCP user available for OAuth flow (neither - # interactive nor pre-configured)") - - # Create synthetic user if none exists - user = create_default_user_for_preconfigured_tokens() - context.current_user = user - logger.info(f"Created synthetic user for token access: {user.cache_key}") # Use the same key construction logic as store_preconfigured_token to ensure consistency resource_str = str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) auth_server_str = str(oauth_config.authorization_server) if oauth_config.authorization_server else None scope_list = list(scopes) if scopes is not None else list(oauth_config.scopes or []) + # check for a globally configure token + key = TokenStoreKey( + user_key=create_default_user_for_preconfigured_tokens().cache_key, + resource=resource_str, + authorization_server=auth_server_str, + scope_fingerprint=scope_fingerprint(scope_list) + ) + + lock = self._locks[key] + + async with lock: + record = await self._token_store.get(key) + if record: + return record + + # there is no global token, look for a user specific one key = TokenStoreKey( user_key=user.cache_key, resource=resource_str, @@ -148,11 +154,9 @@ async def ensure_access_token( scope_fingerprint=scope_fingerprint(scope_list) ) - logger.debug(f"Looking for token with key: user_key={key.user_key}, resource={key.resource}, auth_server={key.authorization_server}, scope_fingerprint={key.scope_fingerprint}") lock = self._locks[key] async with lock: record = await self._token_store.get(key) - logger.debug(f"Found existing record: {record is not None}") leeway = ( self._settings.token_store.refresh_leeway_seconds if self._settings and self._settings.token_store diff --git a/src/mcp_agent/server/app_server.py b/src/mcp_agent/server/app_server.py index dd4027e93..9cede9d45 100644 --- a/src/mcp_agent/server/app_server.py +++ b/src/mcp_agent/server/app_server.py @@ -217,6 +217,14 @@ def _set_upstream_from_request_ctx_if_available(ctx: MCPContext) -> None: except Exception: identity = None + if not identity: + # Try create identity from session id + try: + session_id = ctx.request_context.request.query_params.get("session_id") + identity = create_default_user_for_preconfigured_tokens(session_id) + except Exception: + identity = None + if session is not None: app: MCPApp | None = _get_attached_app(ctx.fastmcp) if app is not None and getattr(app, "context", None) is not None: @@ -1614,16 +1622,6 @@ async def workflow_pre_auth( ) continue - # Ensure we have a user context for token storage - # TODO: This is a temporary workaround until we have proper oauth service, so that we have a user - # in the context from the oauth token - if not app_context.current_user: - # Create synthetic user if none exists - synthetic_user = create_default_user_for_preconfigured_tokens() - app_context.current_user = synthetic_user - logger.info(f"Created synthetic user for workflow pre-auth: {synthetic_user.cache_key}") - logger.info(f"{id(app_context)}: {app_context}") - # Create TokenRecord from mcp_agent.oauth.records import TokenRecord from mcp_agent.oauth.store.base import ( @@ -1648,7 +1646,6 @@ async def workflow_pre_auth( metadata={"workflow_name": workflow_name}, ) - str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) # Create storage key using current user store_key = TokenStoreKey( @@ -1658,17 +1655,9 @@ async def workflow_pre_auth( scope_fingerprint=scope_fingerprint(scope_list), ) - logger.debug( - f"Storing token with key: user_key={store_key.user_key}, resource={store_key.resource}, auth_server={store_key.authorization_server}, scope_fingerprint={store_key.scope_fingerprint}") - # Store the token await app_context.token_store.set(store_key, token_record) stored_count += 1 - - logger.info( - f"Stored OAuth token for workflow '{workflow_name}' and server '{server_name}'" - ) - except Exception as e: errors.append(f"Token {i}: {str(e)}") logger.error( From e56866d7ba2dc0a4433c3e69ca2551b960bb01e4 Mon Sep 17 00:00:00 2001 From: Sarmad Qadri Date: Wed, 8 Oct 2025 11:12:32 -0400 Subject: [PATCH 11/11] reformat --- examples/oauth/dynamic_auth/client.py | 5 +- examples/oauth/dynamic_auth/main.py | 118 ++++++++++-------- examples/oauth/preconfigured/main.py | 32 +++-- examples/oauth/preconfigured/oauth_demo.py | 82 +++++++----- .../oauth/preconfigured/workflow_example.py | 109 ++++++++-------- examples/oauth/workflow_pre_auth/client.py | 36 +++--- examples/oauth/workflow_pre_auth/main.py | 80 ++++++------ src/mcp_agent/oauth/flow.py | 23 ++-- src/mcp_agent/oauth/manager.py | 94 ++++++++++---- src/mcp_agent/server/app_server.py | 23 +++- tests/test_audience_validation.py | 16 +-- 11 files changed, 363 insertions(+), 255 deletions(-) diff --git a/examples/oauth/dynamic_auth/client.py b/examples/oauth/dynamic_auth/client.py index 4e7b67c3a..8280e933a 100644 --- a/examples/oauth/dynamic_auth/client.py +++ b/examples/oauth/dynamic_auth/client.py @@ -24,6 +24,7 @@ except Exception: # pragma: no cover _BrokenResourceError = None # type: ignore + async def main(): # Create MCPApp to get the server registry app = MCPApp( @@ -104,7 +105,9 @@ def make_session( data={"tools": [tool.name for tool in tools_result.tools]}, ) - print(await server.call_tool("github_org_search", {"query": "lastmileai"})) + print( + await server.call_tool("github_org_search", {"query": "lastmileai"}) + ) except Exception as e: # Tolerate benign shutdown races from stdio client (BrokenResourceError within ExceptionGroup) if _ExceptionGroup is not None and isinstance(e, _ExceptionGroup): diff --git a/examples/oauth/dynamic_auth/main.py b/examples/oauth/dynamic_auth/main.py index 3eb54728c..5772c595d 100644 --- a/examples/oauth/dynamic_auth/main.py +++ b/examples/oauth/dynamic_auth/main.py @@ -17,8 +17,17 @@ from mcp_agent.app import MCPApp from mcp_agent.server.app_server import create_mcp_server_for_app -from mcp_agent.config import MCPServerSettings, Settings, LoggerSettings, MCPSettings, MCPServerAuthSettings, \ - MCPOAuthClientSettings, OAuthSettings, OAuthTokenStoreSettings, TemporalSettings +from mcp_agent.config import ( + MCPServerSettings, + Settings, + LoggerSettings, + MCPSettings, + MCPServerAuthSettings, + MCPOAuthClientSettings, + OAuthSettings, + OAuthTokenStoreSettings, + TemporalSettings, +) # Note: This is purely optional: # if not provided, a default FastMCP server will be created by MCPApp using create_mcp_server_for_app() @@ -26,12 +35,14 @@ # Get client id and secret from environment variables -client_id = os.getenv('GITHUB_CLIENT_ID') -client_secret = os.getenv('GITHUB_CLIENT_SECRET') +client_id = os.getenv("GITHUB_CLIENT_ID") +client_secret = os.getenv("GITHUB_CLIENT_SECRET") if not client_id or not client_secret: - print("\nGitHub client id and/or secret not found in GITHUB_CLIENT_Id and GITHUB_CLIENT_SECRET " - "environment variables.") + print( + "\nGitHub client id and/or secret not found in GITHUB_CLIENT_Id and GITHUB_CLIENT_SECRET " + "environment variables." + ) print("\nTo create these:") print("\n1. Open your profile on github.com and navigate to 'Developer Settings'") print("\n2. Create a new OAuth app and create a client secret for it.") @@ -41,44 +52,46 @@ settings = Settings( - execution_engine="temporal", - temporal=TemporalSettings( - host="localhost:7233", - namespace="default", - task_queue="mcp-agent", - max_concurrent_activities=10, - ), - logger=LoggerSettings(level="info"), - oauth=OAuthSettings( - callback_base_url=AnyHttpUrl("http://localhost:8000"), - flow_timeout_seconds=300, - token_store=OAuthTokenStoreSettings(refresh_leeway_seconds=60), - ), - mcp=MCPSettings( - servers={ - "github": MCPServerSettings( - name="github", - transport="streamable_http", - url="https://api.githubcopilot.com/mcp/", - auth=MCPServerAuthSettings( - oauth=MCPOAuthClientSettings( - client_id=client_id, - client_secret=client_secret, - use_internal_callback=True, - enabled=True, - scopes= [ - "read:org", # Required for search_orgs tool - "public_repo", # Access to public repositories - "user:email" # User information access - ], - authorization_server=AnyHttpUrl("https://github.com/login/oauth"), - resource=AnyHttpUrl("https://api.githubcopilot.com/mcp") - ) + execution_engine="temporal", + temporal=TemporalSettings( + host="localhost:7233", + namespace="default", + task_queue="mcp-agent", + max_concurrent_activities=10, + ), + logger=LoggerSettings(level="info"), + oauth=OAuthSettings( + callback_base_url=AnyHttpUrl("http://localhost:8000"), + flow_timeout_seconds=300, + token_store=OAuthTokenStoreSettings(refresh_leeway_seconds=60), + ), + mcp=MCPSettings( + servers={ + "github": MCPServerSettings( + name="github", + transport="streamable_http", + url="https://api.githubcopilot.com/mcp/", + auth=MCPServerAuthSettings( + oauth=MCPOAuthClientSettings( + client_id=client_id, + client_secret=client_secret, + use_internal_callback=True, + enabled=True, + scopes=[ + "read:org", # Required for search_orgs tool + "public_repo", # Access to public repositories + "user:email", # User information access + ], + authorization_server=AnyHttpUrl( + "https://github.com/login/oauth" + ), + resource=AnyHttpUrl("https://api.githubcopilot.com/mcp"), ) - ) - } - ), - ) + ), + ) + } + ), +) # Define the MCPApp instance. The server created for this app will advertise the # MCP logging capability and forward structured logs upstream to connected clients. @@ -97,29 +110,22 @@ async def github_org_search_activity(query: str) -> str: print("running activity)") try: async with gen_client( - "github", - server_registry=app.context.server_registry, - context=app.context + "github", server_registry=app.context.server_registry, context=app.context ) as github_client: print("got client") result = await github_client.call_tool( "search_orgs", - { - "query": query, - "perPage": 10, - "sort": "best-match", - "order": "desc" - } + {"query": query, "perPage": 10, "sort": "best-match", "order": "desc"}, ) organizations = [] if result.content: for content_item in result.content: - if hasattr(content_item, 'text'): + if hasattr(content_item, "text"): try: data = json.loads(content_item.text) - if isinstance(data, dict) and 'items' in data: - organizations.extend(data['items']) + if isinstance(data, dict) and "items" in data: + organizations.extend(data["items"]) elif isinstance(data, list): organizations.extend(data) except json.JSONDecodeError: @@ -129,9 +135,11 @@ async def github_org_search_activity(query: str) -> str: return str(organizations) except Exception as e: import traceback + traceback.print_exc() return f"Error: {e}" + @app.tool(name="github_org_search") async def github_org_search(query: str) -> str: if app._logger and hasattr(app._logger, "_bound_context"): diff --git a/examples/oauth/preconfigured/main.py b/examples/oauth/preconfigured/main.py index c20e164e7..12fd60356 100644 --- a/examples/oauth/preconfigured/main.py +++ b/examples/oauth/preconfigured/main.py @@ -22,6 +22,7 @@ # Create the MCP app with OAuth configuration app = MCPApp(name="oauth_github_example") + async def search_github_orgs(query: str, limit: int = 5) -> List[Dict[str, Any]]: """ Search for GitHub organizations using the GitHub MCP server with OAuth. @@ -42,9 +43,7 @@ async def search_github_orgs(query: str, limit: int = 5) -> List[Dict[str, Any]] try: # Connect to the GitHub MCP server with OAuth async with gen_client( - "github", - server_registry=context.server_registry, - context=context + "github", server_registry=context.server_registry, context=context ) as github_client: logger.info("Connected to GitHub MCP server with OAuth") @@ -72,8 +71,8 @@ async def search_github_orgs(query: str, limit: int = 5) -> List[Dict[str, Any]] "query": query, "perPage": min(limit, 100), # GitHub API max is 100 "sort": "best-match", - "order": "desc" - } + "order": "desc", + }, ) logger.info("Search completed, processing results...") @@ -83,12 +82,12 @@ async def search_github_orgs(query: str, limit: int = 5) -> List[Dict[str, Any]] # The result content should contain the organization data organizations = [] for content_item in result.content: - if hasattr(content_item, 'text'): + if hasattr(content_item, "text"): try: # Try to parse as JSON if it's structured data data = json.loads(content_item.text) - if isinstance(data, dict) and 'items' in data: - organizations.extend(data['items'][:limit]) + if isinstance(data, dict) and "items" in data: + organizations.extend(data["items"][:limit]) elif isinstance(data, list): organizations.extend(data[:limit]) else: @@ -126,9 +125,9 @@ async def demonstrate_org_search(): ] for query in search_queries: - print(f"\n{'='*50}") + print(f"\n{'=' * 50}") print(f"Searching for: {query}") - print('='*50) + print("=" * 50) try: orgs = await search_github_orgs(query, limit=3) @@ -136,13 +135,13 @@ async def demonstrate_org_search(): if orgs: for i, org in enumerate(orgs, 1): print(f"\n{i}. {org.get('login', 'Unknown')}") - if 'description' in org and org['description']: + if "description" in org and org["description"]: print(f" Description: {org['description']}") - if 'html_url' in org: + if "html_url" in org: print(f" URL: {org['html_url']}") - if 'public_repos' in org: + if "public_repos" in org: print(f" Public repos: {org['public_repos']}") - if 'location' in org and org['location']: + if "location" in org and org["location"]: print(f" Location: {org['location']}") else: print("No organizations found.") @@ -152,7 +151,6 @@ async def demonstrate_org_search(): continue - async def main(): """ Main function demonstrating various OAuth MCP agent usage patterns. @@ -180,7 +178,7 @@ async def main(): # Set up logging to show detailed information logging.basicConfig( level=logging.INFO, - format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", ) - asyncio.run(main()) \ No newline at end of file + asyncio.run(main()) diff --git a/examples/oauth/preconfigured/oauth_demo.py b/examples/oauth/preconfigured/oauth_demo.py index 913d6622b..37fbd6846 100644 --- a/examples/oauth/preconfigured/oauth_demo.py +++ b/examples/oauth/preconfigured/oauth_demo.py @@ -40,7 +40,9 @@ def __init__(self, client_id: str, client_secret: str, redirect_uri: str = None) """ self.client_id = client_id self.client_secret = client_secret - self.redirect_uri = redirect_uri or "http://localhost:8080/internal/oauth/callback" + self.redirect_uri = ( + redirect_uri or "http://localhost:8080/internal/oauth/callback" + ) self.state = secrets.token_urlsafe(32) # CSRF protection self.access_token: Optional[str] = None self.refresh_token: Optional[str] = None @@ -97,7 +99,7 @@ async def exchange_code_for_token(self, code: str, state: str) -> Dict[str, Any] headers = { "Accept": "application/json", - "User-Agent": "MCP-Agent-OAuth-Demo/1.0" + "User-Agent": "MCP-Agent-OAuth-Demo/1.0", } async with aiohttp.ClientSession() as session: @@ -136,12 +138,14 @@ async def test_token(self) -> Dict[str, Any]: headers = { "Authorization": f"Bearer {self.access_token}", "Accept": "application/vnd.github.v3+json", - "User-Agent": "MCP-Agent-OAuth-Demo/1.0" + "User-Agent": "MCP-Agent-OAuth-Demo/1.0", } async with aiohttp.ClientSession() as session: # Test with a simple user info call - async with session.get("https://api.github.com/user", headers=headers) as response: + async with session.get( + "https://api.github.com/user", headers=headers + ) as response: if response.status != 200: raise ValueError(f"Token test failed: {response.status}") @@ -165,7 +169,7 @@ def get_token_for_mcp_agent(self) -> Dict[str, Any]: "scopes": ["read:org", "public_repo"], "expires_at": self.token_expires_at, "authorization_server": "https://github.com/login/oauth/authorize", - "token_type": "Bearer" + "token_type": "Bearer", } async def save_token_to_file(self, filename: str = "github_oauth_token.json"): @@ -177,11 +181,13 @@ async def save_token_to_file(self, filename: str = "github_oauth_token.json"): """ token_data = self.get_token_for_mcp_agent() - with open(filename, 'w') as f: + with open(filename, "w") as f: json.dump(token_data, f, indent=2) print(f"Token saved to {filename}") - print("You can now use this token with the MCP agent workflow_pre_auth endpoint.") + print( + "You can now use this token with the MCP agent workflow_pre_auth endpoint." + ) async def run_oauth_flow(self, scopes: list = None) -> Dict[str, Any]: """ @@ -209,16 +215,18 @@ async def run_oauth_flow(self, scopes: list = None) -> Dict[str, Any]: async def handle_callback(request): nonlocal callback_data try: - code = request.query.get('code') - state = request.query.get('state') - error = request.query.get('error') + code = request.query.get("code") + state = request.query.get("state") + error = request.query.get("error") if error: - callback_data['error'] = error - callback_data['error_description'] = request.query.get('error_description', '') + callback_data["error"] = error + callback_data["error_description"] = request.query.get( + "error_description", "" + ) else: - callback_data['code'] = code - callback_data['state'] = state + callback_data["code"] = code + callback_data["state"] = state callback_received.set() @@ -232,7 +240,7 @@ async def handle_callback(request): """ - return web.Response(text=html, content_type='text/html') + return web.Response(text=html, content_type="text/html") except Exception as e: print(f"Error in callback handler: {e}") @@ -240,11 +248,11 @@ async def handle_callback(request): # Start local server app = web.Application() - app.router.add_get('/internal/oauth/callback', handle_callback) + app.router.add_get("/internal/oauth/callback", handle_callback) runner = web.AppRunner(app) await runner.setup() - site = web.TCPSite(runner, 'localhost', 8080) + site = web.TCPSite(runner, "localhost", 8080) await site.start() print("\n3. Local callback server started on http://localhost:8080") @@ -260,7 +268,9 @@ async def handle_callback(request): # Wait for callback with timeout try: - await asyncio.wait_for(callback_received.wait(), timeout=300) # 5 minute timeout + await asyncio.wait_for( + callback_received.wait(), timeout=300 + ) # 5 minute timeout except asyncio.TimeoutError: print(" Timeout waiting for authorization callback") await runner.cleanup() @@ -269,11 +279,13 @@ async def handle_callback(request): await runner.cleanup() # Step 3: Handle callback result - if 'error' in callback_data: - raise ValueError(f"OAuth error: {callback_data['error']} - {callback_data.get('error_description', '')}") + if "error" in callback_data: + raise ValueError( + f"OAuth error: {callback_data['error']} - {callback_data.get('error_description', '')}" + ) - code = callback_data.get('code') - state = callback_data.get('state') + code = callback_data.get("code") + state = callback_data.get("state") if not code: raise ValueError("No authorization code received") @@ -288,7 +300,7 @@ async def handle_callback(request): print("6. Testing access token...") try: user_info = await self.test_token() - username = user_info.get('login', 'unknown') + username = user_info.get("login", "unknown") print(f" ✓ Token test successful - authenticated as: {username}") except Exception as e: print(f" ⚠ Token test failed: {e}") @@ -304,14 +316,16 @@ async def main(): print("=" * 40) # Check for environment variables - client_id = os.getenv('GITHUB_CLIENT_ID') - client_secret = os.getenv('GITHUB_CLIENT_SECRET') + client_id = os.getenv("GITHUB_CLIENT_ID") + client_secret = os.getenv("GITHUB_CLIENT_SECRET") if not client_id or not client_secret: print("\nTo use this demo, you need to set up a GitHub OAuth App:") print("1. Go to GitHub Settings > Developer settings > OAuth Apps") print("2. Click 'New OAuth App'") - print("3. Set Authorization callback URL to: http://localhost:8080/internal/oauth/callback") + print( + "3. Set Authorization callback URL to: http://localhost:8080/internal/oauth/callback" + ) print("4. Set environment variables:") print(" export GITHUB_CLIENT_ID='your_client_id'") print(" export GITHUB_CLIENT_SECRET='your_client_secret'") @@ -339,8 +353,10 @@ async def main(): # Save token to file save_choice = input("\nSave token to file? (y/n): ").lower().strip() - if save_choice in ['y', 'yes']: - filename = input("Enter filename (default: github_oauth_token.json): ").strip() + if save_choice in ["y", "yes"]: + filename = input( + "Enter filename (default: github_oauth_token.json): " + ).strip() if not filename: filename = "github_oauth_token.json" await oauth_demo.save_token_to_file(filename) @@ -353,7 +369,7 @@ async def main(): example_usage = { "workflow_name": "github_analysis_workflow", - "tokens": [token_data] + "tokens": [token_data], } print(f" {json.dumps(example_usage, indent=2)}") @@ -364,9 +380,9 @@ async def main(): "github": { "auth": { "oauth": { - "access_token": token_data['access_token'], - "refresh_token": token_data.get('refresh_token'), - "scopes": token_data['scopes'] + "access_token": token_data["access_token"], + "refresh_token": token_data.get("refresh_token"), + "scopes": token_data["scopes"], } } } @@ -381,4 +397,4 @@ async def main(): if __name__ == "__main__": - asyncio.run(main()) \ No newline at end of file + asyncio.run(main()) diff --git a/examples/oauth/preconfigured/workflow_example.py b/examples/oauth/preconfigured/workflow_example.py index 59948bf7b..e161e41a3 100644 --- a/examples/oauth/preconfigured/workflow_example.py +++ b/examples/oauth/preconfigured/workflow_example.py @@ -32,9 +32,7 @@ def __init__(self, context: Context): self.name = "github_org_analyzer" async def analyze_organizations( - self, - queries: List[str], - detailed_analysis: bool = True + self, queries: List[str], detailed_analysis: bool = True ) -> Dict[str, Any]: """ Analyze multiple organizations based on search queries. @@ -86,7 +84,9 @@ async def analyze_organizations( # Generate summary results["summary"] = self._generate_summary(results["organizations"]) - logger.info(f"Analysis completed: {len(results['organizations'])} organizations analyzed") + logger.info( + f"Analysis completed: {len(results['organizations'])} organizations analyzed" + ) return results except Exception as e: @@ -98,28 +98,21 @@ async def _search_organizations(self, query: str) -> List[Dict[str, Any]]: from mcp_agent.mcp.gen_client import gen_client async with gen_client( - "github", - server_registry=self.context.server_registry, - context=self.context + "github", server_registry=self.context.server_registry, context=self.context ) as github_client: result = await github_client.call_tool( "search_orgs", - { - "query": query, - "perPage": 10, - "sort": "best-match", - "order": "desc" - } + {"query": query, "perPage": 10, "sort": "best-match", "order": "desc"}, ) organizations = [] if result.content: for content_item in result.content: - if hasattr(content_item, 'text'): + if hasattr(content_item, "text"): try: data = json.loads(content_item.text) - if isinstance(data, dict) and 'items' in data: - organizations.extend(data['items']) + if isinstance(data, dict) and "items" in data: + organizations.extend(data["items"]) elif isinstance(data, list): organizations.extend(data) except json.JSONDecodeError: @@ -127,7 +120,9 @@ async def _search_organizations(self, query: str) -> List[Dict[str, Any]]: return organizations - async def _analyze_organization_details(self, org: Dict[str, Any]) -> Dict[str, Any]: + async def _analyze_organization_details( + self, org: Dict[str, Any] + ) -> Dict[str, Any]: """Analyze detailed information about an organization.""" details = { "activity_score": self._calculate_activity_score(org), @@ -164,6 +159,7 @@ def _calculate_age(self, created_at: str) -> float: try: from datetime import datetime + created = datetime.fromisoformat(created_at.replace("Z", "+00:00")) now = datetime.now(created.tzinfo) return (now - created).days / 365.25 @@ -190,10 +186,8 @@ def _generate_summary(self, organizations: List[Dict[str, Any]]) -> Dict[str, An "average_repos_per_org": total_repos / len(organizations), "size_distribution": size_categories, "top_organizations": sorted( - organizations, - key=lambda x: x.get("activity_score", 0), - reverse=True - )[:5] + organizations, key=lambda x: x.get("activity_score", 0), reverse=True + )[:5], } @@ -203,9 +197,7 @@ def _generate_summary(self, organizations: List[Dict[str, Any]]) -> Dict[str, An @app.async_tool async def analyze_github_ecosystem( - app_ctx: Context, - focus_areas: List[str], - include_details: bool = True + app_ctx: Context, focus_areas: List[str], include_details: bool = True ) -> Dict[str, Any]: """ Analyze the GitHub ecosystem based on focus areas. @@ -228,13 +220,19 @@ async def analyze_github_ecosystem( # Map focus areas to search queries query_mapping = { - "AI/ML": ["machine-learning", "artificial-intelligence", "deep-learning", "tensorflow", "pytorch"], + "AI/ML": [ + "machine-learning", + "artificial-intelligence", + "deep-learning", + "tensorflow", + "pytorch", + ], "cloud": ["cloud-computing", "aws", "azure", "kubernetes", "docker"], "security": ["cybersecurity", "security", "encryption", "vulnerability"], "web": ["web-development", "javascript", "react", "vue", "angular"], "mobile": ["mobile-development", "android", "ios", "react-native", "flutter"], "data": ["data-science", "analytics", "big-data", "database", "sql"], - "devtools": ["developer-tools", "ci-cd", "testing", "monitoring", "automation"] + "devtools": ["developer-tools", "ci-cd", "testing", "monitoring", "automation"], } all_queries = [] @@ -250,8 +248,7 @@ async def analyze_github_ecosystem( try: # Perform the analysis analysis_results = await analyzer.analyze_organizations( - queries=unique_queries, - detailed_analysis=include_details + queries=unique_queries, detailed_analysis=include_details ) # Add ecosystem-level insights @@ -260,7 +257,7 @@ async def analyze_github_ecosystem( "timestamp": time.time(), "queries_executed": unique_queries, "results": analysis_results, - "insights": _generate_ecosystem_insights(analysis_results) + "insights": _generate_ecosystem_insights(analysis_results), } logger.info("GitHub ecosystem analysis completed successfully") @@ -283,7 +280,7 @@ def _generate_ecosystem_insights(results: Dict[str, Any]) -> Dict[str, Any]: "dominant_languages": _analyze_language_trends(organizations), "geographic_distribution": _analyze_geographic_distribution(organizations), "maturity_analysis": _analyze_organization_maturity(organizations), - "activity_patterns": _analyze_activity_patterns(organizations) + "activity_patterns": _analyze_activity_patterns(organizations), } return insights @@ -295,11 +292,13 @@ def _analyze_language_trends(organizations: List[Dict[str, Any]]) -> Dict[str, A # you might use additional GitHub API calls to get language data return { "message": "Language trend analysis would require additional API calls", - "suggestion": "Use repository listing and language detection APIs" + "suggestion": "Use repository listing and language detection APIs", } -def _analyze_geographic_distribution(organizations: List[Dict[str, Any]]) -> Dict[str, Any]: +def _analyze_geographic_distribution( + organizations: List[Dict[str, Any]], +) -> Dict[str, Any]: """Analyze geographic distribution of organizations.""" locations = {} for org in organizations: @@ -308,22 +307,30 @@ def _analyze_geographic_distribution(organizations: List[Dict[str, Any]]) -> Dic locations[location] = locations.get(location, 0) + 1 return { - "total_with_location": len([org for org in organizations if org.get("location")]), - "top_locations": dict(sorted(locations.items(), key=lambda x: x[1], reverse=True)[:10]) + "total_with_location": len( + [org for org in organizations if org.get("location")] + ), + "top_locations": dict( + sorted(locations.items(), key=lambda x: x[1], reverse=True)[:10] + ), } -def _analyze_organization_maturity(organizations: List[Dict[str, Any]]) -> Dict[str, Any]: +def _analyze_organization_maturity( + organizations: List[Dict[str, Any]], +) -> Dict[str, Any]: """Analyze the maturity of organizations.""" mature_count = sum(1 for org in organizations if org.get("age_years", 0) > 5) - established_count = sum(1 for org in organizations if 2 <= org.get("age_years", 0) <= 5) + established_count = sum( + 1 for org in organizations if 2 <= org.get("age_years", 0) <= 5 + ) new_count = sum(1 for org in organizations if org.get("age_years", 0) < 2) return { "mature_orgs": mature_count, # > 5 years "established_orgs": established_count, # 2-5 years "new_orgs": new_count, # < 2 years - "maturity_ratio": mature_count / len(organizations) if organizations else 0 + "maturity_ratio": mature_count / len(organizations) if organizations else 0, } @@ -341,8 +348,8 @@ def _analyze_activity_patterns(organizations: List[Dict[str, Any]]) -> Dict[str, "activity_distribution": { "high": sum(1 for score in activity_scores if score > 75), "medium": sum(1 for score in activity_scores if 25 <= score <= 75), - "low": sum(1 for score in activity_scores if score < 25) - } + "low": sum(1 for score in activity_scores if score < 25), + }, } @@ -365,7 +372,7 @@ async def demonstrate_pre_auth_workflow(): "refresh_token": "github_oauth_refresh_token_here", "server_name": "github", "scopes": ["read:org", "public_repo"], - "authorization_server": "https://github.com/login/oauth/authorize" + "authorization_server": "https://github.com/login/oauth/authorize", } ] @@ -382,26 +389,30 @@ async def demonstrate_pre_auth_workflow(): result = await analyze_github_ecosystem( app_ctx=context, focus_areas=["AI/ML", "cloud", "security"], - include_details=True + include_details=True, ) print("\n3. Workflow Results:") print(f" - Focus areas analyzed: {result['focus_areas']}") print(f" - Queries executed: {len(result['queries_executed'])}") - print(f" - Organizations found: {result['results']['summary'].get('total_organizations', 0)}") + print( + f" - Organizations found: {result['results']['summary'].get('total_organizations', 0)}" + ) - if result['results']['errors']: + if result["results"]["errors"]: print(f" - Errors encountered: {len(result['results']['errors'])}") print("\n4. Ecosystem Insights:") - insights = result['insights'] - if 'geographic_distribution' in insights: - top_locations = insights['geographic_distribution'].get('top_locations', {}) + insights = result["insights"] + if "geographic_distribution" in insights: + top_locations = insights["geographic_distribution"].get( + "top_locations", {} + ) if top_locations: print(f" - Top locations: {list(top_locations.keys())[:3]}") - if 'maturity_analysis' in insights: - maturity = insights['maturity_analysis'] + if "maturity_analysis" in insights: + maturity = insights["maturity_analysis"] print(f" - Mature organizations: {maturity.get('mature_orgs', 0)}") print(f" - Maturity ratio: {maturity.get('maturity_ratio', 0):.2%}") @@ -423,4 +434,4 @@ async def main(): if __name__ == "__main__": - asyncio.run(main()) \ No newline at end of file + asyncio.run(main()) diff --git a/examples/oauth/workflow_pre_auth/client.py b/examples/oauth/workflow_pre_auth/client.py index cc8fd23bd..4d9ae1a7c 100644 --- a/examples/oauth/workflow_pre_auth/client.py +++ b/examples/oauth/workflow_pre_auth/client.py @@ -27,7 +27,7 @@ _BrokenResourceError = None # type: ignore # Get GitHub access token from environment or ask user -access_token = os.getenv('GITHUB_ACCESS_TOKEN') +access_token = os.getenv("GITHUB_ACCESS_TOKEN") if not access_token: print("\nGitHub access token not found in environment variable GITHUB_ACCESS_TOKEN") @@ -39,8 +39,10 @@ print("export GITHUB_ACCESS_TOKEN='your_token_here'") # Verify token format -if not access_token.startswith(('gho_', 'ghp_', 'github_pat_')): - print(f"Warning: Token doesn't look like a GitHub token (got: {access_token[:10]}...)") +if not access_token.startswith(("gho_", "ghp_", "github_pat_")): + print( + f"Warning: Token doesn't look like a GitHub token (got: {access_token[:10]}...)" + ) print("GitHub tokens usually start with 'gho_', 'ghp_', or 'github_pat_'") @@ -128,18 +130,22 @@ def make_session( if len(sys.argv) < 2 or sys.argv[1] != "--skip-pre-auth": print("Performing pre-auth") - await server.call_tool("workflows-pre-auth", - arguments={ - "workflow_name": "github_org_search", - "tokens": [ - { - "access_token": access_token, - "server_name": "github", - } - ] - }) - - print(await server.call_tool("github_org_search", {"query": "lastmileai"})) + await server.call_tool( + "workflows-pre-auth", + arguments={ + "workflow_name": "github_org_search", + "tokens": [ + { + "access_token": access_token, + "server_name": "github", + } + ], + }, + ) + + print( + await server.call_tool("github_org_search", {"query": "lastmileai"}) + ) except Exception as e: # Tolerate benign shutdown races from stdio client (BrokenResourceError within ExceptionGroup) if _ExceptionGroup is not None and isinstance(e, _ExceptionGroup): diff --git a/examples/oauth/workflow_pre_auth/main.py b/examples/oauth/workflow_pre_auth/main.py index 415803ba0..8966a43dc 100644 --- a/examples/oauth/workflow_pre_auth/main.py +++ b/examples/oauth/workflow_pre_auth/main.py @@ -18,8 +18,14 @@ from mcp_agent.app import MCPApp from mcp_agent.server.app_server import create_mcp_server_for_app from mcp_agent.mcp.gen_client import gen_client -from mcp_agent.config import MCPServerSettings, Settings, LoggerSettings, MCPSettings, MCPServerAuthSettings, \ - MCPOAuthClientSettings +from mcp_agent.config import ( + MCPServerSettings, + Settings, + LoggerSettings, + MCPSettings, + MCPServerAuthSettings, + MCPOAuthClientSettings, +) # Note: This is purely optional: # if not provided, a default FastMCP server will be created by MCPApp using create_mcp_server_for_app() @@ -31,30 +37,32 @@ class MCPServerOAuthSettings: settings = Settings( - execution_engine="asyncio", - logger=LoggerSettings(level="info"), - mcp=MCPSettings( - servers={ - "github": MCPServerSettings( - name="github", - transport="streamable_http", - url="https://api.githubcopilot.com/mcp/", - auth=MCPServerAuthSettings( - oauth=MCPOAuthClientSettings( - enabled=True, - scopes= [ - "read:org", # Required for search_orgs tool - "public_repo", # Access to public repositories - "user:email" # User information access - ], - authorization_server=AnyHttpUrl("https://github.com/login/oauth"), - resource=AnyHttpUrl("https://api.githubcopilot.com/mcp") - ) + execution_engine="asyncio", + logger=LoggerSettings(level="info"), + mcp=MCPSettings( + servers={ + "github": MCPServerSettings( + name="github", + transport="streamable_http", + url="https://api.githubcopilot.com/mcp/", + auth=MCPServerAuthSettings( + oauth=MCPOAuthClientSettings( + enabled=True, + scopes=[ + "read:org", # Required for search_orgs tool + "public_repo", # Access to public repositories + "user:email", # User information access + ], + authorization_server=AnyHttpUrl( + "https://github.com/login/oauth" + ), + resource=AnyHttpUrl("https://api.githubcopilot.com/mcp"), ) - ) - } - ), - ) + ), + ) + } + ), +) # Define the MCPApp instance. The server created for this app will advertise the # MCP logging capability and forward structured logs upstream to connected clients. @@ -68,7 +76,6 @@ class MCPServerOAuthSettings: @app.tool(name="github_org_search") async def github_org_search(query: str, app_ctx: Optional[AppContext] = None) -> str: - # Use the context's app if available for proper logging with upstream_session _app = app_ctx.app if app_ctx else app # Ensure the app's logger is bound to the current context with upstream_session @@ -77,28 +84,21 @@ async def github_org_search(query: str, app_ctx: Optional[AppContext] = None) -> try: async with gen_client( - "github", - server_registry=app_ctx.server_registry, - context=app_ctx + "github", server_registry=app_ctx.server_registry, context=app_ctx ) as github_client: result = await github_client.call_tool( "search_orgs", - { - "query": query, - "perPage": 10, - "sort": "best-match", - "order": "desc" - } + {"query": query, "perPage": 10, "sort": "best-match", "order": "desc"}, ) organizations = [] if result.content: for content_item in result.content: - if hasattr(content_item, 'text'): + if hasattr(content_item, "text"): try: data = json.loads(content_item.text) - if isinstance(data, dict) and 'items' in data: - organizations.extend(data['items']) + if isinstance(data, dict) and "items" in data: + organizations.extend(data["items"]) elif isinstance(data, list): organizations.extend(data) except json.JSONDecodeError: @@ -107,8 +107,10 @@ async def github_org_search(query: str, app_ctx: Optional[AppContext] = None) -> return str(organizations) except Exception: import traceback + return f"Error: {traceback.format_exc()}" + async def main(): async with app.run() as agent_app: # Log registered workflows and agent configurations @@ -124,7 +126,7 @@ async def main(): agent_app.logger.info(f"MCP Server settings: {mcp_server.settings}") # Run the server - #await mcp_server.run_stdio_async() + # await mcp_server.run_stdio_async() await mcp_server.run_sse_async() diff --git a/src/mcp_agent/oauth/flow.py b/src/mcp_agent/oauth/flow.py index a93dd69ea..021b9c6a7 100644 --- a/src/mcp_agent/oauth/flow.py +++ b/src/mcp_agent/oauth/flow.py @@ -85,14 +85,14 @@ async def authorize( scope_param = " ".join(scopes) params = { - "response_type":"code", - "client_id":client_id, - "redirect_uri":redirect_uri, - "scope":scope_param, - "state":state, - "code_challenge":code_challenge, - "code_challenge_method":"S256", - "resource":resource, + "response_type": "code", + "client_id": client_id, + "redirect_uri": redirect_uri, + "scope": scope_param, + "state": state, + "code_challenge": code_challenge, + "code_challenge_method": "S256", + "resource": resource, } # add extra params if any @@ -100,8 +100,11 @@ async def authorize( params.update(oauth_config.extra_authorize_params) import urllib.parse + authorize_url = httpx.URL( - str(auth_metadata.authorization_endpoint) +"?" + urllib.parse.urlencode(params) + str(auth_metadata.authorization_endpoint) + + "?" + + urllib.parse.urlencode(params) ) callback_future = None @@ -112,7 +115,7 @@ async def authorize( "url": str(authorize_url), "message": f"Authorization required for {server_name}", "redirect_uri_options": redirect_options, - "flow_id": flow_id + "flow_id": flow_id, } result = await _send_auth_request(context, request_payload) diff --git a/src/mcp_agent/oauth/manager.py b/src/mcp_agent/oauth/manager.py index 7dbcb12eb..5a5a14396 100644 --- a/src/mcp_agent/oauth/manager.py +++ b/src/mcp_agent/oauth/manager.py @@ -38,14 +38,21 @@ logger = get_logger(__name__) -def create_default_user_for_preconfigured_tokens(session_id: str | None = None) -> "OAuthUserIdentity": +def create_default_user_for_preconfigured_tokens( + session_id: str | None = None, +) -> "OAuthUserIdentity": """Create a synthetic user identity for pre-configured tokens.""" from mcp_agent.oauth.identity import OAuthUserIdentity return OAuthUserIdentity( provider="mcp-agent", - subject=f"preconfigured-tokens-{session_id}" if session_id else "preconfigured-tokens", - claims={"token_source": "preconfigured", "description": "Synthetic user for pre-configured OAuth tokens"} + subject=f"preconfigured-tokens-{session_id}" + if session_id + else "preconfigured-tokens", + claims={ + "token_source": "preconfigured", + "description": "Synthetic user for pre-configured OAuth tokens", + }, ) @@ -71,19 +78,25 @@ def __init__( self._auth_metadata_cache: Dict[str, tuple[float, object]] = {} async def store_preconfigured_token( - self, - server_name: str, - server_config, - synthetic_user: "OAuthUserIdentity" + self, server_name: str, server_config, synthetic_user: "OAuthUserIdentity" ) -> None: """Store a pre-configured token in the token store.""" oauth_config = server_config.auth.oauth # Create token record - resource_str = str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) - auth_server_str = str(oauth_config.authorization_server) if oauth_config.authorization_server else None + resource_str = ( + str(oauth_config.resource) + if oauth_config.resource + else getattr(server_config, "url", None) + ) + auth_server_str = ( + str(oauth_config.authorization_server) + if oauth_config.authorization_server + else None + ) from datetime import datetime, timezone + record = TokenRecord( access_token=oauth_config.access_token, refresh_token=oauth_config.refresh_token, @@ -93,7 +106,7 @@ async def store_preconfigured_token( resource=resource_str, authorization_server=auth_server_str, obtained_at=datetime.now(tz=timezone.utc).timestamp(), - metadata={"server_name": server_name, "pre_configured": True} + metadata={"server_name": server_name, "pre_configured": True}, ) # Create storage key @@ -101,11 +114,13 @@ async def store_preconfigured_token( user_key=synthetic_user.cache_key, resource=resource_str or "", authorization_server=auth_server_str, - scope_fingerprint=scope_fingerprint(oauth_config.scopes or []) + scope_fingerprint=scope_fingerprint(oauth_config.scopes or []), ) # Store the token - logger.debug(f"Storing token with key: user_key={key.user_key}, resource={key.resource}, auth_server={key.authorization_server}, scope_fingerprint={key.scope_fingerprint}") + logger.debug( + f"Storing token with key: user_key={key.user_key}, resource={key.resource}, auth_server={key.authorization_server}, scope_fingerprint={key.scope_fingerprint}" + ) await self._token_store.set(key, record) async def ensure_access_token( @@ -127,16 +142,26 @@ async def ensure_access_token( user = context.current_user # Use the same key construction logic as store_preconfigured_token to ensure consistency - resource_str = str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) - auth_server_str = str(oauth_config.authorization_server) if oauth_config.authorization_server else None - scope_list = list(scopes) if scopes is not None else list(oauth_config.scopes or []) + resource_str = ( + str(oauth_config.resource) + if oauth_config.resource + else getattr(server_config, "url", None) + ) + auth_server_str = ( + str(oauth_config.authorization_server) + if oauth_config.authorization_server + else None + ) + scope_list = ( + list(scopes) if scopes is not None else list(oauth_config.scopes or []) + ) # check for a globally configure token key = TokenStoreKey( user_key=create_default_user_for_preconfigured_tokens().cache_key, resource=resource_str, authorization_server=auth_server_str, - scope_fingerprint=scope_fingerprint(scope_list) + scope_fingerprint=scope_fingerprint(scope_list), ) lock = self._locks[key] @@ -151,7 +176,7 @@ async def ensure_access_token( user_key=user.cache_key, resource=resource_str, authorization_server=auth_server_str, - scope_fingerprint=scope_fingerprint(scope_list) + scope_fingerprint=scope_fingerprint(scope_list), ) lock = self._locks[key] @@ -168,13 +193,22 @@ async def ensure_access_token( # If token exists but expired, try to refresh it if record and record.refresh_token: # For refresh, we need OAuth metadata - resource_hint = str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) + resource_hint = ( + str(oauth_config.resource) + if oauth_config.resource + else getattr(server_config, "url", None) + ) server_url = getattr(server_config, "url", None) resource = normalize_resource(resource_hint, server_url) # Get OAuth metadata for token refresh parsed_resource = URL(resource) - metadata_url = str(parsed_resource.copy_with(path="/.well-known/oauth-protected-resource" + parsed_resource.path)) + metadata_url = str( + parsed_resource.copy_with( + path="/.well-known/oauth-protected-resource" + + parsed_resource.path + ) + ) resource_metadata = await self._get_resource_metadata(metadata_url) auth_server_url = select_authorization_server( resource_metadata, str(oauth_config.authorization_server) @@ -199,13 +233,22 @@ async def ensure_access_token( # Need to run full authorization flow - only if no token found or refresh failed if not record: - resource_hint = str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) + resource_hint = ( + str(oauth_config.resource) + if oauth_config.resource + else getattr(server_config, "url", None) + ) server_url = getattr(server_config, "url", None) resource = normalize_resource(resource_hint, server_url) # Get OAuth metadata for full authorization flow parsed_resource = URL(resource) - metadata_url = str(parsed_resource.copy_with(path="/.well-known/oauth-protected-resource" + parsed_resource.path)) + metadata_url = str( + parsed_resource.copy_with( + path="/.well-known/oauth-protected-resource" + + parsed_resource.path + ) + ) resource_metadata = await self._get_resource_metadata(metadata_url) auth_server_url = select_authorization_server( resource_metadata, str(oauth_config.authorization_server) @@ -327,8 +370,13 @@ async def _get_authorization_metadata(self, url: str): # Construct OAuth authorization server metadata URL parsed_url = URL(url) metadata_url = str( - parsed_url.copy_with(path="/.well-known/oauth-authorization-server" + parsed_url.path)) - metadata = await fetch_authorization_server_metadata(self._http_client, metadata_url) + parsed_url.copy_with( + path="/.well-known/oauth-authorization-server" + parsed_url.path + ) + ) + metadata = await fetch_authorization_server_metadata( + self._http_client, metadata_url + ) self._auth_metadata_cache[url] = (time.time(), metadata) return metadata diff --git a/src/mcp_agent/server/app_server.py b/src/mcp_agent/server/app_server.py index 9cede9d45..3bbf6e59a 100644 --- a/src/mcp_agent/server/app_server.py +++ b/src/mcp_agent/server/app_server.py @@ -44,6 +44,7 @@ ) from mcp_agent.oauth.manager import create_default_user_for_preconfigured_tokens from mcp_agent.server.token_verifier import MCPAgentTokenVerifier + if TYPE_CHECKING: from mcp_agent.core.context import Context @@ -732,7 +733,9 @@ async def _handle_specific_request( elif method == "auth/request": # TODO: special handling of auth request, should be replaced by future URL elicitation class AuthToken(BaseModel): - confirmation: str = Field(description="Please press enter to confirm this message has been received") + confirmation: str = Field( + description="Please press enter to confirm this message has been received" + ) flow_id = params["flow_id"] callback_future = await callback_registry.create_handle(flow_id) @@ -1606,7 +1609,9 @@ async def workflow_pre_auth( ) continue - server_config = app_context.server_registry.get_server_config(server_name) + server_config = app_context.server_registry.get_server_config( + server_name + ) if not server_config: errors.append( f"Token {i}: server '{server_name}' not recognized" @@ -1629,10 +1634,16 @@ async def workflow_pre_auth( scope_fingerprint, ) - resource_str = str(oauth_config.resource) if oauth_config.resource \ + resource_str = ( + str(oauth_config.resource) + if oauth_config.resource else getattr(server_config, "url", None) - auth_server_str = str(oauth_config.authorization_server) if oauth_config.authorization_server \ + ) + auth_server_str = ( + str(oauth_config.authorization_server) + if oauth_config.authorization_server else None + ) scope_list = list(oauth_config.scopes or []) token_record = TokenRecord( @@ -1646,7 +1657,9 @@ async def workflow_pre_auth( metadata={"workflow_name": workflow_name}, ) - str(oauth_config.resource) if oauth_config.resource else getattr(server_config, "url", None) + str(oauth_config.resource) if oauth_config.resource else getattr( + server_config, "url", None + ) # Create storage key using current user store_key = TokenStoreKey( user_key=app_context.current_user.cache_key, diff --git a/tests/test_audience_validation.py b/tests/test_audience_validation.py index 058774fe1..392cf4e18 100644 --- a/tests/test_audience_validation.py +++ b/tests/test_audience_validation.py @@ -88,7 +88,11 @@ async def test_multiple_audiences_extraction(): } audiences = _extract_all_audiences(payload) - expected = {"https://api1.example.com", "https://api2.example.com", "https://api3.example.com"} + expected = { + "https://api1.example.com", + "https://api2.example.com", + "https://api3.example.com", + } assert set(audiences) == expected @@ -141,8 +145,6 @@ def test_configuration_validation(): assert "https://api.example.com" in settings.expected_audiences - - @pytest.mark.asyncio async def test_token_verifier_audience_validation_integration(): """Test full integration of audience validation in token verifier.""" @@ -196,8 +198,6 @@ async def test_token_verifier_audience_validation_integration(): assert token is None - - def test_audience_extraction_edge_cases(): """Test audience extraction handles edge cases properly.""" # Empty payload @@ -209,7 +209,7 @@ def test_audience_extraction_edge_cases(): # Mixed empty and valid values payload = { "aud": ["", "https://valid.com", None], - "resource": ["https://another.com", ""] + "resource": ["https://another.com", ""], } audiences = _extract_all_audiences(payload) expected = {"https://valid.com", "https://another.com"} @@ -218,7 +218,7 @@ def test_audience_extraction_edge_cases(): # Duplicate values should be removed payload = { "aud": ["https://api.com", "https://api.com"], - "resource": "https://api.com" + "resource": "https://api.com", } audiences = _extract_all_audiences(payload) assert audiences == ["https://api.com"] @@ -247,4 +247,4 @@ async def test_partial_audience_match(): token = MCPAccessToken.from_introspection("test_token", payload) # Should succeed because at least one audience matches - assert token.validate_audience(settings.expected_audiences) is True \ No newline at end of file + assert token.validate_audience(settings.expected_audiences) is True