【次世代AI連携】Anthropicの新規格「Model Context Protocol (MCP)」とは?仕組み・Claude Desktopでの導入から自作ツールの開発手順まで徹底解説

AI技術の進化スピードが加速する中、LLM(大規模言語モデル)を実務に組み込むアプローチとして「外部システムとの連携」が重要視されています。これまで開発者は、モデルごとに異なるAPIやカスタムツール、アドホックなインテグレーションコードを個別に記述せねばならず、実装の乱立が大きな課題となっていました。

この課題を解決すべく、Anthropic社が提唱したオープンな新規格が「Model Context Protocol (MCP)」です。

本記事では、MCPの基礎概念から、Claude Desktopでの設定、さらにはNode.js/TypeScriptを用いたMCPサーバーの自作方法、開発時に直面しやすいトラブルシューティングまでをシニアエンジニアの視点で徹底解説します。


Model Context Protocol(MCP)とは? 誕生の背景

MCPとは、AIアシスタント(クライアント)と、データソースや開発ツール(サーバー)との間で、安全かつ標準化された方法でコンテキスト(コンテキストデータやツール群)を共有するためのオープンソースのプロトコルです。

かつて開発者がIDE(統合開発環境)ごとに個別言語のリンターや補完エンジンを実装していた時代、Microsoftが提唱した「Language Server Protocol (LSP)」によって、開発環境とプログラミング言語間の通信が標準化されました。MCPは、まさに「AIにおけるLSP」を目指して設計されています。

LLMがローカルファイルやDB、Web API、社内ナレッジベースなどの外部リソースにアクセスする際、MCPという標準的な「規格」を介すことで、クライアント(Claude等)とサーバー(データソース)が1対1で強固に接続され、安全かつ柔軟な双方向連携が可能になります。

詳細な仕様や最新のロードマップは、Anthropicが公開している Model Context Protocol公式ドキュメント から確認できます。


MCPの基本構造とアーキテクチャ

MCPのアーキテクチャは、主に以下の3つのコンポーネントで構成されています。

┌─────────────────┐           ┌─────────────────┐           ┌──────────────────┐
│   MCP Client    │  <=====>  │   MCP Server    │  <=====>  │  Data / Tools    │
│ (Claude Desktop │           │ (Local/Remote)  │           │ (Files, DB, API) │
└─────────────────┘           └─────────────────┘           └──────────────────┘

1. MCPクライアント (MCP Client)

AIモデルを搭載したエンドユーザー向けのアプリケーションです。たとえば「Claude Desktop」や、将来的には「Cursor」などの各種エディタ、自作のAIエージェントアプリなどがこれに該当します。クライアントは、後述するMCPサーバーに対してデータの問い合わせやツールの実行要求を送信します。

すでにCursorなどのモダンエディタを利用した開発でもMCPの応用が期待されています。Cursorでの開発連携については Cursor・Vercel・Supabaseで爆速ビルドするClaude 3.5 Sonnet搭載AIアプリ構築ガイド でも触れていますが、MCPの登場によってこれらツールのデータ統合はさらに容易になります。

2. MCPサーバー (MCP Server)

クライアントからの要求に応じて、特定のデータソースやツール機能を提供する軽量なプログラムです。ローカル環境で動かすことも、クラウド上にデプロイしてリモートサーバーとして稼働させることも可能です。

3. リソース・ツール・プロンプト (Resources, Tools, Prompts)

MCPサーバーがクライアントに対して開示する機能は、主に以下の3つに分類されます。

  • Resources(リソース): LLMが読み取ることのできる静的・動的なデータ(ローカルファイル、DBのレコード、APIレスポンスなど)。
  • Tools(ツール): LLMが能動的に実行可能なアクション(コードの実行、ファイルの作成、APIのPOSTリクエスト送信など)。
  • Prompts(プロンプト): 定型化された役割や、文脈に応じたユーザー対話のテンプレート。

Claude Desktopに既製のMCPサーバーを導入する手順

まずは、手元の「Claude Desktop」に公開済みのMCPサーバーを導入し、実際にファイルを探索・操作するデモを体験してみましょう。今回は、ローカルのファイルシステムをClaudeに安全に操作させるための「Filesystem MCP Server」を導入します。

公式のGitHubリポジトリ GitHub - modelcontextprotocol/servers には、SQLite、PostgreSQL、GitHub、Slackなど、多数の公式MCPサーバーが公開されています。

手順 1. 設定ファイルの作成・編集

Claude Desktopは、ローカルの設定ファイルを読み込んでMCPサーバーを起動します。OSごとに以下のパスにある設定ファイルをテキストエディタで開きます(存在しない場合は新規作成します)。

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

手順 2. 設定内容の書き込み

ファイルシステムにアクセスするための設定を以下のように記述します。以下の例では、Node.js環境(npx)を介して公式の filesystem サーバーを起動し、Claudeにアクセスを許可するディレクトリ(今回はデスクトップなど任意のパス)を指定しています。

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/yourname/Desktop"
      ]
    }
  }
}

/Users/yourname/Desktop の部分は、お使いの環境の絶対パスに書き換えてください。Windowsの場合は C:\\Users\\yourname\\Desktop のように、バックスラッシュを適切にエスケープして記述します。

手順 3. Claude Desktopの再起動

Claude Desktopアプリを完全に終了させてから再起動します。画面右下に「コンセントのアイコン」が表示され、クリックした際に「filesystem」というサーバー名と利用可能なツール群が表示されていれば、連携は成功です。

「デスクトップにあるファイルのリストを教えて」とClaudeにチャットで指示すると、AIが自動的にローカルのツールを呼び出し、ファイル一覧を出力してくれます。


【実践】TypeScriptでMCPサーバーを自作する開発手順

