MCPサーバをブリッジし、非同期処理機能を追加するMCPサーバです。
- 非同期化: 既存のMCPサーバのすべてのツールに
syncパラメータを追加(デフォルト:async) - タイムアウト処理: 1秒で応答がない場合、実行制御用ハンドルを返却
- 状況確認: 非同期ツールの実行状況管理とキャンセル機能
- リソース/サブスクリプション:
task://{taskId}でタスクの状態/結果をリソースとして公開。resources/subscribeで更新を購読可能
npm installnpm run buildnpm startnpm run devMCP_TARGET_SERVER: ブリッジ先MCPサーバのコマンド(例:python server.py)MCP_TIMEOUT_MS: タイムアウト時間(ミリ秒、デフォルト:1000)MCP_ENV: ターゲットMCPプロセスへ渡す環境変数の宣言(空白区切り)。- 形式:
<ENV_ITEM> ::= NAME | NAME=VALUEを空白で列挙 - VALUE はシェル風にクオート/展開可能('...' はリテラル、"..."/非クオートは
$VAR${VAR}展開、" \ $ をエスケープ) - 値省略時は
NAME="$NAME"と等価(現在の環境からコピー) - 宣言順にカスケード展開(前に定義した変数を後段で参照可能)
- 例:
MCP_ENV='FOO=abc BAR="$FOO-suf" BAZ=${BAR}-end'
- 形式:
MCP_WORKDIR: ターゲットMCPプロセスの作業ディレクトリ(未指定時は継承)
既定で未指定でも引き継ぐ環境変数: PATH, HOME, SHELL(安全のため値はログ表示しません)。
このプロジェクトにはMCP設定が含まれています(.vscode/mcp.json)。VS CodeでMCPサーバとしてデバッグできます。
- AsyncBridgeServer: メインのMCPサーバ
- TargetServerProxy: 既存MCPサーバへのプロキシ
- AsyncTaskManager: 非同期タスクの管理
- TimeoutHandler: タイムアウト処理
- 既存MCPサーバのすべてのツールに
syncパラメータを追加 - デフォルトで非同期実行、
sync: trueで同期実行
Model Context Protocol の仕様に合わせ、ブリッジ経由のツール呼び出しは次のように
arguments オブジェクト内へ元のパラメータを格納してください。
既存クライアントとの互換性のため、トップレベルに置かれたパラメータ
(例: { "a": 1, "b": 2 })も自動的に arguments にラップされますが、
仕様準拠のため上記形式での利用を推奨します。
async_list_pending_tasks: 未完了の非同期タスク一覧async_get_task_result: タスク結果の取得(完了時にハンドル開放)async_cancel_task: 実行中タスクのキャンセル
- ブリッジは
resources機能を公開し、task://{taskId}でタスクの状態と結果を読み取れます。 - 非同期ツール開始時の応答には
ResourceLink(task://{taskId})が含まれます。 - クライアントは以下の流れで最新状態を追跡します。
resources/subscribeでtask://{taskId}を購読- サーバーから
notifications/resources/updatedが届いたら resources/readでtask://{taskId}を取得(JSON:status,result)
例(概念):
// リソース購読
{
"method": "resources/subscribe",
"params": { "uri": "task://<taskId>" }
}
// 更新通知(サーバー→クライアント)
{
"method": "notifications/resources/updated",
"params": { "uri": "task://<taskId>" }
}
// リソース読み取り
{
"method": "resources/read",
"params": { "uri": "task://<taskId>" }
}// 非同期実行(デフォルト)
const handle = await callTool('some_tool', { param: 'value' });
// 同期実行
const result = await callTool('some_tool', { param: 'value', sync: true });
// 非同期結果の確認
const tasks = await callTool('async_list_pending_tasks');
const result = await callTool('async_get_task_result', { taskId: handle });src/
├── index.ts # エントリーポイント
├── server/
│ ├── AsyncBridgeServer.ts # メインサーバー
│ └── TargetServerProxy.ts # プロキシ実装
├── async/
│ ├── TaskManager.ts # タスク管理
│ └── TimeoutHandler.ts # タイムアウト処理
├── types/
│ └── index.ts # 型定義
└── utils/
└── logger.ts # ログ機能
npm testMIT
{ "arguments": { "a": 1, "b": 2 }, "sync": false // 省略時は false(非同期実行) }