feat(mcp): port the server to MCP Python SDK v2 (FastMCP → MCPServer) (#2196)
CI & Build / Python lint (push) Successful in 4s
CI & Build / Plugin hooks (push) Successful in 13s
CI & Build / TypeScript typecheck (push) Successful in 54s
CI & Build / integration (push) Successful in 53s
CI & Build / Python tests (push) Successful in 1m37s
CI & Build / Build & push image (push) Successful in 31s

- server.py: `mcp.server.mcpserver.MCPServer`; StrictArgsFastMCP becomes
  StrictArgsMCPServer, whose call_tool takes and forwards v2's `context`
  and raises ToolError (the SDK logs anything else as an unexpected crash;
  the message reaches the caller either way).
- stateless_http and transport_security moved from the constructor to
  `streamable_http_app(...)` in mount_mcp, with their reasons.
- Per-request user identity is unchanged: the contextvar set around the
  ASGI call reaches the handler on both v2 paths (legacy stateless spawns
  from the request task; the 2026-07-28 modern path opens its task group
  inside the request).
- pyproject: mcp[cli]>=2.2, no ceiling (installs are --locked). uv.lock
  regenerated with --upgrade-package mcp in the ci-python image: only mcp
  and its own dependencies moved (106 → 110 packages).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-24 07:21:27 -04:00
co-authored by Claude Opus 5.5
parent 4502f0a1ae
commit c26b7f248e
9 changed files with 153 additions and 95 deletions
+6 -5
View File
@@ -19,11 +19,12 @@ dependencies = [
"caldav>=1.3",
"icalendar>=5.0",
"APScheduler>=3.10,<4.0",
# Capped below 2.0: that release removed `mcp.server.fastmcp`, which
# src/scribe/mcp/server.py imports to build the whole tool surface. The
# ceiling is a real incompatibility, not caution — lift it in the same
# change that ports server.py to the 2.x API.
"mcp[cli]>=1.0,<2",
# Floor 2.2: server.py uses the 2.x `mcp.server.mcpserver.MCPServer` API
# (transport settings on `streamable_http_app`, `call_tool(..., context)`,
# `ToolError`), ported and read against 2.2.0 (#2196). No ceiling: CI
# installs with `uv sync --locked`, so a new major arrives only through a
# deliberate `uv lock`, which is where its breakage should be diagnosed.
"mcp[cli]>=2.2",
"fastembed>=0.4",
"pgvector>=0.3",
]