Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】How to create a MCP server and MCP tools from scratch?

2025年09月17日に「Dev.to」が公開したITニュース「How to create a MCP server and MCP tools from scratch?」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

大規模言語モデル(LLM)が苦手な処理を補完するため、リアルタイムデータ等と接続するMCPサーバーの構築手順を解説。JavaScriptでSDKを使い、外部ツールとして特定タスクを処理させ、LLMの能力を拡張する方法を示す。

ITニュース解説

大規模言語モデル(LLM)は、文章の生成や要約、コードの作成など、人間が使う言葉を理解し、様々な複雑なタスクをこなせる現代のAI技術の代表だ。しかし、その驚くべき能力の裏側には、意外なほど単純な作業が苦手という一面もある。例えば、「strawberry」(イチゴ)という単語の様々な変形、例えば「strawberrrry」や「strawberrrrrrry」といった文字列の中に「r」の文字がいくつ含まれているかを正確に数える、といったタスクだ。人間にとっては一目瞭然の簡単な作業だが、LLMはテキストを「トークン」と呼ばれる単位で処理するため、文字レベルの正確なカウントはほぼ不可能である。AIが高度なアートやコードを生成できるにもかかわらず、意識を持たない存在であるため、このような基本的なカウントでつまずくという矛盾は、LLMの特性を理解する上で重要な点となる。

このLLMの弱点を克服し、現実世界のデータや特定のロジックと連携させるための仕組みの一つが、Model Context Protocol(MCP)サーバーである。MCPサーバーを構築することで、LLMが直接アクセスできないリアルタイムデータ、個人のデータ、または特定の計算処理を外部で行い、その結果をLLMに提供できるようになる。これにより、LLMの能力を補完し、より実用的で多機能なアプリケーションの開発が可能となる。

MCPサーバーの構築は、JavaScriptとNode.jsの環境で行う。Node.jsはサーバーサイドでJavaScriptを実行するための環境であり、様々なバックエンド処理をJavaScriptで記述することを可能にする。まず、新しいNode.jsプロジェクトを初期化することから始める。これはnpm init -yコマンドを実行してpackage.jsonというプロジェクト設定ファイルを作成し、index.jsというメインのJavaScriptファイルを用意する。package.jsonファイルには、プロジェクトをESモジュールとして扱うための"type": "module"という設定を追加する。これにより、現代的なJavaScriptのimport/export構文が使えるようになる。

次に、MCPサーバーの構築に必要なライブラリをインストールする。主要なものは、公式のMCPサーバーSDKである@modelcontextprotocol/sdkと、データ検証ライブラリであるzodだ。zodは、JavaScriptで受け取るデータの型が正しいかを検証するために使用され、開発中のエラーを防ぎ、アプリケーションの堅牢性を高める上で非常に有用なツールとなる。これらのライブラリはnpm installコマンドでプロジェクトに導入する。

ライブラリの準備が整ったら、McpServerオブジェクトを初期化することで、MCPサーバーの基本的なインスタンスを作成する。この際、サーバーの名前とバージョンを指定する。これにより、そのサーバーが提供する機能の識別が容易になる。

MCPサーバーの最も重要な要素は、「MCPツール」と呼ばれる、LLMが利用できる特定の機能の定義だ。MCPツールは、LLMから特定のパラメータを受け取り、そのパラメータに基づいて外部で処理を実行し、結果をLLMに返す仕組みを提供する。例えば、今回の例では、LLMから受け取った「イチゴの種類」を意味する文字列に含まれる「r」の数を数えるツールを作成する。これは、受け取った文字列を小文字に変換し、一文字ずつに分割し、その中から「r」である文字だけを抽出し、その数をカウントするという単純な処理だ。

MCPツールを定義する際には、ツールの名前、機能の説明、そしてzodを使って定義されたパラメータの型情報を指定する。LLMは、この詳細な説明情報を「コンテキスト」として利用し、ユーザーの自然言語による入力から、MCPツールが期待する適切なパラメータを抽出しようとする。この仕組みにより、LLMはユーザーの複雑な質問を、外部ツールが理解できる具体的なデータ形式に変換できる。もちろん、実際のMCPツールは、文字カウントのような単純な作業だけでなく、外部APIからのデータ取得、データベースへの問い合わせ、ファイルシステムの操作、さらには他のAIモデルとの連携など、より複雑で実用的な処理を実行するために活用される。

MCPサーバーとLLMがどのように情報をやり取りするかは「トランスポート」という通信方法によって決定される。今回の例では、最も基本的な方法としてSTDIO(Standard Input Output、標準入出力)を使用する。これは、プログラムがキーボードからの入力を読み込み、画面に結果を出力するような、基本的な入出力チャネルだ。StdioServerTransportオブジェクトを初期化し、それをserver.connect()メソッドに渡すことで、MCPサーバーはSTDIOを通じてLLMからの入力を受け付け、処理結果を返す準備が整う。

構築したMCPサーバーは、Model Context Protocolをサポートする様々なアプリケーションと連携できる。例えば、Claude Desktopのようなアプリケーションでは、特定のJSON設定ファイルを通じてMCPサーバーの起動コマンドとスクリプトへのパスを記述することで、そのアプリケーション内からMCPツールを呼び出して利用できるようになる。これにより、ユーザーはLLMを介して、開発者が作成したカスタム機能をシームレスに利用できるようになる。

MCPサーバーが意図通りに動作するかを検証するためには、「MCP Inspector」というデバッグツールが非常に役立つ。これは、LLMを介さずにMCPサーバーのツールを直接テストできる独立した環境を提供する。npx @modelcontextprotocol/inspector <mcp_server_command>というコマンドでInspectorを起動し、そのグラフィカルユーザーインターフェース(GUI)を通じて、作成したMCPツールのリストを表示し、任意のパラメータを与えてその実行結果をシミュレートできる。このテスト環境では、LLMの複雑な推論プロセスを考慮せず、MCPサーバー自体のロジックが正しく機能しているかを効率的に確認できる。

Inspectorでツールを選択し、パラメータを入力して実行すると、MCPサーバーからの応答が表示される。この応答が期待通りであれば、MCPサーバーが正しく機能していることを意味する。実際の運用環境では、この応答はLLMに返され、LLMはその情報を使ってユーザーに最終的な回答を生成する。このように、MCPサーバーはLLMが苦手とする特定のタスクを補完し、より信頼性が高く、多機能なAIアシスタントとしての能力を拡張する重要な役割を果たす。この一連のプロセスを通じて、システムエンジニアを目指す初心者は、AIの限界を外部システムで補完し、その能力を拡張する具体的な技術的アプローチを学ぶことができる。

関連コンテンツ

関連IT用語