リモート MCP サーバーをホストする
クライアントがリモート URL を必要とする場合は、MCP サーバーを HTTP アプリケーションとしてデプロイします。この例では、1 つの算術ツールを提供し、bearer token を検証し、ヘルスエンドポイントを公開します。Streamable HTTP を使用します。ローカルの stdio サーバーだけでは、リモートクライアントに提供できません。
開始する前に
Node.js 22、Lizard CLI、デプロイ可能なプロジェクト、設定済み bearer token を受け付ける MCP クライアントが必要です。この例では、ステートレスモードで @modelcontextprotocol/sdk 1.30.0 を使用します。OAuth ログイン、ブラウザーアクセス、または ID プロバイダーは提供しません。
実行可能なファイルは remote-mcp-node にあります。チェックイン済みの lockfile を使用してください。ローカルのスモークテストでは、初期化、ツールの検出、ツール呼び出し、有効な token がない場合の拒否を確認します。デプロイの確認では、公開プロキシと TLS の経路も確認する必要があります。
ローカルで実行する
サンプルディレクトリから:
npm ci
npm test
node issue-token.mjs
export MCP_PUBLIC_KEY="$(cat .mcp-public-key.pem)"
export MCP_ALLOWED_HOSTS=127.0.0.1,localhost
npm start生成された token は 1 時間後に期限切れになります。秘密署名鍵は保存されません。継続的なデプロイには、独自の token 発行およびローテーションの仕組みを使用し、その秘密鍵はサーバーの外部で管理してください。
別のターミナルで:
export MCP_URL=http://127.0.0.1:8000/mcp
export MCP_TOKEN="$(cat .mcp-token)"
node client.mjsクライアントは初期化、ツールの検出、結果 5 を確認し、その後 MCP initialize, tools/list and tools/call passed: 5 を出力します。/health は ok を返します。/mcp への、有効な token なしのリクエストは 401 を返します。
アプリケーションをデプロイする
サンプルの Dockerfile と lockfile はそのまま使ってください。それらを含むディレクトリから:
lizard init --name mcp-example
lizard add --service mcp
lizard domain --service mcp --json認証が必要だとコマンドに表示された場合は、lizard login でサインインしてください。init はプロジェクトをリンクし、add は指定した名前のサービスを作成します。domain コマンドは、デプロイ前にそのホスト名を割り当てます。返された hostname を以下で使用してください。https:// やパスは付けないでください:
lizard secrets set MCP_PUBLIC_KEY="$(cat .mcp-public-key.pem)" --service mcp
lizard secrets set MCP_ALLOWED_HOSTS=YOUR_SERVICE_HOSTNAME --service mcp最初のデプロイ前に両方の値を設定してください。その後、次を実行します:
lizard up --service mcp --port 8000
lizard logs --build --service mcp --json
lizard logs --service mcp --json
lizard ps --jsonmacOS で Lizard CLI 0.3.92 を使う場合は、アーカイブから AppleDouble メタデータを除外するために COPYFILE_DISABLE=1 lizard up --service mcp --port 8000 を使用してください。後の CLI リリースでは、このアーカイブ修正が含まれている可能性があります。最終的なデプロイイベントと公開エンドポイントを確認してください。ビルド失敗後は、この CLI バージョンの終了コードだけに依存しないでください。server.mjs は 0.0.0.0 で待ち受け、PORT を読み取ります。デフォルトは 8000 です。deploy コマンドはサービスのポートを 8000 に設定します。公開鍵は複数行の環境変数値として設定してください。秘密署名鍵や token ファイルはアップロードしないでください。
公開エンドポイントを検証する
MCP_URL を https://YOUR_SERVICE_HOSTNAME/mcp に設定し、クライアント環境に有効な token を保持したまま、node client.mjs を実行します。次の 3 つの結果をすべて確認してください:
/healthは HTTPS 経由で200を返す。/mcpは、有効な token を持たないクライアントを拒否する。- 認証済みクライアントはツール一覧を取得し、
addを呼び出して5を返す。
プロセスが正常であるだけでは、MCP ハンドシェイクやストリーミングされたレスポンスが公開プロキシ経由で機能していることの証明にはなりません。
トラブルシューティング
| 結果 | 確認 |
|---|---|
| 起動中にプロセスが終了する | MCP_PUBLIC_KEY には公開 PEM 鍵が含まれている必要があります。MCP_ALLOWED_HOSTS にはサービスのホスト名が含まれている必要があります。 |
401 | token は RS256 を使用し、issuer と audience mcp-example が一致し、期限切れであってはいけません。 |
403 | リクエストのホスト名を MCP_ALLOWED_HOSTS と一致させてください。この例ではブラウザーの origin は有効化されていません。 |
有効な token で 405 | このステートレス MCP エンドポイントは、POST を通じてプロトコルリクエストを受け付けます。MCP クライアントを使用してください。token なしのブラウザー GET は、まず 401 を返します。 |
| ローカルテストは成功するがリモート呼び出しが失敗する | port、HTTPS、レスポンスストリーミング、プロキシのタイムアウトを確認してください。 |
制限とコスト
この例では、ユーザーセッションや永続ファイルをサーバーメモリに保持しません。長期的なアプリケーション状態にはデータベースを追加し、非公開ツールを公開する前にユーザーごとのアクセスを確認してください。OAuth ディスカバリーや対話的ログインを必要とするクライアントには、このテスト token を配布する代わりに、サポートされている OAuth プロバイダーを追加してください。
HTTP プロセスは呼び出しの間もアクティブなままの場合があります。pricing、limits、測定された CPU/メモリを確認してください。リクエストキューが空でも、料金が発生していないことを意味しません。
次のステップ
確認済みバージョン、クラウドでの結果、残っている制限については、シナリオテスト結果 を参照してください。