Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ai/slackbot-mcp-client/slack-identity/requirements.txt
Original file line number Diff line number Diff line change
@@ -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
Expand Down
17 changes: 9 additions & 8 deletions ai/slackbot-mcp-client/slack-identity/src/app.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import contextlib
import os
from typing import Any

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
Expand All @@ -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 {}
meta: dict[str, Any] = dict(ctx.request_context.meta or {})
slack = meta.get("slack") or {}
Comment on lines +40 to +41

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔬 note: This pattern continues to work without introducing new variables! Unauthenticated requests fail and authenticated requests succeed.


if not slack.get("user_id") or not slack.get("team_id"):
return CallToolResult(
Expand Down Expand Up @@ -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(
Expand Down