mcpField
B
build-mcp-server

build-mcp-server

github.com/pproenca開発220220 回インストール11 週間前に更新
リポジトリ

build-mcp-server について

build-mcp-serverは、API連携やローカルサービス向けのMCPサーバーを計画・構築する開発者向けスキルです。実装前に、デプロイ方式、ツール設計、フレームワーク、認証の選択を導きます。

主な機能

  1. 01要件整理を先に実施
  2. 02デプロイ方式の推奨
  3. 03規模別のツール設計パターン
  4. 04TypeScript SDKとFastMCPの指針
  5. 05サーバーのスモークテスト

活用シーン

  1. 01クラウドAPI向けMCPサーバーの計画
  2. 02ローカルまたはリモートのデプロイ選択
  3. 03API規模に応じたツール設計
  4. 04MCPサーバーの構築と検証

MCP 対応

クライアントにツール、リソース、プロンプトを提供するMCPサーバーの構築を案内し、`tools/list`の応答を確認するスモークテストも含みます。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/pproenca/dot-skills --skill build-mcp-server

インストール後、Claude Code で/build-mcp-serverを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

gotchas.md
metadata.json
references/
auth.md
deploy-cloudflare-workers.md
elicitation.md
remote-http-scaffold.md
resources-and-prompts.md
server-capabilities.md
tool-design.md
versions.md
scripts/
test-server.sh

詳細

MCP サーバーを構築する

Claude とシームレスに連携する MCP サーバーの設計と構築を、開発者向けに案内します。MCP サーバーにはさまざまな形態があり、最初に誤った形を選ぶと、後で大幅な書き直しが必要になります。まず行うべきことは、コードを書くことではなく、要件を把握することです。

Phase 1 の質問への回答を得るまでは、スキャフォールディングを始めないでください。ユーザーの最初のメッセージにすでに回答が含まれている場合は、その旨を確認し、すぐに推奨案を提示してください。

適用する場面

  • ユーザーが MCP サーバーの構築、作成、またはスキャフォールディングを依頼した場合
  • ユーザーが Claude で使う REST/GraphQL API のラッパーを作成したい場合
  • ユーザーが MCP 経由でツール、リソース、またはプロンプトを公開したい場合
  • ユーザーがデプロイモデル(リモート HTTP、MCPB、ローカル stdio)の選択を検討している場合
  • ユーザーが MCP 連携用のツールスキーマを設計している場合

ワークフローの概要

Phase 1: Discovery → Phase 2: Deployment model → Phase 3: Tool pattern → Phase 4: Framework → Phase 5: Scaffold

各フェーズで設計の選択肢を絞り込みます。Phase 5 の後、適切なスキャフォールドのリファレンスまたは関連スキルに引き継ぎます。

前提条件

  • TypeScript の場合: Node.js >= 18、npm
  • Python の場合: Python >= 3.10、pip
  • テスト: npx(npm に同梱)— scripts/test-server.sh と MCP Inspector で使用します

Phase 1 — ユースケースを詳しく確認する

これらの質問は会話形式で尋ねてください(一度のメッセージにまとめ、1つずつ尋問するように聞かないでください)。ユーザーがすでに伝えた内容に合わせて、質問の表現を調整してください。

1. 何に接続しますか?
接続先…想定される方向性
クラウド API(SaaS、REST、GraphQL)リモート HTTP サーバー
ローカルプロセス、ファイルシステム、またはデスクトップアプリMCPB またはローカル stdio
ハードウェア、OS レベルの API、またはユーザー固有の状態MCPB
外部接続なし — 純粋なロジック/計算どちらでも可 — デフォルトはリモート
2. 誰が使いますか?
  • 自分/チームだけが、自分たちのマシンで使う → ローカル stdio で問題ありません(プロトタイプを作るのに最も簡単です)
  • インストールする人なら誰でも使う → リモート HTTP(強く推奨)、またはローカルである必要がある場合は MCPB
  • UI ウィジェットを使いたい Claude デスクトップユーザー → MCP アプリ(リモートまたは MCPB)
3. 公開する個別のアクションはいくつありますか?

これによってツール設計のパターンが決まります — Phase 3 を参照してください。

  • 約15未満のアクション → アクションごとに1つのツール
  • 数十から数百のアクション(例:大規模な API 群をラップする場合) → 検索+実行パターン
4. ツールの実行中にユーザー入力が必要ですか? または豊富な表示が必要ですか?
  • シンプルな構造化入力(リストから選ぶ、値を入力する、確認する) → Elicitation — 仕様に組み込まれており、UI コードは不要です。ホストのサポートは順次導入中です(Claude Code ≥2.1.76)— 必ず機能チェックとフォールバックを併用してください。references/elicitation.md を参照してください。
  • リッチ/ビジュアル UI(グラフ、検索機能付きカスタムピッカー、ライブダッシュボード) → MCP アプリのウィジェット — iframe ベースで、@modelcontextprotocol/ext-apps が必要です。build-mcp-app スキルを参照してください。
  • どちらも不要 → テキスト/JSON を返す通常のツール
