Files

45 lines
1.6 KiB
Python

"""Serve over Streamable HTTP with JSON responses (lowlevel API)."""
from typing import Any
from starlette.applications import Starlette
import mcp.types as types
from mcp.server.context import ServerRequestContext
from mcp.server.lowlevel import Server
from stories._hosting import NO_DNS_REBIND, run_app_from_args
GREET_INPUT_SCHEMA: dict[str, Any] = {
"type": "object",
"properties": {"name": {"type": "string"}},
"required": ["name"],
}
def build_app() -> Starlette:
async def list_tools(
ctx: ServerRequestContext[Any], params: types.PaginatedRequestParams | None
) -> types.ListToolsResult:
return types.ListToolsResult(
tools=[
types.Tool(
name="greet",
description="Report progress mid-call, then return a greeting.",
input_schema=GREET_INPUT_SCHEMA,
)
]
)
async def call_tool(ctx: ServerRequestContext[Any], params: types.CallToolRequestParams) -> types.CallToolResult:
assert params.name == "greet" and params.arguments is not None
await ctx.session.report_progress(0.5, total=1.0, message="halfway")
text = f"Hello, {params.arguments['name']}!"
return types.CallToolResult(content=[types.TextContent(text=text)], structured_content={"result": text})
server = Server("json-response-example", on_list_tools=list_tools, on_call_tool=call_tool)
return server.streamable_http_app(json_response=True, transport_security=NO_DNS_REBIND)
if __name__ == "__main__":
run_app_from_args(build_app)