こんにちは。
ファインディ株式会社 で Tech Lead をやらせてもらってる戸田です。
現在のソフトウェア開発の世界は、生成AIの登場により大きな転換点を迎えています。
GitHub Copilotやチャットベースの開発支援ツールなど、生成AIを活用した開発支援ツールが次々と登場し、開発者の日常的なワークフローに組み込まれつつあります。
そのような状況の中で、MCPというプロトコルが話題となっていることは読者の皆さんもご存知かと思います。
そこで今回は、弊社の開発組織でのMCPサーバーの導入と実装、そして実績について紹介します。
それでは見ていきましょう!
MCPとは
MCP(Model Context Protocol)は、アプリケーションが大規模言語モデル(LLM)に情報やツールへのアクセス方法を提供する、新しいオープンプロトコルです。
USB-Cが様々なデバイスを標準的な方法で接続するように、MCPはAIモデルを多様なデータソースやツールへつなぐための、標準化された方法を提供します。
これがこれまでのやり方、特に従来のAPIとどう違うのかというと、AI連携の開発を大幅に簡素化し、より動的な機能を提供する点にあります。従来は、各サービスに対して個別のコードや設定が必要で、「それぞれのドアに個別の鍵が必要」な状況に似ていました。しかし、MCPは単一の標準化されたコネクタとして機能するため、一度の統合で複数のツールやサービスにアクセスできる可能性があります。
詳しくは次の公式ドキュメントをご覧ください。
このMCPの規格に則って作成されたサーバーをMCPサーバーと呼びます。
導入
弊社でも例に漏れず、MCPサーバーの利用を開始しました。
Model Context Protocol servers で紹介されている公式MCPサーバーを開発リポジトリに追加するだけで、すぐに利用開始できます。
GitHubのMCPサーバーを使って、Pull requestやIssueの情報を取得して、そのままLLMに渡すことができます。
SentryのMCPサーバーを使って、不具合の詳細を取得して、そのままLLMに渡すことが可能です。その情報をそのままCopilotやAgentなどに解析してもらい、原因を特定した後に自動的に実装コードを修正してもらうことが出来ます。
AWSのDocumentのMCPサーバーを使うことで、CopilotなどからAWSについての質問を投げて、ドキュメントの内容を検索して返してもらうことができます。その内容はそのままLLMに渡すことも可能です。
利用方法はとても簡単です。各種AIエージェントの設定ファイルに追記して、MCPサーバーを起動するだけです。
例えばVSCodeでGitHubのMCPサーバーを利用する場合、次のような記述を追加します。
{ "servers": { "github": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server" ], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_ACCESS_TOKEN>" } } } }
このように、既に多くのプロダクトやサービスでMCPサーバーは公開されており、開発者やプロダクト開発の生産性を向上させるための強力なツールとなっています。
実装
各社から提供されているMCPサーバーを活用していると、組み合わせ次第で色々なことが出来ることに気づきます。
そこで弊社の開発組織で活用できるようなMCPサーバーを自分たちで作ることにしました。
公式から開発用のSDKが提供されているのですが、今回は弊社が普段から使っているTypeScriptのSDKを使って実装しています。
公式のSDKを使うことで、MCPサーバー内部の実装に集中することが出来るので、利用しない手はありません。
次のコードは、与えられた2つの数値に対して計算を行い、その結果を返すMCPサーバーの実装例です。
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; const mcpServer = new McpServer({ name: "Sample MCP Server", version: "0.0.1" }); mcpServer.tool( "addition", "足し算をする", { a: z.number(), b: z.number() }, async ({ a, b }) => ({ content: [{ type: "text", text: String(a + b) }] }) ); mcpServer.tool( "multiplication", "掛け算をする", { a: z.number(), b: z.number() }, async ({ a, b }) => ({ content: [{ type: "text", text: String(a * b) }] }) ); try { const transport = new StdioServerTransport(); await mcpServer.connect(transport); } catch (error) { console.error('Error starting server:', error); process.exit(1); }
mcpServer.tool でtoolを追加します。
1つ目の引数でtoolの名前、2つ目の引数でtoolの説明、3つ目の引数でtoolのパラメータ、4つ目の引数でtoolの実装を定義しています。
また、用途や内容によってはMCPサーバーそのものを分けたいケースが出てきます。ですが、そのたびにリポジトリを切ってしまうと、同じような処理のコードを分散管理することになってしまいます。
そのため弊社では、以前から活用していたNxを利用して、MCPサーバーの実装をモノレポで管理するようにしました。
モノレポにすることで、複数のMCPサーバーから利用できる共通関数などを作成できます。外部APIを実行するClientなどが良い例です。このように弊社ではMCPサーバーの社内エコシステムを実現しています。
更にNxのgenerator機能を使うことで、モノレポとMCPサーバーの初期設定はコマンドを数回実行するだけで完了するようにしています。
Nxのgenerator機能については以前の記事で紹介しておりますので、併せてご覧ください。
このような整備を行うことで、社内のエンジニアがMCPサーバーを作るハードルを下げることができました。
実績
社内エコシステムの整備を行ったことにより、数名のエンジニアで、3日間で10個のMCPサーバーと30個のtoolを実装して、社内のエンジニアに配布することを実現できました。
今回はその中の一部を紹介します。
動的にプロンプトのテキストを作成して返す
パラメータを受け取り、その内容に応じて動的にプロンプトのテキストを生成して返すMCPサーバーを実装しました。
開発チーム内で共通で利用したいプロンプトがあり、内容を動的に切り替えたい場合などに便利です。
例えば、他のMCPサーバーからデータを取得して、そのデータをこのMCPサーバーに渡すことで、外部データのテキストを利用してプロンプトを生成するといったことが実現できます。
このように、プロンプトのテキストを返し、それをそのままLLMで実行するような使い方がMCPサーバーでは可能です。
Devinと連携する
完全自律型AIエンジニアのDevinは、α版ではありますがAPIを公開しています。
そのAPIをMCPサーバーから実行することにより、Devinに関する情報を取得したり、セッションを作成、停止できるようにしました。
これによりエンジニア自身の作業中に、SlackやDevinの画面を直接確認せずともDevinの管理ができるようになりました。
このように、外部APIを実行して情報を取得したりデータ登録、削除を行うことがMCPサーバーでは可能です。
Figmaデータのlintを行う
デザインプラットフォームのFigmaはAPIを公開しています。
そのAPIをMCPサーバーから実行して、対象のFigmaのデータを取得して、データの中身をチェックして、デザインルールに則っているかどうかlintのようなチェックを行うMCPサーバーを実装しました。
例えば、指定したフォント以外を使っている場合や、利用できるpx数ではない場合など、デザインルールに則っていない場合は警告を返すようなことが可能です。
このように、外部APIからデータを取得して、内容を解析したり加工して返すようなことがMCPサーバーには可能です。
セキュリティ面の考慮
外部APIを実行する場合、アクセストークンが必要になるケースが多いと思います。
このようなケースの場合、MCPサーバーを実行する際に環境変数を使ってアクセストークンを渡すことができます。
利用するアクセストークンの権限を絞り、環境変数でアクセストークンを隠蔽して実行することで、安全にMCPサーバーを管理、実装することが可能になります。
また、外部の公式以外のMCPサーバー、いわゆる野良MCPサーバーを利用する場合は注意が必要です。
悪意のあるMCPサーバーに対してアクセストークンなどを渡してしまうと、意図しない情報漏洩やデータの改ざんなどのリスクがあります。
そのため、外部の野良MCPサーバーを利用する場合は、内部実装を確認して実際に実行されている処理を確認することをオススメします。
まとめ
いかがでしたでしょうか?
MCPサーバーを実装するハードルとコストは非常に低く、それに対するリターンは非常に大きいため、コストパフォーマンスが非常に高いです。
是非一度、公式ドキュメントを参考にして簡単なMCPサーバーを実装してみてください。
現在、ファインディでは一緒に働くメンバーを募集中です。
興味がある方はこちらから ↓ herp.careers