5. 上流サービスではどの認証方式を使いますか?
  • なし/API キー → 簡単です
  • OAuth 2.0 → CIMD(推奨)または DCR をサポートするリモートサーバーが必要です。references/auth.md を参照してください

Phase 2 — デプロイモデルを推奨する

回答に基づいて、1つの方針を推奨してください。明確な見解を示してください。選択肢の優先順位は次のとおりです。

リモート streamable-HTTP MCP サーバー(デフォルトの推奨)

streamable HTTP 経由で MCP を提供するホスト型サービスです。クラウド API をラップする場合は、推奨される方法です。

推奨する理由:

  • インストール時の手間がありません — ユーザーは URL を追加するだけです
  • 1つのデプロイで全ユーザーに対応でき、アップグレードも管理できます
  • OAuth フローが適切に動作します(サーバーがリダイレクト、DCR、トークン保存に対応できます)
  • Claude デスクトップ、Claude Code、Claude.ai、およびサードパーティの MCP ホストで動作します

サーバーがユーザーのローカルマシンにアクセスする必要がある場合を除き、この方法を選んでください。

→ 最速でデプロイ: Cloudflare Workers — references/deploy-cloudflare-workers.md(2つのコマンドで URL を公開) → 移植可能な Node/Python: references/remote-http-scaffold.md(Express または FastMCP を使用し、任意のホストで実行)

Elicitation(構造化入力、UI 構築不要)

ユーザーに確認してもらう、選択肢を選んでもらう、または短いフォームに入力してもらうだけなら、Elicitationを使えばUIコードは一切不要です。サーバーがフラットなJSONスキーマを送信し、ホストがネイティブフォームを表示します。仕様に準拠しており、追加パッケージも不要です。

**注意点:**ホスト側のサポートは始まったばかりです(Claude Codeはv2.1.76で提供開始、Desktopは未確認)。クライアントがこの機能に対応していることを通知していない場合、SDKはエラーをスローします。必ず最初にclientCapabilities.elicitationを確認し、フォールバックも用意してください。標準的な実装パターンについてはreferences/elicitation.mdを参照してください。これは仕様に準拠した正しい方法であり、ホスト側の対応範囲は今後広がっていきます。

ネストされたデータや複雑なデータ、スクロールまたは検索できるリスト、ビジュアルプレビュー、ライブ更新が必要な場合は、build-mcp-appウィジェットに移行してください。

MCP アプリ(リモートHTTP+インタラクティブUI)

上記と同じですが、UIリソースが加わります。チャット内にインタラクティブなウィジェットが表示されます。検索可能な高機能ピッカー、グラフ、ライブダッシュボード、ビジュアルプレビューを利用できます。一度作成すれば、Claude と ChatGPTの両方で表示できます。

**次の場合はこちらを選んでください:**Elicitationのフラットフォームの制約に合わず、カスタムレイアウト、大規模な検索可能リスト、ビジュアルコンテンツ、ライブ更新が必要な場合。

通常はリモートで動作しますが、UIからローカルアプリを操作する必要があれば、MCPBとして配布できます。

→ **build-mcp-app**スキルに引き継いでください。

MCPB(バンドルされたローカルサーバー)

ランタイムと一緒にパッケージ化されたローカルMCPサーバーです。ユーザーはNode/Pythonをインストールする必要がありません。ローカルサーバーを配布するための正式な方法です。

**次の場合はこちらを選んでください:**サーバーをユーザーのマシン上で実行する必要がある場合。ローカルファイルの読み取り、デスクトップアプリの操作、localhostのサービスとの通信、またはOSレベルのアクセスが必要な場合などです。

→ **build-mcpb**スキルに引き継いでください。

ローカルstdio(npx / uvx)— 配布には非推奨

ユーザーのマシン上でnpx / uvxを使って起動するスクリプトです。個人用ツールやプロトタイプには適しています。配布には不向きです。ユーザーは適切なランタイムを用意する必要があり、更新をプッシュできず、配布経路はClaude Codeプラグインに限られます。

移行の足がかりとしてのみ推奨してください。ユーザーが希望する場合は、ひな形を作成したうえで、MCPBへのアップグレード経路も説明してください。


フェーズ3 — ツール設計パターンを選ぶ

すべてのMCPサーバーはツールを公開します。ツールの切り分け方は、多くの人が想像する以上に重要です。ツールのスキーマはClaudeのコンテキストウィンドウに直接入ります。

パターンA:アクションごとに1つのツール(小規模なサーフェス)

アクションの種類が少ない場合(約15未満)は、それぞれに明確な説明と厳密なスキーマを備えた専用ツールを用意します。

create_issue    — Create a new issue. Params: title, body, labels[]
update_issue    — Update an existing issue. Params: id, title?, body?, state?
search_issues   — Search issues by query string. Params: query, limit?
add_comment     — Add a comment to an issue. Params: issue_id, body

**効果がある理由:**Claudeはツール一覧を一度読むだけで、何ができるかを正確に把握できます。探索のための追加往復は不要です。各ツールのスキーマによって入力が正確に検証されます。

