From 3e150fa78d52399ccb1c6a0df5f5f2f5c9bf2abd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Aug 2026 01:53:52 +0000 Subject: [PATCH 1/3] build(deps): bump mcp in /ai/slackbot-mcp-client/slack-identity Bumps [mcp](https://github.com/modelcontextprotocol/python-sdk) from 1.28.1 to 2.0.0. - [Release notes](https://github.com/modelcontextprotocol/python-sdk/releases) - [Changelog](https://github.com/modelcontextprotocol/python-sdk/blob/main/RELEASE.md) - [Commits](https://github.com/modelcontextprotocol/python-sdk/compare/v1.28.1...v2.0.0) --- updated-dependencies: - dependency-name: mcp dependency-version: 2.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- ai/slackbot-mcp-client/slack-identity/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai/slackbot-mcp-client/slack-identity/requirements.txt b/ai/slackbot-mcp-client/slack-identity/requirements.txt index 95fdecc..9fa0893 100644 --- a/ai/slackbot-mcp-client/slack-identity/requirements.txt +++ b/ai/slackbot-mcp-client/slack-identity/requirements.txt @@ -1,5 +1,5 @@ httpx2==2.9.1 -mcp==1.28.1 +mcp==2.0.0 mypy==2.3.0 pytest==9.1.1 ruff==0.16.0 From 73978d473f286dd904b37cfba24b0a6019838c21 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Fri, 31 Jul 2026 19:17:37 -0700 Subject: [PATCH 2/3] fix(mcp-client): migrate slack-identity example to mcp 2.0 API Companion to the mcp 1.28.1 -> 2.0.0 bump on this branch. In addition to the shared server-API changes (FastMCP -> MCPServer, transport kwargs moved to streamable_http_app(), ToolAnnotations snake_case), slack-identity needed the Context/_meta changes: - Context now comes from mcp.server.mcpserver (the module whose Context the framework recognizes and filters from the tool arg schema); importing it elsewhere breaks JSON-schema generation for the tool. - Context is no longer parameterized in the tool signature (ctx: Context). - Request _meta is a plain dict now: ctx.request_context.meta.model_extra -> ctx.request_context.meta.get('slack'); cast the extra to dict[str, Any]. The @mcp_server.tool decorator body is otherwise unchanged. Verified: ruff, format, mypy, pytest all pass. Co-Authored-By: Claude --- ai/slackbot-mcp-client/slack-identity/src/app.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ai/slackbot-mcp-client/slack-identity/src/app.py b/ai/slackbot-mcp-client/slack-identity/src/app.py index b2b190b..dd907ed 100644 --- a/ai/slackbot-mcp-client/slack-identity/src/app.py +++ b/ai/slackbot-mcp-client/slack-identity/src/app.py @@ -1,8 +1,9 @@ import contextlib import os +from typing import Any, cast -from mcp.server.fastmcp import Context, FastMCP -from mcp.server.session import ServerSession +from mcp.server import MCPServer +from mcp.server.mcpserver import Context from mcp.types import CallToolResult, TextContent, ToolAnnotations from slack_bolt import App from slack_bolt.adapter.starlette import SlackRequestHandler @@ -23,21 +24,21 @@ https://github.com/modelcontextprotocol/python-sdk#quickstart """ -mcp_server = FastMCP("Profile Card", stateless_http=True, json_response=True) +mcp_server = MCPServer("Profile Card") @mcp_server.tool( name="get_profile_card", title="Get Profile Card", description="Get a profile card for a Slack user by their user ID.", - annotations=ToolAnnotations(readOnlyHint=True), + annotations=ToolAnnotations(read_only_hint=True), ) async def get_profile_card( user_id: str, - ctx: Context[ServerSession, None], + ctx: Context, ) -> CallToolResult: meta = ctx.request_context.meta - slack = (meta.model_extra or {}).get("slack", {}) if meta else {} + slack = cast("dict[str, Any]", meta.get("slack", {}) if meta else {}) if not slack.get("user_id") or not slack.get("team_id"): return CallToolResult( @@ -155,7 +156,7 @@ async def lifespan(a): yield -mcp_app = mcp_server.streamable_http_app() +mcp_app = mcp_server.streamable_http_app(stateless_http=True, json_response=True) app = Starlette( From dd6fad6267db6bafb643ad37337d0143b79d827b Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Fri, 31 Jul 2026 19:50:56 -0700 Subject: [PATCH 3/3] refactor(mcp-client): read Slack identity from meta without a cast Convert the request _meta (a RequestParamsMeta TypedDict, a dict at runtime) to a plain dict[str, Any] and read the custom 'slack' field with ordinary .get() instead of typing.cast. Same behavior, no type-checker override in the example. Co-Authored-By: Claude --- ai/slackbot-mcp-client/slack-identity/src/app.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ai/slackbot-mcp-client/slack-identity/src/app.py b/ai/slackbot-mcp-client/slack-identity/src/app.py index dd907ed..7f61de6 100644 --- a/ai/slackbot-mcp-client/slack-identity/src/app.py +++ b/ai/slackbot-mcp-client/slack-identity/src/app.py @@ -1,6 +1,6 @@ import contextlib import os -from typing import Any, cast +from typing import Any from mcp.server import MCPServer from mcp.server.mcpserver import Context @@ -37,8 +37,8 @@ async def get_profile_card( user_id: str, ctx: Context, ) -> CallToolResult: - meta = ctx.request_context.meta - slack = cast("dict[str, Any]", meta.get("slack", {}) if meta else {}) + meta: dict[str, Any] = dict(ctx.request_context.meta or {}) + slack = meta.get("slack") or {} if not slack.get("user_id") or not slack.get("team_id"): return CallToolResult(