こんにちは、エムスリーエンジニアリンググループ、コンシューマチームの園田です。本記事では、外部サービスとAIエージェントの連携を可能にするMCPプロトコルについて、技術検証の実装例を交えてお話しします。
1. MCPとは(ざっくり)
MCP(Model Context Protocol)とは、Anthropic社によって策定されたAIエージェントが外部サービスから情報を参照したり連携することを目的としたプロトコルです。 「MCPサーバー」は、GitHubやPostgreSQLといったリソースをMCPで喋れるように変換してあげるプロキシのようなサーバーです。 Claude DesktopやCursorなどはMCPクライアントの機能があり、GitHubなどのMCPサーバーを利用してナレッジとして利用したり、プルリクエストの作成なども行えます。
Introduction - Model Context Protocol
2. MCPサーバーの実装方法
MCPサーバーの実装には、PythonおよびTypeScriptのSDKが提供されています。これらのSDKを使用することで、MCPサーバーを効率的に構築できます。
次のようなイメージでMCPサーバーを実装します。
import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { ListResourcesRequestSchema, ReadResourceRequestSchema } from "@modelcontextprotocol/sdk/server/schemas.js"; const server = new Server({ name: "example-server", version: "1.0.0", }, { capabilities: { resources: {} } }); // リソースの一覧を提供するハンドラー server.setRequestHandler(ListResourcesRequestSchema, async () => { return { resources: [ { uri: "file:///example.txt", name: "Example Resource", }, ], }; }); // 特定のリソースの内容を提供するハンドラー server.setRequestHandler(ReadResourceRequestSchema, async (request) => { if (request.params.uri === "file:///example.txt") { return { contents: [ { uri: "file:///example.txt", mimeType: "text/plain", text: "This is the content of the example resource.", }, ], }; } else { throw new Error("Resource not found"); } }); // サーバーの起動 const transport = new StdioServerTransport(); await server.connect(transport);
3. 技術検証:Q&A検索機能の実装
社内システムにおけるMCPの活用可能性を探るため、遠隔健康医療相談サービス「AskDoctors」のQ&A検索機能をMCPサーバーとして実装する検証を行いました。本検証ではテストデータのみを使用しています。*1
こちらは、検証用に実装したMCPによるQ&A検索のコードです。
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 { zodToJsonSchema } from "zod-to-json-schema"; import { searchAskDoctors, searchSchema } from "./tools/index.js"; const server = new Server( { name: "askdoctors-mpc-server", version: "0.0.1", }, { capabilities: { tools: {}, }, }, ); server.setRequestHandler(ListToolsRequestSchema, async (request) => { return { tools: [ { name: "askdoctors_search", description: "Search for medical information and advice from AskDoctors", inputSchema: zodToJsonSchema(searchSchema), }, ], }; }); server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; switch (name) { case "askdoctors_search": try { const content = await searchAskDoctors(args); return { content: [{ type: "text", text: JSON.stringify(content) }] }; } catch (e) { console.error("Error in askdoctors_search:", e); throw e; } default: throw new Error(`Unknown tool: ${name}`); } }); async function runServer() { const transport = new StdioServerTransport(); await server.connect(transport); console.error("AskDoctors MCP Server running on stdio"); } runServer().catch((error) => { console.error("Fatal error in main():", error); process.exit(1); });
ちなみに console.error
すると MCP クライアント側にエラー内容が表示されます。便利。
動作確認方法
なんと、MCPにはとても便利な動作確認用ツールが用意されています。
npx @modelcontextprotocol/inspector npm run dev
ブラウザで http://localhost:5173 にアクセスすると以下のようなツールが立ち上がります。
いきなり Claude Desktop や Cline に組み込むよりもまずこちらで動作確認するのが良いと思います。
VS Code での検証環境構築
これを適当に docker image に固めます。Dockerfile は@modelcontextprotocol/server-github
のを適当にコピペしました。
FROM node:22.12-alpine AS builder COPY . /app WORKDIR /app RUN --mount=type=cache,target=/root/.npm npm install RUN --mount=type=cache,target=/root/.npm npm run build RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev FROM node:22.12-alpine AS release WORKDIR /app COPY --from=builder /app/dist /app/dist COPY --from=builder /app/package.json /app/package.json COPY --from=builder /app/package-lock.json /app/package-lock.json ENV NODE_ENV=production RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev ENTRYPOINT ["node", "dist/index.js"]
おもむろにビルドします。ローカルで利用するためタグはなんでもいいです。
docker build -t askdoctors-mcp-server .
今回は Roo Code を利用しました。
Roo Code のメニューから[MCP Servers]をクリックして
[Enable MCP Servers]をチェックして[Edit MCP Settings]ボタンを押下します。
JSON ファイルが開くので、次のようにローカルにある docker image を指定します。
{ "mcpServers": { "askdoctors": { "command": "docker", "args": [ "run", "--rm", "-i", "-e", "ASKDOCTORS_BASE_URL", "-e", "ASKDOCTORS_ACCESS_TOKEN", "askdoctors-mcp-server" ], "env": { /* 今回はローカルを利用 */ "ASKDOCTORS_BASE_URL": "http://host.docker.internal:3000", "ASKDOCTORS_ACCESS_TOKEN": "*****************************************" }, "disabled": false, "alwaysAllow": [] } } }
JSON を編集すると自動的にコマンドが実行され、MCPサーバーが起動し、tools/list
や resources/list
という RPC が実行されます。
この状態までできたら、新しいタスクに「息子が 40 度の熱でうなされています。インフルエンザでしょうか?」というプロンプトを入力してみます。プロンプトではとくにAskDoctorsについて触れていませんが、AIが文脈から判断して今回のツールを利用しようとしています。
現在は検証環境でテストデータが揃っていないため結果は空でしたが、ツール利用の基本的な動作は確認できました。
4. 将来的な活用可能性
サービスの機能をMCP経由で使うこと自体にもメリットはありそうですが、個人的にはサービス運用やカスタマーサポートにこそ真価を発揮するのでは?と思い、MCPサーバーによる業務効率化の可能性として、以下のような活用方法を検討しています。
1. ガイドラインやヘルプの検索機能
将来的な実装として、以下のような機能を検討しています:
リソースの統合: 社内のガイドラインやヘルプドキュメントをMCPサーバーのリソースとして登録します。これにより、AIエージェントがこれらの情報を直接参照できるようになります。
高度な検索: MCPサーバーに検索機能を実装し、社内ユーザーが自然言語で質問を入力すると、関連するガイドラインやヘルプドキュメントを迅速に提示できるようにします。
業務最適化: 特定の業務シナリオに応じたプロンプトを設定し、社内ユーザーが適切な情報に素早くアクセスできるよう支援します。
2. カスタマーサポート業務での活用
カスタマーサポート業務においては、以下のような改善が期待できます:
情報アクセスの効率化: CS担当者が顧客からの問い合わせを受けた際、MCPサーバーを通じて関連するガイドラインやヘルプドキュメントを即座に参照できます。これにより、回答の正確性とスピードが向上します。
対応品質の均一化: すべてのCS担当者が同じ情報源にアクセスすることで、提供する情報の一貫性が保たれ、顧客満足度の向上につながります。
トレーニングの効率化: 新任のCS担当者も、MCPサーバーを活用することで、必要な情報を迅速に学習・参照でき、早期に業務に慣れることができます。
業務の一元化: 問い合わせのやり取り自体もMCPの機能である
tools
として実装すれば、MCPクライアントのみで業務を完結可能です。
5. まとめ
MCPサーバーの導入により、自社サービスのガイドラインやヘルプドキュメントへのアクセスが統一化され、業務効率が大幅に向上する可能性が見えました。とくに、カスタマーサポート部門では、迅速かつ一貫性のある対応が可能となり、顧客満足度の向上にも寄与しそうです。引き続き検証を重ね、実用化に向けた取り組みを進めていく予定です。
We are hiring
エンジニアリングで事業を革新したい仲間を募集中です! 技術を駆使して、新たなサービスの可能性を一緒に切り拓きませんか?
エンジニア採用情報はこちら
インターン応募はこちら
*1:現在AskDoctorsにMCPサーバーとしての機能や外部から検索を可能にするAPIなどの機能はありません。本稿では筆者のローカル環境で今回用に実装したAPIを利用しています。