TypeScriptでMCPサーバーを作る方法
MCPサーバーの作り方
TypeScriptでMCPサーバーを作る方法(SDK v2) | We.Inc
公式TypeScript SDK v2で動くMCPサーバーを作ります。インストール、Zodスキーマを使ったツールの登録、stdioでの接続、MCP Inspectorでのテストまで解説します。
公式パッケージ@modelcontextprotocol/serverとZodをインストールし、名前とバージョンを指定してMcpServerを作成します。各ツールはregisterToolで、説明とZodの入力スキーマを付けて登録し、StdioServerTransportを接続します。AIアプリケーションに触らせる前に、npx @modelcontextprotocol/inspectorを実行して、ツールを手動で呼び出してみましょう。
必要な部品
- McpServer
- @modelcontextprotocol/server
- ツールを保持し、プロトコルのリクエストに応答する
- registerTool
- McpServerのメソッド
- ツールを1つ追加する:名前、説明、入力スキーマ、ハンドラー
- StdioServerTransport
- @modelcontextprotocol/server/stdio
- 標準入出力でホストと通信する
- z.object(...)
- zod/v4
- ツールの引数を記述し、検証する
- Inspector
- npx @modelcontextprotocol/inspector
- ツールを手動で一覧表示し、呼び出せる
進めながら各ステップにチェックを入れてください。チェックリストが進捗を記録し、各ステップには必要なコマンドやファイルがそのまま載っています。完成したサーバーは小さなメモの一覧を検索します。データベースなしで、すべての構成要素を確認するには十分です。
- フォルダーを作り、下に示すpackage.jsonを追加して、2つの依存関係をインストールします。
- server.tsを貼り付け、notes配列を自分のデータやAPI呼び出しに置き換えます。
- Inspectorを起動し、サーバーを実行するコマンドを指定します。
- ツールを一覧表示し、単語を指定してnotes_searchを呼び出し、返ってくるテキストを確認します。
- stdioサーバーからstdoutに書き込んではいけません。そのストリームはプロトコルのメッセージを運ぶため、余計なconsole.logがメッセージを壊します。stderrに出力されるconsole.errorを使いましょう。
- 各ツールは小さく具体的にしましょう。モード切り替え付きの1つのnotesツールより、notes_searchとnotes_createという2つのツールのほうが、モデルが選びやすくなります。
- お金、ファイル、他人のデータに触れるツールでは、スキーマだけでなくハンドラー内でも検証しましょう。スキーマが確認するのは形であって、権限ではありません。
- package.jsonでSDKのメジャーバージョンを固定しましょう。バージョン1は別のパッケージ@modelcontextprotocol/sdkだったため、古いチュートリアルはこれらのimportと一致しません。
よくある質問
どのnpmパッケージをインストールすればよいですか?
SDKバージョン2では、サーバーには@modelcontextprotocol/serverを、クライアントには@modelcontextprotocol/clientをインストールします。古いv1のパッケージ@modelcontextprotocol/sdkはv1.xブランチで維持され、v2リリース後も少なくとも6か月間はバグとセキュリティの修正が提供されます。
Zodは必要ですか?
v2のREADMEでは入力スキーマにZod v4を使い、zod/v4からimportしています。また、ValibotやArkTypeなど他のStandard Schemaライブラリも使えると書かれています。選んだものをSDKと一緒にインストールしてください。
サーバーはBunやDenoで動きますか?
SDKのREADMEによると、Node.js、Bun、Denoで動作します。Inspectorは別のNodeツールで、そのREADMEではNode 22.19.0以降が必要とされています。
サーバーをリモートから使えるようにするには?
stdioトランスポートをStreamable HTTPに替え、到達可能な場所でプロセスをホストします。URLに到達できる人なら誰でもリクエストを送れるため、データを変更するツールを公開する前に認証を追加しましょう。
AIアプリケーションがツールを理解できるかどうか、どうすればわかりますか?
プロジェクトについて何も知らないつもりで、説明とスキーマを読んでみてください。初めて見る人が、いつツールを呼び出し何を渡せばよいか判断できないなら、モデルも推測することになります。Inspectorは、ホストに見える内容をそのまま表示します。
まずstdioから始める理由
- stdioサーバーは、ホストが起動する単なるプログラムです。ポートもホスティングもログインも不要なので、自分のマシンでテストできる動くツールへの最短ルートです。
- ツールが正しく動くようになれば、Streamable HTTPへの移行で変わるのはトランスポートの行とホスティングだけで、ツールのコードは変わりません。ビジネスロジックを、ハンドラーから呼び出す普通の関数に置いておく主な理由はこの分離にあります。
ハンドラーの応答を設計する
- ハンドラーはcontent配列を持つオブジェクトを返します。一般的なのはテキスト項目で、短く具体的なテキストが最も効果的です。レコード一式をそのまま出すのではなく、何が何件一致したかを伝えましょう。
- 何も一致しないときは、そう伝える文を返します。空の文字列だと、呼び出しが失敗したのか、検索結果が単に空だったのか、モデルは推測するしかありません。
完成したサーバー
ファイルは2つです。notes配列は、サーバーに検索させたい内容に置き換えてください。
type moduleによりESのimport構文がそのまま動きます。startスクリプトはtsxを使うため、ビルド手順を省けます。
Zodスキーマ付きのツール1つ、普通の検索関数、stdio接続で構成されています。ログはstderrに出力されるため、プロトコルのメッセージと混ざりません。
Inspectorでテストする
Inspectorには3つのモードがあります。最初に使うならWeb UIが最も簡単で、CLIモードはスクリプトやCIに向いています。
Inspectorのモード
Web UIでは、サーバーを起動するコマンド(npx tsx server.ts)で接続し、ツールの一覧を開きます。
SDK、Zod、TypeScriptの実行ツールをインストールする
ツールを1つ持つserver.tsを書く
一度サーバーを起動し、クラッシュしないことを確認する
Inspectorを開き、サーバーに接続する
ツールを一覧表示し、notes_searchを手動で呼び出す
作成チェックリスト
{v}ステップ中{n}ステップ完了
チェックを外す
コマンドをコピー
無料で始める · クレジットカード不要
関連: ガイド|Webマーケティングと集客を学ぶ
製品
ご利用いただける方
機能
リソース
会社情報
サイトマップを見る