Split protocol types into a standalone mcp-types package (#2973)

This commit is contained in:
Marcelo Trylesinski
2026-06-25 19:18:38 +02:00
committed by GitHub
parent 03681ed55e
commit 0ee7f1b293
211 changed files with 1041 additions and 868 deletions
+2 -2
View File
@@ -36,9 +36,10 @@ from typing import Any, cast
from urllib.parse import parse_qs, urlparse
import httpx
import mcp_types as types
from mcp_types.version import MODERN_PROTOCOL_VERSIONS
from pydantic import AnyUrl
from mcp import types
from mcp.client.auth import OAuthClientProvider, TokenStorage
from mcp.client.auth.extensions.client_credentials import (
ClientCredentialsOAuthProvider,
@@ -49,7 +50,6 @@ from mcp.client.client import Client
from mcp.client.context import ClientRequestContext
from mcp.client.streamable_http import streamable_http_client
from mcp.shared.auth import AuthorizationCodeResult, OAuthClientInformationFull, OAuthClientMetadata, OAuthToken
from mcp.shared.version import MODERN_PROTOCOL_VERSIONS
# Set up logging to stderr (stdout is for conformance test output)
logging.basicConfig(
+3 -1
View File
@@ -27,7 +27,9 @@ jobs:
run: uv python install 3.12
- name: Build
run: uv build
run: |
uv build --package mcp
uv build --package mcp-types
- name: Upload artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+24 -12
View File
@@ -419,10 +419,10 @@ For full control over tool responses including the `_meta` field (for passing da
from typing import Annotated
from mcp_types import CallToolResult, TextContent
from pydantic import BaseModel
from mcp.server.mcpserver import MCPServer
from mcp.types import CallToolResult, TextContent
mcp = MCPServer("CallToolResult Example")
@@ -739,9 +739,10 @@ uv run completion-client
import asyncio
import os
from mcp_types import PromptReference, ResourceTemplateReference
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from mcp.types import PromptReference, ResourceTemplateReference
# Create server parameters for stdio connection
server_params = StdioServerParameters(
@@ -828,11 +829,11 @@ like OAuth flows, credential collection, or payment processing.
import uuid
from mcp_types import ElicitRequestURLParams
from pydantic import BaseModel, Field
from mcp.server.mcpserver import Context, MCPServer
from mcp.shared.exceptions import UrlElicitationRequiredError
from mcp.types import ElicitRequestURLParams
mcp = MCPServer(name="Elicitation Example")
@@ -937,8 +938,9 @@ Tools can interact with LLMs through sampling (generating text):
<!-- snippet-source examples/snippets/servers/sampling.py -->
```python
from mcp_types import SamplingMessage, TextContent
from mcp.server.mcpserver import Context, MCPServer
from mcp.types import SamplingMessage, TextContent
mcp = MCPServer(name="Sampling Example")
@@ -1647,8 +1649,9 @@ from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
from typing import TypedDict
import mcp_types as types
import mcp.server.stdio
from mcp import types
from mcp.server import Server, ServerRequestContext
@@ -1759,8 +1762,9 @@ uv run examples/snippets/servers/lowlevel/basic.py
import asyncio
import mcp_types as types
import mcp.server.stdio
from mcp import types
from mcp.server import Server, ServerRequestContext
@@ -1836,8 +1840,9 @@ uv run examples/snippets/servers/lowlevel/structured_output.py
import asyncio
import json
import mcp_types as types
import mcp.server.stdio
from mcp import types
from mcp.server import Server, ServerRequestContext
@@ -1928,8 +1933,9 @@ uv run examples/snippets/servers/lowlevel/direct_call_tool_result.py
import asyncio
import mcp_types as types
import mcp.server.stdio
from mcp import types
from mcp.server import Server, ServerRequestContext
@@ -1999,7 +2005,8 @@ For servers that need to handle large datasets, the low-level server provides pa
```python
"""Example of implementing pagination with the low-level MCP server."""
from mcp import types
import mcp_types as types
from mcp.server import Server, ServerRequestContext
# Sample data to paginate
@@ -2045,9 +2052,10 @@ _Full example: [examples/snippets/servers/pagination_example.py](https://github.
import asyncio
from mcp_types import PaginatedRequestParams, Resource
from mcp.client.session import ClientSession
from mcp.client.stdio import StdioServerParameters, stdio_client
from mcp.types import PaginatedRequestParams, Resource
async def list_all_resources() -> None:
@@ -2107,7 +2115,9 @@ uv run client
import asyncio
import os
from mcp import ClientSession, StdioServerParameters, types
import mcp_types as types
from mcp import ClientSession, StdioServerParameters
from mcp.client.context import ClientRequestContext
from mcp.client.stdio import stdio_client
@@ -2417,7 +2427,9 @@ When calling tools through MCP, the `CallToolResult` object contains the tool's
import asyncio
from mcp import ClientSession, StdioServerParameters, types
import mcp_types as types
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
+47 -18
View File
@@ -209,9 +209,38 @@ named `mcp.os.win32.utilities` (was `client.stdio.win32`).
The WebSocket transport has been removed: `mcp.client.websocket.websocket_client`, `mcp.server.websocket.websocket_server`, and the `ws` optional dependency extra (`mcp[ws]`) no longer exist. WebSocket was never part of the MCP specification. Use the streamable HTTP transport instead (`mcp.client.streamable_http.streamable_http_client` on the client, `streamable_http_app()` on the server), which supports bidirectional communication with server-to-client streaming over standard HTTP.
### `mcp.types` moved to the `mcp-types` package
The protocol wire types now live in a standalone distribution, `mcp-types`, imported as
`mcp_types`. It depends only on `pydantic`, so code that just needs to (de)serialize MCP
traffic can install it without the full SDK. The `mcp` package depends on `mcp-types` and
continues to re-export the type names at the top level, so `from mcp import Tool` is
unchanged. Only the `mcp.types` submodule and `mcp.shared.version` were removed.
**Why:** keeping the wire types in their own package lets tooling and lightweight clients
depend on the protocol schema without pulling in `httpx`, `starlette`, `uvicorn`, and the
rest of the server/transport stack.
**Before (v1):**
```python
from mcp.types import Tool, CallToolResult
from mcp.shared.version import LATEST_PROTOCOL_VERSION
```
**After (v2):**
```python
from mcp_types import Tool, CallToolResult
from mcp_types.version import LATEST_PROTOCOL_VERSION
# Top-level re-exports are unchanged:
from mcp import Tool, CallToolResult
```
### Removed type aliases and classes
The following deprecated type aliases and classes have been removed from `mcp.types`:
The following deprecated type aliases and classes have been removed from `mcp_types`:
| Removed | Replacement |
|---------|-------------|
@@ -231,13 +260,13 @@ from mcp.types import Content, ResourceReference, Cursor
**After (v2):**
```python
from mcp.types import ContentBlock, ResourceTemplateReference
from mcp_types import ContentBlock, ResourceTemplateReference
# Use `str` instead of `Cursor` for pagination cursors
```
### Field names changed from camelCase to snake_case
All Pydantic model fields in `mcp.types` now use snake_case names for Python attribute access. The JSON wire format is unchanged — serialization still uses camelCase via Pydantic aliases.
All Pydantic model fields in `mcp_types` now use snake_case names for Python attribute access. The JSON wire format is unchanged — serialization still uses camelCase via Pydantic aliases.
**Before (v1):**
@@ -287,7 +316,7 @@ Results returned from server handlers are now validated against the negotiated p
### Client validates inbound traffic against the protocol schema
`ClientSession` now validates server requests, notifications, and results against the negotiated protocol version's schema before parsing them into `mcp.types` models. Spec-invalid server output that the previous monolith parse tolerated may now raise `pydantic.ValidationError` from `list_tools()`, `call_tool()`, and similar calls. `_meta` remains the sanctioned place for result extras (and `experimental` for capability extras).
`ClientSession` now validates server requests, notifications, and results against the negotiated protocol version's schema before parsing them into `mcp_types` models. Spec-invalid server output that the previous monolith parse tolerated may now raise `pydantic.ValidationError` from `list_tools()`, `call_tool()`, and similar calls. `_meta` remains the sanctioned place for result extras (and `experimental` for capability extras).
### `args` parameter removed from `ClientSessionGroup.call_tool()`
@@ -326,7 +355,7 @@ result = await session.list_tools(cursor="next_page_token")
**After (v2):**
```python
from mcp.types import PaginatedRequestParams
from mcp_types import PaginatedRequestParams
result = await session.list_resources(params=PaginatedRequestParams(cursor="next_page_token"))
result = await session.list_tools(params=PaginatedRequestParams(cursor="next_page_token"))
@@ -415,7 +444,7 @@ raise McpError(ErrorData(code=INVALID_REQUEST, message="bad input"))
```python
from mcp.shared.exceptions import MCPError
from mcp.types import INVALID_REQUEST
from mcp_types import INVALID_REQUEST
raise MCPError(INVALID_REQUEST, "bad input")
# or, if you already have an ErrorData:
@@ -590,7 +619,7 @@ In v2, the lowlevel `Server` supports arbitrary request handlers directly via `a
```python
from mcp.server import ServerRequestContext
from mcp.types import EmptyResult, SetLevelRequestParams, SubscribeRequestParams
from mcp_types import EmptyResult, SetLevelRequestParams, SubscribeRequestParams
async def handle_set_logging_level(ctx: ServerRequestContext, params: SetLevelRequestParams) -> EmptyResult:
@@ -663,7 +692,7 @@ actual_notification = notification.root
**After (v2):**
```python
from mcp.types import client_request_adapter, server_notification_adapter
from mcp_types import client_request_adapter, server_notification_adapter
# Using TypeAdapter.validate_python()
request = client_request_adapter.validate_python(data)
@@ -701,7 +730,7 @@ await session.send_request(PingRequest(), EmptyResult)
| `ServerResult` | `server_result_adapter` |
| `JSONRPCMessage` | `jsonrpc_message_adapter` |
All adapters are exported from `mcp.types`.
All adapters are exported from `mcp_types`.
### `RequestParams.Meta` replaced with `RequestParamsMeta` TypedDict
@@ -881,7 +910,7 @@ resource = Resource(name="test", uri=AnyUrl("users/me")) # Would fail validatio
**After (v2):**
```python
from mcp.types import Resource
from mcp_types import Resource
# Plain strings accepted
resource = Resource(name="test", uri="users/me") # Works
@@ -1038,7 +1067,7 @@ async def handle_call_tool(name: str, arguments: dict):
```python
from mcp.server import Server, ServerRequestContext
from mcp.types import (
from mcp_types import (
CallToolRequestParams,
CallToolResult,
ListToolsResult,
@@ -1087,13 +1116,13 @@ All handlers receive `ctx: ServerRequestContext` as the first argument. The seco
| `@server.progress_notification()` | `on_progress` | `ProgressNotificationParams` | `None` |
| — | `on_roots_list_changed` | `NotificationParams \| None` | `None` |
All `params` and return types are importable from `mcp.types`.
All `params` and return types are importable from `mcp_types`.
**Notification handlers:**
```python
from mcp.server import Server, ServerRequestContext
from mcp.types import ProgressNotificationParams
from mcp_types import ProgressNotificationParams
async def handle_progress(ctx: ServerRequestContext, params: ProgressNotificationParams) -> None:
@@ -1218,7 +1247,7 @@ async def handle_call_tool(name: str, arguments: dict):
```python
from mcp.server import ServerRequestContext
from mcp.types import CallToolRequestParams, CallToolResult, TextContent
from mcp_types import CallToolRequestParams, CallToolResult, TextContent
async def handle_call_tool(ctx: ServerRequestContext, params: CallToolRequestParams) -> CallToolResult:
@@ -1290,7 +1319,7 @@ Behavior changes:
### Experimental Tasks support removed
Tasks (SEP-1686) have been removed from the MCP specification and are no longer part of this SDK. The `mcp.client.experimental`, `mcp.server.experimental`, `mcp.shared.experimental`, and `mcp.server.lowlevel.experimental` modules have been removed, along with the `experimental` properties on `ClientSession`, `ServerSession`, `Server`, and `ServerRequestContext`. The corresponding `Task*` types remain in `mcp.types` as types-only definitions.
Tasks (SEP-1686) have been removed from the MCP specification and are no longer part of this SDK. The `mcp.client.experimental`, `mcp.server.experimental`, `mcp.shared.experimental`, and `mcp.server.lowlevel.experimental` modules have been removed, along with the `experimental` properties on `ClientSession`, `ServerSession`, `Server`, and `ServerRequestContext`. The corresponding `Task*` types remain in `mcp_types` as types-only definitions.
Tasks are expected to return as a separate MCP extension in a future release.
@@ -1358,7 +1387,7 @@ In v1, MCP protocol types were configured with `extra="allow"`: unknown fields p
In v2, MCP types silently ignore extra fields. Unknown constructor keyword arguments and unknown keys in wire data are dropped during validation — no error is raised, and the values do not round-trip:
```python
from mcp.types import CallToolRequestParams
from mcp_types import CallToolRequestParams
params = CallToolRequestParams(
name="my_tool",
@@ -1404,7 +1433,7 @@ Under OIDC, omitting `application_type` defaults to `"web"`, which an authorizat
### 2025-11-25 and 2026-07-28 protocol fields modeled
`mcp.types` models the 2025-11-25 and 2026-07-28 protocol fields (e.g. `resultType`, `ttlMs`/`cacheScope` on cacheable results, `inputResponses`/`requestState` on retried requests), so inbound payloads carrying these keys parse into typed fields and round-trip. `ttlMs`/`cacheScope` default to `0`/`"private"` (immediately stale, not shared-cacheable); `resultType` defaults to `"complete"` on concrete results (`None` on `EmptyResult`); the server strips all of them from the wire at pre-2026 versions.
`mcp_types` models the 2025-11-25 and 2026-07-28 protocol fields (e.g. `resultType`, `ttlMs`/`cacheScope` on cacheable results, `inputResponses`/`requestState` on retried requests), so inbound payloads carrying these keys parse into typed fields and round-trip. `ttlMs`/`cacheScope` default to `0`/`"private"` (immediately stale, not shared-cacheable); `resultType` defaults to `"complete"` on concrete results (`None` on `EmptyResult`); the server strips all of them from the wire at pre-2026 versions.
### `streamable_http_app()` available on lowlevel Server
@@ -1412,7 +1441,7 @@ The `streamable_http_app()` method is now available directly on the lowlevel `Se
```python
from mcp.server import Server, ServerRequestContext
from mcp.types import ListToolsResult, PaginatedRequestParams
from mcp_types import ListToolsResult, PaginatedRequestParams
async def handle_list_tools(ctx: ServerRequestContext, params: PaginatedRequestParams | None) -> ListToolsResult:
+1 -1
View File
@@ -44,7 +44,7 @@ To run the below test, you'll need to install the following dependencies:
import pytest
from inline_snapshot import snapshot
from mcp import Client
from mcp.types import CallToolResult, TextContent
from mcp_types import CallToolResult, TextContent
from server import app
@@ -2,10 +2,10 @@
from typing import Annotated
from mcp_types import CallToolResult, TextContent
from pydantic import BaseModel
from mcp.server.mcpserver import MCPServer
from mcp.types import CallToolResult, TextContent
mcp = MCPServer("Echo Server")
@@ -15,7 +15,7 @@ from mcp.server.mcpserver import Context, MCPServer
from mcp.server.mcpserver.prompts.base import UserMessage
from mcp.server.streamable_http import EventCallback, EventMessage, EventStore
from mcp.shared.exceptions import MCPError
from mcp.types import (
from mcp_types import (
AudioContent,
Completion,
CompletionArgument,
@@ -33,7 +33,7 @@ from mcp.types import (
TextResourceContents,
UnsubscribeRequestParams,
)
from mcp.types.jsonrpc import MISSING_REQUIRED_CLIENT_CAPABILITY
from mcp_types.jsonrpc import MISSING_REQUIRED_CLIENT_CAPABILITY
from pydantic import BaseModel, Field
logger = logging.getLogger(__name__)
@@ -8,7 +8,7 @@ from typing import TypeVar
import anyio
import click
from mcp import types
import mcp_types as types
from mcp.server import Server, ServerRequestContext
T = TypeVar("T")
@@ -1,6 +1,6 @@
import anyio
import click
from mcp import types
import mcp_types as types
from mcp.server import Server, ServerRequestContext
+1 -1
View File
@@ -22,7 +22,7 @@ Using the MCP client, you can retrieve resources like this using the STDIO trans
```python
import asyncio
from mcp.types import AnyUrl
from pydantic import AnyUrl
from mcp.client.session import ClientSession
from mcp.client.stdio import StdioServerParameters, stdio_client
@@ -2,7 +2,7 @@ from urllib.parse import urlparse
import anyio
import click
from mcp import types
import mcp_types as types
from mcp.server import Server, ServerRequestContext
SAMPLE_RESOURCES = {
@@ -2,8 +2,8 @@ import logging
import anyio
import click
import mcp_types as types
import uvicorn
from mcp import types
from mcp.server import Server, ServerRequestContext
from starlette.middleware.cors import CORSMiddleware
@@ -10,7 +10,7 @@ from dataclasses import dataclass
from uuid import uuid4
from mcp.server.streamable_http import EventCallback, EventId, EventMessage, EventStore, StreamId
from mcp.types import JSONRPCMessage
from mcp_types import JSONRPCMessage
logger = logging.getLogger(__name__)
@@ -2,8 +2,8 @@ import logging
import anyio
import click
import mcp_types as types
import uvicorn
from mcp import types
from mcp.server import Server, ServerRequestContext
from starlette.middleware.cors import CORSMiddleware
@@ -1,6 +1,6 @@
import anyio
import click
from mcp import types
import mcp_types as types
from mcp.server import Server, ServerRequestContext
from mcp.shared._httpx_utils import create_mcp_http_client
@@ -10,7 +10,7 @@ from dataclasses import dataclass
from uuid import uuid4
from mcp.server.streamable_http import EventCallback, EventId, EventMessage, EventStore, StreamId
from mcp.types import JSONRPCMessage
from mcp_types import JSONRPCMessage
logger = logging.getLogger(__name__)
@@ -16,8 +16,8 @@ import logging
import anyio
import click
import mcp_types as types
import uvicorn
from mcp import types
from mcp.server import Server, ServerRequestContext
from .event_store import InMemoryEventStore
@@ -10,8 +10,9 @@ import json
import random
from datetime import datetime
import mcp_types as types
import mcp.server.stdio
from mcp import types
from mcp.server import Server, ServerRequestContext
@@ -5,9 +5,10 @@ uv run completion-client
import asyncio
import os
from mcp_types import PromptReference, ResourceTemplateReference
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from mcp.types import PromptReference, ResourceTemplateReference
# Create server parameters for stdio connection
server_params = StdioServerParameters(
@@ -2,9 +2,10 @@
import asyncio
from mcp_types import PaginatedRequestParams, Resource
from mcp.client.session import ClientSession
from mcp.client.stdio import StdioServerParameters, stdio_client
from mcp.types import PaginatedRequestParams, Resource
async def list_all_resources() -> None:
@@ -2,7 +2,9 @@
import asyncio
from mcp import ClientSession, StdioServerParameters, types
import mcp_types as types
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
+3 -1
View File
@@ -5,7 +5,9 @@ uv run client
import asyncio
import os
from mcp import ClientSession, StdioServerParameters, types
import mcp_types as types
from mcp import ClientSession, StdioServerParameters
from mcp.client.context import ClientRequestContext
from mcp.client.stdio import stdio_client
@@ -28,11 +28,13 @@ import webbrowser
from typing import Any
from urllib.parse import urlparse
from mcp import ClientSession, types
import mcp_types as types
from mcp_types import URL_ELICITATION_REQUIRED
from mcp import ClientSession
from mcp.client.context import ClientRequestContext
from mcp.client.sse import sse_client
from mcp.shared.exceptions import MCPError, UrlElicitationRequiredError
from mcp.types import URL_ELICITATION_REQUIRED
async def handle_elicitation(
+3 -2
View File
@@ -1,5 +1,4 @@
from mcp.server.mcpserver import MCPServer
from mcp.types import (
from mcp_types import (
Completion,
CompletionArgument,
CompletionContext,
@@ -7,6 +6,8 @@ from mcp.types import (
ResourceTemplateReference,
)
from mcp.server.mcpserver import MCPServer
mcp = MCPServer(name="Example")
@@ -2,10 +2,10 @@
from typing import Annotated
from mcp_types import CallToolResult, TextContent
from pydantic import BaseModel
from mcp.server.mcpserver import MCPServer
from mcp.types import CallToolResult, TextContent
mcp = MCPServer("CallToolResult Example")
+1 -1
View File
@@ -7,11 +7,11 @@ like OAuth flows, credential collection, or payment processing.
import uuid
from mcp_types import ElicitRequestURLParams
from pydantic import BaseModel, Field
from mcp.server.mcpserver import Context, MCPServer
from mcp.shared.exceptions import UrlElicitationRequiredError
from mcp.types import ElicitRequestURLParams
mcp = MCPServer(name="Elicitation Example")
+2 -1
View File
@@ -4,8 +4,9 @@ uv run examples/snippets/servers/lowlevel/basic.py
import asyncio
import mcp_types as types
import mcp.server.stdio
from mcp import types
from mcp.server import Server, ServerRequestContext
@@ -4,8 +4,9 @@ uv run examples/snippets/servers/lowlevel/direct_call_tool_result.py
import asyncio
import mcp_types as types
import mcp.server.stdio
from mcp import types
from mcp.server import Server, ServerRequestContext
@@ -6,8 +6,9 @@ from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
from typing import TypedDict
import mcp_types as types
import mcp.server.stdio
from mcp import types
from mcp.server import Server, ServerRequestContext
@@ -5,8 +5,9 @@ uv run examples/snippets/servers/lowlevel/structured_output.py
import asyncio
import json
import mcp_types as types
import mcp.server.stdio
from mcp import types
from mcp.server import Server, ServerRequestContext
@@ -1,6 +1,7 @@
"""Example of implementing pagination with the low-level MCP server."""
from mcp import types
import mcp_types as types
from mcp.server import Server, ServerRequestContext
# Sample data to paginate
+2 -1
View File
@@ -1,5 +1,6 @@
from mcp_types import SamplingMessage, TextContent
from mcp.server.mcpserver import Context, MCPServer
from mcp.types import SamplingMessage, TextContent
mcp = MCPServer(name="Sampling Example")
+31 -27
View File
@@ -1,6 +1,6 @@
[project]
name = "mcp"
dynamic = ["version"]
dynamic = ["version", "dependencies"]
description = "Model Context Protocol SDK"
readme = "README.v2.md"
requires-python = ">=3.10"
@@ -24,29 +24,6 @@ classifiers = [
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
]
dependencies = [
# anyio < 4.10 triggers a compile-time SyntaxWarning on Python 3.14 (PEP 765,
# "'return' in a 'finally' block"); for stdio servers it lands on the child's
# stderr (agronholm/anyio#816, fixed in 4.10).
"anyio>=4.10; python_version >= '3.14'",
"anyio>=4.9; python_version < '3.14'",
"httpx>=0.27.1,<1.0.0",
"httpx-sse>=0.4",
"pydantic>=2.12.0",
"starlette>=0.48.0; python_version >= '3.14'",
"starlette>=0.27; python_version < '3.14'",
"python-multipart>=0.0.9",
"sse-starlette>=3.0.0",
"pydantic-settings>=2.5.2",
"uvicorn>=0.31.1; sys_platform != 'emscripten'",
"jsonschema>=4.20.0",
"pywin32>=311; sys_platform == 'win32'",
"pyjwt[crypto]>=2.10.1",
"typing-extensions>=4.13.0",
"typing-inspection>=0.4.1",
"opentelemetry-api>=1.28.0",
]
[project.optional-dependencies]
rich = ["rich>=13.9.4"]
cli = ["typer>=0.16.0", "python-dotenv>=1.0.0"]
@@ -118,6 +95,31 @@ vcs = "git"
style = "pep440"
bump = true
[tool.hatch.metadata.hooks.uv-dynamic-versioning]
dependencies = [
# anyio < 4.10 triggers a compile-time SyntaxWarning on Python 3.14 (PEP 765,
# "'return' in a 'finally' block"); for stdio servers it lands on the child's
# stderr (agronholm/anyio#816, fixed in 4.10).
"anyio>=4.10; python_version >= '3.14'",
"anyio>=4.9; python_version < '3.14'",
"httpx>=0.27.1,<1.0.0",
"httpx-sse>=0.4",
"mcp-types=={{ version }}",
"pydantic>=2.12.0",
"starlette>=0.48.0; python_version >= '3.14'",
"starlette>=0.27; python_version < '3.14'",
"python-multipart>=0.0.9",
"sse-starlette>=3.0.0",
"pydantic-settings>=2.5.2",
"uvicorn>=0.31.1; sys_platform != 'emscripten'",
"jsonschema>=4.20.0",
"pywin32>=311; sys_platform == 'win32'",
"pyjwt[crypto]>=2.10.1",
"typing-extensions>=4.13.0",
"typing-inspection>=0.4.1",
"opentelemetry-api>=1.28.0",
]
[project.urls]
Homepage = "https://modelcontextprotocol.io"
Documentation = "https://py.sdk.modelcontextprotocol.io/v2/"
@@ -131,6 +133,7 @@ packages = ["src/mcp"]
typeCheckingMode = "strict"
include = [
"src/mcp",
"src/mcp-types/mcp_types",
"tests",
"examples/servers",
"examples/snippets",
@@ -179,7 +182,7 @@ max-complexity = 24 # Default is 10
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["F401"]
# Generated by scripts/gen_surface_types.py: raw datamodel-codegen output (TID251 lifts the repo-wide RootModel ban for these generated validators).
"src/mcp/types/v*/__init__.py" = ["D212", "E501", "I001", "TID251", "UP007", "UP037"]
"src/mcp-types/mcp_types/v*/__init__.py" = ["D212", "E501", "I001", "TID251", "UP007", "UP037"]
"tests/server/mcpserver/test_func_metadata.py" = ["E501"]
"tests/shared/test_progress_notifications.py" = ["PLW0603"]
@@ -191,10 +194,11 @@ max-returns = 13 # Default is 6
max-statements = 102 # Default is 50
[tool.uv.workspace]
members = ["examples/clients/*", "examples/servers/*", "examples/snippets"]
members = ["src/mcp-types", "examples/clients/*", "examples/servers/*", "examples/snippets"]
[tool.uv.sources]
mcp = { workspace = true }
mcp-types = { workspace = true }
strict-no-cover = { git = "https://github.com/pydantic/strict-no-cover" }
[tool.pytest.ini_options]
@@ -241,7 +245,7 @@ MD059 = false # descriptive-link-text
branch = true
patch = ["subprocess"]
concurrency = ["multiprocessing", "thread"]
source = ["src", "tests"]
source = ["src", "src/mcp-types/mcp_types", "tests"]
omit = [
"src/mcp/client/__main__.py",
"src/mcp/server/__main__.py",
+3 -3
View File
@@ -1,7 +1,7 @@
"""Regenerate the per-version wire-shape surface packages from vendored schemas.
Runs `datamodel-code-generator` over each `schema/PINNED.json` entry and
writes the result to `src/mcp/types/v<version>/__init__.py` with only the
writes the result to `src/mcp-types/mcp_types/v<version>/__init__.py` with only the
fixes the raw output needs: a small JSON pre-patch for the known
`number`-as-`integer` schema.json defect, a header, full URLs for the spec's
site-absolute doc links, and per-version epilogue aliases. Run with
@@ -23,7 +23,7 @@ from typing import Any
REPO_ROOT = Path(__file__).resolve().parent.parent
SCHEMA_DIR = REPO_ROOT / "schema"
TYPES_DIR = REPO_ROOT / "src" / "mcp" / "types"
TYPES_DIR = REPO_ROOT / "src" / "mcp-types" / "mcp_types"
# schema.ts -> schema.json renders TypeScript `number` as JSON Schema
# `integer` at these sites; patch the JSON before codegen so floats validate.
@@ -142,7 +142,7 @@ def run_codegen(schema_path: Path, output_path: Path) -> None:
"--output", str(output_path),
"--output-model-type", "pydantic_v2.BaseModel",
"--target-python-version", "3.10",
"--base-class", "mcp.types._wire_base.WireModel",
"--base-class", "mcp_types._wire_base.WireModel",
"--snake-case-field", "--remove-special-field-name-prefix",
"--use-annotated", "--use-field-description", "--use-schema-description",
"--enum-field-as-literal", "all",
+16
View File
@@ -0,0 +1,16 @@
# MCP Types
The wire types for the [Model Context Protocol](https://modelcontextprotocol.io).
This package holds the protocol message models, JSON-RPC envelope types, per-version
surface validators, and the protocol-version registry. Its only runtime dependencies are
`pydantic` and `typing-extensions`, so it can be installed on its own when you need to
(de)serialize MCP traffic without pulling in the full `mcp` SDK.
```python
from mcp_types import Tool, CallToolRequest
from mcp_types.version import LATEST_PROTOCOL_VERSION
```
The `mcp` package re-exports these names, so existing `from mcp import Tool` imports
keep working.
@@ -4,10 +4,8 @@ Check the latest schema at:
https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/schema/draft/schema.json
"""
from mcp.shared.version import LATEST_PROTOCOL_VERSION
# Re-export everything from _types for backward compatibility
from mcp.types._types import (
from mcp_types._types import (
CLIENT_CAPABILITIES_META_KEY,
CLIENT_INFO_META_KEY,
DEFAULT_NEGOTIATED_VERSION,
@@ -198,7 +196,7 @@ from mcp.types._types import (
)
# Re-export JSONRPC types
from mcp.types.jsonrpc import (
from mcp_types.jsonrpc import (
CONNECTION_CLOSED,
HEADER_MISMATCH,
INTERNAL_ERROR,
@@ -220,6 +218,7 @@ from mcp.types.jsonrpc import (
RequestId,
jsonrpc_message_adapter,
)
from mcp_types.version import LATEST_PROTOCOL_VERSION
__all__ = [
# Protocol version constants
@@ -3,7 +3,7 @@
One model per protocol construct, carrying every field from every supported
protocol version, so application code sees a single set of types regardless of
the negotiated version. Per-field docstrings note version availability. The
`mcp.types.v*` surface packages carry the schema-exact wire shapes.
`mcp_types.v*` surface packages carry the schema-exact wire shapes.
"""
from __future__ import annotations
@@ -21,7 +21,7 @@ from pydantic import (
from pydantic.alias_generators import to_camel
from typing_extensions import NotRequired, Self, TypedDict
from mcp.types.jsonrpc import RequestId
from mcp_types.jsonrpc import RequestId
DEFAULT_NEGOTIATED_VERSION: Final[str] = "2025-03-26"
"""The default negotiated version of the Model Context Protocol when no version is specified.
@@ -122,7 +122,7 @@ class Request(MCPModel, Generic[RequestParamsT, MethodT]):
"""Base class for JSON-RPC requests.
The JSON-RPC envelope (`jsonrpc`, `id`) is attached by the session layer
(see `mcp.types.jsonrpc`), not carried here.
(see `mcp_types.jsonrpc`), not carried here.
"""
method: MethodT
@@ -2073,7 +2073,7 @@ GetPromptRequestParams.model_rebuild()
CallToolRequestParams.model_rebuild()
# Top-level message unions: superset across all supported protocol versions.
# Per-version validity is recorded in `mcp.types.methods`, not enforced here.
# Per-version validity is recorded in `mcp_types.methods`, not enforced here.
ClientRequest = (
PingRequest
@@ -1,4 +1,4 @@
"""Shared pydantic base for the generated `mcp.types.v*` wire-shape packages."""
"""Shared pydantic base for the generated `mcp_types.v*` wire-shape packages."""
from pydantic import BaseModel, ConfigDict
@@ -1,12 +1,12 @@
"""Per-version method maps and parse/serialize functions for MCP traffic.
This module is supported public API; the `mcp.types.v*` packages it draws on
This module is supported public API; the `mcp_types.v*` packages it draws on
are internal validators and not for direct import.
Surface maps key `(method, version)` to per-version wire types (key absence is
the version gate; shape validation is per schema era, i.e. 2025-11-25 for every
pre-2026 version and 2026-07-28 for 2026). Monolith maps key `method` to the
version-free `mcp.types` models user code receives."""
version-free `mcp_types` models user code receives."""
from __future__ import annotations
@@ -17,10 +17,10 @@ from typing import Any, Final, TypeVar
from pydantic import BaseModel, TypeAdapter
import mcp.types as types
import mcp.types.v2025_11_25 as v2025
import mcp.types.v2026_07_28 as v2026
from mcp.shared.version import KNOWN_PROTOCOL_VERSIONS
import mcp_types as types
import mcp_types.v2025_11_25 as v2025
import mcp_types.v2026_07_28 as v2026
from mcp_types.version import KNOWN_PROTOCOL_VERSIONS
__all__ = [
"CLIENT_NOTIFICATIONS",
View File
@@ -8,7 +8,7 @@ from __future__ import annotations
from typing import Annotated, Any, Literal
from mcp.types._wire_base import WireModel
from mcp_types._wire_base import WireModel
from pydantic import ConfigDict, Field, RootModel
@@ -8,7 +8,7 @@ from __future__ import annotations
from typing import Annotated, Any, Literal, Union
from mcp.types._wire_base import WireModel
from mcp_types._wire_base import WireModel
from pydantic import ConfigDict, Field, RootModel
+54
View File
@@ -0,0 +1,54 @@
[project]
name = "mcp-types"
dynamic = ["version"]
description = "Model Context Protocol wire types"
readme = "README.md"
requires-python = ">=3.10"
authors = [{ name = "Model Context Protocol a Series of LF Projects, LLC." }]
maintainers = [
{ name = "David Soria Parra", email = "davidsp@anthropic.com" },
{ name = "Marcelo Trylesinski", email = "marcelotryle@gmail.com" },
{ name = "Max Isbey", email = "maxisbey@anthropic.com" },
{ name = "Felix Weinberger", email = "fweinberger@anthropic.com" },
]
keywords = ["mcp", "llm", "automation"]
license = { text = "MIT" }
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
]
dependencies = [
"pydantic>=2.12.0",
"typing-extensions>=4.13.0",
]
[project.urls]
Homepage = "https://modelcontextprotocol.io"
Documentation = "https://py.sdk.modelcontextprotocol.io/v2/"
Repository = "https://github.com/modelcontextprotocol/python-sdk"
Issues = "https://github.com/modelcontextprotocol/python-sdk/issues"
[build-system]
requires = ["hatchling", "uv-dynamic-versioning"]
build-backend = "hatchling.build"
[tool.hatch.version]
source = "uv-dynamic-versioning"
[tool.uv-dynamic-versioning]
vcs = "git"
style = "pep440"
bump = true
[tool.hatch.build.targets.sdist.force-include]
"../../LICENSE" = "LICENSE"
[tool.hatch.build.targets.wheel]
packages = ["mcp_types"]
+10 -9
View File
@@ -1,11 +1,4 @@
from .client.client import Client
from .client.session import ClientSession
from .client.session_group import ClientSessionGroup
from .client.stdio import StdioServerParameters, stdio_client
from .server.session import ServerSession
from .server.stdio import stdio_server
from .shared.exceptions import MCPDeprecationWarning, MCPError, UrlElicitationRequiredError
from .types import (
from mcp_types import (
CallToolRequest,
ClientCapabilities,
ClientNotification,
@@ -63,7 +56,15 @@ from .types import (
ToolUseContent,
UnsubscribeRequest,
)
from .types import Role as SamplingRole
from mcp_types import Role as SamplingRole
from .client.client import Client
from .client.session import ClientSession
from .client.session_group import ClientSessionGroup
from .client.stdio import StdioServerParameters, stdio_client
from .server.session import ServerSession
from .server.stdio import stdio_server
from .shared.exceptions import MCPDeprecationWarning, MCPError, UrlElicitationRequiredError
__all__ = [
"CallToolRequest",
+1 -1
View File
@@ -6,8 +6,8 @@ from functools import partial
from urllib.parse import urlparse
import anyio
import mcp_types as types
from mcp import types
from mcp.client._transport import ReadStream, WriteStream
from mcp.client.session import ClientSession
from mcp.client.sse import sse_client
+7 -7
View File
@@ -17,17 +17,17 @@ from __future__ import annotations
from typing import Any
from pydantic import ValidationError
from mcp import types
from mcp.client.session import ClientSession
from mcp.shared.exceptions import MCPError
from mcp.shared.version import (
import mcp_types as types
from mcp_types import UNSUPPORTED_PROTOCOL_VERSION
from mcp_types.version import (
HANDSHAKE_PROTOCOL_VERSIONS,
LATEST_MODERN_VERSION,
MODERN_PROTOCOL_VERSIONS,
)
from mcp.types import UNSUPPORTED_PROTOCOL_VERSION
from pydantic import ValidationError
from mcp.client.session import ClientSession
from mcp.shared.exceptions import MCPError
def _parse_supported(data: Any) -> list[str] | None:
+1 -1
View File
@@ -16,6 +16,7 @@ from urllib.parse import quote, urlencode, urljoin, urlparse
import anyio
import httpx
from mcp_types.version import is_version_at_least
from pydantic import BaseModel, Field, ValidationError
from mcp.client.auth.exceptions import OAuthFlowError, OAuthTokenError
@@ -54,7 +55,6 @@ from mcp.shared.auth_utils import (
resource_url_from_server_url,
)
from mcp.shared.inbound import MCP_PROTOCOL_VERSION_HEADER
from mcp.shared.version import is_version_at_least
logger = logging.getLogger(__name__)
+1 -1
View File
@@ -2,6 +2,7 @@ import re
from urllib.parse import urljoin, urlparse
from httpx import Request, Response
from mcp_types import LATEST_PROTOCOL_VERSION
from pydantic import AnyUrl, ValidationError
from mcp.client.auth import OAuthFlowError, OAuthRegistrationError, OAuthTokenError
@@ -13,7 +14,6 @@ from mcp.shared.auth import (
ProtectedResourceMetadata,
)
from mcp.shared.inbound import MCP_PROTOCOL_VERSION_HEADER
from mcp.types import LATEST_PROTOCOL_VERSION
def extract_field_from_www_auth(response: Response, field_name: str) -> str | None:
+17 -17
View File
@@ -8,23 +8,8 @@ from dataclasses import KW_ONLY, dataclass, field
from typing import Any, Literal, TypeVar, overload
import anyio
from typing_extensions import deprecated
from mcp import types
from mcp.client._memory import InMemoryTransport
from mcp.client._probe import negotiate_auto
from mcp.client._transport import Transport
from mcp.client.session import ClientSession, ElicitationFnT, ListRootsFnT, LoggingFnT, MessageHandlerFnT, SamplingFnT
from mcp.client.streamable_http import streamable_http_client
from mcp.server import Server
from mcp.server.mcpserver import MCPServer
from mcp.server.runner import modern_on_request
from mcp.shared.direct_dispatcher import create_direct_dispatcher_pair
from mcp.shared.dispatcher import Dispatcher, ProgressFnT
from mcp.shared.exceptions import MCPDeprecationWarning
from mcp.shared.jsonrpc_dispatcher import JSONRPCDispatcher
from mcp.shared.version import HANDSHAKE_PROTOCOL_VERSIONS, MODERN_PROTOCOL_VERSIONS
from mcp.types import (
import mcp_types as types
from mcp_types import (
CallToolResult,
CompleteResult,
EmptyResult,
@@ -44,6 +29,21 @@ from mcp.types import (
ResourceTemplateReference,
ServerCapabilities,
)
from mcp_types.version import HANDSHAKE_PROTOCOL_VERSIONS, MODERN_PROTOCOL_VERSIONS
from typing_extensions import deprecated
from mcp.client._memory import InMemoryTransport
from mcp.client._probe import negotiate_auto
from mcp.client._transport import Transport
from mcp.client.session import ClientSession, ElicitationFnT, ListRootsFnT, LoggingFnT, MessageHandlerFnT, SamplingFnT
from mcp.client.streamable_http import streamable_http_client
from mcp.server import Server
from mcp.server.mcpserver import MCPServer
from mcp.server.runner import modern_on_request
from mcp.shared.direct_dispatcher import create_direct_dispatcher_pair
from mcp.shared.dispatcher import Dispatcher, ProgressFnT
from mcp.shared.exceptions import MCPDeprecationWarning
from mcp.shared.jsonrpc_dispatcher import JSONRPCDispatcher
ConnectMode = Literal["legacy", "auto"] | str
"""``mode=`` value: ``"legacy"`` (initialize handshake), ``"auto"`` (discover, fall back to
+18 -18
View File
@@ -9,10 +9,27 @@ from typing import Any, Literal, Protocol, cast, overload
import anyio
import anyio.abc
import anyio.lowlevel
import mcp_types as types
from mcp_types import (
CLIENT_CAPABILITIES_META_KEY,
CLIENT_INFO_META_KEY,
INTERNAL_ERROR,
METHOD_NOT_FOUND,
PROTOCOL_VERSION_META_KEY,
UNSUPPORTED_PROTOCOL_VERSION,
RequestId,
RequestParamsMeta,
)
from mcp_types import methods as _methods
from mcp_types.version import (
HANDSHAKE_PROTOCOL_VERSIONS,
LATEST_HANDSHAKE_VERSION,
LATEST_MODERN_VERSION,
MODERN_PROTOCOL_VERSIONS,
)
from pydantic import BaseModel, TypeAdapter, ValidationError
from typing_extensions import Self, TypeVar, deprecated
from mcp import types
from mcp.client._transport import ReadStream, WriteStream
from mcp.shared._compat import resync_tracer
from mcp.shared.dispatcher import CallOptions, DispatchContext, Dispatcher, ProgressFnT
@@ -27,23 +44,6 @@ from mcp.shared.jsonrpc_dispatcher import JSONRPCDispatcher
from mcp.shared.message import ClientMessageMetadata, SessionMessage
from mcp.shared.session import RequestResponder
from mcp.shared.transport_context import TransportContext
from mcp.shared.version import (
HANDSHAKE_PROTOCOL_VERSIONS,
LATEST_HANDSHAKE_VERSION,
LATEST_MODERN_VERSION,
MODERN_PROTOCOL_VERSIONS,
)
from mcp.types import (
CLIENT_CAPABILITIES_META_KEY,
CLIENT_INFO_META_KEY,
INTERNAL_ERROR,
METHOD_NOT_FOUND,
PROTOCOL_VERSION_META_KEY,
UNSUPPORTED_PROTOCOL_VERSION,
RequestId,
RequestParamsMeta,
)
from mcp.types import methods as _methods
DEFAULT_CLIENT_INFO = types.Implementation(name="mcp", version="0.1.0")
DISCOVER_TIMEOUT_SECONDS = 10.0
+1 -1
View File
@@ -15,11 +15,11 @@ from typing import Any, Literal, TypeAlias, overload
import anyio
import httpx
import mcp_types as types
from pydantic import BaseModel, Field
from typing_extensions import Self
import mcp
from mcp import types
from mcp.client.session import ElicitationFnT, ListRootsFnT, LoggingFnT, MessageHandlerFnT, SamplingFnT
from mcp.client.sse import sse_client
from mcp.client.stdio import StdioServerParameters
+1 -1
View File
@@ -6,10 +6,10 @@ from urllib.parse import parse_qs, urljoin, urlparse
import anyio
import httpx
import mcp_types as types
from anyio.abc import TaskStatus
from httpx_sse import SSEError, aconnect_sse
from mcp import types
from mcp.shared._compat import resync_tracer
from mcp.shared._context_streams import create_context_streams
from mcp.shared._httpx_utils import McpHttpClientFactory, create_mcp_http_client
+1 -1
View File
@@ -18,11 +18,11 @@ from typing import Literal, TextIO
import anyio
import anyio.lowlevel
import mcp_types as types
from anyio.abc import AsyncResource, Process
from anyio.streams.text import TextReceiveStream
from pydantic import BaseModel, Field
from mcp import types
from mcp.client._transport import TransportStreams
from mcp.os.posix.utilities import terminate_posix_process_tree
from mcp.os.win32.utilities import (
+9 -9
View File
@@ -12,15 +12,7 @@ import anyio
import httpx
from anyio.abc import TaskGroup
from httpx_sse import EventSource, ServerSentEvent, aconnect_sse
from pydantic import ValidationError
from mcp.client._transport import TransportStreams
from mcp.shared._compat import resync_tracer
from mcp.shared._context_streams import ContextReceiveStream, ContextSendStream, create_context_streams
from mcp.shared._httpx_utils import create_mcp_http_client
from mcp.shared.inbound import MCP_PROTOCOL_VERSION_HEADER
from mcp.shared.message import ClientMessageMetadata, SessionMessage
from mcp.types import (
from mcp_types import (
INTERNAL_ERROR,
INVALID_REQUEST,
METHOD_NOT_FOUND,
@@ -34,6 +26,14 @@ from mcp.types import (
RequestId,
jsonrpc_message_adapter,
)
from pydantic import ValidationError
from mcp.client._transport import TransportStreams
from mcp.shared._compat import resync_tracer
from mcp.shared._context_streams import ContextReceiveStream, ContextSendStream, create_context_streams
from mcp.shared._httpx_utils import create_mcp_http_client
from mcp.shared.inbound import MCP_PROTOCOL_VERSION_HEADER
from mcp.shared.message import ClientMessageMetadata, SessionMessage
logger = logging.getLogger(__name__)
+1 -1
View File
@@ -2,13 +2,13 @@ from __future__ import annotations
from typing import Any
from mcp_types import INVALID_PARAMS, CallToolResult
from opentelemetry.trace import SpanKind, StatusCode
from pydantic import ValidationError
from mcp.server.context import CallNext, HandlerResult, ServerMiddleware, ServerRequestContext
from mcp.shared._otel import extract_trace_context, otel_span
from mcp.shared.exceptions import MCPError
from mcp.types import INVALID_PARAMS, CallToolResult
class OpenTelemetryMiddleware(ServerMiddleware[Any]):
+12 -12
View File
@@ -19,6 +19,18 @@ from dataclasses import dataclass, field
from typing import TYPE_CHECKING, Any, TypeVar
import anyio
from mcp_types import (
INTERNAL_ERROR,
INVALID_REQUEST,
PARSE_ERROR,
ClientCapabilities,
ErrorData,
Implementation,
JSONRPCError,
JSONRPCRequest,
JSONRPCResponse,
RequestId,
)
from pydantic import BaseModel, ValidationError
from starlette.requests import Request
from starlette.responses import Response
@@ -33,18 +45,6 @@ from mcp.shared.inbound import ERROR_CODE_HTTP_STATUS, InboundLadderRejection, c
from mcp.shared.jsonrpc_dispatcher import handler_exception_to_error_data
from mcp.shared.message import MessageMetadata, ServerMessageMetadata
from mcp.shared.transport_context import TransportContext
from mcp.types import (
INTERNAL_ERROR,
INVALID_REQUEST,
PARSE_ERROR,
ClientCapabilities,
ErrorData,
Implementation,
JSONRPCError,
JSONRPCRequest,
JSONRPCResponse,
RequestId,
)
if TYPE_CHECKING:
from mcp.server.lowlevel.server import Server
+9 -9
View File
@@ -25,14 +25,7 @@ from contextlib import AsyncExitStack
from typing import Any, TypeVar, overload
import anyio
from pydantic import BaseModel
from typing_extensions import deprecated
from mcp.shared.dispatcher import CallOptions, Outbound
from mcp.shared.exceptions import MCPDeprecationWarning, NoBackChannelError
from mcp.shared.peer import Meta, dump_params
from mcp.shared.version import LATEST_HANDSHAKE_VERSION
from mcp.types import (
from mcp_types import (
ClientCapabilities,
CreateMessageRequest,
CreateMessageResult,
@@ -47,7 +40,14 @@ from mcp.types import (
PingRequest,
Request,
)
from mcp.types import methods as _methods
from mcp_types import methods as _methods
from mcp_types.version import LATEST_HANDSHAKE_VERSION
from pydantic import BaseModel
from typing_extensions import deprecated
from mcp.shared.dispatcher import CallOptions, Outbound
from mcp.shared.exceptions import MCPDeprecationWarning, NoBackChannelError
from mcp.shared.peer import Meta, dump_params
__all__ = ["Connection"]
+1 -1
View File
@@ -2,6 +2,7 @@ from collections.abc import Awaitable, Callable, Mapping
from dataclasses import dataclass
from typing import Any, Generic, Protocol
from mcp_types import LoggingLevel, RequestId, RequestParamsMeta
from pydantic import BaseModel
from typing_extensions import TypeVar, deprecated
@@ -13,7 +14,6 @@ from mcp.shared.exceptions import MCPDeprecationWarning
from mcp.shared.message import CloseSSEStreamCallback
from mcp.shared.peer import Meta
from mcp.shared.transport_context import TransportContext
from mcp.types import LoggingLevel, RequestId, RequestParamsMeta
# Invariant: parametrizes a mutable dataclass field; dict default matches the default lifespan.
LifespanContextT = TypeVar("LifespanContextT", default=dict[str, Any])
+4 -4
View File
@@ -4,15 +4,15 @@ from __future__ import annotations
from typing import Any, Generic, Literal, TypeVar
from mcp_types import RequestId
# Internal surface package; imported as the gate's source of truth for spec-valid property schemas.
from mcp_types.v2025_11_25 import PrimitiveSchemaDefinition
from pydantic import BaseModel, ValidationError
from pydantic.json_schema import GenerateJsonSchema, JsonSchemaValue
from pydantic_core import core_schema
from mcp.server.session import ServerSession
from mcp.types import RequestId
# Internal surface package; imported as the gate's source of truth for spec-valid property schemas.
from mcp.types.v2025_11_25 import PrimitiveSchemaDefinition
ElicitSchemaModelT = TypeVar("ElicitSchemaModelT", bound=BaseModel)
+2 -2
View File
@@ -43,6 +43,8 @@ from dataclasses import dataclass
from importlib.metadata import version as importlib_version
from typing import Any, Generic
import mcp_types as types
from mcp_types.version import MODERN_PROTOCOL_VERSIONS
from pydantic import BaseModel
from starlette.applications import Starlette
from starlette.middleware import Middleware
@@ -50,7 +52,6 @@ from starlette.middleware.authentication import AuthenticationMiddleware
from starlette.routing import Mount, Route
from typing_extensions import TypeVar
from mcp import types
from mcp.server.auth.middleware.auth_context import AuthContextMiddleware
from mcp.server.auth.middleware.bearer_auth import BearerAuthBackend, RequireAuthMiddleware
from mcp.server.auth.provider import OAuthAuthorizationServerProvider, TokenVerifier
@@ -64,7 +65,6 @@ from mcp.server.streamable_http_manager import StreamableHTTPASGIApp, Streamable
from mcp.server.transport_security import TransportSecuritySettings
from mcp.shared._stream_protocols import ReadStream, WriteStream
from mcp.shared.message import SessionMessage
from mcp.shared.version import MODERN_PROTOCOL_VERSIONS
logger = logging.getLogger(__name__)
+1 -1
View File
@@ -1,6 +1,6 @@
"""MCPServer - A more ergonomic interface for MCP servers."""
from mcp.types import Icon
from mcp_types import Icon
from .context import Context
from .server import MCPServer
+1 -1
View File
@@ -3,6 +3,7 @@ from __future__ import annotations
from collections.abc import Iterable
from typing import TYPE_CHECKING, Any, Generic
from mcp_types import LoggingLevel
from pydantic import AnyUrl, BaseModel
from typing_extensions import deprecated
@@ -16,7 +17,6 @@ from mcp.server.elicitation import (
)
from mcp.server.lowlevel.helper_types import ReadResourceContents
from mcp.shared.exceptions import MCPDeprecationWarning
from mcp.types import LoggingLevel
if TYPE_CHECKING:
from mcp.server.mcpserver.server import MCPServer
+1 -1
View File
@@ -8,12 +8,12 @@ from typing import TYPE_CHECKING, Any, Literal
import anyio.to_thread
import pydantic_core
from mcp_types import ContentBlock, Icon, TextContent
from pydantic import BaseModel, Field, TypeAdapter, validate_call
from mcp.server.mcpserver.utilities.context_injection import find_context_parameter, inject_context
from mcp.server.mcpserver.utilities.func_metadata import func_metadata
from mcp.shared._callable_inspection import is_async_callable
from mcp.types import ContentBlock, Icon, TextContent
if TYPE_CHECKING:
from mcp.server.context import LifespanContextT, RequestT
+1 -2
View File
@@ -3,6 +3,7 @@
import abc
from typing import Any
from mcp_types import Annotations, Icon
from pydantic import (
BaseModel,
ConfigDict,
@@ -11,8 +12,6 @@ from pydantic import (
field_validator,
)
from mcp.types import Annotations, Icon
class Resource(BaseModel, abc.ABC):
"""Base class for all resources."""
@@ -5,13 +5,13 @@ from __future__ import annotations
from collections.abc import Callable
from typing import TYPE_CHECKING, Any
from mcp_types import Annotations, Icon
from pydantic import AnyUrl
from mcp.server.mcpserver.exceptions import ResourceNotFoundError
from mcp.server.mcpserver.resources.base import Resource
from mcp.server.mcpserver.resources.templates import ResourceTemplate
from mcp.server.mcpserver.utilities.logging import get_logger
from mcp.types import Annotations, Icon
if TYPE_CHECKING:
from mcp.server.context import LifespanContextT, RequestT
@@ -9,6 +9,7 @@ from typing import TYPE_CHECKING, Any
from urllib.parse import unquote
import anyio.to_thread
from mcp_types import Annotations, Icon
from pydantic import BaseModel, Field, validate_call
from mcp.server.mcpserver.exceptions import ResourceError
@@ -17,7 +18,6 @@ from mcp.server.mcpserver.utilities.context_injection import find_context_parame
from mcp.server.mcpserver.utilities.func_metadata import func_metadata
from mcp.server.mcpserver.utilities.logging import get_logger
from mcp.shared._callable_inspection import is_async_callable
from mcp.types import Annotations, Icon
logger = get_logger(__name__)
+1 -1
View File
@@ -12,11 +12,11 @@ import anyio.to_thread
import httpx
import pydantic
import pydantic_core
from mcp_types import Annotations, Icon
from pydantic import Field, ValidationInfo, validate_call
from mcp.server.mcpserver.resources.base import Resource
from mcp.shared._callable_inspection import is_async_callable
from mcp.types import Annotations, Icon
class TextResource(Resource):
+29 -29
View File
@@ -11,6 +11,35 @@ from typing import Any, Generic, Literal, TypeVar, overload
import anyio
import pydantic_core
from mcp_types import (
INTERNAL_ERROR,
INVALID_PARAMS,
Annotations,
BlobResourceContents,
CallToolRequestParams,
CallToolResult,
CompleteRequestParams,
CompleteResult,
Completion,
GetPromptRequestParams,
GetPromptResult,
Icon,
ListPromptsResult,
ListResourcesResult,
ListResourceTemplatesResult,
ListToolsResult,
PaginatedRequestParams,
ReadResourceRequestParams,
ReadResourceResult,
TextContent,
TextResourceContents,
ToolAnnotations,
)
from mcp_types import Prompt as MCPPrompt
from mcp_types import PromptArgument as MCPPromptArgument
from mcp_types import Resource as MCPResource
from mcp_types import ResourceTemplate as MCPResourceTemplate
from mcp_types import Tool as MCPTool
from pydantic.networks import AnyUrl
from pydantic_settings import BaseSettings, SettingsConfigDict
from starlette.applications import Starlette
@@ -42,35 +71,6 @@ from mcp.server.streamable_http import EventStore
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
from mcp.server.transport_security import TransportSecuritySettings
from mcp.shared.exceptions import MCPError
from mcp.types import (
INTERNAL_ERROR,
INVALID_PARAMS,
Annotations,
BlobResourceContents,
CallToolRequestParams,
CallToolResult,
CompleteRequestParams,
CompleteResult,
Completion,
GetPromptRequestParams,
GetPromptResult,
Icon,
ListPromptsResult,
ListResourcesResult,
ListResourceTemplatesResult,
ListToolsResult,
PaginatedRequestParams,
ReadResourceRequestParams,
ReadResourceResult,
TextContent,
TextResourceContents,
ToolAnnotations,
)
from mcp.types import Prompt as MCPPrompt
from mcp.types import PromptArgument as MCPPromptArgument
from mcp.types import Resource as MCPResource
from mcp.types import ResourceTemplate as MCPResourceTemplate
from mcp.types import Tool as MCPTool
logger = get_logger(__name__)
+1 -1
View File
@@ -4,6 +4,7 @@ from collections.abc import Callable
from functools import cached_property
from typing import TYPE_CHECKING, Any
from mcp_types import Icon, ToolAnnotations
from pydantic import BaseModel, Field
from mcp.server.mcpserver.exceptions import ToolError
@@ -12,7 +13,6 @@ from mcp.server.mcpserver.utilities.func_metadata import FuncMetadata, func_meta
from mcp.shared._callable_inspection import is_async_callable
from mcp.shared.exceptions import MCPError
from mcp.shared.tool_name_validation import validate_and_warn_tool_name
from mcp.types import Icon, ToolAnnotations
if TYPE_CHECKING:
from mcp.server.context import LifespanContextT, RequestT
@@ -3,10 +3,11 @@ from __future__ import annotations
from collections.abc import Callable
from typing import TYPE_CHECKING, Any
from mcp_types import Icon, ToolAnnotations
from mcp.server.mcpserver.exceptions import ToolError
from mcp.server.mcpserver.tools.base import Tool
from mcp.server.mcpserver.utilities.logging import get_logger
from mcp.types import Icon, ToolAnnotations
if TYPE_CHECKING:
from mcp.server.context import LifespanContextT, RequestT
@@ -9,6 +9,7 @@ from typing import Annotated, Any, cast, get_args, get_origin, get_type_hints
import anyio
import anyio.to_thread
import pydantic_core
from mcp_types import CallToolResult, ContentBlock, TextContent
from pydantic import BaseModel, ConfigDict, Field, PydanticUserError, WithJsonSchema, create_model
from pydantic.fields import FieldInfo
from pydantic.json_schema import GenerateJsonSchema, JsonSchemaWarningKind
@@ -24,7 +25,6 @@ from typing_inspection.introspection import (
from mcp.server.mcpserver.exceptions import InvalidSignature
from mcp.server.mcpserver.utilities.logging import get_logger
from mcp.server.mcpserver.utilities.types import Audio, Image
from mcp.types import CallToolResult, ContentBlock, TextContent
logger = get_logger(__name__)
+1 -1
View File
@@ -3,7 +3,7 @@
import base64
from pathlib import Path
from mcp.types import AudioContent, ImageContent
from mcp_types import AudioContent, ImageContent
class Image:
+1 -2
View File
@@ -2,10 +2,9 @@
and tools.
"""
from mcp_types import Icon, ServerCapabilities
from pydantic import BaseModel
from mcp.types import Icon, ServerCapabilities
class InitializationOptions(BaseModel):
server_name: str
+16 -16
View File
@@ -21,6 +21,22 @@ from typing import TYPE_CHECKING, Any, Generic, cast
import anyio
import anyio.abc
from mcp_types import (
CLIENT_CAPABILITIES_META_KEY,
CLIENT_INFO_META_KEY,
INTERNAL_ERROR,
INVALID_PARAMS,
METHOD_NOT_FOUND,
PROTOCOL_VERSION_META_KEY,
ErrorData,
Implementation,
InitializeRequestParams,
InitializeResult,
RequestParams,
RequestParamsMeta,
)
from mcp_types import methods as _methods
from mcp_types.version import HANDSHAKE_PROTOCOL_VERSIONS, LATEST_HANDSHAKE_VERSION, LATEST_MODERN_VERSION
from opentelemetry.trace import SpanKind, StatusCode
from pydantic import BaseModel, ValidationError
from typing_extensions import TypeVar
@@ -36,22 +52,6 @@ from mcp.shared.exceptions import MCPError
from mcp.shared.jsonrpc_dispatcher import JSONRPCDispatcher
from mcp.shared.message import ServerMessageMetadata, SessionMessage
from mcp.shared.transport_context import TransportContext
from mcp.shared.version import HANDSHAKE_PROTOCOL_VERSIONS, LATEST_HANDSHAKE_VERSION, LATEST_MODERN_VERSION
from mcp.types import (
CLIENT_CAPABILITIES_META_KEY,
CLIENT_INFO_META_KEY,
INTERNAL_ERROR,
INVALID_PARAMS,
METHOD_NOT_FOUND,
PROTOCOL_VERSION_META_KEY,
ErrorData,
Implementation,
InitializeRequestParams,
InitializeResult,
RequestParams,
RequestParamsMeta,
)
from mcp.types import methods as _methods
if TYPE_CHECKING:
from mcp.server.lowlevel.server import Server
+2 -2
View File
@@ -8,16 +8,16 @@ Handlers reach it as `ctx.session` and use the typed helpers (`elicit_form`,
from typing import Any, TypeVar, overload
import mcp_types as types
from mcp_types import methods as _methods
from pydantic import AnyUrl, BaseModel
from typing_extensions import deprecated
from mcp import types
from mcp.server.connection import Connection
from mcp.server.validation import validate_sampling_tools, validate_tool_use_result_messages
from mcp.shared.dispatcher import CallOptions, DispatchContext, ProgressFnT
from mcp.shared.exceptions import MCPDeprecationWarning
from mcp.shared.message import ServerMessageMetadata
from mcp.types import methods as _methods
__all__ = ["ServerSession"]
+1 -1
View File
@@ -43,13 +43,13 @@ from urllib.parse import quote
from uuid import UUID, uuid4
import anyio
import mcp_types as types
from pydantic import ValidationError
from sse_starlette import EventSourceResponse
from starlette.requests import Request
from starlette.responses import Response
from starlette.types import Receive, Scope, Send
from mcp import types
from mcp.server.auth.middleware.bearer_auth import AuthenticatedUser, AuthorizationContext, authorization_context
from mcp.server.transport_security import (
TransportSecurityMiddleware,
+1 -1
View File
@@ -23,8 +23,8 @@ from io import TextIOWrapper
import anyio
import anyio.lowlevel
import mcp_types as types
from mcp import types
from mcp.shared._context_streams import create_context_streams
from mcp.shared.message import SessionMessage
+13 -13
View File
@@ -19,19 +19,7 @@ from typing import Any, Final
import anyio
import pydantic_core
from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream
from pydantic import ValidationError
from sse_starlette import EventSourceResponse
from starlette.requests import Request
from starlette.responses import Response
from starlette.types import Receive, Scope, Send
from mcp.server.transport_security import TransportSecurityMiddleware, TransportSecuritySettings
from mcp.shared._context_streams import ContextReceiveStream, ContextSendStream, create_context_streams
from mcp.shared._stream_protocols import ReadStream, WriteStream
from mcp.shared.inbound import MCP_PROTOCOL_VERSION_HEADER
from mcp.shared.message import ServerMessageMetadata, SessionMessage
from mcp.shared.version import is_version_at_least
from mcp.types import (
from mcp_types import (
DEFAULT_NEGOTIATED_VERSION,
INTERNAL_ERROR,
INVALID_PARAMS,
@@ -45,6 +33,18 @@ from mcp.types import (
RequestId,
jsonrpc_message_adapter,
)
from mcp_types.version import is_version_at_least
from pydantic import ValidationError
from sse_starlette import EventSourceResponse
from starlette.requests import Request
from starlette.responses import Response
from starlette.types import Receive, Scope, Send
from mcp.server.transport_security import TransportSecurityMiddleware, TransportSecuritySettings
from mcp.shared._context_streams import ContextReceiveStream, ContextSendStream, create_context_streams
from mcp.shared._stream_protocols import ReadStream, WriteStream
from mcp.shared.inbound import MCP_PROTOCOL_VERSION_HEADER
from mcp.shared.message import ServerMessageMetadata, SessionMessage
logger = logging.getLogger(__name__)
+2 -2
View File
@@ -10,6 +10,8 @@ from uuid import uuid4
import anyio
from anyio.abc import TaskStatus
from mcp_types import DEFAULT_NEGOTIATED_VERSION, INVALID_REQUEST, ErrorData, JSONRPCError
from mcp_types.version import HANDSHAKE_PROTOCOL_VERSIONS
from starlette.requests import Request
from starlette.responses import Response
from starlette.types import Receive, Scope, Send
@@ -28,8 +30,6 @@ from mcp.shared._compat import resync_tracer
from mcp.shared.inbound import MCP_PROTOCOL_VERSION_HEADER
from mcp.shared.jsonrpc_dispatcher import JSONRPCDispatcher
from mcp.shared.transport_context import TransportContext
from mcp.shared.version import HANDSHAKE_PROTOCOL_VERSIONS
from mcp.types import DEFAULT_NEGOTIATED_VERSION, INVALID_REQUEST, ErrorData, JSONRPCError
if TYPE_CHECKING:
from mcp.server.lowlevel.server import Server
+2 -1
View File
@@ -3,8 +3,9 @@
This module provides validation logic for sampling and elicitation requests.
"""
from mcp_types import INVALID_PARAMS, ClientCapabilities, SamplingMessage, Tool, ToolChoice
from mcp.shared.exceptions import MCPError
from mcp.types import INVALID_PARAMS, ClientCapabilities, SamplingMessage, Tool, ToolChoice
def check_sampling_tools_capability(client_caps: ClientCapabilities | None) -> bool:
+1 -1
View File
@@ -13,11 +13,11 @@ from collections.abc import Mapping
from typing import Any, Generic
import anyio
from mcp_types import RequestParamsMeta
from typing_extensions import TypeVar
from mcp.shared.dispatcher import CallOptions, DispatchContext
from mcp.shared.transport_context import TransportContext
from mcp.types import RequestParamsMeta
__all__ = ["BaseContext"]
+1 -1
View File
@@ -24,6 +24,7 @@ from typing import Any
import anyio
import anyio.abc
from mcp_types import CONNECTION_CLOSED, INTERNAL_ERROR, INVALID_PARAMS, REQUEST_TIMEOUT, RequestId
from pydantic import ValidationError
from mcp.shared._compat import resync_tracer
@@ -31,7 +32,6 @@ from mcp.shared.dispatcher import CallOptions, OnNotify, OnRequest, ProgressFnT
from mcp.shared.exceptions import MCPError, NoBackChannelError
from mcp.shared.message import MessageMetadata
from mcp.shared.transport_context import TransportContext
from mcp.types import CONNECTION_CLOSED, INTERNAL_ERROR, INVALID_PARAMS, REQUEST_TIMEOUT, RequestId
logger = logging.getLogger(__name__)
+1 -1
View File
@@ -21,10 +21,10 @@ from typing import Any, Protocol, TypedDict, TypeVar, runtime_checkable
import anyio
import anyio.abc
from mcp_types import RequestId
from mcp.shared.message import MessageMetadata
from mcp.shared.transport_context import TransportContext
from mcp.types import RequestId
__all__ = [
"CallOptions",
+1 -1
View File
@@ -2,7 +2,7 @@ from __future__ import annotations
from typing import Any, cast
from mcp.types import INVALID_REQUEST, URL_ELICITATION_REQUIRED, ElicitRequestURLParams, ErrorData, JSONRPCError
from mcp_types import INVALID_REQUEST, URL_ELICITATION_REQUIRED, ElicitRequestURLParams, ErrorData, JSONRPCError
class MCPDeprecationWarning(UserWarning):
+6 -6
View File
@@ -15,14 +15,13 @@ from dataclasses import dataclass
from types import MappingProxyType
from typing import Any, Final
from mcp.shared.version import MODERN_PROTOCOL_VERSIONS
from mcp.types import (
from mcp_types import (
CLIENT_CAPABILITIES_META_KEY,
CLIENT_INFO_META_KEY,
PROTOCOL_VERSION_META_KEY,
UnsupportedProtocolVersionErrorData,
)
from mcp.types.jsonrpc import (
from mcp_types.jsonrpc import (
HEADER_MISMATCH,
INVALID_PARAMS,
INVALID_REQUEST,
@@ -31,6 +30,7 @@ from mcp.types.jsonrpc import (
PARSE_ERROR,
UNSUPPORTED_PROTOCOL_VERSION,
)
from mcp_types.version import MODERN_PROTOCOL_VERSIONS
__all__ = [
"ERROR_CODE_HTTP_STATUS",
@@ -119,14 +119,14 @@ def classify_inbound_request(
1. ``params._meta`` is a mapping carrying every reserved envelope key
(protocol version, client info, client capabilities) else
:data:`~mcp.types.jsonrpc.INVALID_PARAMS`.
:data:`~mcp_types.jsonrpc.INVALID_PARAMS`.
2. When ``headers`` is given, its ``MCP-Protocol-Version`` entry equals
the envelope's protocol version → else
:data:`~mcp.types.jsonrpc.HEADER_MISMATCH`. Runs before the
:data:`~mcp_types.jsonrpc.HEADER_MISMATCH`. Runs before the
supported-version rung so a client that disagrees with itself is told
so, rather than told the body's version is unsupported.
3. The envelope's protocol version is in ``supported_modern_versions`` →
else :data:`~mcp.types.jsonrpc.UNSUPPORTED_PROTOCOL_VERSION` with
else :data:`~mcp_types.jsonrpc.UNSUPPORTED_PROTOCOL_VERSION` with
``data = {"supported": [...], "requested": <value>}``.
Method existence is *not* a rung: kernel dispatch owns that decision so
+14 -14
View File
@@ -18,6 +18,20 @@ import anyio
import anyio.abc
import anyio.lowlevel
from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream
from mcp_types import (
CONNECTION_CLOSED,
INTERNAL_ERROR,
INVALID_PARAMS,
REQUEST_TIMEOUT,
ErrorData,
JSONRPCError,
JSONRPCMessage,
JSONRPCNotification,
JSONRPCRequest,
JSONRPCResponse,
ProgressToken,
RequestId,
)
from opentelemetry.trace import SpanKind
from pydantic import ValidationError
from typing_extensions import TypeVar
@@ -34,20 +48,6 @@ from mcp.shared.message import (
SessionMessage,
)
from mcp.shared.transport_context import TransportContext
from mcp.types import (
CONNECTION_CLOSED,
INTERNAL_ERROR,
INVALID_PARAMS,
REQUEST_TIMEOUT,
ErrorData,
JSONRPCError,
JSONRPCMessage,
JSONRPCNotification,
JSONRPCRequest,
JSONRPCResponse,
ProgressToken,
RequestId,
)
__all__ = ["JSONRPCDispatcher", "handler_exception_to_error_data"]
+1 -1
View File
@@ -8,7 +8,7 @@ from collections.abc import Awaitable, Callable
from dataclasses import dataclass
from typing import Any
from mcp.types import JSONRPCMessage, RequestId
from mcp_types import JSONRPCMessage, RequestId
ResumptionToken = str
+1 -1
View File
@@ -4,7 +4,7 @@ These utilities are primarily intended for client-side usage to properly display
human-readable names in user interfaces in a spec-compliant way.
"""
from mcp.types import Implementation, Prompt, Resource, ResourceTemplate, Tool
from mcp_types import Implementation, Prompt, Resource, ResourceTemplate, Tool
def get_display_name(obj: Tool | Resource | Prompt | ResourceTemplate | Implementation) -> str:
+6 -6
View File
@@ -12,12 +12,7 @@ model. Gating (and `NoBackChannelError`) is the wrapped `Outbound`'s job.
from collections.abc import Mapping
from typing import Any, cast, overload
from pydantic import BaseModel
from typing_extensions import deprecated
from mcp.shared.dispatcher import CallOptions, Outbound
from mcp.shared.exceptions import MCPDeprecationWarning
from mcp.types import (
from mcp_types import (
CreateMessageRequestParams,
CreateMessageResult,
CreateMessageResultWithTools,
@@ -34,6 +29,11 @@ from mcp.types import (
Tool,
ToolChoice,
)
from pydantic import BaseModel
from typing_extensions import deprecated
from mcp.shared.dispatcher import CallOptions, Outbound
from mcp.shared.exceptions import MCPDeprecationWarning
__all__ = ["ClientPeer", "Meta"]
+2 -1
View File
@@ -2,9 +2,10 @@
from typing import Generic, TypeVar
from mcp_types import RequestParamsMeta
from mcp.shared.dispatcher import ProgressFnT as ProgressFnT
from mcp.shared.message import MessageMetadata
from mcp.types import RequestParamsMeta
RequestId = str | int
+1 -1
View File
@@ -4,11 +4,11 @@ from typing import Any
from unittest.mock import patch
import pytest
from mcp_types import JSONRPCNotification, JSONRPCRequest
import mcp.shared.memory
from mcp.client._transport import WriteStream
from mcp.shared.message import SessionMessage
from mcp.types import JSONRPCNotification, JSONRPCRequest
class SpyMemoryObjectSendStream:
+13 -12
View File
@@ -8,20 +8,10 @@ from contextlib import asynccontextmanager, contextmanager
from unittest.mock import patch
import anyio
import mcp_types as types
import pytest
from inline_snapshot import snapshot
from mcp import MCPError, types
from mcp.client._memory import InMemoryTransport
from mcp.client._transport import TransportStreams
from mcp.client.client import Client
from mcp.client.streamable_http import streamable_http_client
from mcp.server import Server, ServerRequestContext
from mcp.server.mcpserver import MCPServer
from mcp.shared.memory import MessageStream, create_client_server_memory_streams
from mcp.shared.message import SessionMessage
from mcp.shared.version import LATEST_HANDSHAKE_VERSION
from mcp.types import (
from mcp_types import (
CallToolResult,
EmptyResult,
GetPromptResult,
@@ -42,6 +32,17 @@ from mcp.types import (
Tool,
ToolsCapability,
)
from mcp_types.version import LATEST_HANDSHAKE_VERSION
from mcp import MCPError
from mcp.client._memory import InMemoryTransport
from mcp.client._transport import TransportStreams
from mcp.client.client import Client
from mcp.client.streamable_http import streamable_http_client
from mcp.server import Server, ServerRequestContext
from mcp.server.mcpserver import MCPServer
from mcp.shared.memory import MessageStream, create_client_server_memory_streams
from mcp.shared.message import SessionMessage
from tests.interaction._connect import BASE_URL, mounted_app
pytestmark = pytest.mark.anyio
+2 -2
View File
@@ -8,16 +8,16 @@ from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
import httpx
import mcp_types as types
import pytest
from mcp_types import TextContent, Tool
from starlette.applications import Starlette
from starlette.routing import Mount
from mcp import types
from mcp.client.session import ClientSession
from mcp.client.streamable_http import streamable_http_client
from mcp.server import Server, ServerRequestContext
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
from mcp.types import TextContent, Tool
from tests.interaction.transports import StreamingASGITransport
# The in-process app is mounted at this origin purely so URLs are well-formed; nothing listens here.
+3 -2
View File
@@ -1,11 +1,12 @@
from collections.abc import Callable
import mcp_types as types
import pytest
from mcp_types import ListToolsResult
from mcp import Client, types
from mcp import Client
from mcp.server import Server, ServerRequestContext
from mcp.server.mcpserver import MCPServer
from mcp.types import ListToolsResult
from .conftest import StreamSpyCollection
+1 -1
View File
@@ -1,11 +1,11 @@
import pytest
from mcp_types import INVALID_REQUEST, ListRootsResult, Root, TextContent
from pydantic import FileUrl
from mcp import Client
from mcp.client import ClientRequestContext
from mcp.server.mcpserver import Context, MCPServer
from mcp.shared.exceptions import MCPError
from mcp.types import INVALID_REQUEST, ListRootsResult, Root, TextContent
@pytest.mark.anyio
+6 -5
View File
@@ -1,15 +1,16 @@
from typing import Literal
import mcp_types as types
import pytest
from mcp import Client, types
from mcp.server.mcpserver import Context, MCPServer
from mcp.shared.session import RequestResponder
from mcp.types import (
from mcp_types import (
LoggingMessageNotificationParams,
TextContent,
)
from mcp import Client
from mcp.server.mcpserver import Context, MCPServer
from mcp.shared.session import RequestResponder
class LoggingCollector:
def __init__(self):
+3 -2
View File
@@ -7,16 +7,17 @@ that don't follow SDK conventions.
import json
import httpx
import mcp_types as types
import pytest
from mcp_types import RootsListChangedNotification
from starlette.applications import Starlette
from starlette.requests import Request
from starlette.responses import JSONResponse, Response
from starlette.routing import Route
from mcp import ClientSession, MCPError, types
from mcp import ClientSession, MCPError
from mcp.client.streamable_http import streamable_http_client
from mcp.shared.session import RequestResponder
from mcp.types import RootsListChangedNotification
pytestmark = pytest.mark.anyio
@@ -2,10 +2,7 @@ import logging
from typing import Any
import pytest
from mcp import Client
from mcp.server import Server, ServerRequestContext
from mcp.types import (
from mcp_types import (
CallToolRequestParams,
CallToolResult,
ListToolsResult,
@@ -14,6 +11,9 @@ from mcp.types import (
Tool,
)
from mcp import Client
from mcp.server import Server, ServerRequestContext
def _make_server(
tools: list[Tool],

Some files were not shown because too many files have changed in this diff Show More