Skip to content

Commit f5d82bd

Browse files
committed
Remove helper types
The helper types in mcp.server.types got really confusioning during implementation as they overlapped with mcp.types. I now believe it is better if we stay more low level to the spec types. To do this, we now only use mcp.types everywhere. We renamed mcp.server.types to mcp.server.models and removed it to the absolute minimum.
1 parent 837309c commit f5d82bd

File tree

8 files changed

+40
-98
lines changed

8 files changed

+40
-98
lines changed

src/mcp/server/__init__.py

Lines changed: 14 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,18 @@
77
from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream
88
from pydantic import AnyUrl
99

10-
from mcp.server import types
10+
from mcp.server.models import InitializationOptions
1111
from mcp.server.session import ServerSession
1212
from mcp.server.stdio import stdio_server as stdio_server
1313
from mcp.shared.context import RequestContext
1414
from mcp.shared.session import RequestResponder
1515
from mcp.types import (
1616
METHOD_NOT_FOUND,
1717
CallToolRequest,
18+
GetPromptResult,
19+
GetPromptRequest,
20+
GetPromptResult,
21+
ImageContent,
1822
ClientNotification,
1923
ClientRequest,
2024
CompleteRequest,
@@ -84,7 +88,7 @@ def create_initialization_options(
8488
self,
8589
notification_options: NotificationOptions | None = None,
8690
experimental_capabilities: dict[str, dict[str, Any]] | None = None,
87-
) -> types.InitializationOptions:
91+
) -> InitializationOptions:
8892
"""Create initialization options from this server instance."""
8993

9094
def pkg_version(package: str) -> str:
@@ -99,7 +103,7 @@ def pkg_version(package: str) -> str:
99103

100104
return "unknown"
101105

102-
return types.InitializationOptions(
106+
return InitializationOptions(
103107
server_name=self.name,
104108
server_version=pkg_version("mcp"),
105109
capabilities=self.get_capabilities(
@@ -168,50 +172,16 @@ async def handler(_: Any):
168172
return decorator
169173

170174
def get_prompt(self):
171-
from mcp.types import (
172-
GetPromptRequest,
173-
GetPromptResult,
174-
ImageContent,
175-
)
176-
from mcp.types import (
177-
Role as Role,
178-
)
179-
180175
def decorator(
181176
func: Callable[
182-
[str, dict[str, str] | None], Awaitable[types.PromptResponse]
177+
[str, dict[str, str] | None], Awaitable[GetPromptResult]
183178
],
184179
):
185180
logger.debug("Registering handler for GetPromptRequest")
186181

187182
async def handler(req: GetPromptRequest):
188183
prompt_get = await func(req.params.name, req.params.arguments)
189-
messages: list[PromptMessage] = []
190-
for message in prompt_get.messages:
191-
match message.content:
192-
case str() as text_content:
193-
content = TextContent(type="text", text=text_content)
194-
case types.ImageContent() as img_content:
195-
content = ImageContent(
196-
type="image",
197-
data=img_content.data,
198-
mimeType=img_content.mime_type,
199-
)
200-
case types.EmbeddedResource() as resource:
201-
content = EmbeddedResource(
202-
type="resource", resource=resource.resource
203-
)
204-
case _:
205-
raise ValueError(
206-
f"Unexpected content type: {type(message.content)}"
207-
)
208-
209-
prompt_message = PromptMessage(role=message.role, content=content)
210-
messages.append(prompt_message)
211-
212-
return ServerResult(
213-
GetPromptResult(description=prompt_get.desc, messages=messages)
214-
)
184+
return ServerResult(prompt_get)
215185

216186
self.request_handlers[GetPromptRequest] = handler
217187
return func
@@ -338,7 +308,7 @@ def call_tool(self):
338308
def decorator(
339309
func: Callable[
340310
...,
341-
Awaitable[Sequence[str | types.ImageContent | types.EmbeddedResource]],
311+
Awaitable[Sequence[TextContent | ImageContent | EmbeddedResource]],
342312
],
343313
):
344314
logger.debug("Registering handler for CallToolRequest")
@@ -351,15 +321,15 @@ async def handler(req: CallToolRequest):
351321
match result:
352322
case str() as text:
353323
content.append(TextContent(type="text", text=text))
354-
case types.ImageContent() as img:
324+
case ImageContent() as img:
355325
content.append(
356326
ImageContent(
357327
type="image",
358328
data=img.data,
359-
mimeType=img.mime_type,
329+
mimeType=img.mimeType,
360330
)
361331
)
362-
case types.EmbeddedResource() as resource:
332+
case EmbeddedResource() as resource:
363333
content.append(
364334
EmbeddedResource(
365335
type="resource", resource=resource.resource
@@ -427,7 +397,7 @@ async def run(
427397
self,
428398
read_stream: MemoryObjectReceiveStream[JSONRPCMessage | Exception],
429399
write_stream: MemoryObjectSendStream[JSONRPCMessage],
430-
initialization_options: types.InitializationOptions,
400+
initialization_options: InitializationOptions,
431401
# When True, exceptions are returned as messages to the client.
432402
# When False, exceptions are raised, which will cause the server to shut down
433403
# but also make tracing exceptions much easier during testing and when using

src/mcp/server/__main__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from mcp.server.session import ServerSession
88
from mcp.server.stdio import stdio_server
9-
from mcp.server.types import InitializationOptions
9+
from mcp.server.models import InitializationOptions
1010
from mcp.types import ServerCapabilities
1111

1212
if not sys.warnoptions:

src/mcp/server/models.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"""
2+
This module provides simpler types to use with the server for managing prompts
3+
and tools.
4+
"""
5+
6+
from dataclasses import dataclass
7+
from typing import Literal
8+
9+
from pydantic import BaseModel
10+
11+
from mcp.types import (
12+
ServerCapabilities,
13+
)
14+
15+
16+
class InitializationOptions(BaseModel):
17+
server_name: str
18+
server_version: str
19+
capabilities: ServerCapabilities

src/mcp/server/session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream
77
from pydantic import AnyUrl
88

9-
from mcp.server.types import InitializationOptions
9+
from mcp.server.models import InitializationOptions
1010
from mcp.shared.session import (
1111
BaseSession,
1212
RequestResponder,

src/mcp/server/types.py

Lines changed: 0 additions & 46 deletions
This file was deleted.

tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from pydantic import AnyUrl
33

44
from mcp.server import Server
5-
from mcp.server.types import InitializationOptions
5+
from mcp.server.models import InitializationOptions
66
from mcp.types import Resource, ServerCapabilities
77

88
TEST_INITIALIZATION_OPTIONS = InitializationOptions(

tests/server/test_session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from mcp.client.session import ClientSession
55
from mcp.server import NotificationOptions, Server
66
from mcp.server.session import ServerSession
7-
from mcp.server.types import InitializationOptions
7+
from mcp.server.models import InitializationOptions
88
from mcp.types import (
99
ClientNotification,
1010
InitializedNotification,

uv.lock

Lines changed: 3 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)