Model Context Protocol (MCP)について

MCP は、アプリケーションが LLM にコンテキストを提供する方法を標準化するオープン プロトコルです。MCP は、AI アプリケーション用の USB-C ポートのようなものです。USB-C がデバイスをさまざまな周辺機器やアクセサリに接続するための標準化された方法を提供するのと同様に、MCP は AI モデルをさまざまなデータ ソースやツールに接続するための標準化された方法を提供します。
MCP (モデル コンテキスト プロトコル)は、Anthropic によって導入されたオープン プロトコルであり、大規模な言語モデルが外部ツールやリソースと通信する方法を標準化します。MCP サーバーを使用すると、Cline などの AI エージェントは、Web 検索、ファイル操作、API 統合、データベース アクセスなどの追加機能にアクセスできます。
アーキテクチャ
- MCP ホスト
- Claude Desktop、IDE、または MCP を介してデータにアクセスする AI ツールなどのプログラム
- MCP クライアント
- サーバーとの 1:1 接続を維持するプロトコル クライアント
- MCP サーバー
- 標準化されたモデル コンテキスト プロトコルを通じて特定の機能を公開する軽量プログラム
- ローカル データ ソース
- MCP サーバーが安全にアクセスできるコンピューターのファイル、データベース、サービス
- リモートサービス
- MCP サーバーが接続できるインターネット経由 (API 経由など) で利用可能な外部システム

Cline MCP Marketplace
試しにSlackのMCP Serverをインストールしてみる
- MCPサーバがローカルにインストールされる
git clone https://github.com/modelcontextprotocol/servers.git /Users/dehio3/Documents/Cline/MCP/servers && cd /Users/dehio3/Documents/Cline/MCP/servers && npm install
- Slackアプリの認証情報を設定ファイルに追加する
{
"mcpServers": {
"github.com/modelcontextprotocol/servers/tree/main/src/slack": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-slack"
],
"env": {
"SLACK_BOT_TOKEN": "xoxb-your-bot-token",
"SLACK_TEAM_ID": "T01234567"
}
}
}
}
Slack MCP Serverの分析結果:
- 主要機能:
- チャンネル管理:チャンネル一覧の取得と参照
- メッセージング:新規メッセージ投稿、スレッド返信
- リアクション:メッセージへの絵文字リアクションの追加
- 履歴管理:チャンネル履歴とスレッド返信の取得
- ユーザー情報:ユーザー一覧とプロフィール情報の取得
- 技術仕様:
- TypeScriptによる実装
- MCPプロトコルに準拠したAPI設計
- エラーハンドリングとバリデーション機能
- ページネーション対応のAPI呼び出し
- 環境変数による設定(SLACK_BOT_TOKEN、SLACK_TEAM_ID)
- デプロイ方法:
- npmパッケージとしてインストール可能
- Dockerコンテナとして実行可能(マルチステージビルド対応)
- セキュリティ要件:
- Slack Bot Tokenの設定
- Team IDの設定
- 必要なBotスコープの設定:
- channels:history
- channels:read
- chat:write
- reactions:write
- users:read

