コンテンツにスキップ

ふたつの使い方

mcp-stdio はひとつのコマンドにふたつの明確に異なる役割があります。この ドキュメントの残り全部がこの選択にぶら下がっているので、まずここで 整理してください。

クライアント側ゲートウェイ(デフォルト) サーバーゲートウェイserve
あなたは… 誰かのリモート MCP サーバーを使う 自分の MCP サーバーを公開する
MCP サーバーの居場所 どこか別の場所、HTTPS の向こう あなたのマシン上、stdio で動作
mcp-stdio の居場所 MCP クライアントの隣(手元のマシン) MCP サーバーの隣(公開ホスト)
変換の向き stdio → Streamable HTTP / SSE Streamable HTTP → stdio
OAuth での役割 クライアント:ログインし、トークンを保存・リフレッシュ 認可サーバー:クライアントを登録し、トークンを発行・検証
典型的な利用者 Claude Desktop / Claude Code でリモートサーバーを使う人 stdio MCP サーバーをリモートユーザーに届けたい運用者
次に読む リモート MCP サーバーに接続する stdio サーバーを公開する

クライアント側ゲートウェイとして(デフォルトモード)

MCP クライアント(Claude Desktop、Claude Code など)はローカルの stdio プロセスしか起動できませんが、使いたいサーバーはネットワークの向こうに あります。mcp-stdio がそのローカルプロセスそのものになります: クライアントは mcp-stdio と stdio で会話し、mcp-stdio がすべての メッセージを HTTPS でリモートサーバーへ中継します——OAuth ログイン、 トークンキャッシュ、リフレッシュを引き受けるので、接続はアクセス トークンの寿命より長生きします。

graph TD
    A["MCP クライアント<br/>(Claude Desktop / Claude Code)"]
    B["mcp-stdio<br/>OAuth クライアント · トークンキャッシュ · トランスポート変換"]
    C["リモート MCP サーバー<br/>(Streamable HTTP または legacy SSE)"]
    A -- "stdio (JSON-RPC 行)" --> B
    B -- "HTTPS (+ Bearer トークン)" --> C
    C --> B
    B --> A
mcp-stdio --oauth https://mcp.example.com/mcp

このモードが欲しくなるのは:

  • ベンダーやチームがホストする MCP サーバーを Claude Desktop / Claude Code から使いたいとき;
  • クライアント単体では完結できない OAuth ログインをサーバーが要求する とき;
  • クライアントが対応をやめた legacy SSE トランスポートをサーバーが まだ話しているとき。

リモート MCP サーバーに接続する へ。

サーバーゲートウェイとして(serve モード)

手元のマシンで stdio を話す MCP サーバーを書いた(または動かしている)。 それをリモートユーザーが彼らの MCP クライアントから使えるようにしたい。 mcp-stdio serve はそれを本物の Streamable HTTP エンドポイントにします: 片側で HTTPS を受け、もう片側ではユーザーセッションごとに隔離された stdio 子プロセスを spawn し、--enable-oauth を付ければクライアント登録と トークン発行を担う OAuth 2.1 認可サーバーとしてすべてを守ります。

graph TD
    A1["リモートユーザー A<br/>(Claude Desktop)"]
    A2["リモートユーザー B<br/>(Claude.ai コネクタ)"]
    B["mcp-stdio serve<br/>OAuth 認可サーバー · セッション管理"]
    C1["A 用の stdio 子プロセス<br/>(あなたの MCP サーバー)"]
    C2["B 用の stdio 子プロセス<br/>(あなたの MCP サーバー)"]
    A1 -- "HTTPS + OAuth" --> B
    A2 -- "HTTPS + OAuth" --> B
    B -- "stdio" --> C1
    B -- "stdio" --> C2
mcp-stdio serve --enable-oauth \
  --public-url https://mcp.example.com \
  --token-store /var/lib/mcp-stdio/state.json \
  -- python -m my_mcp_server

このモードが欲しくなるのは:

  • MCP サーバーが stdio 専用で、リモートクライアントから届かせたいとき;
  • 複数ユーザーがひとつのデプロイをプロセスを共有せずに使う必要が あるとき——各セッションが専用の子プロセスを持ち、認証済みユーザーに 束縛されます;
  • 前段に本物の OAuth が必要だが、エンドポイントひとつのために Keycloak を立てたくはないとき。

stdio サーバーを公開する へ。

両方いっぺんに

ふたつの役割は組み合わせられます。よくあるパターン:運用者が社内サーバー を serve で公開し、チームの全員が手元のラップトップからクライアント モードの mcp-stdio で接続する——両端で同じパッケージが、それぞれ OAuth の 自分の側を担当します。

graph TD
    A["Claude Desktop"] -- "stdio" --> B["mcp-stdio<br/>(クライアントモード)"]
    B -- "HTTPS + OAuth" --> C["mcp-stdio serve<br/>(サーバーモード)"]
    C -- "stdio" --> D["あなたの MCP サーバー"]