标准的FastMCP框架在生产环境中面临重大挑战:
管理MCP服务器的身份验证非常复杂:
MCPToolKit提供了一个生产就绪的框架,解决了这些问题,同时完全兼容FastMCP。以下是其工作原理:
graph TD
A[LLM客户端<br/>例如Claude, ChatGPT, Cursor] --> B[负载均衡器]
B --> C[MCP服务器实例1<br/>带有Redis状态]
B --> D[MCP服务器实例2<br/>带有Redis状态]
B --> E[MCP服务器实例N<br/>带有Redis状态]
C --> F[Redis<br/>会话状态及OAuth令牌]
D --> F
E --> F
C --> H[MCP授权服务器<br/>OAuth 2.1 & PKCE]
D --> H
E --> H
H --> G[OAuth提供商<br/>Notion, Slack等]
style H fill:#f9f,stroke:#333,stroke-width:2px
此架构图展示了MCPToolKit如何启用生产就绪的MCP服务器:
这种架构实现了:
从FastMCP迁移到MCPToolKit非常简单。以下是更新现有FastMCP服务器的方法:
# 之前(FastMCP)
- from mcp.server.fastmcp import FastMCP
-
- # 创建一个MCP服务器
- mcp = FastMCP("Demo")
# 之后(MCPToolKit)
+ from mcptoolkit import MCPToolKit
+ import os
+
+ # 创建一个生产就绪的MCP服务器
+ mcp = MCPToolKit(
+ name="Demo",
+ redis_url=os.environ["REDIS_URL"] # 必需:在您的环境中设置REDIS_URL
+ )
# 您的工具和资源保持完全相同
@mcp.tool()
def add(a: int, b: int) -> int:
"""加两个数"""
return a + b
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""获取个性化的问候语"""
return f"你好,{name}!"
迁移只需要几个简单的更改:
REDIS_URL环境变量(生产必需)对于本地开发,您可以设置环境变量:
export REDIS_URL="redis://localhost:6379/0"
对于无服务器部署,您还需要更新部署配置:
# 之前(FastMCP)
- # api/index.py
- from mcp.server.fastmcp import FastMCP
-
- mcp = FastMCP("Demo")
- app = mcp.create_fastapi_app()
# 之后(MCPToolKit)
+ # api/index.py
+ from mcptoolkit.vercel import create_vercel_app
+ import os
+
+ app = create_vercel_app(
+ name="Demo",
+ redis_url=os.environ["REDIS_URL"] # 必需:在您的环境中设置REDIS_URL
+ )
关键特性:
from mcptoolkit import MCPToolKit, requires_auth
from mcptoolkit.auth.providers import NotionProvider, SlackProvider
# 定义每个提供商的默认范围
default_notion_scopes = [
"read:database",
"write:page",
"read:page"
]
default_slack_scopes = [
"channels:read",
"chat:write",
"reactions:write"
]
server = MCPToolKit(name="授权服务器")
@server.tool()
@requires_auth(provider=NotionProvider(
scopes=default_notion_scopes,
consent_required=True # 需要明确的用户同意
))
def notion_search(query: str, ctx: Context) -> str:
# 访问具有特定范围的已认证Notion客户端
notion = ctx.get_oauth_client("notion")
return notion.search(query)
@server.tool()
@requires_auth(provider=
SlackProvider(
scopes=default_slack_scopes,
consent_required=True
))
def slack_message(channel: str, message: str, ctx: Context) -> str:
# 访问具有特定范围的已认证Slack客户端
slack = ctx.get_oauth_client("slack")
return slack.post_message(channel, message)
关键特性:
MCPToolKit实现了安全的OAuth 2.1流程与PKCE:
MCPToolKit支持两种授权服务器部署模型:
嵌入式授权服务器
外部授权服务器
两种模型都支持:
MCPToolKit提供了全面的同意和访问管理:
@server.tool()
@requires_auth(provider=NotionProvider(
scopes=["delete:database"],
human_approval_required=True # 需要明确的人工批准
))
def delete_database(database_id: str, ctx: Context) -> str:
# 此操作需要明确的人工批准
notion = ctx.get_oauth_client("notion")
return notion.delete_database(database_id)
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcp-server
spec:
replicas: 3
template:
spec:
containers:
- name: mcp-server
image: your-mcp-server
env:
- name: REDIS_URL
valueFrom:
secretKeyRef:
name: redis-credentials
key: url
# api/index.py
from mcptoolkit.vercel import create_vercel_app
app = create_vercel_app(
name="无服务器MCP",
redis_url=os.environ.get("REDIS_URL")
)
pip install mcp-python-sdk
from mcptoolkit import MCPToolKit, requires_auth
server = MCPToolKit(
name="我的生产服务器",
redis_url="redis://localhost:6379/0"
)
@server.tool()
def public_tool() -> str:
return "此工具不需要认证"
@server.tool()
@requires_auth(provider="notion")
def notion_tool() -> str:
return "此工具需要Notion认证"
同MCP Python SDK。