refactor: use snake case instead of camel case in types (#1894)

This commit is contained in:
Marcelo Trylesinski 2026-01-16 15:51:27 +01:00 • committed by GitHub
commit e94b386a13
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
33 changed files with 1063 additions and 1057 deletions

View file

@ -225,7 +225,7 @@ class ExperimentalTaskHandlers:
requests_capability: types.ClientTasksRequestsCapability | None = None
if has_sampling or has_elicitation:
requests_capability = types.ClientTasksRequestsCapability(
sampling=types.TasksSamplingCapability(createMessage=types.TasksCreateMessageCapability())
sampling=types.TasksSamplingCapability(create_message=types.TasksCreateMessageCapability())
if has_sampling
else None,
elicitation=types.TasksElicitationCapability(create=types.TasksCreateElicitationCapability())

View file

@ -8,7 +8,7 @@ WARNING: These APIs are experimental and may change without notice.
Example:
# Call a tool as a task
result = await session.experimental.call_tool_as_task("tool_name", {"arg": "value"})
task_id = result.task.taskId
task_id = result.task.task_id
# Get task status
status = await session.experimental.get_task(task_id)
@ -77,7 +77,7 @@ class ExperimentalClientFeatures:
result = await session.experimental.call_tool_as_task(
"long_running_tool", {"input": "data"}
)
task_id = result.task.taskId
task_id = result.task.task_id
# Poll for completion
while True:
@ -120,7 +120,7 @@ class ExperimentalClientFeatures:
return await self._session.send_request(
types.ClientRequest(
types.GetTaskRequest(
params=types.GetTaskRequestParams(taskId=task_id),
params=types.GetTaskRequestParams(task_id=task_id),
)
),
types.GetTaskResult,
@ -148,7 +148,7 @@ class ExperimentalClientFeatures:
return await self._session.send_request(
types.ClientRequest(
types.GetTaskPayloadRequest(
params=types.GetTaskPayloadRequestParams(taskId=task_id),
params=types.GetTaskPayloadRequestParams(task_id=task_id),
)
),
result_type,
@ -188,7 +188,7 @@ class ExperimentalClientFeatures:
return await self._session.send_request(
types.ClientRequest(
types.CancelTaskRequest(
params=types.CancelTaskRequestParams(taskId=task_id),
params=types.CancelTaskRequestParams(task_id=task_id),
)
),
types.CancelTaskResult,

View file

@ -161,7 +161,7 @@ class ClientSession(
# TODO: Should this be based on whether we
# _will_ send notifications, or only whether
# they're supported?
types.RootsCapability(listChanged=True)
types.RootsCapability(list_changed=True)
if self._list_roots_callback is not _default_list_roots_callback
else None
)
@ -170,7 +170,7 @@ class ClientSession(
types.ClientRequest(
types.InitializeRequest(
params=types.InitializeRequestParams(
protocolVersion=types.LATEST_PROTOCOL_VERSION,
protocol_version=types.LATEST_PROTOCOL_VERSION,
capabilities=types.ClientCapabilities(
sampling=sampling,
elicitation=elicitation,
@ -178,15 +178,15 @@ class ClientSession(
roots=roots,
tasks=self._task_handlers.build_capability(),
),
clientInfo=self._client_info,
client_info=self._client_info,
),
)
),
types.InitializeResult,
)
if result.protocolVersion not in SUPPORTED_PROTOCOL_VERSIONS:
raise RuntimeError(f"Unsupported protocol version from the server: {result.protocolVersion}")
if result.protocol_version not in SUPPORTED_PROTOCOL_VERSIONS:
raise RuntimeError(f"Unsupported protocol version from the server: {result.protocol_version}")
self._server_capabilities = result.capabilities
@ -235,7 +235,7 @@ class ClientSession(
types.ClientNotification(
types.ProgressNotification(
params=types.ProgressNotificationParams(
progressToken=progress_token,
progress_token=progress_token,
progress=progress,
total=total,
message=message,
@ -326,7 +326,7 @@ class ClientSession(
progress_callback=progress_callback,
)
if not result.isError:
if not result.is_error:
await self._validate_tool_result(name, result)
return result
@ -346,12 +346,12 @@ class ClientSession(
if output_schema is not None:
from jsonschema import SchemaError, ValidationError, validate
if result.structuredContent is None:
if result.structured_content is None:
raise RuntimeError(
f"Tool {name} has an output schema but did not return structured content"
) # pragma: no cover
try:
validate(result.structuredContent, output_schema)
validate(result.structured_content, output_schema)
except ValidationError as e:
raise RuntimeError(f"Invalid structured content returned by tool {name}: {e}") # pragma: no cover
except SchemaError as e: # pragma: no cover
@ -418,7 +418,7 @@ class ClientSession(
# Cache tool output schemas for future validation
# Note: don't clear the cache, as we may be using a cursor
for tool in result.tools:
self._tool_output_schemas[tool.name] = tool.outputSchema
self._tool_output_schemas[tool.name] = tool.output_schema
return result

View file

@ -119,9 +119,9 @@ class ClientSessionGroup:
_exit_stack: contextlib.AsyncExitStack
_session_exit_stacks: dict[mcp.ClientSession, contextlib.AsyncExitStack]
# Optional fn consuming (component_name, serverInfo) for custom names.
# Optional fn consuming (component_name, server_info) for custom names.
# This is provide a means to mitigate naming conflicts across servers.
# Example: (tool_name, serverInfo) => "{result.serverInfo.name}.{tool_name}"
# Example: (tool_name, server_info) => "{result.server_info.name}.{tool_name}"
_ComponentNameHook: TypeAlias = Callable[[str, types.Implementation], str]
_component_name_hook: _ComponentNameHook | None
@ -324,7 +324,7 @@ class ClientSessionGroup:
# main _exit_stack.
await self._exit_stack.enter_async_context(session_stack)
return result.serverInfo, session
return result.server_info, session
except Exception: # pragma: no cover
# If anything during this setup fails, ensure the session-specific
# stack is closed.

View file

@ -110,7 +110,7 @@ async def sse_client(
continue
try:
message = types.JSONRPCMessage.model_validate_json( # noqa: E501
sse.data
sse.data, by_name=False
)
logger.debug(f"Received server message: {message}")
except Exception as exc: # pragma: no cover

View file

@ -152,7 +152,7 @@ async def stdio_client(server: StdioServerParameters, errlog: TextIO = sys.stder
for line in lines:
try:
message = types.JSONRPCMessage.model_validate_json(line)
message = types.JSONRPCMessage.model_validate_json(line, by_name=False)
except Exception as exc: # pragma: no cover
logger.exception("Failed to parse JSONRPC message from server")
await read_stream_writer.send(exc)

View file

@ -113,8 +113,8 @@ class StreamableHTTPTransport:
if isinstance(message.root, JSONRPCResponse) and message.root.result: # pragma: no branch
try:
# Parse the result as InitializeResult for type safety
init_result = InitializeResult.model_validate(message.root.result)
self.protocol_version = str(init_result.protocolVersion)
init_result = InitializeResult.model_validate(message.root.result, by_name=False)
self.protocol_version = str(init_result.protocol_version)
logger.info(f"Negotiated protocol version: {self.protocol_version}")
except Exception: # pragma: no cover
logger.warning("Failed to parse initialization response as InitializeResult", exc_info=True)
@ -137,7 +137,7 @@ class StreamableHTTPTransport:
await resumption_callback(sse.id)
return False
try:
message = JSONRPCMessage.model_validate_json(sse.data)
message = JSONRPCMessage.model_validate_json(sse.data, by_name=False)
logger.debug(f"SSE message: {message}")
# Extract protocol version from initialization response
@ -291,7 +291,7 @@ class StreamableHTTPTransport:
"""Handle JSON response from the server."""
try:
content = await response.aread()
message = JSONRPCMessage.model_validate_json(content)
message = JSONRPCMessage.model_validate_json(content, by_name=False)
# Extract protocol version from initialization response
if is_initialization:

View file

@ -53,7 +53,7 @@ async def websocket_client(
async with read_stream_writer:
async for raw_text in ws:
try:
message = types.JSONRPCMessage.model_validate_json(raw_text)
message = types.JSONRPCMessage.model_validate_json(raw_text, by_name=False)
session_message = SessionMessage(message)
await read_stream_writer.send(session_message)
except ValidationError as exc: # pragma: no cover

View file

@ -125,7 +125,7 @@ async def elicit_with_validation(
result = await session.elicit_form(
message=message,
requestedSchema=json_schema,
requested_schema=json_schema,
related_request_id=related_request_id,
)

View file

@ -122,7 +122,7 @@ class Experimental:
Returns:
None if valid, ErrorData if invalid and raise_error=False
"""
mode = tool.execution.taskSupport if tool.execution else None
mode = tool.execution.task_support if tool.execution else None
return self.validate_task_mode(mode, raise_error=raise_error)
def can_use_tool(self, tool_task_mode: TaskExecutionMode | None) -> bool:

View file

@ -52,7 +52,7 @@ class ExperimentalServerSessionFeatures:
GetTaskResult containing the task status
"""
return await self._session.send_request(
types.ServerRequest(types.GetTaskRequest(params=types.GetTaskRequestParams(taskId=task_id))),
types.ServerRequest(types.GetTaskRequest(params=types.GetTaskRequestParams(task_id=task_id))),
types.GetTaskResult,
)
@ -72,7 +72,7 @@ class ExperimentalServerSessionFeatures:
The task result, validated against result_type
"""
return await self._session.send_request(
types.ServerRequest(types.GetTaskPayloadRequest(params=types.GetTaskPayloadRequestParams(taskId=task_id))),
types.ServerRequest(types.GetTaskPayloadRequest(params=types.GetTaskPayloadRequestParams(task_id=task_id))),
result_type,
)
@ -97,7 +97,7 @@ class ExperimentalServerSessionFeatures:
async def elicit_as_task(
self,
message: str,
requestedSchema: types.ElicitRequestedSchema,
requested_schema: types.ElicitRequestedSchema,
*,
ttl: int = 60000,
) -> types.ElicitResult:
@ -113,7 +113,7 @@ class ExperimentalServerSessionFeatures:
Args:
message: The message to present to the user
requestedSchema: Schema defining the expected response
requested_schema: Schema defining the expected response
ttl: Task time-to-live in milliseconds
Returns:
@ -130,7 +130,7 @@ class ExperimentalServerSessionFeatures:
types.ElicitRequest(
params=types.ElicitRequestFormParams(
message=message,
requestedSchema=requestedSchema,
requested_schema=requested_schema,
task=types.TaskMetadata(ttl=ttl),
)
)
@ -138,7 +138,7 @@ class ExperimentalServerSessionFeatures:
types.CreateTaskResult,
)
task_id = create_result.task.taskId
task_id = create_result.task.task_id
async for _ in self.poll_task(task_id):
pass
@ -196,15 +196,15 @@ class ExperimentalServerSessionFeatures:
types.CreateMessageRequest(
params=types.CreateMessageRequestParams(
messages=messages,
maxTokens=max_tokens,
systemPrompt=system_prompt,
includeContext=include_context,
max_tokens=max_tokens,
system_prompt=system_prompt,
include_context=include_context,
temperature=temperature,
stopSequences=stop_sequences,
stop_sequences=stop_sequences,
metadata=metadata,
modelPreferences=model_preferences,
model_preferences=model_preferences,
tools=tools,
toolChoice=tool_choice,
tool_choice=tool_choice,
task=types.TaskMetadata(ttl=ttl),
)
)
@ -212,7 +212,7 @@ class ExperimentalServerSessionFeatures:
types.CreateTaskResult,
)
task_id = create_result.task.taskId
task_id = create_result.task.task_id
async for _ in self.poll_task(task_id):
pass

View file

@ -65,7 +65,7 @@ class ServerTaskContext:
result = await task.elicit(
message="Continue?",
requestedSchema={"type": "object", "properties": {"ok": {"type": "boolean"}}}
requested_schema={"type": "object", "properties": {"ok": {"type": "boolean"}}}
)
if result.content.get("ok"):
@ -165,13 +165,13 @@ class ServerTaskContext:
ServerNotification(
TaskStatusNotification(
params=TaskStatusNotificationParams(
taskId=task.taskId,
task_id=task.task_id,
status=task.status,
statusMessage=task.statusMessage,
createdAt=task.createdAt,
lastUpdatedAt=task.lastUpdatedAt,
status_message=task.status_message,
created_at=task.created_at,
last_updated_at=task.last_updated_at,
ttl=task.ttl,
pollInterval=task.pollInterval,
poll_interval=task.poll_interval,
)
)
)
@ -202,7 +202,7 @@ class ServerTaskContext:
async def elicit(
self,
message: str,
requestedSchema: ElicitRequestedSchema,
requested_schema: ElicitRequestedSchema,
) -> ElicitResult:
"""
Send an elicitation request via the task message queue.
@ -217,7 +217,7 @@ class ServerTaskContext:
Args:
message: The message to present to the user
requestedSchema: Schema defining the expected response structure
requested_schema: Schema defining the expected response structure
Returns:
The client's response
@ -236,7 +236,7 @@ class ServerTaskContext:
# Build the request using session's helper
request = self._session._build_elicit_form_request( # pyright: ignore[reportPrivateUsage]
message=message,
requestedSchema=requestedSchema,
requested_schema=requested_schema,
related_task_id=self.task_id,
)
request_id: RequestId = request.id
@ -430,7 +430,7 @@ class ServerTaskContext:
async def elicit_as_task(
self,
message: str,
requestedSchema: ElicitRequestedSchema,
requested_schema: ElicitRequestedSchema,
*,
ttl: int = 60000,
) -> ElicitResult:
@ -444,7 +444,7 @@ class ServerTaskContext:
Args:
message: The message to present to the user
requestedSchema: Schema defining the expected response structure
requested_schema: Schema defining the expected response structure
ttl: Task time-to-live in milliseconds for the client's task
Returns:
@ -465,7 +465,7 @@ class ServerTaskContext:
request = self._session._build_elicit_form_request( # pyright: ignore[reportPrivateUsage]
message=message,
requestedSchema=requestedSchema,
requested_schema=requested_schema,
related_task_id=self.task_id,
task=TaskMetadata(ttl=ttl),
)
@ -486,7 +486,7 @@ class ServerTaskContext:
# Wait for initial response (CreateTaskResult from client)
response_data = await resolver.wait()
create_result = CreateTaskResult.model_validate(response_data)
client_task_id = create_result.task.taskId
client_task_id = create_result.task.task_id
# Poll the client's task using session.experimental
async for _ in self._session.experimental.poll_task(client_task_id):
@ -592,7 +592,7 @@ class ServerTaskContext:
# Wait for initial response (CreateTaskResult from client)
response_data = await resolver.wait()
create_result = CreateTaskResult.model_validate(response_data)
client_task_id = create_result.task.taskId
client_task_id = create_result.task.task_id
# Poll the client's task using session.experimental
async for _ in self._session.experimental.poll_task(client_task_id):

View file

@ -106,7 +106,7 @@ class TaskResultHandler:
Returns:
GetTaskPayloadResult with the task's final payload
"""
task_id = request.params.taskId
task_id = request.params.task_id
while True:
task = await self._store.get_task(task_id)
@ -126,7 +126,7 @@ class TaskResultHandler:
# GetTaskPayloadResult is a Result with extra="allow"
# The stored result contains the actual payload data
# Per spec: tasks/result MUST include _meta with related-task metadata
related_task = RelatedTaskMetadata(taskId=task_id)
related_task = RelatedTaskMetadata(task_id=task_id)
related_task_meta: dict[str, Any] = {RELATED_TASK_METADATA_KEY: related_task.model_dump(by_alias=True)}
if result is not None:
result_data = result.model_dump(by_alias=True)

View file

@ -305,8 +305,8 @@ class FastMCP(Generic[LifespanResultT]):
name=info.name,
title=info.title,
description=info.description,
inputSchema=info.parameters,
outputSchema=info.output_schema,
input_schema=info.parameters,
output_schema=info.output_schema,
annotations=info.annotations,
icons=info.icons,
_meta=info.meta,
@ -340,7 +340,7 @@ class FastMCP(Generic[LifespanResultT]):
name=resource.name or "",
title=resource.title,
description=resource.description,
mimeType=resource.mime_type,
mime_type=resource.mime_type,
icons=resource.icons,
annotations=resource.annotations,
_meta=resource.meta,
@ -352,11 +352,11 @@ class FastMCP(Generic[LifespanResultT]):
templates = self._resource_manager.list_templates()
return [
MCPResourceTemplate(
uriTemplate=template.uri_template,
uri_template=template.uri_template,
name=template.name,
title=template.title,
description=template.description,
mimeType=template.mime_type,
mime_type=template.mime_type,
icons=template.icons,
annotations=template.annotations,
_meta=template.meta,
@ -1104,7 +1104,7 @@ class Context(BaseModel, Generic[ServerSessionT, LifespanContextT, RequestT]):
total: Optional total value e.g. 100
message: Optional message e.g. Starting render...
"""
progress_token = self.request_context.meta.progressToken if self.request_context.meta else None
progress_token = self.request_context.meta.progress_token if self.request_context.meta else None
if progress_token is None: # pragma: no cover
return

View file

@ -113,7 +113,7 @@ class FuncMetadata(BaseModel):
if isinstance(result, CallToolResult):
if self.output_schema is not None:
assert self.output_model is not None, "Output model must be set if output schema is defined"
self.output_model.model_validate(result.structuredContent)
self.output_model.model_validate(result.structured_content)
return result
unstructured_content = _convert_to_content(result)

View file

@ -51,7 +51,7 @@ class Image:
else: # pragma: no cover
raise ValueError("No image data available")
return ImageContent(type="image", data=data, mimeType=self._mime_type)
return ImageContent(type="image", data=data, mime_type=self._mime_type)
class Audio:
@ -98,4 +98,4 @@ class Audio:
else: # pragma: no cover
raise ValueError("No audio data available")
return AudioContent(type="audio", data=data, mimeType=self._mime_type)
return AudioContent(type="audio", data=data, mime_type=self._mime_type)

View file

@ -134,23 +134,23 @@ class ExperimentalHandlers:
if GetTaskRequest not in self._request_handlers:
async def _default_get_task(req: GetTaskRequest) -> ServerResult:
task = await support.store.get_task(req.params.taskId)
task = await support.store.get_task(req.params.task_id)
if task is None:
raise McpError(
ErrorData(
code=INVALID_PARAMS,
message=f"Task not found: {req.params.taskId}",
message=f"Task not found: {req.params.task_id}",
)
)
return ServerResult(
GetTaskResult(
taskId=task.taskId,
task_id=task.task_id,
status=task.status,
statusMessage=task.statusMessage,
createdAt=task.createdAt,
lastUpdatedAt=task.lastUpdatedAt,
status_message=task.status_message,
created_at=task.created_at,
last_updated_at=task.last_updated_at,
ttl=task.ttl,
pollInterval=task.pollInterval,
poll_interval=task.poll_interval,
)
)
@ -172,7 +172,7 @@ class ExperimentalHandlers:
async def _default_list_tasks(req: ListTasksRequest) -> ServerResult:
cursor = req.params.cursor if req.params else None
tasks, next_cursor = await support.store.list_tasks(cursor)
return ServerResult(ListTasksResult(tasks=tasks, nextCursor=next_cursor))
return ServerResult(ListTasksResult(tasks=tasks, next_cursor=next_cursor))
self._request_handlers[ListTasksRequest] = _default_list_tasks
@ -180,7 +180,7 @@ class ExperimentalHandlers:
if CancelTaskRequest not in self._request_handlers:
async def _default_cancel_task(req: CancelTaskRequest) -> ServerResult:
result = await cancel_task(support.store, req.params.taskId)
result = await cancel_task(support.store, req.params.task_id)
return ServerResult(result)
self._request_handlers[CancelTaskRequest] = _default_cancel_task

View file

@ -209,17 +209,17 @@ class Server(Generic[LifespanResultT, RequestT]):
# Set prompt capabilities if handler exists
if types.ListPromptsRequest in self.request_handlers:
prompts_capability = types.PromptsCapability(listChanged=notification_options.prompts_changed)
prompts_capability = types.PromptsCapability(list_changed=notification_options.prompts_changed)
# Set resource capabilities if handler exists
if types.ListResourcesRequest in self.request_handlers:
resources_capability = types.ResourcesCapability(
subscribe=False, listChanged=notification_options.resources_changed
subscribe=False, list_changed=notification_options.resources_changed
)
# Set tool capabilities if handler exists
if types.ListToolsRequest in self.request_handlers:
tools_capability = types.ToolsCapability(listChanged=notification_options.tools_changed)
tools_capability = types.ToolsCapability(list_changed=notification_options.tools_changed)
# Set logging capabilities if handler exists
if types.SetLevelRequest in self.request_handlers: # pragma: no cover
@ -327,7 +327,7 @@ class Server(Generic[LifespanResultT, RequestT]):
async def handler(_: Any):
templates = await func()
return types.ServerResult(types.ListResourceTemplatesResult(resourceTemplates=templates))
return types.ServerResult(types.ListResourceTemplatesResult(resource_templates=templates))
self.request_handlers[types.ListResourceTemplatesRequest] = handler
return func
@ -351,14 +351,14 @@ class Server(Generic[LifespanResultT, RequestT]):
return types.TextResourceContents(
uri=req.params.uri,
text=data,
mimeType=mime_type or "text/plain",
mime_type=mime_type or "text/plain",
**meta_kwargs,
)
case bytes() as data: # pragma: no cover
return types.BlobResourceContents(
uri=req.params.uri,
blob=base64.b64encode(data).decode(),
mimeType=mime_type or "application/octet-stream",
mime_type=mime_type or "application/octet-stream",
**meta_kwargs,
)
@ -474,7 +474,7 @@ class Server(Generic[LifespanResultT, RequestT]):
return types.ServerResult(
types.CallToolResult(
content=[types.TextContent(type="text", text=error_message)],
isError=True,
is_error=True,
)
)
@ -532,7 +532,7 @@ class Server(Generic[LifespanResultT, RequestT]):
# input validation
if validate_input and tool:
try:
jsonschema.validate(instance=arguments, schema=tool.inputSchema)
jsonschema.validate(instance=arguments, schema=tool.input_schema)
except jsonschema.ValidationError as e:
return self._make_error_result(f"Input validation error: {e.message}")
@ -562,14 +562,14 @@ class Server(Generic[LifespanResultT, RequestT]):
return self._make_error_result(f"Unexpected return type from tool: {type(results).__name__}")
# output validation
if tool and tool.outputSchema is not None:
if tool and tool.output_schema is not None:
if maybe_structured_content is None:
return self._make_error_result(
"Output validation error: outputSchema defined but no structured output returned"
)
else:
try:
jsonschema.validate(instance=maybe_structured_content, schema=tool.outputSchema)
jsonschema.validate(instance=maybe_structured_content, schema=tool.output_schema)
except jsonschema.ValidationError as e:
return self._make_error_result(f"Output validation error: {e.message}")
@ -577,8 +577,8 @@ class Server(Generic[LifespanResultT, RequestT]):
return types.ServerResult(
types.CallToolResult(
content=list(unstructured_content),
structuredContent=maybe_structured_content,
isError=False,
structured_content=maybe_structured_content,
is_error=False,
)
)
except UrlElicitationRequiredError:
@ -601,7 +601,7 @@ class Server(Generic[LifespanResultT, RequestT]):
async def handler(req: types.ProgressNotification):
await func(
req.params.progressToken,
req.params.progress_token,
req.params.progress,
req.params.total,
req.params.message,
@ -633,7 +633,7 @@ class Server(Generic[LifespanResultT, RequestT]):
types.CompleteResult(
completion=completion
if completion is not None
else types.Completion(values=[], total=None, hasMore=None),
else types.Completion(values=[], total=None, has_more=None),
)
)

View file

@ -129,7 +129,7 @@ class ServerSession(
if capability.roots is not None:
if client_caps.roots is None:
return False
if capability.roots.listChanged and not client_caps.roots.listChanged:
if capability.roots.list_changed and not client_caps.roots.list_changed:
return False
if capability.sampling is not None:
@ -165,23 +165,23 @@ class ServerSession(
async def _received_request(self, responder: RequestResponder[types.ClientRequest, types.ServerResult]):
match responder.request.root:
case types.InitializeRequest(params=params):
requested_version = params.protocolVersion
requested_version = params.protocol_version
self._initialization_state = InitializationState.Initializing
self._client_params = params
with responder:
await responder.respond(
types.ServerResult(
types.InitializeResult(
protocolVersion=requested_version
protocol_version=requested_version
if requested_version in SUPPORTED_PROTOCOL_VERSIONS
else types.LATEST_PROTOCOL_VERSION,
capabilities=self._init_options.capabilities,
serverInfo=types.Implementation(
server_info=types.Implementation(
name=self._init_options.server_name,
title=self._init_options.title,
description=self._init_options.description,
version=self._init_options.server_version,
websiteUrl=self._init_options.website_url,
website_url=self._init_options.website_url,
icons=self._init_options.icons,
),
instructions=self._init_options.instructions,
@ -327,15 +327,15 @@ class ServerSession(
types.CreateMessageRequest(
params=types.CreateMessageRequestParams(
messages=messages,
systemPrompt=system_prompt,
includeContext=include_context,
system_prompt=system_prompt,
include_context=include_context,
temperature=temperature,
maxTokens=max_tokens,
stopSequences=stop_sequences,
max_tokens=max_tokens,
stop_sequences=stop_sequences,
metadata=metadata,
modelPreferences=model_preferences,
model_preferences=model_preferences,
tools=tools,
toolChoice=tool_choice,
tool_choice=tool_choice,
),
)
)
@ -366,14 +366,14 @@ class ServerSession(
async def elicit(
self,
message: str,
requestedSchema: types.ElicitRequestedSchema,
requested_schema: types.ElicitRequestedSchema,
related_request_id: types.RequestId | None = None,
) -> types.ElicitResult:
"""Send a form mode elicitation/create request.
Args:
message: The message to present to the user
requestedSchema: Schema defining the expected response structure
requested_schema: Schema defining the expected response structure
related_request_id: Optional ID of the request that triggered this elicitation
Returns:
@ -383,19 +383,19 @@ class ServerSession(
This method is deprecated in favor of elicit_form(). It remains for
backward compatibility but new code should use elicit_form().
"""
return await self.elicit_form(message, requestedSchema, related_request_id)
return await self.elicit_form(message, requested_schema, related_request_id)
async def elicit_form(
self,
message: str,
requestedSchema: types.ElicitRequestedSchema,
requested_schema: types.ElicitRequestedSchema,
related_request_id: types.RequestId | None = None,
) -> types.ElicitResult:
"""Send a form mode elicitation/create request.
Args:
message: The message to present to the user
requestedSchema: Schema defining the expected response structure
requested_schema: Schema defining the expected response structure
related_request_id: Optional ID of the request that triggered this elicitation
Returns:
@ -411,7 +411,7 @@ class ServerSession(
types.ElicitRequest(
params=types.ElicitRequestFormParams(
message=message,
requestedSchema=requestedSchema,
requested_schema=requested_schema,
),
)
),
@ -451,7 +451,7 @@ class ServerSession(
params=types.ElicitRequestURLParams(
message=message,
url=url,
elicitationId=elicitation_id,
elicitation_id=elicitation_id,
),
)
),
@ -479,7 +479,7 @@ class ServerSession(
types.ServerNotification(
types.ProgressNotification(
params=types.ProgressNotificationParams(
progressToken=progress_token,
progress_token=progress_token,
progress=progress,
total=total,
message=message,
@ -519,7 +519,7 @@ class ServerSession(
await self.send_notification(
types.ServerNotification(
types.ElicitCompleteNotification(
params=types.ElicitCompleteNotificationParams(elicitationId=elicitation_id)
params=types.ElicitCompleteNotificationParams(elicitation_id=elicitation_id)
)
),
related_request_id,
@ -528,7 +528,7 @@ class ServerSession(
def _build_elicit_form_request(
self,
message: str,
requestedSchema: types.ElicitRequestedSchema,
requested_schema: types.ElicitRequestedSchema,
related_task_id: str | None = None,
task: types.TaskMetadata | None = None,
) -> types.JSONRPCRequest:
@ -536,7 +536,7 @@ class ServerSession(
Args:
message: The message to present to the user
requestedSchema: Schema defining the expected response structure
requested_schema: Schema defining the expected response structure
related_task_id: If provided, adds io.modelcontextprotocol/related-task metadata
task: If provided, makes this a task-augmented request
@ -545,7 +545,7 @@ class ServerSession(
"""
params = types.ElicitRequestFormParams(
message=message,
requestedSchema=requestedSchema,
requested_schema=requested_schema,
task=task,
)
params_data = params.model_dump(by_alias=True, mode="json", exclude_none=True)
@ -556,7 +556,7 @@ class ServerSession(
if "_meta" not in params_data: # pragma: no cover
params_data["_meta"] = {}
params_data["_meta"][RELATED_TASK_METADATA_KEY] = types.RelatedTaskMetadata(
taskId=related_task_id
task_id=related_task_id
).model_dump(by_alias=True)
request_id = f"task-{related_task_id}-{id(params)}" if related_task_id else self._request_id
@ -591,7 +591,7 @@ class ServerSession(
params = types.ElicitRequestURLParams(
message=message,
url=url,
elicitationId=elicitation_id,
elicitation_id=elicitation_id,
)
params_data = params.model_dump(by_alias=True, mode="json", exclude_none=True)
@ -601,7 +601,7 @@ class ServerSession(
if "_meta" not in params_data: # pragma: no cover
params_data["_meta"] = {}
params_data["_meta"][RELATED_TASK_METADATA_KEY] = types.RelatedTaskMetadata(
taskId=related_task_id
task_id=related_task_id
).model_dump(by_alias=True)
request_id = f"task-{related_task_id}-{id(params)}" if related_task_id else self._request_id
@ -652,15 +652,15 @@ class ServerSession(
"""
params = types.CreateMessageRequestParams(
messages=messages,
systemPrompt=system_prompt,
includeContext=include_context,
system_prompt=system_prompt,
include_context=include_context,
temperature=temperature,
maxTokens=max_tokens,
stopSequences=stop_sequences,
max_tokens=max_tokens,
stop_sequences=stop_sequences,
metadata=metadata,
modelPreferences=model_preferences,
model_preferences=model_preferences,
tools=tools,
toolChoice=tool_choice,
tool_choice=tool_choice,
task=task,
)
params_data = params.model_dump(by_alias=True, mode="json", exclude_none=True)
@ -671,7 +671,7 @@ class ServerSession(
if "_meta" not in params_data: # pragma: no cover
params_data["_meta"] = {}
params_data["_meta"][RELATED_TASK_METADATA_KEY] = types.RelatedTaskMetadata(
taskId=related_task_id
task_id=related_task_id
).model_dump(by_alias=True)
request_id = f"task-{related_task_id}-{id(params)}" if related_task_id else self._request_id

View file

@ -231,7 +231,7 @@ class SseServerTransport:
logger.debug(f"Received JSON: {body}")
try:
message = types.JSONRPCMessage.model_validate_json(body)
message = types.JSONRPCMessage.model_validate_json(body, by_name=False)
logger.debug(f"Validated client message: {message}")
except ValidationError as err:
logger.exception("Failed to parse message")

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