Server initialize response update to last spec (add title, description) (#1634)

This commit is contained in:
Yann Jouanin 2026-01-06 22:34:08 +01:00 • committed by GitHub
commit 3863f203e9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 73 additions and 1 deletions

View file

@ -147,9 +147,12 @@ class FastMCP(Generic[LifespanResultT]):
def __init__( # noqa: PLR0913
self,
name: str | None = None,
title: str | None = None,
description: str | None = None,
instructions: str | None = None,
website_url: str | None = None,
icons: list[Icon] | None = None,
version: str | None = None,
auth_server_provider: (OAuthAuthorizationServerProvider[Any, Any, Any] | None) = None,
token_verifier: TokenVerifier | None = None,
event_store: EventStore | None = None,
@ -204,9 +207,12 @@ class FastMCP(Generic[LifespanResultT]):
self._mcp_server = MCPServer(
name=name or "FastMCP",
title=title,
description=description,
instructions=instructions,
website_url=website_url,
icons=icons,
version=version,
# TODO(Marcelo): It seems there's a type mismatch between the lifespan type from an FastMCP and Server.
# We need to create a Lifespan type that is a generic on the server type, like Starlette does.
lifespan=(lifespan_wrapper(self, self.settings.lifespan) if self.settings.lifespan else default_lifespan), # type: ignore
@ -245,6 +251,14 @@ class FastMCP(Generic[LifespanResultT]):
def name(self) -> str:
return self._mcp_server.name
@property
def title(self) -> str | None:
return self._mcp_server.title
@property
def description(self) -> str | None:
return self._mcp_server.description
@property
def instructions(self) -> str | None:
return self._mcp_server.instructions
@ -257,6 +271,10 @@ class FastMCP(Generic[LifespanResultT]):
def icons(self) -> list[Icon] | None:
return self._mcp_server.icons
@property
def version(self) -> str | None:
return self._mcp_server.version
@property
def session_manager(self) -> StreamableHTTPSessionManager:
"""Get the StreamableHTTP session manager.

View file

@ -139,6 +139,8 @@ class Server(Generic[LifespanResultT, RequestT]):
self,
name: str,
version: str | None = None,
title: str | None = None,
description: str | None = None,
instructions: str | None = None,
website_url: str | None = None,
icons: list[types.Icon] | None = None,
@ -149,6 +151,8 @@ class Server(Generic[LifespanResultT, RequestT]):
):
self.name = name
self.version = version
self.title = title
self.description = description
self.instructions = instructions
self.website_url = website_url
self.icons = icons
@ -181,6 +185,8 @@ class Server(Generic[LifespanResultT, RequestT]):
return InitializationOptions(
server_name=self.name,
server_version=self.version if self.version else pkg_version("mcp"),
title=self.title,
description=self.description,
capabilities=self.get_capabilities(
notification_options or NotificationOptions(),
experimental_capabilities or {},

View file

@ -14,6 +14,8 @@ from mcp.types import (
class InitializationOptions(BaseModel):
server_name: str
server_version: str
title: str | None = None
description: str | None = None
capabilities: ServerCapabilities
instructions: str | None = None
website_url: str | None = None

View file

@ -178,6 +178,8 @@ class ServerSession(
capabilities=self._init_options.capabilities,
serverInfo=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,
icons=self._init_options.icons,

View file

@ -249,6 +249,12 @@ class Implementation(BaseMetadata):
version: str
title: str | None = None
"""An optional human-readable title for this implementation."""
description: str | None = None
"""An optional human-readable description of what this implementation does."""
websiteUrl: str | None = None
"""An optional URL of the website for this implementation."""