汎用LLM・AI開発⭐ リポ 0品質スコア 65/100
mcp-pool-http-proxy-for-subprocess-sdks
複数のMCPソース(Linear、GitHub、Notionなど)をプールして、各サブプロセスが独立した接続を開く代わりに、単一のStreamable-HTTP MCPエンドポイント経由でCodex/Copilot SDKのサブプロセスに公開します。これにより、リソース効率を向上させながら、複数のデータソースへのアクセスを一元管理できます。
description の原文を見る
Expose a pool of MCP sources (Linear, GitHub, Notion, ...) to Codex/Copilot SDK subprocesses through a single Streamable-HTTP MCP endpoint, instead of having each subprocess open independent connections.
SKILL.md 本文
サブプロセス SDK 用 MCP プール HTTP プロキシ
使用する場面
- ホストプロセスが既に多数のソース(Linear、GitHub、Notion など)への MCP 接続を管理している。
- LLM SDK のサブプロセス(Codex、Copilot)を起動し、それ自体が MCP ツールを使用する。
- 各サブプロセスが全てのソースに対して、ステートフルな stdio/SSE 接続を再確立することを避けたい。
- ステートレス HTTP により、複数のサブプロセスがセッション追跡なしでプールを共有できるようにしたい。
動作方法
- ホスト(例:Electron メイン)で、ソースごとに 1 つの
PoolClientインスタンスを持つMcpClientPoolを保持する。各インスタンスは実際の@modelcontextprotocol/sdkクライアントを保有しています。 127.0.0.1:0(ランダムポート)でローカル HTTP サーバーを立ち上げます。StreamableHTTPServerTransport({ sessionIdGenerator: undefined })でラップします — ステートレスモード、セッションアフィニティなし。@modelcontextprotocol/sdk/serverのServerをトランスポートに接続し、ListToolsRequestSchema(プールへファンアウト、ネームスペース付きのツール名)とCallToolRequestSchema(返却をディスパッチ)を登録します。/mcpへの全ての受信リクエストを HTTP メソッドに関わらずtransport.handleRequest(req, res)にルーティングします。- URL
http://127.0.0.1:<port>/mcpを各スポーンされた SDK サブプロセスにその MCP エンドポイントとして返却します。 - サブプロセスは
StreamableHTTPClientTransport(new URL(url))を使用してプールと通信します。
例
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
this.transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
this.mcpServer = new Server({ name: 'pool', version: '1.0.0' }, { capabilities: { tools: {} } });
this.mcpServer.setRequestHandler(ListToolsRequestSchema, async () => {
const tools = [];
for (const [slug, client] of this.pool.entries()) {
const list = await client.listTools();
tools.push(...list.map(t => ({ ...t, name: `mcp__${slug}__${t.name}` })));
}
return { tools };
});
this.mcpServer.setRequestHandler(CallToolRequestSchema, async (req) => {
const [, slug, tool] = req.params.name.split('__');
return this.pool.get(slug).callTool(tool, req.params.arguments);
});
await this.mcpServer.connect(this.transport);
http.createServer((req, res) => this.transport.handleRequest(req, res)).listen(0, '127.0.0.1');
注意点
- ステートレスモードは
session/notificationsやリソースサブスクリプション を使用してはいけません — それらはいずれもセッション ID が必要です。 127.0.0.1のみにバインドしてください — SDK サブプロセスはあなたの localhost を共有しているため、ポートを公開する必要はありません。- ツール名を積極的にネームスペース付けしてください(
mcp__<source>__<tool>)。そうしないとソース間の衝突が静かに互いを隠します。 transport.handleRequestは POST、GET、DELETE に対応しています — 全てそこにルーティングしてください。メソッドで分岐させようとしないでください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- kjuhwa
- リポジトリ
- kjuhwa/skills-hub
- ライセンス
- MIT
- 最終更新
- 2026/4/26
Source: https://github.com/kjuhwa/skills-hub / ライセンス: MIT