MCPToolKit - 実稼働対応の MCP サーバー フレームワーク
私たちが解決する問題
1. 実稼働環境でのMCPサーバーのスケーリング
標準の FastMCP フレームワークは、実稼働環境では重大な課題に直面します。
状態管理: 従来のFastMCPサーバーはメモリ内に状態を保持するため、水平スケーリングが困難です。
サーバーレスの制限: サーバーレス環境ではステートレスなアーキテクチャが求められるが、FastMCP はそれを目的として設計されていない。
マルチテナントサポート: 同じサーバー上で複数のテナントを実行するには、複雑なセッション管理が必要です。
2. 委任OAuthのサポート
MCP サーバーの認証管理は複雑です。
ツールレベルの認証: ユーザーはツールが要求した場合にのみ認証を行う必要があります
サードパーティ統合: Notion、SlackなどのサービスでOAuthをサポートするには、複雑なトークン管理が必要です。
セキュリティ: セキュリティを維持しながら複数の認証フローを管理するのは困難です
Related MCP server: Vercel MCP
私たちのソリューション
MCPToolKitは、FastMCPとの完全な互換性を維持しながらこれらの問題を解決する、実稼働対応のフレームワークを提供します。その仕組みは以下のとおりです。
graph TD
A[LLM Client<br/>e.g. Claude, ChatGPT, Cursor] --> B[Load Balancer]
B --> C[MCP Server Instance 1<br/>with Redis State]
B --> D[MCP Server Instance 2<br/>with Redis State]
B --> E[MCP Server Instance N<br/>with Redis State]
C --> F[Redis<br/>Session State & OAuth Tokens]
D --> F
E --> F
C --> H[MCP Authorization Server<br/>OAuth 2.1 & PKCE]
D --> H
E --> H
H --> G[OAuth Providers<br/>Notion, Slack, etc.]
style H fill:#f9f,stroke:#333,stroke-width:2pxこのアーキテクチャ図は、MCPToolKit が実稼働対応の MCP サーバーをどのように有効にするかを説明しています。
LLMクライアント(例:Claude、ChatGPT、Cursor)はMCPサーバーへのリクエストを開始します。これらのクライアントは、MCPツールとやり取りする必要があるあらゆるアプリケーションです。
**ロード バランサは、**受信要求を複数の MCP サーバー インスタンスに分散し、水平スケーリングと高可用性を実現します。
MCPサーバーインスタンス(1~N)は、ツールの実行とリソースへのアクセスを処理します。各インスタンスは次の処理を行います。
セッションの永続性のために独自のRedis状態を維持する
リクエストを独立して処理できる
同じコードベースと構成を共有する
需要に応じて水平方向に拡張可能
Redis は中央状態ストアとして機能し、以下を提供します。
サーバーの再起動後もセッション状態が維持される
OAuthトークンの保存と管理
サーバーインスタンス間での状態の共有
ステートレスサーバーインスタンスを有効にする
MCP 認証サーバー(ピンク色で強調表示) は、OAuth 関連のすべての操作を管理します。
安全な認証のためにPKCEを使用したOAuth 2.1を実装
トークンの発行と更新を処理する
同意フローを管理する
すべてのサーバーインスタンスのOAuthロジックを一元管理します
OAuthプロバイダー(例:Notion、Slack)は、ユーザーが認証できるサードパーティのサービスです。認可サーバーはこれらの接続を安全に管理します。
このアーキテクチャにより、次のことが可能になります。
ステートレスなサーバーインスタンスによる真の水平スケーリング
集中型OAuth管理
複数のサーバーインスタンスによる高可用性
安全なトークン管理
セッション間で一貫したユーザーエクスペリエンス
FastMCPからの移行
FastMCPからMCPToolKitへの移行は簡単です。既存のFastMCPサーバーを更新する手順は次のとおりです。
# Before (FastMCP)
- from mcp.server.fastmcp import FastMCP
-
- # Create an MCP server
- mcp = FastMCP("Demo")
# After (MCPToolKit)
+ from mcptoolkit import MCPToolKit
+ import os
+
+ # Create a production-ready MCP server
+ mcp = MCPToolKit(
+ name="Demo",
+ redis_url=os.environ["REDIS_URL"] # Required: Set REDIS_URL in your environment
+ )
# Your tools and resources remain exactly the same
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"移行にはいくつかの簡単な変更が必要です。
インポート文を変更する
REDIS_URL環境変数を設定する(本番環境では必須)これで完了です!既存のツール、リソース、プロンプトはすべてこれまでどおり機能します。
ローカル開発の場合は、環境変数を設定できます。
export REDIS_URL="redis://localhost:6379/0"サーバーレス デプロイメントの場合は、デプロイメント構成も更新する必要があります。
# Before (FastMCP)
- # api/index.py
- from mcp.server.fastmcp import FastMCP
-
- mcp = FastMCP("Demo")
- app = mcp.create_fastapi_app()
# After (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"] # Required: Set REDIS_URL in your environment
+ )主な機能:
Redis ベースの状態: セッション状態はサーバーの再起動や関数の呼び出し後も保持されます
サーバーレス対応: Vercel、AWS Lambda、その他のサーバーレスプラットフォーム向けに設計
水平スケーリング: 状態の永続性により、真の水平スケーリングが可能になります。
マルチテナントサポート: 複数のユーザーが分離されたセッションで同じエンドポイントに接続できます
2. 委任OAuthのサポート
from mcptoolkit import MCPToolKit, requires_auth
from mcptoolkit.auth.providers import NotionProvider, SlackProvider
# Define default scopes for each provider
default_notion_scopes = [
"read:database",
"write:page",
"read:page"
]
default_slack_scopes = [
"channels:read",
"chat:write",
"reactions:write"
]
server = MCPToolKit(name="Auth Server")
@server.tool()
@requires_auth(provider=NotionProvider(
scopes=default_notion_scopes,
consent_required=True # Require explicit user consent
))
def notion_search(query: str, ctx: Context) -> str:
# Access authenticated Notion client with specific scopes
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:
# Access authenticated Slack client with specific scopes
slack = ctx.get_oauth_client("slack")
return slack.post_message(channel, message)主な機能:
遅延認証: ツールが要求した場合にのみユーザーは認証する
プロバイダー サポート: 一般的なプロバイダー (Notion、Slack など) の組み込みサポート
トークン管理: トークンの自動更新と保存
セキュリティ: 安全なトークンの保管と送信
詳細なスコープ: OAuth 権限のきめ細かな制御
同意管理: 論理的な権限グループ化を備えたユーザーフレンドリーな同意画面
人間参加型: 高リスクアクションに対するオプションの承認要件
OAuthフロー
MCPToolKit は、PKCE を使用して安全な OAuth 2.1 フローを実装します。
LLMクライアントがMCPサーバーへのリクエストを開始する
サーバーは401 Unauthorizedとリダイレクトリンクで応答します
ユーザーはOAuthプロバイダーにログインし、要求されたスコープを付与します
サーバーはクライアントに認証コードを返します
クライアントはアクセストークンとリフレッシュトークンのコードを交換する
トークンは後続のリクエストに使用されます
MCPサーバーがサードパーティのサービスを呼び出す
認可サーバーのアーキテクチャ
MCPToolKit は、認可サーバーの 2 つのデプロイメント モデルをサポートしています。
組み込み認証サーバー
MCPサーバーはアイデンティティプロバイダとリライングパーティの両方の役割を果たします。
ログイン、同意、トークンの発行を直接処理します
トークンの有効期間、更新ロジック、失効を管理します
スタンドアロンアプリケーションに最適
外部認証サーバー
MCPサーバーはRelying Partyとして機能する
OAuth フローを外部サービス(例:Stytch)に委任します。
ツールレベルのアクセス制御に焦点を当てる
既存のアイデンティティインフラストラクチャとの統合に最適
どちらのモデルも以下をサポートします:
PKCE を使用した OAuth 2.1
動的クライアント登録
認可サーバーメタデータ(RFC 8414)
リソース/アクションに基づくカスタムスコープ
エンドユーザーの同意管理
プロバイダーごとの詳細なスコープ定義
組織レベルの可視性と制御
暗黙の権限(ユーザーは自分が持っている権限のみを付与できます)
同意とアクセス管理
MCPToolKit は包括的な同意とアクセス管理を提供します。
組織レベルの可視性: 組織全体で承認されたすべての接続アプリを表示
きめ細かな権限: どのメンバーがアクセスを許可したか、どのスコープを承認したかを確認します
アクセス管理: 特定のユーザーまたはアプリのアクセスをいつでも取り消すことができます
ユーザーフレンドリーな同意: RBAC 権限を論理グループにまとめる
暗黙の権限: ユーザーは自分が持っている権限と同じ権限のみをアプリに与えることができます
人間参加型: リスクの高いアクションには人間の承認が必要
高リスクアクション保護
@server.tool()
@requires_auth(provider=NotionProvider(
scopes=["delete:database"],
human_approval_required=True # Require explicit human approval
))
def delete_database(database_id: str, ctx: Context) -> str:
# This action will require explicit human approval
notion = ctx.get_oauth_client("notion")
return notion.delete_database(database_id)建築
展開オプション
Kubernetes
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サーバーレス(Vercel)
# api/index.py
from mcptoolkit.vercel import create_vercel_app
app = create_vercel_app(
name="Serverless MCP",
redis_url=os.environ.get("REDIS_URL")
)クイックスタート
MCPToolKitをインストールします。
pip install mcp-python-sdkサーバーを作成します:
from mcptoolkit import MCPToolKit, requires_auth
server = MCPToolKit(
name="My Production Server",
redis_url="redis://localhost:6379/0"
)
@server.tool()
def public_tool() -> str:
return "This tool doesn't require auth"
@server.tool()
@requires_auth(provider="notion")
def notion_tool() -> str:
return "This tool requires Notion auth"お好みのプラットフォーム(Kubernetes、Vercel など)にデプロイします
要件
Python 3.9以上
Redis インスタンス (セッション状態の永続化用)
OAuth プロバイダーの資格情報(委任認証を使用している場合)
ライセンス
MCP Python SDK と同じです。