**特に有効な場合:**1つ以上のツールがインタラクティブなウィジェット(MCPアプリ)を提供するときです。各ウィジェットを1つのツールに自然に結び付けられます。

パターンB:検索+実行(大規模なサーフェス)

大規模なAPI(数十から数百のエンドポイント)をラップする場合、すべての操作をツールとして列挙するとコンテキストウィンドウを圧迫し、モデルの性能が低下します。代わりに、2つのツールを公開します。

search_actions  — Given a natural-language intent, return matching actions
                  with their IDs, descriptions, and parameter schemas.
execute_action  — Run an action by ID with a params object.

サーバーはカタログ全体を内部に保持します。Claudeが検索して選択し、実行します。コンテキストは軽量に保たれます。

**ハイブリッド:**最もよく使われる3〜5個のアクションは専用ツールにし、利用頻度の低いその他の操作は検索/実行の背後に置きます。

→ スキーマの例と説明文の書き方についてはreferences/tool-design.mdを参照してください。


フェーズ4 — フレームワークを選ぶ

次の2つから推奨してください。他にもありますが、MCP仕様への対応範囲とClaudeとの互換性が最も優れています。

フレームワーク言語使用する場面
公式TypeScript SDK(@modelcontextprotocol/sdk)TS/JSデフォルトの選択肢です。仕様への対応範囲が最も広く、新機能も最初に利用できます。
FastMCP 3.x(PyPIのfastmcp)PythonユーザーがPythonを希望する場合、またはPythonライブラリをラップする場合に適しています。デコレーターベースで、定型コードが非常に少なくて済みます。これはjlowinのパッケージであり、公式のmcp SDKに同梱されている凍結版のFastMCP 1.0ではありません。

ユーザーがすでに使いたい言語やスタックを決めている場合は、それに合わせてください。どちらも同一のワイヤープロトコルを生成します。


フェーズ 5 — スキャフォールドを作成して引き継ぐ

4 つの決定(デプロイモデル、ツールパターン、フレームワーク、認証)が固まったら、次のいずれか 1 つを行います。

  1. リモート HTTP、UI なし → references/remote-http-scaffold.md(移植性重視)または references/deploy-cloudflare-workers.md(最速でデプロイ)を使って、ここでスキャフォールドを作成します。このスキルで作業を完了できます。
  2. MCP アプリ(UI ウィジェット) → ここまでの決定事項をまとめてから、build-mcp-app スキルを読み込みます。
  3. MCPB(ローカルバンドル) → ここまでの決定事項をまとめてから、build-mcpb スキルを読み込みます。
  4. ローカル stdio プロトタイプ → ここでスキャフォールドを作成します(最も簡単なケース)。MCPB へのアップグレードパスを示します。

引き継ぐ際は、次のスキルで同じ質問を繰り返さずに済むよう、設計概要を 1 段落で改めて伝えてください。

サーバーを検証する

スキャフォールドの作成後、サーバーが正しく応答することを検証します。

# Start the server first (e.g. npx tsx src/server.ts or python server.py)
# Then smoke-test it:
bash scripts/test-server.sh http://localhost:3000/mcp

テストスクリプトは MCP Inspector 経由で tools/list を呼び出し、サーバーが少なくとも 1 つのツールを返すことを確認します。このテストに合格すれば、サーバーは正しく接続されています。


ツール以外の要素 — その他のプリミティブ

ツールは、サーバーの 3 つのプリミティブのうちの 1 つです。ほとんどのサーバーはツールから始まり、ほかのプリミティブを必要としませんが、これらの存在を知っておけば、車輪の再発明を防げます。

プリミティブ実行するユーザー使用する場面
リソースホストアプリ(Claude ではありません)ドキュメント/ファイル/データを閲覧可能なコンテキストとして公開する
プロンプトユーザー(スラッシュコマンド)定型ワークフロー(「/summarize-thread」)
エリシテーションサーバー(ツール実行中)UI を構築せずにユーザーへ入力を求める
サンプリングサーバー(ツール実行中)ツールのロジックで LLM 推論が必要な場合

→ references/resources-and-prompts.md、references/elicitation.md、references/server-capabilities.md


クイックリファレンス:決定マトリックス

シナリオデプロイツールパターン
小規模な SaaS API をラップするリモート HTTPアクションごとに 1 つ
大規模な SaaS API(エンドポイント 50 個以上)をラップするリモート HTTP検索 + 実行
リッチフォーム/ピッカーを備えた SaaS APIMCP アプリ(リモート)アクションごとに 1 つ
ローカルデスクトップアプリを操作するMCPBアクションごとに 1 つ
チャット内 UI を備えたローカルデスクトップアプリMCP アプリ(MCPB)アクションごとに 1 つ
ローカルファイルシステムを読み書きするMCPB実行面による
個人用プロトタイプローカル stdio最速の方法

参考ファイル

該当するフェーズに進んだときに参照してください。事前に読む必要はありません。

コメント