🔌

Claude Code MCP入門:47体のAIエージェントに「外部ツールの手足」を与えた全記録

に公開

MCPとは何か——AIに「手足」を生やすプロトコル

Claude Codeは賢い。だが、素の状態では「頭だけの存在」だ。ファイルの読み書きとシェルコマンドの実行はできるが、Slack、Notion、GitHub Issues、データベース、外部APIと直接やり取りする手段を持たない。

この制約を根本から解決するのが**MCP(Model Context Protocol)**である。

MCPは、AIモデルと外部ツールをつなぐオープンプロトコルだ。Claude Codeに「MCPサーバー」を接続すると、AIがそのツールのAPIを直接呼び出せるようになる。ブラウザでポチポチ操作していた作業を、AIが自律的に実行できるようになるということだ。

私が運営する47名のAIエージェント会社「Altus」では、MCPの導入前後で業務の自動化率が劇的に変わった。具体的にどう設定し、何が起きたかを記録する。

MCPの仕組みを30秒で理解する

構造はシンプルだ。

Claude Code(クライアント)
    ↕ JSON-RPC over stdio/SSE
MCPサーバー(ツールごとに1プロセス)

外部サービス(Slack, GitHub, DB, etc.)

MCPサーバーは「ツール一覧」と「各ツールの実行エンドポイント」を公開する。Claude Codeはその一覧を読み取り、必要に応じてツールを呼び出す。人間が「Slackに投稿して」と指示すれば、AIが適切なMCPツールを選んで実行する。

重要なのは、MCPサーバーはただのプロセスであるという点だ。Node.jsでもPythonでも書ける。既存のnpmパッケージも豊富に公開されている。

実際の設定方法:3ステップで外部ツールと接続する

ステップ1:MCPサーバーを追加する

Claude Codeには claude mcp add コマンドが用意されている。例えばGitHub連携なら以下の通りだ。

claude mcp add github -- npx -y @modelcontextprotocol/server-github

これだけでGitHub MCPサーバーが登録される。環境変数でトークンを渡す場合は -e フラグを使う。

claude mcp add github \
  -e GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxxxxxxxxxxx \
  -- npx -y @modelcontextprotocol/server-github

ステップ2:設定ファイルを確認する

登録したMCPサーバーは ~/.claude.json に記録される。直接編集も可能だ。

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxx"
      }
    }
  }
}

プロジェクト単位で管理したい場合は、リポジトリルートに .mcp.json を置く。

{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://localhost:5432/mydb"]
    }
  }
}

ステップ3:動作確認

Claude Codeを起動して /mcp と入力する。接続中のMCPサーバーとツール一覧が表示される。

> /mcp

GitHub (connected)
  Tools: create_issue, search_repositories, get_file_contents, ...

PostgreSQL (connected)
  Tools: query, list_tables, describe_table, ...

ステータスが connected になっていれば準備完了だ。あとは自然言語で指示するだけでAIがツールを使い分ける。

Altusで実際に接続している5つのMCPサーバー

47体のエージェントを運用する中で、特に効果が高かったMCP構成を共有する。

1. GitHub MCP — コードレビュー自動化

claude mcp add github \
  -e GITHUB_PERSONAL_ACCESS_TOKEN=$GITHUB_TOKEN \
  -- npx -y @modelcontextprotocol/server-github

エージェント「レビュアー」がPRの差分を読み、Issueにコメントを書き、ラベルを付ける。人間のレビュー待ち時間がゼロになった。

2. PostgreSQL MCP — データ分析の自律実行

claude mcp add postgres \
  -- npx -y @modelcontextprotocol/server-postgres \
  "postgresql://readonly:pass@db.example.com:5432/analytics"

「先月のユーザー離脱率をコホート別に出して」と指示すると、AIがテーブル構造を確認し、SQLを組み立て、結果を整形して返す。読み取り専用ユーザーで接続しているため、誤ってデータを壊すリスクもない。

3. Filesystem MCP — ドキュメント横断検索

claude mcp add docs \
  -- npx -y @modelcontextprotocol/server-filesystem \
  /home/altus/knowledge-base

