MCP Server ボイラープレート生成 (TypeScript / Python)
Anthropic の Model Context Protocol (MCP) Server を、tools / resources / prompts を構造化フォームで定義するだけで TypeScript / Python のスケルトンコードに変換。Claude Desktop / Claude Code / Cursor の MCP クライアントで即使える形式 (stdio transport)。
⚠ MCP SDK は活発に更新中。生成コードは TypeScript SDK ^1.0 / Python SDK >=1.0 想定。新仕様適用時は
modelcontextprotocol.io
⚡ プリセット (1 クリックで雛形)
🔧 Tools (LLM が呼び出す関数)
📚 Resources (読込専用データ)
💬 Prompts (再利用可能なテンプレ)
💡 セットアップ手順
- 「全部 zip」で全ファイルをダウンロード
- 解凍して「依存インストール」(npm install / pip install -r requirements.txt)
- 「Claude config」を ~/Library/Application Support/Claude/claude_desktop_config.json に追記
- Claude Desktop を再起動 — MCP server がツール一覧に出る
📖 つまずきやすいポイント
tools / resources / prompts をフォームで定義すると、Model Context Protocol サーバーの雛形を TypeScript または Python で出力します (stdio transport)。Claude Desktop / Claude Code / Cursor などの MCP クライアントにそのまま登録できる形です。処理はブラウザ内で完結します。生成されるのは骨組みだけで — 各ツールの中身は自分で書く必要があります。そして MCP で詰まる箇所は、たいていコードの中ではなく「クライアントとサーバーの境界」にあります: プロセスの起動、標準入出力、環境変数。以下はその 3 つです。
| ケース | 何が起きるか | どうする |
|---|---|---|
| 標準出力に 1 行でも書くと壊れる | stdio transport では、標準出力そのものがプロトコルの通信路です — JSON-RPC のメッセージだけが流れることを前提にしています。したがって console.log() や print() を 1 回書いただけで、フレームの途中に異物が混ざり、クライアント側のパーサーが壊れます。厄介なのはエラーメッセージがまったく的外れになることで、「サーバーが接続できない」「予期しないトークン」「切断されました」といった、原因を示さない表示になります。そして自分が書いた console.log だけが原因とは限りません — 依存ライブラリが起動時に出す警告、パッケージマネージャの更新通知、シェルの初期化スクリプトの出力も、すべて同じ経路に流れ込みます。 |
ログはすべて標準エラー出力に出してください。 TypeScript なら console.error()、Python なら print(..., file=sys.stderr) か logging.basicConfig(stream=sys.stderr) です — 標準エラーはプロトコルに使われないので、いくら書いても安全で、しかもクライアント側のログに残ります。チームで開発するなら、console.log を lint で禁止してください (ESLint の no-console で allow: ['error', 'warn']) — デバッグ中にうっかり書いて、消し忘れたまま commit されるのが最も多いパターンです。切り分けの手順も覚えておくと早いです: ターミナルでサーバーを直接起動し、標準出力に JSON 以外が出ていないかを目で見てください — ここに何か表示されたら、それがそのまま原因です。 |
| description が実質のプロンプトになっている | モデルがそのツールを呼ぶかどうか、どの引数を渡すかを判断する材料は、ツール名・description・各パラメータの説明だけです — 実装コードは一切見えていません。したがって description: "データを取得します" のような説明を書くと、いつ呼ぶべきかが判断できず、必要な場面で呼ばれないか、関係ない場面で呼ばれます。もう 1 つの失敗がツールの数で、似た名前のツールを 20 個並べると、モデルは選択を誤りやすくなります。そして返り値も設計対象です — 巨大な JSON をそのまま返すと、コンテキストを消費し尽くしたうえに、モデルが必要な部分を見つけられません。MCP サーバーの品質は、コードよりも「言葉」で決まります。 |
description には「何をするか」ではなく「いつ使うか・いつ使わないか」を書いてください。 「ユーザーが特定の注文の配送状況を尋ねたときに使う。注文 ID が分かっている場合のみ。商品検索には使わない」のように、境界を明示するほど選択の精度が上がります。パラメータの説明には形式の例を入れてください — 「ISO 8601 の日付 (例: 2025-03-04)」と書くだけで、フォーマット違いの失敗がほぼ消えます。ツールは少なく、名前は互いに紛れないように: get_user と fetch_user を両方置かないことです。返り値は要約して返し、詳細が必要なときだけ second call で取りに行かせる設計にしてください — ページングや limit を最初から入れておくと、後から作り直さずに済みます。 |
| ターミナルでは動くのにクライアントからは起動しない | MCP クライアントはサーバーを子プロセスとして起動しますが、そのプロセスの環境はあなたのターミナルとは別物です。GUI アプリから起動された場合、.bashrc や .zshrc は読み込まれず、PATH は最小限になります。結果として、nvm・pyenv・asdf・volta などのバージョン管理ツールが挿入する PATH が存在せず、node や python 自体が見つかりません — エラーは spawn ENOENT という一言だけです。環境変数も同様に引き継がれませんので、API キーを export して動作確認したサーバーは、クライアントから起動すると認証に失敗します。カレントディレクトリも期待した場所ではありません — 相対パスで読んでいる設定ファイルは見つかりません。 |
クライアントの設定には、インタープリタの絶対パスを書いてください。 which node / which python3 の結果をそのまま command に入れます — バージョン管理ツールを使っているなら、これはほぼ必須です。環境変数はクライアント設定の env キーで明示的に渡します ("env": {"API_KEY": "..."} ) — サーバー側で .env を読む設計にしているなら、そのパスも絶対パスにしてください。ファイルを読むときは __dirname (TypeScript) や Path(__file__).parent (Python) を起点にし、カレントディレクトリに依存しないこと。そして問題が起きたら、まずクライアントのログを開いてください — 標準エラーに出したログはそこに集まっているので、原因はたいてい 1 行目に書いてあります。 |
MCP サーバーは、あなたの権限で動くプログラムです。ファイルを読み書きし、ネットワークに出て、コマンドを実行できます — そしてそれを呼ぶかどうかを決めるのは、外部のテキストを読んでいるモデルです。つまり「モデルが読んだ内容」が、間接的にツール呼び出しを誘導しうるということです (プロンプトインジェクション)。破壊的な操作は、ツールとして公開しないでください — 削除・送信・支払い・デプロイのような取り返しのつかない操作は、人間の確認を挟む設計にするのが原則です。読み取り専用のツールと書き込みを行うツールは、サーバーごと分けるのも有効です。実装面では、パス引数は必ず正規化して許可されたディレクトリの内側に収まるか検証し (../ の連打で外に出られないように)、コマンド実行は配列形式で引数を渡します。最後に、MCP SDK は活発に更新されています — 生成コードは出発点であり、実際の API は modelcontextprotocol.io の最新版で確認してください。
📖 使い方
-
1
プリセット選択 or 0 から定義「Filesystem」「GitHub」「SQL」などのプリセット、または手動で tools / resources / prompts を追加
-
2
言語選択 + 設定TypeScript or Python、stdio or HTTP transport を選択
-
3
zip DL → 起動全ファイル zip をダウンロード、依存インストール、Claude Desktop の config に追記
❓ よくある質問
MCP とは?
stdio と HTTP の違い?
Tools / Resources / Prompts どう使い分け?
🐛 このツールで問題が発生しましたか?
完全無料・登録不要。再現手順だけでも結構です。届いたご報告は運営者に直接届き、修正の参考にします。
ご報告ありがとうございます!
運営者に届きました。改善の参考にさせていただきます。