MCPサーバーの構築方法

執筆者

Ash Minhas

Manager, Technical Content | AI Advocate

IBM

PJ Hagerty

Lead, AI Advocacy

IBM

Erika Russi

Data Scientist

IBM

このチュートリアルでは、単純な[モデル・コンテキスト・プロトコル](https://www.ibm.com/jp-ja/think/topics/model-context-protocol)(MCP)サーバーを構築し、IBMチュートリアルを検索するための単一ツールを公開します。「fastmcp」フレームワークとリクエスト・ライブラリーを使用して、スクリプトはリモートURLからチュートリアルのJSONインデックスをダウンロードします。次に、ユーザーの照会に一致するものを検索し、しっかりと書式設定された成果リストを返します。また、ネットワークの問題、不正なJSON、予期しない問題に対するエラー処理が追加されているため、堅牢で初心者向けのツールとなっています。最後に、MCPサーバーを実行し、Cursorのようなクライアントに接続してテストできるようにします。

MCPとは

Enterpriseとスタートアップの開発者も同様に、生成[人工知能](https://www.ibm.com/jp-ja/think/topics/artificial-intelligence)(AI)駆動型ソリューションの開発が増えています。ソリューションをより有用なものにするには、最新の情報とコンテキストが必要です。機械学習[モデル](https://www.ibm.com/jp-ja/think/topics/ai-model)はツールや、[アプリケーション・プログラミング・インターフェイス](https://www.ibm.com/jp-ja/think/topics/api)(API)、[ソフトウェア開発キット](https://www.ibm.com/jp-ja/think/topics/api-vs-sdk)(SDK)とフロントエンド・システムと連携する必要があります。

MCPは、AIモデルとシステムの間でコンテキストを処理する方法を標準化します。これは、[大規模言語モデル](https://www.ibm.com/jp-ja/think/topics/large-language-models)と外部データ・ソースやツールとの連携を簡素化します。一般的なアナロジーは、MCPをLLMのUSB-Cポートと考えることです。モデルがモデルのトレーニングの一部ではなかった機能やデータにアクセスできるため、LLMの有用性がさらに高まります。この機能は、[AIエージェント](https://www.ibm.com/jp-ja/think/topics/ai-agent)を構築する場合に特に役立ちます。

MCPはAnthropic社によって開発されたもので、OpenAI、Google DeepMindをはじめとする主要なAIプロバイダーと、業種・業務で採用されています。AIモデルが外部データ、参考情報(プロンプト・テンプレートなど)、ツールにアクセスして使用するための安全で標準化された方法を提供します。

さらに、[統合開発環境](https://www.ibm.com/jp-ja/think/topics/integrated-development-environment)(IDE)(CursorやVisual Studio Codeなど)もMCPを採用しており、AIアシスタントがMCPサーバーにアクセスできるようになっているため、コンテキストに関連した、開発者にとって使いやすいものになっています。オープン・スタンダードとして構築されたMCPは、生成AIが持つ確率的な世界と、今日に存在する組織が利用するほとんどのエンタープライズ・システムが持つ決定論的な世界の間の橋渡しとして機能します。MCPは、[検索拡張生成](https://www.ibm.com/jp-ja/think/topics/retrieval-augmented-Generation)(RAG)、[tool calling](https://www.ibm.com/jp-ja/think/topics/tool-calling)、そしてAIエージェントなどに出現し始めている他の設計パターンと同様に、コンテキスト情報をLLMに提供します。

他のソリューションと比較して、MCPを使用することの利点には次のようなものがあります。

- 規模:MCPサーバーは、一度定義してホストし、多くのAIシステムで使用できます。この容量により、複数の生成AIシステムの同じソースデータ、参考情報、AIツールへのアクセスを定義する必要性が制限されます。

- データ取得:データ取得ではクエリーの前の前処理とベクトル化が必要なRAGとは異なり、MCPは動的であり、情報ソースからの変動と更新をリアルタイムで行うことができます。

- 複雑性:ここで示すように、MCPはセットアップとAIアプリケーションへの組み込みが非常に簡単です。構成ファイルを簡単に使用することで、MCPサーバーを環境間で移植可能にすることができます。

- プラットフォームに依存しない:Python、typeScript、またはその他の言語を使用してMCPサーバーを構築できるという事実だけでなく、特定のLLMソリューションにも結合されていません。

- クライアント/サーバー・モデルによるデバッグ:MCPクライアントはMCPサーバーにリクエストを送信し、MCPサーバーはAPI、データベース、ローカル・ファイルなど、さまざまな外部システムやソースから必要なデータを取得します。この構造化されたアプローチにより、AIモデルが一貫性のある関連性の高いコンテキストを確実に受け取ることができるようになり、より正確で信頼性の高いアウトプットが得られます。MCPはJSON-RPCを使用してメッセージをエンコードし、2つの転送メカニズム、stdio、ストリーミング可能なHTTPをサポートします。以前のプロトコルのバージョンでは、サーバー送信イベント(SSE)を使用するHTTPもサポートしていました

企業が必要とする最新の情報を常に把握することは困難な場合があります。MCPは、コンテキストを構築し、契約の実行時に契約の新しい情報や、レガシー情報がデジタル化されているが必ずしも消化下にならない既存の情報などを組み込むのに役立ちます。この情報は内部および外部の両方を含む可能性がありますが、コンテキストを追加することで、有用になるためにLLMを再トレーニングするという時間のかかる必要性を回避できます。

多くのリモートMCPサーバーが利用可能で、github.comには多数の参照実装があります。

手順

このステップバイステップガイドは、server.pyとともにGitHubリポジトリにあります。MCPサーバーの作成時に参照するスクリプト。このチュートリアルでは、次のことができる基本的なカスタムMCPサーバーの構築について説明します。

  • チュートリアルのGitHubリポジトリに接続する
  • ユーザーが関心を持ちそうなトピックの検索を実行する
  • チュートリアルへのリンクを使用して成果を返す

このチュートリアルの作成を容易にするために、構築するサーバーが認証を必要とせずにチュートリアルのコンテンツを簡単に利用できるメカニズムを作成しました。

ステップ1. 環境を設定する

- ‌Python 3.11以降がコンピューターにインストールされていること (ターミナルで python3 --version を実行して確認します)。

- 組み込みのvenvモジュールが利用可能(ほとんどのシステムにはPythonが付属しています。一部のLinuxディストリビューションでは、suto apt install python3-venvで個別にインストールする必要がある場合があります)。

- コマンド・ライン・ターミナル(CLI):

- macOSまたはLinux:ターミナルアプリを使用します (これらの環境はUnixのようなものです)。

- Windows:PowerShellまたはコマンド・プロンプトを使用します。ただし、小さな構文の違いは次のステップで説明します。

- 選択したテキストエディターまたはIDE

新しいディレクトリを作成し、そこにcdする

  mkdir ibmtutorialmcpserver およびcd ibmtutorialmcpserver

ディレクトリーに存在することを確認するibmtutorialmcpserver 次のコマンドを実行して、仮想環境を作成できる

python3 -m venv venv 

注:Windowsでは、python3  withpython

仮想環境を作成したら、次のコマンドを使用して仮想環境をアクティブ化する必要があります。

source venv/bin/activate

一度アクティブ化すると、シェルには次のような表示がされます(venv) プロンプトで

ここで、Pythonパッケージをインストールする必要があります。fastMCP このオープンソースフレームワークは、MCPサーバーの実行に必要な主要な機能を提供し、積極的に保守されています。IBM watsonx.dataのrequests package 単純なHTTPリクエストを行うために

次のコマンドを使用してfastMCP およびrequests パッケージpip をインストールします

pip install fastmcp requests

このステップが完了したら、以下のコマンドを実行して、fastMCPが正しくインストールされていることを確認できます。

fastmcp version

以下のようなアウトプットが表示された場合は、仮想環境にfastMCPがインストールされています。

FastMCP version:                                       2.10.1
MCP version:                                           1.10.1
Python version:                                       3.11.13
Platform:                          macOS-15.5-arm64-arm-64bit
FastMCP root path: /opt/homebrew/lib/python3.11/site-packages

では、FastMCPがインストールされているため、MCPサーバーを作成しましょう

ステップ2. MCPサーバーを作成する

ディレクトリに新しいファイルを作成し、名前を付けますserver.py .

そのファイルを開いたら、以下のコード・スニペットをコピー&ペーストしてください。

# Simple MCP server that exposes a single tool to search IBM tutorials.
# How to run:
# 1) Install dependencies: pip install fastmcp requests
# 2) Start the server using an MCP client with the command: fastmcp run <YOUR PATH>/server.py

from fastmcp import FastMCPimport requests

# Source of the tutorials index 
DOCS_INDEX_URL = "https://raw.githubusercontent.com/IBM/ibmdotcom-tutorials/refs/heads/main/docs_index.json"


mcp = FastMCP("IBM Tutorials")

@mcp.tool
def search_ibmtutorials(query: str) -> str:
    """
    Search for tutorials on GitHub by downloading a JSON file from a GitHub repo and searching the payload for any relevant results and the respective details

Args:
    query: The search term to look for in tutorial titles and URLs

Returns:
    A formatted list of relevant tutorial results
    """
    try:
        # Download the JSON file from the GitHub repo
        response = requests.get(DOCS_INDEX_URL, timeout=10)
        response.raise_for_status() # Raise an exception for bad status codes

        # Parse the JSON data
        tutorials = response.json()

        # Search for relevant tutorials (case-insensitive)
        query_lower = query.lower()
        relevant_tutorials = []

        for tutorial in tutorials:
            # Search in title and URL
            title = tutorial.get('title', '').lower()
            url_path = tutorial.get('url', '').lower()

            if query_lower in title or query_lower in url_path:
                relevant_tutorials.append(tutorial)

        # Format and return results
        if not relevant_tutorials:
            return f"No IBM tutorials found matching '{query}'"

        # Format the results
            result_lines = [f"Found {len(relevant_tutorials)} tutorial(s) matching '{query}':\n"]

        for i, tutorial in enumerate(relevant_tutorials, 1):
            title = tutorial.get('title', 'No title')
            tutorial_url = tutorial.get('url', 'No URL')
            date = tutorial.get('date', 'No date')
            author = tutorial.get('author', '')

            result_lines.append(f"{i}. **{title}**")
            result_lines.append(f" URL: {tutorial_url}")
            result_lines.append(f" Date: {date}")
            if author:
                result_lines.append(f" Author: {author}")
            result_lines.append("") # Empty line for spacing

        return "\n".join(result_lines)

    except requests.exceptions.RequestException as e:
    return f"Error fetching tutorials from GitHub: {str(e)}"
    except ValueError as e:
    return f"Error parsing JSON data: {str(e)}"
    except Exception as e:
    return f"Error searching IBM tutorials: {str(e)}"


if __name__ == "__main__":
    mcp.run()

前のコードを確認し、主要な部分が何をしているかを説明しましょう。

インポートとセットアップ

このスクリプトは、HTTP経由でデータをダウンロードするために使用されるMCPサーバーとリクエストを作成するためのフレームワークを提供するFastMCPをインポートすることから始まります。定数などのDOCS_INDEX_URL チュートリアル・インデックスのリモートJSON URLを保持します。このアプローチにより、このチュートリアルを後で再利用するJSONデータの別のソースがある場合に、ソースの場所を簡単に変更できます。

MCPサーバーの

次に、MCPサーバー・インスタンスを作成します。FastMCP(“IBM Tutorials”) このステップは、サーバーがMCPクライアントに公開するすべてのツールの中央コントローラーとして機能します。search_ibmtutorials 私たちが定義するツールなどです。

MCPツールの定義

@mcp.tool 装飾マークはsearch_ibmtutorials MCPツールとして提供されます。この関数は検索語を受け取り、チュートリアルのインデックスをDOCS_INDEX_URL を使用してrequests.get() (ネットワークの安全性を確保するために10秒のタイムアウトを設定)、HTTP応答ステータスがエラーを示している場合は例外を生成します。データが取得されると、JSONからPythonオブジェクトに解析されます。

検索では大文字と小文字が区別されません。クエリは小文字に変換され、各チュートリアルのタイトルとURLも一致するために小文字にされます。チュートリアルにタイトルまたはURLのいずれかに検索語が含まれている場合、関連する成果のリストに追加されます。

成果のフォーマットと返信

検索に一致するチュートリアルがない場合、この関数は何も見つからなかったことを示すわかりやすいメッセージを返します。一致する場合、この関数は各チュートリアルのタイトル、URL、日付、および(可能な場合は作成者)を示す、書式設定された番号付きリストを構築します。書式設定では、タイトルにマークダウンスタイルの太字が使用されるため、それをサポートするクライアントではタイトルが目立つようになります。最終的な書式設定されたテキストは、1つの文字列として返されます。

エラー処理

この関数には、対象となる例外処理が含まれます。

requests.exceptions.RequestException タイムアウトや接続不良などのネットワークの問題を検出します。

ValueError (.json() によって発生する可能性があります)応答が有効な JSON でない場合をキャッチします。

一般Exception ハンドラーは、その他の予期しないものをキャッチします。

各エラーは、プログラムを停止するのではなく、呼び出し元に説明的なメッセージを返します。

サーバーの起動

下部には、if name == “main” :ブロックすることでmcp.run() スクリプトが直接実行された場合にのみ実行されます。このステップによりMCPサーバーが起動し、search_ibmtutorials ツールとして、MCP Inspectorなど、どのMCPクライアントでも使用できるツールを設定します。このツールは、MCPサーバーのトラブルシューティングとデバッグに役立ちます。このツールは、MCPサーバーのデバッグと、予想される動作の検証に使用できるUIを提供します。

ステップ3. MCPサーバーをIDEに追加する

サーバーを構築したら、使用する前にIDEでサーバーを有効にする必要があります。プロトコルとのさまざまなレベルの統合でMCPをサポートするクライアントは多くあります。公式MCPウェブサイトでは、サンプル・クライアントの完全なリストが提供されています。
Cursorがインストールされている場合は、次の手順に従って、Cursor内にMCPサーバーを追加できます。

Cursor設定を開き、[ツールと統合]に移動します。新しいMCPサーバーを選択し、Cursorが新しいタブで開くmcp.jsonファイルに貼り付けてください。<YOUR PATH>を現在のディレクトリーに置き換えてください。ターミナルでpwdを実行して、フルパスを取得できます。CursorとMCPの詳細については、Cursorのドキュメントを参照してください。

{
  &quot;mcpServers&quot;: {
    &quot;tutorials&quot;: {
      &quot;command&quot;: &quot;fastmcp&quot;,
      &quot;args&quot;: [&quot;run <YOUR PATH>/ibmtutorialmcpserver/server.py&quot;],
      &quot;env&quot;: {
      }
    }
  }
}

Microsoft VS Codeのユーザーの場合は、ここにリンクされている手順を使用してMCPサーバーを追加できます。続行する前に、VS CodeでCopilotが設定されていることを確認してください。
ファイルを使用してMCPサーバーを有効にしたい場合は、.vscode/mcp.jsonファイルをこのプロジェクトのディレクトリーに作成し、このコードをファイルにコピー・アンド・ペーストします。<YOUR PATH>を現在のディレクトリーに置き換えてください。ターミナルでpwdを実行して、フルパスを取得できます。

&quot;servers&quot;: {
		&quot;IBM Tutorials&quot;: {
			&quot;type&quot;: &quot;stdio&quot;,
			&quot;command&quot;: &quot;fastmcp&quot;,
			&quot;args&quot;: [
				&quot;run&quot;,
				&quot;<YOUR PATH>/ibmtutorialmcpserver/server.py&quot;
			]
		},
	},

ステップ4. MCPサーバーを使用する

MCPサーバーを有効にしたので、server.pyで作成されたツールを使用できるようにサーバーを稼働させましょう。VS Codeを使用している場合は、これらのドキュメントを確認してください。

IDEチャットで「IBMの時系列チュートリアルとは何ですか」と質問します。以下は、受信したアウトプットを受信したことを示していますが、応答は使用したモデルやIDEによって異なる場合があります。

アウトプット:

Here are some IBM time series tutorials:

Time series forecasting with Lag-Llama (zero-shot learning)
Tutorial link
Predict overnight low temperatures using the Lag-Llama model in a zero-shot learning scenario.

Using the watsonx.ai Time Series Forecasting API to predict energy demand
Tutorial link
Predict energy demand with the watsonx.ai Time Series Forecasting API.
Authors: Aleksandra Kłeczek and Meredith Syed

Let me know if you want details or help with a specific tutorial.

成功です。エージェントは search_ibmtutorials 時系列に関連するチュートリアルを検索するために作成したツールです

まとめ

このチュートリアルでは、好みのMCPクライアントを使用してすべてのチュートリアルを検索するためのMCPサーバーの構築方法を学びました。あなたは、チュートリアルのリモートJSONインデックスを取得し、検索語に基づいて成果をフィルタリングし、読み取り可能な形式で返す単一の検索ツールを備えたMCPサーバーを作成しました。Fastmcpを使用してツールを登録・実行し、データの取得リクエストやネットワーク、解析、予期せぬ問題に対するエラー処理が含まれています。実行すると、MCPクライアントがサーバーに接続して、すべてのチュートリアルをライブでクエリできるようになります。

関連ソリューション
ビジネス向けAIエージェント

生成AIを使用してワークフローとプロセスを自動化する強力なAIアシスタントとエージェントを構築、デプロイ、管理しましょう。

    watsonx Orchestrateの詳細はこちら
    IBM AIエージェント・ソリューション

    信頼できるAIソリューションでビジネスの未来を構築します。

    AIエージェント・ソリューションの詳細はこちら
    IBM®コンサルティング AIサービス

    IBMコンサルティングAIサービスは、企業がAIをトランスフォーメーションに活用する方法を再考するのに役立ちます。

    人工知能サービスの詳細はこちら
    次のステップ

    事前構築済みのアプリケーションとスキルをカスタマイズする場合でも、AIスタジオを使用してカスタム・エージェント・サービスを構築し、デプロイする場合でも、IBM watsonxプラットフォームが対応します。

    watsonx Orchestrateの詳細はこちら watsonx.aiの詳細はこちら