社内ナレッジベースのMarkdownファイル群を丸ごと参照可能にしている。新しいエージェントの立ち上げ時に「過去の議事録から類似案件を探して」と指示すると、関連ファイルを自動で見つけてくる。

4. Fetch MCP — 外部API呼び出し

claude mcp add fetch \
  -- npx -y @modelcontextprotocol/server-fetch

任意のURLにHTTPリクエストを送れるようになる。REST APIのレスポンスを解析したり、Webページの内容を取得してまとめたりする用途で多用している。

5. Slack MCP(カスタム) — 日報の自動投稿

公式パッケージが要件に合わなかったため、自前でMCPサーバーを書いた。TypeScriptで約120行だ。

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

const server = new McpServer({
  name: "slack-poster",
  version: "1.0.0",
});

server.tool(
  "post_message",
  "Slackチャンネルにメッセージを投稿する",
  {
    channel: z.string().describe("チャンネルID"),
    text: z.string().describe("投稿するメッセージ本文"),
  },
  async ({ channel, text }) => {
    const res = await fetch("https://slack.com/api/chat.postMessage", {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${process.env.SLACK_BOT_TOKEN}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ channel, text }),
    });
    const data = await res.json();
    return { content: [{ type: "text", text: JSON.stringify(data) }] };
  }
);

const transport = new StdioServerTransport();
await server.connect(transport);
claude mcp add slack-poster \
  -e SLACK_BOT_TOKEN=$SLACK_BOT_TOKEN \
  -- node /home/altus/mcp-servers/slack-poster.mjs

毎日18時に「日報担当」エージェントが各チームの進捗をまとめてSlackに投稿する。手動の日報作成が完全に不要になった。

MCPを導入して気づいた3つの落とし穴

1. 権限の渡しすぎに注意

MCPで接続したツールは、AIが自律的に呼び出す。データベースにフルアクセス権を与えると、DELETEクエリを実行するリスクがある。必ず読み取り専用ユーザーや制限付きトークンを使うべきだ。Altusではすべてのデータベース接続をREAD ONLYに限定している。

2. MCPサーバーの起動失敗はサイレントに起きる

サーバーがクラッシュしてもClaude Code側にはエラーが表示されないことがある。/mcp で定期的にステータスを確認する習慣をつけるか、claude mcp serve でデバッグモードを使うとよい。

# トラブルシューティング:サーバーを直接実行して確認
npx -y @modelcontextprotocol/server-github 2>&1

3. ツールが多すぎるとAIが迷う

10個以上のMCPサーバーを同時接続したとき、AIが不適切なツールを選ぶ頻度が上がった。プロジェクトごとに必要なMCPだけを .mcp.json で定義し、スコープを絞ることで精度が改善した。

MCPのスコープ設計:グローバル vs プロジェクト vs ユーザー

Claude CodeのMCP設定には3つのスコープがある。

スコープ 設定場所 用途
グローバル ~/.claude.json 全プロジェクト共通で使うツール
プロジェクト .mcp.json(リポジトリルート) チーム共有・プロジェクト固有
ユーザーローカル .claude/local.json 個人のトークンを含む設定(gitignore推奨)

Altusでは以下のように使い分けている。

  • グローバル:Fetch MCP(汎用的なHTTPクライアント)
  • プロジェクト:GitHub MCP、PostgreSQL MCP(リポジトリごとに対象が異なる)
  • ユーザーローカル:個人のAPIトークンを含む設定

.mcp.json はGit管理に含めてチームで共有し、トークン類は環境変数で注入するのが安全な運用パターンだ。

まとめ:MCPはAIエージェントの「行動範囲」を決める

MCPを導入する前、Altusのエージェントは「コードを書く」「ファイルを整理する」が限界だった。MCP導入後は「Slackに報告する」「DBを調べる」「GitHubでIssueを管理する」まで自律的にこなすようになった。

MCPは難しい技術ではない。claude mcp add の1コマンドで始められる。だが、AIエージェントの実用性を根本的に変える。

まずはGitHub MCPかFilesystem MCPを1つ追加してみるところから始めるのが良い。AIが外部ツールを使い始めた瞬間、「ああ、これは単なるチャットボットではないな」と実感するはずだ。

GitHubで編集を提案

Discussion