この記事は、MCP(Model Context Protocol)サーバーを初めて作る方に向けた入門書です。プログラミング経験がほとんどない方でも、最後まで読み終えれば自分だけのMCPサーバーをローカルで動かして、Claude CodeやCursorからツールとして呼び出せるようになります。

私がMCPサーバーを初めて作ったとき、公式ドキュメントを読んでも「stdio? JSON-RPC? 何から手を付ければよいのか」正直まったく分かりませんでした。つまずいたポイントをすべて先回りして説明するので、みなさんは遠回りをしなくて済むはずです。特別な前提知識は不要です。Node.jsのインストール経験さえあれば十分です。

この記事で完成するもの

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の主なメリットは次の通りです。

まずHolySheep AIに登録して、APIキーを取得しておいてください。登録はメールアドレスだけで1分で完了します。

料金比較:1Mトークンあたりのoutput価格(2026年4月時点)

主要なモデルをHolySheep経由で使う場合と、各社の公式エンドポイントを直接使う場合を比較してみます。1ドル=150円で計算すると、月間100Mトークンを処理したときの差は次のようになります。

同じドル建て価格でも、為替換算で大きく差が出るのがHolySheepの強みです。複数モデルを併用する場合、年間で数十万円単位のコスト差になります。

レイテンシ実測値(ベンチマーク)

私が手元のMacBook Pro(M2、メモリ16GB)で計測した、TTFB(Time To First Byte)の平均値は次の通りです。

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か所です。

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だけでも十分に便利ですが、実用的には次のようなツールを追加すると一気にパワーアップします。

すべてserver.tool(...)のブロックを追加するだけで実装できます。Zodスキーマを工夫すれば、引数のバリデーションも自動で行われます。

まとめ

今回は、TypeScriptでMCPサーバーを作ってHolySheep AIに接続し、Claude CodeとCursorの両方から使うところまでを解説しました。MCPは一度仕組みを理解すれば、自分の業務に合わせたカスタムツールを量産できる非常に強力な規格です。

HolySheep AIは為替レートが¥1=$1と公式の約85%オフで使えるため、個人開発や検証用途にぴったりです。WeChat PayとAlipayにも対応しているので、海外クレカなしですぐに始められます。新規登録で無料クレジットが付与されるので、最初の一歩としてHolySheep AIに登録して、ぜひMCPサーバー作りに挑戦してみてください。

👉 HolySheep AI に登録して無料クレジットを獲得

```