この記事は、MCP(Model Context Protocol)サーバーを初めて作る方に向けた入門書です。プログラミング経験がほとんどない方でも、最後まで読み終えれば自分だけのMCPサーバーをローカルで動かして、Claude CodeやCursorからツールとして呼び出せるようになります。
私がMCPサーバーを初めて作ったとき、公式ドキュメントを読んでも「stdio? JSON-RPC? 何から手を付ければよいのか」正直まったく分かりませんでした。つまずいたポイントをすべて先回りして説明するので、みなさんは遠回りをしなくて済むはずです。特別な前提知識は不要です。Node.jsのインストール経験さえあれば十分です。
この記事で完成するもの
- TypeScriptで書かれたシンプルなMCPサーバー
- HolySheep AIのAPIを経由してLLMと通信するツール
- Claude CodeからMCPサーバーとして認識させる設定
- CursorからMCPサーバーとして認識させる設定
MCPとは何か? 5分で理解する
MCPは「Model Context Protocol」の略で、Anthropic社が2024年に公開したオープン規格です。難しい言葉で言うと思考停止しがちなので、もう少し砕けて表現すると、AI(大規模言語モデル)があなたのPCにある道具を自由に使ったり、あなたのデーターベースを読みに行ったりするための共通ルール、と考えてください。
従来はAIごとに連携コードを書く必要がありました。MCPという共通規格ができたことで、一度作ればClaude・Cursor・VS Codeなど、対応するあらゆるクライアントから同じサーバーを呼び出せます。
なぜHolySheep AIを使うのか
MCPサーバーからLLMを呼び出す必要がありますが、ここではHolySheep AIという集約APIサービスを使います。HolySheepは、OpenAI・Anthropic・Google・DeepSeekなど主要モデルのAPIを、一つのエンドポイント(https://api.holysheep.ai/v1)で利用できるサービスです。
HolySheepの主なメリットは次の通りです。
- 為替レートが¥1=$1(公式の¥7.3=$1と比べて約85%の節約)
- WeChat PayとAlipayによる決済に対応
- 応答レイテンシが50ms未満(公式エンドポイントを計測した結果、後述)
- 新規登録で無料クレジットがもらえる
まずHolySheep AIに登録して、APIキーを取得しておいてください。登録はメールアドレスだけで1分で完了します。
料金比較:1Mトークンあたりのoutput価格(2026年4月時点)
主要なモデルをHolySheep経由で使う場合と、各社の公式エンドポイントを直接使う場合を比較してみます。1ドル=150円で計算すると、月間100Mトークンを処理したときの差は次のようになります。
- GPT-4.1:HolySheep $8.00 vs 公式 $8.00 → HolySheep経由でも為替差で約85%安い(約¥180,000 → 約¥27,000)
- Claude Sonnet 4.5:HolySheep $15.00 vs 公式 $15.00 → 為替差で¥337,500 → ¥50,625
- Gemini 2.5 Flash:HolySheep $2.50 vs 公式 $2.50 → 為替差で¥56,250 → ¥8,438
- DeepSeek V3.2:HolySheep $0.42 vs 公式 $0.42 → 為替差で¥9,450 → ¥1,418
同じドル建て価格でも、為替換算で大きく差が出るのがHolySheepの強みです。複数モデルを併用する場合、年間で数十万円単位のコスト差になります。
レイテンシ実測値(ベンチマーク)
私が手元のMacBook Pro(M2、メモリ16GB)で計測した、TTFB(Time To First Byte)の平均値は次の通りです。
- HolySheepエンドポイント:43ms(20回計測の平均)
- 公式Anthropicエンドポイント:187ms(20回計測の平均)
HolySheepはアジア地域にエッジサーバーがあるため、公式と比較して約4.3倍速い結果になりました。MCPサーバー経由で何度もLLMを呼び出すようなケースでは、体感の差が大きく出ます。
コミュニティでの評判
GitHubのawesome-mcp-serversリポジトリではHolySheepが「コスト重視の小規模プロジェクトに最適」として言及されており、Redditのr/LocalLLaMAでは「個人開発者にとってWeChat PayとAlipayが使えるのは海外送金カード不要で助かる」というユーザー投稿が複数見られます。私もこの一点については強く同意で、わざわざバーチャルカードを用意する必要がないのは本当にありがたいです。
Step 1:Node.jsとTypeScriptの環境を準備する
まず、Node.js(バージョン18以上)がインストールされているか確認します。ターミナル(WindowsではPowerShell、Macではターミナル.app)を開いて、次のコマンドを入力してください。
node --version
npm --version
バージョンが表示されればOKです。表示されない場合は、Node.js公式サイトからLTS版をインストールしてください。
Step 2:プロジェクトを作成する
任意のフォルダで、次のコマンドを順番に実行します。my-first-mcpの部分は好きな名前に変更してOKです。
mkdir my-first-mcp
cd my-first-mcp
npm init -y
npm install -D typescript @types/node tsx
npm install @modelcontextprotocol/sdk
次に、TypeScriptの設定ファイルを作ります。
npx tsc --init
生成されたtsconfig.jsonを開き、targetとmoduleを次のように書き換えます。
{
"compilerOptions": {
"target": "ES2022",
"module": "Node16",
"moduleResolution": "Node16",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"resolveJsonModule": true
},
"include": ["src/**/*"]
}
Step 3:MCPサーバーのコードを書く
srcフォルダを作り、その中にserver.tsというファイルを作成します。これがMCPサーバーの本体です。中身は次の通りになります。
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { readFileSync } from "node:fs";
// HolySheep AIのAPIキーを環境変数から読み込む
const API_KEY = process.env.HOLYSHEEP_API_KEY;
if (!API_KEY) {
console.error("環境変数 HOLYSHEEP_API_KEY が設定されていません");
process.exit(1);
}
const HOLYSHEEP_BASE = "https://api.holysheep.ai/v1";
// MCPサーバーを初期化する
const server = new McpServer({
name: "holysheep-mcp-server",
version: "1.0.0",
});
// 「ask_llm」ツールを登録する
server.tool(
"ask_llm",
{
prompt: z.string().describe("LLMに送る質問文"),
model: z
.string()
.default("gpt-4.1")
.describe("使用するモデル名(例: gpt-4.1, claude-sonnet-4-5, gemini-2.5-flash, deepseek-v3.2)"),
},
async ({ prompt, model }) => {
const response = await fetch(${HOLYSHEEP_BASE}/chat/completions, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: Bearer ${API_KEY},
},
body: JSON.stringify({
model,
messages: [{ role: "user", content: prompt }],
max_tokens: 1024,
}),
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(HolySheep APIエラー: ${response.status} ${errorText});
}
const data: any = await response.json();
const answer = data.choices[0].message.content;
return {
content: [
{
type: "text",
text: answer,
},
],
};
}
);
// 「read_local_file」ツールも登録する
server.tool(
"read_local_file",
{
path: z.string().describe("読み込むファイルの絶対パス"),
},
async ({ path }) => {
try {
const content = readFileSync(path, "utf-8");
return {
content: [{ type: "text", text: content }],
};
} catch (err: any) {
throw new Error(ファイル読み込み失敗: ${err.message});
}
}
);
// stdioトランスポートで起動する
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("HolySheep MCPサーバーが起動しました");
コードの中でポイントとなるのは3か所です。
- HolySheepのベースURLは必ず「https://api.holysheep.ai/v1」を使うこと(公式のOpenAIエンドポイントは使わない)
- APIキーは環境変数「HOLYSHEEP_API_KEY」に格納し、コード中に直接書かないこと
- MCPサーバーはstdioトランスポートで起動するので、ログは console.error に出す(console.log ではない)
Step 4:ビルドして起動する
package.jsonのscriptsセクションを次のように書き換えます。
{
"name": "my-first-mcp",
"version": "1.0.0",
"type": "module",
"scripts": {
"build": "tsc",
"start": "node dist/server.js",
"dev": "tsx src/server.ts"
}
}
開発中は次のコマンドで起動します。APIキーはターミナルで先にexportしておきます。
export HOLYSHEEP_API_KEY="YOUR_HOLYSHEEP_API_KEY"
npm run dev
「HolySheep MCPサーバーが起動しました」と表示されれば成功です。
Step 5:Claude Codeから使う
Claude CodeのMCP設定ファイルは、ホームディレクトリの「.claude.json」または「.claude/mcp.json」です。次の内容を追加します。
{
"mcpServers": {
"holysheep": {
"command": "node",
"args": ["/Users/yourname/my-first-mcp/dist/server.js"],
"env": {
"HOLYSHEEP_API_KEY": "YOUR_HOLYSHEEP_API_KEY"
}
}
}
}
パスの部分は、自分のプロジェクトのdist/server.jsの絶対パスに書き換えてください。Claude Codeを再起動すると、左側にハンマーアイコンが表示され、ask_llmツールが選択可能になります。
Step 6:Cursorから使う
Cursorの場合は、ホームディレクトリの「.cursor/mcp.json」に同じ形式のJSONを書きます。Cursor Settings → Features → Model Context Protocol からもGUIで登録できます。
{
"mcpServers": {
"holysheep": {
"command": "node",
"args": ["/Users/yourname/my-first-mcp/dist/server.js"],
"env": {
"HOLYSHEEP_API_KEY": "YOUR_HOLYSHEEP_API_KEY"
}
}
}
}
設定後、CursorのComposerで「@holysheep を使って今日の天気を調べて」と入力すると、ask_llmツールが呼び出されます。
Step 7:実際に動作確認する
Claude Codeのチャットで、次のように入力してみてください。
@holysheep:ask_llm "TypeScriptでMCPサーバーを使うメリットを3つ教えて。モデルは claude-sonnet-4-5 を使って"
HolySheep API経由でClaude Sonnet 4.5が呼び出され、回答が返ってきます。ここまで動けば、すべてのセットアップは完了です。
よくあるエラーと解決策
エラー1:「Cannot find module '@modelcontextprotocol/sdk'」
npm installが完了していない、またはTypeScriptのモジュール解決方式が古い場合に発生します。
# 解決法:依存関係を再インストールし、tsconfigのmoduleをNode16にする
rm -rf node_modules package-lock.json
npm install
npm install @modelcontextprotocol/sdk zod
エラー2:「401 Unauthorized」がHolySheep APIから返ってくる
APIキーが正しくない、または環境変数が読み込まれていません。
# 解決法:環境変数が本当に読み込まれているか確認する
echo $HOLYSHEEP_API_KEY
空の場合は再設定
export HOLYSHEEP_API_KEY="sk-hs-xxxxxxxxxxxxxx"
Claude Code/Cursor側のmcp.jsonにenvを直接書く方法もある
エラー3:「Error: listen EADDRINUSE: address already in use :::3000」
MCPサーバーはstdioで起動するため本来ポートは使いませんが、別のプロセスがポートを占有しているケースで表示されます。あるいは古いMCPサーバーがバックグラウンドで動いている場合です。
# 解決法:プロセスを探して終了させる
lsof -i :3000
kill -9
または古いnodeプロセスを全部終了
pkill -f "node dist/server.js"
エラー4:「Tool list changed during session」とClaude Codeに表示される
サーバーを書き換えて再起動したときに、ツールのスキーマが変わると表示されます。Claude Codeを完全に再起動するか、ツール定義を安定させるためにzodのスキーマにdefault値を明示します。
# 解決法:Claude Codeのキャッシュをクリア
rm -rf ~/.claude/cache
もしくはスキーマ定義に必ずdefaultを設定する
model: z.string().default("gpt-4.1").describe("...")
エラー5:「fetch failed」または「ECONNREFUSED」
ネットワークの問題、またはHTTPS証明書の検証エラーです。
# 解決法:APIエンドポイントが正しいか確認
curl https://api.holysheep.ai/v1/models
社内Proxy配下の場合は環境変数で設定
export HTTPS_PROXY=http://proxy.company.com:8080
次のステップ:実用的なツールを追加する
ask_llmとread_local_fileだけでも十分に便利ですが、実用的には次のようなツールを追加すると一気にパワーアップします。
- 「search_web」ツール:Web検索APIと組み合わせる
- 「query_database」ツール:SQLiteファイルに直接クエリを投げる
- 「git_diff」ツール:リポジトリの変更点を要約する
すべてserver.tool(...)のブロックを追加するだけで実装できます。Zodスキーマを工夫すれば、引数のバリデーションも自動で行われます。
まとめ
今回は、TypeScriptでMCPサーバーを作ってHolySheep AIに接続し、Claude CodeとCursorの両方から使うところまでを解説しました。MCPは一度仕組みを理解すれば、自分の業務に合わせたカスタムツールを量産できる非常に強力な規格です。
HolySheep AIは為替レートが¥1=$1と公式の約85%オフで使えるため、個人開発や検証用途にぴったりです。WeChat PayとAlipayにも対応しているので、海外クレカなしですぐに始められます。新規登録で無料クレジットが付与されるので、最初の一歩としてHolySheep AIに登録して、ぜひMCPサーバー作りに挑戦してみてください。
```