Claude Code用カスタムMCPサーバーの構築
Node.jsでカスタムClaude Code MCPサーバーを構築する方法。ツール定義、リクエストハンドラー、RESTとPostgresのパターン、Claude Codeが読み込むための設定を解説。
設定をやめて、構築を始めよう。
AIオーケストレーション付きSaaSビルダーテンプレート。
問題: 公開されているMCPサーバーは、実際に使っているシステムと連携しません。社内API、社内のPostgres、誰も触れないカスタムワークフロー。Claude Codeがそれらにアクセスするには、サーバー自体を作る必要があります。
すぐに試せること: 5分のNode.jsでClaudeを任意のREST APIに接続できます。
// my-api-server.js - Connect Claude to your API
const { Server } = require("@modelcontextprotocol/sdk/server/index.js");
const server = new Server({ name: "my-api-server", version: "1.0.0" });
server.setRequestHandler("tools/list", async () => ({
tools: [
{
name: "fetch_user_data",
description: "Get user information from our internal API",
inputSchema: {
type: "object",
properties: {
userId: { type: "string", description: "User ID to fetch" },
},
required: ["userId"],
},
},
],
}));
server.setRequestHandler("tools/call", async (request) => {
const { name, arguments: args } = request.params;
if (name === "fetch_user_data") {
const response = await fetch(
`https://api.yourcompany.com/users/${args.userId}`,
{
headers: { Authorization: `Bearer ${process.env.API_TOKEN}` },
},
);
return {
content: [{ type: "text", text: JSON.stringify(await response.json()) }],
};
}
});
server.connect(process.stdio);このファイルを my-api-server.js として保存します。テストするには node my-api-server.js を実行してください。これで動作するインテグレーションの完成です。
MCPサーバーとは何か
MCPサーバーとは、Claude Codeに呼び出し可能なツールのリストを渡すNode.jsプロセスです。エディタとは独立して動作し、ClaudeにNode.jsからアクセスできるあらゆるもの、つまりAPI、データベース、社内サービスへの接続を提供します。
すべてのサーバーには4つの要素が含まれます:
- ツール定義: Claudeが呼び出せる関数
- ツールハンドラー: Claudeが呼び出したときに実行されるコード
- エラーハンドリング: 呼び出しが失敗したときの有用なメッセージ
- 認証: 背後のシステムに安全にアクセスする方法
ほとんどのケースをカバーするパターン
REST APIとの連携
小さなコネクターでClaudeをHTTPエンドポイントに向けることができます。
// Generic API connector pattern
const { Server } = require("@modelcontextprotocol/sdk/server/index.js");
const server = new Server({ name: "api-connector", version: "1.0.0" });
server.setRequestHandler("tools/list", async () => ({
tools: [
{
name: "api_get",
description: "GET request to any endpoint",
inputSchema: {
type: "object",
properties: {
endpoint: { type: "string", description: "API endpoint path" },
params: { type: "object", description: "Query parameters" },
},
required: ["endpoint"],
},
},
],
}));
server.setRequestHandler("tools/call", async (request) => {
const { name, arguments: args } = request.params;
if (name === "api_get") {
const url = new URL(`${process.env.API_BASE_URL}${args.endpoint}`);
if (args.params) {
Object.entries(args.params).forEach(([key, value]) =>
url.searchParams.append(key, value),
);
}
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.API_TOKEN}` },
});
return {
content: [
{ type: "text", text: JSON.stringify(await response.json(), null, 2) },
],
};
}
});
server.connect(process.stdio);同じ形式でStripe、Shopify、社内ダッシュボード、HTTPに対応しているものならすべて処理できます。
データベースとの連携
fetchの呼び出しをデータベースクライアントに置き換えるだけです。
// Database connector for PostgreSQL, MySQL, SQLite
const { Server } = require("@modelcontextprotocol/sdk/server/index.js");
const { Client } = require("pg");
const server = new Server({ name: "database-connector", version: "1.0.0" });
const client = new Client({ connectionString: process.env.DATABASE_URL });
server.setRequestHandler("tools/call", async (request) => {
if (request.params.name === "query_database") {
const result = await client.query(request.params.arguments.query);
return {
content: [{ type: "text", text: JSON.stringify(result.rows, null, 2) }],
};
}
});これでClaudeがSQLを実行し、データベース作業を支援できるようになります。
セットアップとテスト
プロジェクトを開始します。
mkdir my-mcp-server && cd my-mcp-server
npm init -y && npm install @modelcontextprotocol/sdk次に、MCPの設定ファイルからClaude Codeにサーバーを指定します。ファイルの場所はClaudeの実行方法によって異なります。
- Claude Code CLI:
~/.claude.json(ユーザーレベル)または.mcp.json(プロジェクトレベル) - Claude Desktop:
~/Library/Application Support/Claude/claude_desktop_config.json(macOS)または%APPDATA%\Claude\claude_desktop_config.json(Windows)
{
"mcpServers": {
"my-custom-server": {
"command": "node",
"args": ["/path/to/your/server.js"],
"env": { "API_TOKEN": "your-token" }
}
}
}保存したらClaude Codeを再起動してください。新しいサーバーは起動時に読み込まれます。
問題が起きたとき
サーバーが見つからない: 設定のパスまたはJSONに問題があります。ファイルの場所を確認してください。command には絶対パスを使用してください。
ツールのタイムアウト: 時間がかかる処理はツールをハングさせます。独自のタイムアウトで包み、クリーンに失敗するようにしましょう。
認証失敗: 設定の環境変数がサーバーに届いていません。スペルが正しく、値が存在するか確認してください。
最初にやっておくべきこと
- 外部呼び出しはすべてtry-catchで囲み、クラッシュではなくテキストとしてエラーが表示されるようにする
- トークンはソースコードではなく環境変数に格納する
- レート制限のあるAPIにはClaudeがクォータを使い切らないよう独自のスロットルを設ける
console.logの出力はClaudeのログに表示されるため、デバッグに自由に活用する
次のステップ
1つ接続するものを選んで、そこから積み上げていきましょう。
- 1つのAPIから始める: 毎日触れるもの
- RESTパターンをコピーする: 上記のコネクターがテンプレート
- 読み込みを確認する: Claudeに「利用可能なMCPツールは何ですか?」と質問すれば、新しいツールが表示されるはず
- 良いツールの説明を書く: MCPツール検索はこれを使ってサーバーをいつ読み込むか判断する
- さらに読む: MCPの基本ガイドとよく使われるMCPサーバーのリストが次の構築内容をカバーしている
カスタムMCPサーバーはClaude Codeを自社スタックのクライアントに変えます。週に1サーバーを作れば、Claudeがアクセスできるもののリストは静かに長くなっていきます。
設定をやめて、構築を始めよう。
AIオーケストレーション付きSaaSビルダーテンプレート。