AIエージェントとMCPサーバーの連携:基本設定から実践まで
AIエージェントとMCPサーバーの連携方法を解説。基本概念、実装手順、設定ファイルの例、ツール拡張のベストプラクティスを紹介。
AIエージェントとMCPサーバーの連携:基本設定から実践まで
近年、AIエージェントの開発が急速に進み、外部サービスやツールとの連携が重要なテーマとなっています。その中で注目されるのがMCP(Model Context Protocol)です。MCPはAIエージェントと外部サーバー間の標準プロトコルであり、エージェントがデータベース、API、ファイルシステムなどに安全かつ効率的にアクセスするための基盤を提供します。本記事では、MCPサーバーの基本概念から具体的な連携設定、ツール拡張の方法までを解説します。
MCPとは?
MCPはAnthropicが提唱するオープンプロトコルで、AIエージェントと外部リソース(ツールやデータソース)を疎結合で連携させるためのものです。MCPサーバーはエージェントの代わりに外部リソースへのアクセスを仲介し、エージェントはMCPクライアントを通じてサーバーにリクエストを送ります。これにより、エージェントは直接外部APIを叩く必要がなく、セキュリティや拡張性が向上します。
MCPサーバーの基本構成
MCPサーバーは以下の要素で構成されます。
典型的なMCPサーバーは、Node.jsやPythonで実装され、mcpライブラリを使用します。
連携手順(Node.js + TypeScript例)
1. MCPサーバーのセットアップ
まず、MCPサーバーを実装します。以下は簡単なファイル読み取りツールを提供するサーバーの例です。
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
const server = new Server(
{
name: "example-fs-server",
version: "1.0.0",
},
{
capabilities: {
tools: {},
},
}
);
// ツール一覧を返す
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
{
name: "read_file",
description: "Read the contents of a file",
inputSchema: {
type: "object",
properties: {
path: { type: "string" },
},
required: ["path"],
},
},
],
}));
// ツール実行
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "read_file") {
const path = request.params.arguments?.path;
if (typeof path !== "string") {
throw new Error("Invalid path");
}
// 実際のファイル読み込み処理(セキュリティ注意)
const content = await fs.promises.readFile(path, "utf-8");
return {
content: [
{
type: "text",
text: content,
},
],
};
}
throw new Error("Tool not found");
});
// トランスポート開始
const transport = new StdioServerTransport();
await server.connect(transport);
2. AIエージェント側の設定
AIエージェント(例:Claude Desktopやカスタムエージェント)は、MCPクライアントを通じてサーバーに接続します。設定ファイル(claude_desktop_config.json)でサーバーを指定します。
{
"mcpServers": {
"example-fs": {
"command": "node",
"args": ["path/to/server.js"],
"env": {}
}
}
}
この設定により、エージェントはexample-fsサーバーのread_fileツールを利用できるようになります。
3. ツールの拡張
MCPサーバーに新しいツールを追加するには、ListToolsRequestSchemaのハンドラでツール定義を追加し、CallToolRequestSchemaで処理を実装します。例えば、ファイル書き込みツールを追加する場合:
// ツール一覧に追加
tools.push({
name: "write_file",
description: "Write content to a file",
inputSchema: {
type: "object",
properties: {
path: { type: "string" },
content: { type: "string" },
},
required: ["path", "content"],
},
});
// CallToolRequestSchema内で分岐
if (request.params.name === "write_file") {
const { path, content } = request.params.arguments;
await fs.promises.writeFile(path, content, "utf-8");
return { content: [{ type: "text", text: "File written" }] };
}
実践的な連携パターン
データベース連携
MCPサーバーを介してデータベースにアクセスする場合、サーバー内でSQLを実行し、結果を返します。エージェントは直接DBに接続せず、サーバーのツール経由で安全に操作できます。
外部API連携
REST APIをラップしたMCPサーバーを作成することで、エージェントは標準化されたツールインターフェースで外部サービスを利用できます。
マルチサーバー管理
エージェントは複数のMCPサーバーを同時に利用可能です。設定ファイルに複数サーバーを記述し、エージェントはコンテキストに応じて適切なサーバーを選択します。
注意点とベストプラクティス
*この記事はOpenCodeを日常的に使用し、AIエージェントにSSH経由でNixOSをインストールさせるなどの実践経験を持つSioが監修しています。DeepSeek APIのヘビーユーザーとして、実際のコスト感や制限事項を反映しています。*
まとめ
MCPはAIエージェントと外部リソースの連携を標準化し、開発効率とセキュリティを向上させます。本記事で紹介した手順を参考に、独自のMCPサーバーを構築し、エージェントの機能を拡張してみてください。MCPのエコシステムは急速に発展しており、今後さらに多くのツールやフレームワークが登場するでしょう。