MCPに関する主な課題と、それらに対するMCPの解決策について説明
1. モデル間の一貫性と互換性の課題
問題: 各AIモデル提供者(OpenAI、Anthropic、Google等)が独自のAPIフォーマットを持ち、モデルごとにインテグレーション方法が異なる。
MCP解決策:
- 統一インターフェース: すべてのLLMモデルへのアクセスを標準化するAPI抽象化レイヤーを提供
- アダプタパターンの実装: 各モデルのネイティブAPIをMCP標準形式に変換するアダプタを用意
- 例:
run_model
のような統一メソッドを通じて異なるモデルを呼び出し可能
# 異なるモデルでも同じインターフェースで呼び出せる
response = mcp_client.run_model(
model_id="anthropic/claude-3",
inputs={"prompt": "こんにちは"}
)
2. コンテキスト管理の複雑さ
問題: 会話履歴や状態情報の保持が各実装に依存し、一貫した管理が困難。
MCP解決策:
- コンテキストオブジェクト: セッション情報を標準化されたフォーマットで保存
- 永続化メカニズム: コンテキストをデータベースやファイルシステムに保存する機能
- JSON-RPCによるコンテキスト操作: コンテキスト情報の取得・更新用の標準メソッド
{
"jsonrpc": "2.0",
"method": "update_context",
"params": {
"context_id": "session-123",
"values": {"user_preference": "日本語", "previous_topics": ["AI", "プログラミング"]}
},
"id": 5
}
3. スケーラビリティの課題
問題: 多くのリクエストを効率的に処理する仕組みが標準化されていない。
MCP解決策:
- 非同期処理: JSON-RPCを用いた非同期リクエスト処理の標準化
- キューイングシステム: 優先度付きのリクエストキューの実装
- リソース管理: 利用可能なコンピュートリソースに基づくリクエスト分散
# 非同期処理の例
task_id = mcp_client.run_model_async(model_id="gpt-4", inputs={"prompt": "長い分析を実行"})
# 後で結果を取得
result = mcp_client.get_task_result(task_id)
4. モニタリングとロギングの標準化
問題: 各モデルの動作監視や問題診断方法が統一されていない。
MCP解決策:
- 標準ロギングフレームワーク: Python標準ロギングとの統合
- テレメトリデータ収集: 実行時間、トークン消費量などの標準メトリクス
- 構造化ログ形式: JSONベースのログフォーマットによる分析容易性の向上
# ロギング設定例
logger = logging.getLogger("mcp_client")
mcp_client = MCPClient(logger=logger)
# 内部でJSON形式のログが生成される
5. セキュリティとプライバシーの懸念
問題: 機密データの扱いやアクセス制御が不統一。
MCP解決策:
- 認証メカニズム: JSON-RPCリクエストへのJWTやAPIキーによる認証の組み込み
- データ暗号化: 通信経路の暗号化標準の実装
- アクセス制御: きめ細かなパーミッション設定による機能制限
{
"jsonrpc": "2.0",
"method": "run_model",
"params": {...},
"id": 7,
"auth": {"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}
}
これらの実装により、MCPは異なるAIモデルを統一的かつ効率的に管理・利用するための標準フレームワークとして機能します。

mcp-server-sentryを参考にClientとServer間の通信を理解する
Docker コンテナとして mcp-server-sentry
を利用する場合、主に以下の流れで通信が行われます。
-
起動と設定:
- Docker イメージ
mcp/sentry
をもとにコンテナが起動されます。 - 起動時に、
-i
、--rm
などのオプションや、Sentry の認証トークン--auth-token YOUR_SENTRY_TOKEN
が引数として渡されることがあります。YOUR_SENTRY_TOKEN
は、Sentry API へのアクセスに必要な認証情報です。 - コンテナ内で
mcp-server-sentry
コマンドが実行され、MCP サーバーとしての機能を開始します。
- Docker イメージ
-
MCP クライアントからのリクエスト:
-
Zed エディタなどの MCP クライアント は、コンテキスト情報(例えば、Sentry のIssueの詳細)を取得するために、
mcp-server-sentry
サーバーに対してリクエストを送信します。 - Docker コンテナとして実行されている
mcp-server-sentry
は、標準入力 (read_stream
) を監視し、クライアントからのリクエストを待ち受けます 。
-
Zed エディタなどの MCP クライアント は、コンテキスト情報(例えば、Sentry のIssueの詳細)を取得するために、
-
リクエストの処理:
-
mcp-server-sentry
サーバーがリクエストを受信すると、その内容を解析し、どのプロンプトまたはツールが要求されているかを判断します 。 - 例えば、Zed エディタから
sentry-issue
プロンプトがissue_id_or_url
と共にリクエストされた場合,handle_get_prompt
関数が呼び出されます 。
-
-
Sentry API へのリクエスト:
-
handle_get_prompt
関数は、要求された Issue の詳細を取得するために、Sentry API に対して HTTP リクエストを送信します 。 -
src/mcp_server_sentry/server.py
のhandle_sentry_issue
関数内で、httpx.AsyncClient
を用いて Sentry API (ベース URL はSENTRY_API_BASE
として定義されている可能性があります) の/issues/{issue_id}/
エンドポイントに対して GET リクエストが送信されます。 - この際、起動時に
--auth-token
で渡された Sentry 認証トークンが、Authorization ヘッダーに Bearer トークンとして含められます 。
-
-
Sentry API からのレスポンス:
- Sentry API は、認証トークンが有効であれば、要求された Issue の詳細情報を JSON 形式で
mcp-server-sentry
に返します。 - もし認証に失敗した場合 (ステータスコード 401)、
mcp-server-sentry
はエラー (McpError
) を発生させます 。
- Sentry API は、認証トークンが有効であれば、要求された Issue の詳細情報を JSON 形式で
-
レスポンスの作成と送信:
-
mcp-server-sentry
は、Sentry API から受信した JSON データを解析し、SentryIssueData
オブジェクトに格納します 。 - そして、このオブジェクトの
to_prompt_result
メソッドまたはto_tool_result
メソッドを呼び出し、MCP クライアントが理解できる形式 (types.GetPromptResult
など) のレスポンスを作成します。 - 作成されたレスポンスは、標準出力 (
write_stream
) を通じて Zed エディタなどの MCP クライアント に返送されます 。
-
以下に、この通信の流れを Mermaid のシーケンス図で示します。
このシーケンス図は、Zed エディタ(MCP クライアント) が Docker コンテナとして実行されている mcp-server-sentry
に Issue 詳細などの MCP リクエストを送信し、mcp-server-sentry
がそのリクエストを受けて Sentry API に認証トークン付きで HTTP リクエストを送信、Sentry API からのレスポンスを受け取った mcp-server-sentry
が、MCP クライアントが理解できる形式でレスポンスを Zed エディタに返すという一連の流れを示しています。
重要なポイント は、
-
Zed エディタと
mcp-server-sentry
は MCP を介して通信します。 -
mcp-server-sentry
と Sentry API は HTTP を介して通信します。 - Sentry API への認証には、コンテナ起動時に渡される認証トークンが使用されます。
- Docker コンテナは、標準入力で MCP クライアントからのリクエストを待ち受け、標準出力でレスポンスを返送します 。

Slack MCPサーバのシーケンス図
この図は、MCPホスト がSlackの機能を要求し、Slack MCPサーバ が Slack API と連携してその要求を処理し、結果を MCPホスト に返すまでの一連の流れを示しています。
図の説明
1.
MCP Host は、ユーザーの指示などに基づき、Slackの機能(例:チャンネル履歴の取得)を利用したいと考え、そのリクエストを MCP Client に送信します。このリクエストには、実行したいツールの名前(例:slack_get_channel_history)と、必要な引数(例:channel_id)が含まれます。
2.
MCP Client は、MCP Host からのリクエストを受け取り、それを Slack MCP Server に転送します。
3.
Slack MCP Server は、MCP Client からのツール実行リクエストを受け取ると、設定された Slack Bot Token と Team ID を用いて Slack API に対して実際のリクエストを送信します。
4.
Slack API は、Slack MCP Server からのリクエストに応じて処理を実行し、その結果(例:指定されたチャンネルのメッセージ履歴データ)を Slack MCP Server に返信します。
5.
Slack MCP Server は、Slack API からのレスポンスを受け取り、それを MCPの標準的なリソース形式 に整形します。
6.
整形されたリソースは、MCP Client を経由して MCP Host に転送されます。
7.
最終的に、MCP Host は受け取ったリソース(Slackのチャンネル履歴など)を、LLMへのコンテキストとして利用したり、ユーザーに表示したりします。
このシーケンス図により、Slack MCPサーバがMCPの枠組みの中でどのように機能し、Slack APIと連携して情報を提供するかという流れをより具体的にイメージできるかと思います。ただし、これは概念的な図であり、実際の実装ではより複雑な処理やエラーハンドリングが含まれる可能性があります。

Marketplase

mcp-remoteとは?
MCP-remote(Model Context Protocol Remote)は、ローカル専用のMCPクライアントがリモートMCPサーバーに接続できるようにするプロキシツールです。以下にその詳細を説明します:
MCP-remoteの基本概念
MCP-remoteは、ローカル(stdio)のみをサポートするMCPクライアントをリモートMCPサーバーに接続するためのリモートプロキシツールで、OAuth認証をサポートしています。これは実験的な作業プルーフオブコンセプトとして提供されています。
背景と目的
現在、ほとんどのMCPサーバーはstdio(標準入出力)トランスポートを使用してローカルにインストールされています。このローカル方式には利点があります:ユーザーが両方に実行許可を与えているため、クライアントとサーバーは互いに暗黙的に信頼できます。また、APIキーなどの秘密情報は環境変数を使用して追加でき、マシンから外部に出ることはありません。
しかし、多くのソフトウェアがウェブに移行した理由があります:バグの発見と修正、新機能の迅速な展開が単一のデプロイで全ユーザーに提供できるためです。MCP認証仕様の完成に近づくにつれて、ユーザーのラップトップでコードを実行することなく、MCPサーバーを世界と安全に共有する方法が確立されつつあります。
使用方法
MCP-remoteの基本的な使用方法は次のコマンドで行います:
npx -p mcp-remote@latest mcp-remote-client https://remote.mcp.server/sse
このコマンドは認証フローを実行し、リモートURLでツールとリソースの一覧表示を試みます。
処理の流れ
全体のフローの詳細な説明
-
MCPクライアントからのリクエスト: ユーザーが Claude Desktop, Windsurf などのMCPクライアントアプリケーションで質問やタスクを実行すると、そのリクエストは標準入出力 (STDIO) を通じてローカルプロキシである
mcp-remote
に送信されます [MCPクライアント->>mcp-remote: MCPリクエスト送信 (STDIO)]。 -
mcp-remote
の設定読み込み:mcp-remote
は、通常.json
形式の設定ファイルを読み込み、接続先のリモートMCPサーバーのURL やその他の設定(必要なコマンド引数など)を取得します [mcp-remote->>ローカルファイルシステム: 設定ファイル読み込み]。この設定には、MCPサーバーの種類(例: "math")と、それを起動するためのコマンド (npx mcp-remote
)、そしてリモートサーバーのURLが含まれます。 -
認証:
-
OAuth認証が必要な場合:
mcp-remote
は、設定に基づいて認証サーバー(Auth0, Google OAuth2 など)との間でOAuth 2.0の認可フローを開始します [mcp-remote->>認証サーバー: 認可URLリクエスト]。これには、認可URLの取得、ユーザーのブラウザへのリダイレクト、ユーザーによる認証、認証コードの取得、そして最終的なアクセストークンとリフレッシュトークンの交換が含まれます [認証サーバー-->>mcp-remote: アクセストークン、リフレッシュトークン]。取得した認証情報は、通常~/.mcp-auth
などのローカルファイルシステムに保存されます [mcp-remote->>ローカルファイルシステム: 認証情報保存 (~/.mcp-auth)] 。 -
APIキー認証の場合: 一部のリモートMCPサーバーは、OAuthの代わりにAPIキーによる認証を採用している場合があります。この場合、
mcp-remote
はHTTPリクエストのAuthorizationヘッダーにAPIキーを含めて送信します [mcp-remote->>リモートMCPサーバー: HTTPリクエスト送信 (AuthorizationヘッダーにAPIキー)]。 - 認証が不要な場合: リモートMCPサーバーによっては、認証を必要としない場合もあります。
-
OAuth認証が必要な場合:
-
リモートMCPサーバーへの接続:
mcp-remote
は、認証で得られたアクセストークン(またはAPIキー)をAuthorizationヘッダーに含めて、リモートMCPサーバー(Cloudflare Workers 上で動作することが多い)に対してHTTPリクエストを送信します [mcp-remote->>リモートMCPサーバー: HTTPリクエスト送信 (Authorizationヘッダーにアクセストークン)]。リモートMCPサーバーは、Cloudflareのグローバルネットワークを利用して高性能、高可用性を実現しています。Cloudflare Workersはステートレスであるため、必要に応じて Cloudflare KV や Durable Objects を使用して状態を管理します。 -
SSEアップグレード: 効率的なデータストリーミングのために、
mcp-remote
とリモートMCPサーバー間の接続は Server-Sent Events (SSE) にアップグレードされます。これは、初期のHTTPリクエストに含まれるAccept: text/event-stream
ヘッダーによって要求され、サーバーからの101 Switching Protocols
レスポンスによって確立されます [リモートMCPサーバー-->>mcp-remote: 101 Switching Protocols (SSEアップグレード)] [mcp-remote-->>リモートMCPサーバー: SSE接続確立]。SSE接続は永続的であり、サーバーからクライアントへの非同期なデータプッシュを可能にします。 -
MCPレスポンスの受信: リモートMCPサーバーは、処理結果やその他の関連情報を SSEイベント の形式で
mcp-remote
に送信します [リモートMCPサーバー-->>mcp-remote: SSEイベント送信 (MCPレスポンス)]。 -
レスポンスの転送:
mcp-remote
は受信したSSEイベントからMCPレスポンスを取り出し、元のMCPクライアント(STDIO)に送信します [mcp-remote-->>MCPクライアント: MCPレスポンス送信 (STDIO)]。 -
継続的な通信: SSE接続が確立している間、MCPクライアントからの後続のリクエストも同様に
mcp-remote
を経由してリモートMCPサーバーに送信され、レスポンスはSSEイベントとして返送されます [loop 継続的な通信]。
重要なポイント
-
mcp-remote
の役割: ローカルのMCPクライアントとリモートMCPサーバー間の通信を仲介し、認証処理(OAuthなど)やプロトコル変換などを担います. - リモートMCPサーバー: Cloudflare Workersなどのサーバーレスプラットフォーム上で動作し、スケーラビリティとセキュリティが確保されます.
- SSE (Server-Sent Events): サーバーからクライアントへの効率的なデータプッシュを可能にし、リアルタイムなレスポンスを実現します。初期接続後にHTTPからSSEにアップグレードされます。
- 認証: OAuth 2.0やAPIキーなど、様々な認証方式が利用される可能性があります.
- 設定: MCPクライアントは、設定ファイルを通じて接続するリモートMCPサーバーのURLや認証方法などを指定します.
-
デバッグ: 認証エラーが発生した場合、ローカルに保存された認証情報を削除することで解消することがあります (
rm -rf ~/.mcp-auth
).
このフローによって、MCPクライアントは安全かつ効率的にリモートのAIモデルや外部サービスと連携することができます.