LLM(大規模言語モデル)の業務活用が進む中、「自社の社内データや特定ツールとAIを連携させたい」というニーズは急速に高まっています。しかし、多くの開発現場において、APIごとの個別スクリプト開発という「アドホックな連携」が常態化していませんか?
新しいツールを導入するたびに連携プログラムを書き直し、仕様変更のたびにメンテナンスに追われる。このような属人的な開発手法は、いずれ技術負債となって組織のAI活用を鈍化させます。
そこで現在注目を集めているのが、Anthropicが提唱したオープンスタンダード「Model Context Protocol(MCP)」です。MCPは、AIモデルと外部データソースを接続するための「標準化されたインターフェース」を提供します。本記事では、MCPの仕様を正しく理解し、実際にローカル環境でMCPサーバを構築するまでの実践的なステップを技術者の視点から解説します。
AI活用のボトルネック「連携の個別開発」をどう突破するか
アドホックな連携開発が招く技術負債
社内のデータベース、ドキュメント管理システム、あるいはタスク管理ツールなど、企業内には多種多様なデータが存在します。これらをLLMに読み込ませる際、従来は各ツールのAPI仕様を読み解き、専用のコネクタ(連携プログラム)を個別に開発するのが一般的でした。
しかし、このアプローチには明確な限界があります。連携先のSaaSがAPIの仕様を変更すればコードの修正が必要になり、新しいLLMモデル(例えば、異なるプロバイダーのAI)を試そうとすれば、プロンプトのフォーマットや関数呼び出し(Function Calling)の仕様に合わせて連携部分を再構築しなければなりません。
専門家の視点から言えば、この「N対N」の個別開発は、スケーラビリティの欠如とメンテナンスコストの増大を引き起こす最大の要因です。開発リソースが限られる情報システム部門にとって、終わりのないAPI連携の保守は避けるべき課題と言えます。
MCP(Model Context Protocol)が必要とされる背景
このような状況を打破するために登場したのがMCPです。MCPは、USB-Cが多様なデバイスの接続を一つの規格に統一したように、AIとデータソース間の通信仕様を標準化するプロトコルです。
MCPを導入することで、データソースごとに「MCPサーバ」を一度構築すれば、MCPに対応したあらゆるAIクライアント(Host)から同じ方法でデータにアクセスできるようになります。つまり、開発と運用の標準化による劇的なコスト削減効果が期待できるのです。「API連携は個別に開発するのが当たり前」という定説から脱却し、標準化による統合を目指すことこそが、今後のAIアーキテクチャ設計における正解と考えます。
Model Context Protocol(MCP)の基本構造と動作原理
MCPサーバを構築する前に、そのアーキテクチャを正確に把握しておくことが重要です。MCPは主に3つのコンポーネントで構成されています。
Host, Client, Serverの役割分担
Host(ホスト)
AIモデルを内包し、ユーザーとのインターフェースを提供するアプリケーションです。「Claude Desktop」などがこれに該当します。Hostは、ユーザーの要求に応じてどのツールやリソースを呼び出すかを判断します。Client(クライアント)
Hostの内部に存在し、実際の通信を担うコンポーネントです。Hostからの指示を受け、適切なServerに対してリクエストを送信し、レスポンスを受け取ります。Server(サーバ)
本記事の主役となる部分です。社内データベースや外部SaaSなどのデータソースと直接通信し、Clientからの要求に応じてデータを提供したり、アクションを実行したりする軽量なプログラムです。
この構造により、AIモデル(Host)はデータソースの具体的なAPI仕様や認証方法を知る必要がなくなり、データソースへのアクセスが完全に抽象化されます。
JSON-RPCベースの通信メカニズム
MCPの通信は、標準的な JSON-RPC 2.0 プロトコルをベースにしています。ClientとServer間でJSON形式のメッセージをやり取りすることで、初期化(Handshake)、リソースの取得、ツールの実行などを非同期に行います。
通信経路(Transport)としては、主に以下の2つが定義されています。
- stdio(標準入出力): ローカル環境でサブプロセスとしてServerを起動し、標準入出力を介して通信する方式。セキュアで設定が容易です。
- SSE(Server-Sent Events): HTTP経由でリモートのServerと通信する方式。クラウド上のAPIとして提供する場合に使用します。
まずはセキュリティリスクが低く、実装がシンプルな stdio トランスポートから構築を始めることを推奨します。
MCPサーバ構築の準備:技術スタックと環境セットアップ
TypeScript/Node.js vs Python:SDKの選択基準
公式ドキュメントを参照すると、MCPの実装には主にTypeScript(Node.js)とPythonの公式SDKが提供されています。どちらを選択すべきかは、既存のチームのスキルセットや連携先のシステムに依存しますが、一般的な選択基準は以下の通りです。
- TypeScript: WebフロントエンドやNode.jsベースのバックエンドを運用しているチームに最適です。Zodを用いた堅牢な型定義とスキーマ検証が強力で、予期せぬエラーを防ぐことができます。
- Python: データサイエンスチームが主導する場合や、既存の機械学習スクリプト、Pandasなどのデータ処理ライブラリを直接連携させたい場合に適しています。
本記事では、型の恩恵を受けやすく、企業システムでの採用例も多いTypeScriptを用いた構築手順を解説します。前提として、最新の Node.js がインストールされている環境を用意してください。
Claude Desktopを用いた検証環境の構築
開発中のMCPサーバをテストするためには、Hostとなるクライアントアプリケーションが必要です。現在のところ、最も手軽で確実な検証環境は「Claude Desktop」を使用することです。
Claude Desktopに自作のMCPサーバを認識させるには、設定ファイルを作成します。OSによって設定ファイルの配置場所が異なります。
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
設定ファイルは以下のような形式で記述します。
{
"mcpServers": {
"my-local-server": {
"command": "node",
"args": ["/path/to/your/mcp-server/build/index.js"]
}
}
}
この設定を行うことで、Claude Desktopの起動時に指定したNode.jsスクリプトがサブプロセスとして立ち上がり、AIチャット画面から自作のサーバ機能にアクセスできるようになります。
【実践】最小構成のMCPサーバを構築する4つのステップ
それでは、実際にコードを書きながら最小構成(Hello Worldレベル)のMCPサーバを構築してみましょう。DIY感覚で進められるよう、ステップバイステップで解説します。
ステップ1: プロジェクトの初期化とSDKのインストール
まずは適当なディレクトリを作成し、Node.jsプロジェクトを初期化します。
mkdir my-mcp-server
cd my-mcp-server
npm init -y
次に、MCPの公式SDKと、スキーマ定義のための zod をインストールします。TypeScript環境も合わせて構築します。
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node
npx tsc --init
tsconfig.json では、モジュール解決を適切に行うため、"moduleResolution": "node" や "target": "ES2022" などの設定を確認してください。
ステップ2: ResourceとToolの定義・実装
ここが最も重要なポイントです。MCPには『リソース(Resources)』と『ツール(Tools)』という2つの概念があり、これらを明確に使い分ける必要があります。
- Resources(リソース): AIが読み取るための静的なデータソース(例:ファイルのテキスト、DBの特定レコード)。URIで識別され、読み取り専用(Read-only)です。
- Tools(ツール): AIが実行できる関数やアクション(例:APIへのPOST送信、計算処理、DBの更新)。副作用を伴う操作が含まれます。
以下は、簡単な計算を行う Tool を定義する例です。index.ts を作成し、コードを記述します。
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
// 1. サーバインスタンスの作成
const server = new McpServer({
name: "my-first-mcp-server",
version: "1.0.0"
});
// 2. Toolの追加
server.tool(
"calculate_sum",
"Calculate the sum of two numbers",
{
a: z.number().describe("First number"),
b: z.number().describe("Second number")
},
async ({ a, b }) => {
// 実際の処理
const result = a + b;
return {
content: [{ type: "text", text: `The sum is ${result}` }]
};
}
);
ステップ3: サーバの起動とトランスポートの設定
定義したサーバを stdio トランスポート経由で起動するための設定を追加します。
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("MCP Server is running on stdio");
}
main().catch((error) => {
console.error("Fatal error in main():", error);
process.exit(1);
});
ここで重要なのは、console.log ではなく console.error を使用してログを出力している点です。stdio トランスポートを使用する場合、標準出力(stdout)はMCPのプロトコル通信に使用されるため、デバッグ用のログを標準出力に流すと通信が破損します。必ず標準エラー出力(stderr)を使用してください。
ステップ4: ローカル環境での接続テスト
コードが書けたらビルドを実行します。
npx tsc
生成されたJavaScriptファイルを、前述の claude_desktop_config.json のパスに指定します。Claude Desktopを再起動し、チャット画面で「calculate_sumツールを使って、15と27を足して」と入力してみてください。Claudeがあなたのローカルサーバを呼び出し、計算結果を返すはずです。
実用的なMCPサーバへの拡張:データベース・SaaS連携の実装
基礎を終えた後の応用として、実務で想定されるユースケースに基づいた実装のヒントを提供します。
SQLite/PostgreSQLとのデータ連携
社内システムで最も多いのが、リレーショナルデータベースとの連携です。例えば、顧客情報や在庫データにAIからアクセスさせたいケースです。
この場合、SQLクエリを直接AIに書かせるツール(Tool)を作るのは、SQLインジェクションのリスクが高いため推奨されません。代わりに、特定の条件で安全にデータを抽出する専用のToolを定義するか、特定の顧客IDに基づくデータをURIとして提供するResourceを定義します。
// 顧客情報を検索するToolの例(プレースホルダーを用いた安全な実装)
server.tool(
"search_customer",
"Search customer by email",
{
email: z.string().email()
},
async ({ email }) => {
// DB接続ライブラリ(例: pg, sqlite3)を使用して安全にクエリを実行
const customer = await db.query("SELECT * FROM customers WHERE email = $1", [email]);
return {
content: [{ type: "text", text: JSON.stringify(customer) }]
};
}
);
GitHub/Google Drive等外部APIの統合方法
SaaSとの連携では、外部APIを叩く処理をTool内に隠蔽します。ここで注意すべきは「コンテキスト制限」です。Google Driveから大容量のPDFを取得してそのままテキストとして返すと、LLMのトークン上限を簡単に超過してしまいます。
実用的なアプローチとしては、サーバ側でテキストの要約やチャンク化(分割)を行い、必要な部分だけを返す工夫が求められます。あるいは、検索機能(Search Tool)を提供し、AIに適切なキーワードで絞り込ませる設計が有効です。
企業導入に不可欠な「セキュリティとガバナンス」の設計
日本企業の情シス担当者がMCPの導入を検討する際、最も懸念するのがセキュリティリスクです。自作のサーバを介してAIが社内データにアクセスする以上、厳格なガバナンス設計が不可欠です。
環境変数による認証情報の管理
MCPサーバから外部のデータベースやAPIにアクセスするためのクレデンシャル(APIキーやパスワード)は、絶対にコード内にハードコードしてはいけません。dotenv などのライブラリを使用し、環境変数から読み込む設計を徹底してください。
Claude Desktopから起動する場合、claude_desktop_config.json の env プロパティを使用して環境変数を渡すことができます。
{
"mcpServers": {
"my-db-server": {
"command": "node",
"args": ["/path/to/server.js"],
"env": {
"DB_PASSWORD": "your_secure_password",
"API_KEY": "your_api_key"
}
}
}
}
実行権限の制御(Read-only vs Read-write)
AIにどこまでの操作を許可するかは、慎重に設計する必要があります。原則として、初期段階では「Read-only(読み取り専用)」の操作のみを許可すべきです。データベースの参照やドキュメントの検索といった操作です。
もし「Read-write(更新・削除)」を伴うTool(例:チケットのステータス変更、メールの送信)を実装する場合は、AIが勝手に実行するのではなく、必ず「Human-in-the-loop(人間の確認を挟む)」仕組みを取り入れるか、破壊的な操作(DELETEなど)をツールとして公開しないといった制限を設けることがベストプラクティスです。
ログの取得と監査対応
「いつ、どのツールが、どのようなパラメータで呼び出されたか」を記録することは、監査対応の観点から非常に重要です。前述の通り stdio 通信では標準出力が使えないため、ファイルシステムへのログ出力や、社内のログ収集基盤(Syslog等)への転送処理をサーバ内に実装することをおすすめします。
MCPサーバ運用の定着化とエコシステムの活用
チーム内でのMCPサーバ共有方法
ローカルで動作するMCPサーバが完成したら、それをチーム内で共有する仕組みを整えましょう。Gitリポジトリでコードを管理し、社内のパッケージレジストリやDockerイメージとして配布することで、他の開発者も簡単に自分のHost(Claude Desktopなど)に設定を追加できるようになります。
既存のオープンソースMCPサーバの活用
すべてを自作する必要はありません。MCPのエコシステムは急速に拡大しており、GitHubやGoogle Drive、Slackなど、主要なSaaSと連携するためのオープンソースのMCPサーバがすでに多数公開されています。公式ドキュメントやコミュニティのリポジトリを参照し、既存のサーバを自社の要件に合わせてカスタマイズすることで、開発効率を最大化できます。
まとめ
MCP(Model Context Protocol)は、LLMと社内データ連携における「個別開発の罠」から抜け出すための強力な標準規格です。本記事で解説したように、SDKを活用すれば、技術者にとってMCPサーバの構築自体は決して難しくありません。重要なのは、ツールとリソースの設計、そしてエンタープライズ水準のセキュリティを担保することです。
自社への適用を検討する際は、専門家への相談で導入リスクを軽減できます。個別のシステム環境やセキュリティ要件に応じたアーキテクチャ設計のアドバイスを得ることで、より安全で効果的なAI統合基盤の構築が可能になります。ぜひ、自社のデータ資産を安全にAIと連携させる第一歩を踏み出してみてください。
コメント