既製品を使うだけでなく、自社システムや独自の社内API、ローカルスクリプトとClaudeを連携させたい場合、MCPサーバーを自作するのが最も強力なアプローチです。ここでは、Node.js/TypeScriptと公式SDKを使用して、簡単な「システム情報(メモリ・OSなど)を返却する自作MCPサーバー」を構築する手順を解説します。

1. プロジェクトの初期化と依存関係のインストール

新規のディレクトリを作成し、必要なパッケージをインストールします。

mkdir my-mcp-server
cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk
npm install -D typescript @types/node tsx

次に、TypeScriptの設定ファイル tsconfig.json を作成します。

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"]
}

2. サーバーコードの実装

src/index.ts を作成し、公式のTypeScript SDKをインポートしてMCPサーバーを実装します。詳細なインターフェース定義については、Model Context Protocol TypeScript SDK リポジトリ を参照してください。

import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import * as os from "os";

// 1. MCPサーバーインスタンスの初期化
const server = new Server(
  {
    name: "my-system-info-server",
    version: "1.0.0",
  },
  {
    capabilities: {
      tools: {},
    },
  }
);

// 2. 利用可能なツールの定義を登録
server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      {
        name: "get_system_info",
        description: "ホストマシンのメモリやOS、稼働時間などのシステム情報を取得します。",
        inputSchema: {
          type: "object",
          properties: {},
        },
      },
    ],
  };
});

// 3. ツール実行要求のハンドリング
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "get_system_info") {
    const freeMemGB = (os.freemem() / 1024 / 1024 / 1024).toFixed(2);
    const totalMemGB = (os.totalmem() / 1024 / 1024 / 1024).toFixed(2);
    const uptimeMins = (os.uptime() / 60).toFixed(0);

    const infoString = `OS: ${os.type()} ${os.release()}
Free Memory: ${freeMemGB} GB / ${totalMemGB} GB
Uptime: ${uptimeMins} minutes`;

    return {
      content: [
        {
          type: "text",
          text: infoString,
        },
      ],
    };
  }

  throw new Error(`Unknown tool: ${request.params.name}`);
});

// 4. 標準入出力を介したサーバーの起動
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("My System Info MCP server running on stdio");
}

main().catch((error) => {
  console.error("Server startup failed:", error);
  process.exit(1);
});

3. ビルドとClaude Desktopへの登録

コードの記述が終わったら、ビルドを行います。

npx tsc

ビルドが成功すると、dist/index.js が生成されます。次に、Claude Desktopの設定ファイルにこの自作サーバーを登録します。

{
  "mcpServers": {
    "my-system-info": {
      "command": "node",
      "args": [
        "/absolute/path/to/my-mcp-server/dist/index.js"
      ]
    }
  }
}

/absolute/path/to/... 部分は、プロジェクトフォルダの実パス(絶対パス)に置き換えてください。

設定ファイルを保存後、Claude Desktopを再起動すると、自作ツール「get_system_info」が認識されます。「パソコンのシステム情報を教えて」と尋ねると、リアルタイムなリソース状況をClaudeが読み取って回答してくれるようになります。

なお、このようなAIエージェントの本格的な動作検証をクラウド上で行いたい場合は、Ollama × VS Codeで構築するローカルAI開発環境 もローカルAI・外部ツール連携の実験場として非常に有益な構成です。


MCP導入・開発時によく発生するエラーとトラブルシューティング

MCPサーバーの開発およびClaude Desktopとの統合プロセスでは、いくつかの特有のエラーに直面することがあります。ここでは、代表的なエラー例とその解決方法を提示します。

1. Claude Desktopが起動しない、またはMCPサーバーを認識しない

  • 原因: claude_desktop_config.json の記述ミス(JSONフォーマットの不正、不要なカンマなど)や、サーバー起動コマンドに記述したパスの間違いです。
  • 解決方法:
    1. JSONファイルを JSONLint などの検証ツールにかけて、正しいシンタックスであるか確認します。
    2. Windows環境の場合、ディレクトリ区切り文字のバックスラッシュ(\)がエスケープされているか確認します(例: C:\\path\\to\\file)。
    3. 設定ファイルに記述したパスが「絶対パス」であることを確認します。相対パス(./dist/... など)は認識されません。

2. npx や環境パスに起因するコマンド実行エラー

  • 原因: Claude DesktopがバックグラウンドでMCPサーバーを起動する際、シェル環境変数(PATHなど)が正しく引き継がれず、nodenpx コマンドを見つけられない場合があります。
  • 解決方法:
    1. 設定ファイル内の command を、単なる node ではなく、インストールされているNode.jsのフルパス(例: /usr/local/bin/nodeC:\\Program Files\\nodejs\\node.exe)に変更します。パスはターミナルで which node (macOS) または where node (Windows) を実行して確認できます。
    2. npxを利用する場合も、フルパスで指定するか、ローカル環境にあらかじめ該当モジュールをビルドして絶対パスで直接起動する形に書き換えることで動作が安定します。

まとめ:MCPがもたらすAIエコシステムの未来

Anthropicが提唱した「Model Context Protocol (MCP)」は、これまで乱立していたLLMと外部データのインターフェースに「標準の共通言語」をもたらす画期的な取り組みです。LSPが開発者の生産性を底上げしたのと同様に、MCPはAIアプリケーションの構築コストを激減させ、安全かつポータブルな連携エコシステムを急速に形作っていくでしょう。

まずは手軽なClaude Desktopへの導入から始め、ご自身のプロジェクトやシステムを繋ぐカスタムMCPサーバーの自作へとステップを進めてみてください。AIとリアルデータがシームレスに結合する恩恵を、すぐに実感できるはずです。