🙌

AIに外部APIを使わせたい?MCPサーバーを30分で実装する

に公開

はじめに

AIエージェントや大規模言語モデル(LLM)が急速に進化する中、これらのAIを外部のデータやサービスと安全かつ効率的に連携させる技術が重要になっています。その中核を担うのが Model Context Protocol (MCP) です。

すでにClaudeCodeやCursorなどAI開発においてMCPは使われている方が多いとは思いますが、
Webエンジニアの皆さんを対象に、MCPサーバーとは何か、なぜ今注目されているのか、そして実際にPythonを使ってどのように構築するのかを、ハンズオン形式で徹底解説します。

MCPサーバーとは何か?

まず、MCPサーバーの正体を探っていきましょう。

MCP: AIと外部サービスをつなぐ「共通言語」

MCPModel Context Protocol の略で、LLMのようなAIアプリケーションが、外部のシステムやツール、データソースと対話するためのオープンソースな標準プロトコルです [1]

これまで、AIが外部APIを叩く際は、OpenAI Functionsのような特定プラットフォームの独自仕様に依存するか、自前で複雑な連携ロジックを組む必要がありました。MCPは、この連携部分に「共通規格」を設けることで、特定のAIモデルやプラットフォームに縛られず、再利用可能で安全な接続を実現します。まるで、様々な電子機器を同じケーブルで接続できる「USB-C」のように、MCPはAIアプリケーションの接続性を標準化するものです [2]

以前の記事で非エンジニアの方でも分かるように解説していますので、もし気になれば見てください!

MCPサーバーの役割:AIのための「通訳・アダプタ」

MCPサーバーは、このMCPというプロトコルに則って作られた、LLMから呼び出されることに特化した専用のAPIサーバーです。

その役割は、LLMクライアント(ChatGPT, Claude, Cursorなど)と、あなたが連携させたい既存のAPI、データベース、SaaSなどのバックエンドサービスとの間に立つ「通訳」や「アダプタ」とイメージすると分かりやすいでしょう。

LLMはMCPサーバーに「このツールを使ってこの操作をして」と標準化された形式でリクエストを送り、MCPサーバーはそのリクエストを解釈して、実際のバックエンド処理を実行し、結果をLLMに返します。

MCPの基本コンセプト

MCPは、主に3つの基本要素(プリミティブ)で構成されています [3]

プリミティブ 役割 ユースケース例
Tools AIが呼び出せる「操作」の定義。実行可能な関数。 天気APIの呼び出し、データベースへの書き込み
Resources AIに提供する「読み取り専用データ」の定義。 ファイルの内容、データベースのスキーマ情報
Prompts AIとの対話を効率化するための「定型プロンプト」のカタログ。 複雑なタスクを依頼するためのシステムプロンプト

通信は、ローカル環境では高速なSTDIN/STDOUT、リモート環境ではHTTP + Server-Sent Events (SSE) を使ったストリーミング通信が標準的に用いられます。やり取りされるデータは、JSON-RPC 2.0形式に準拠したリクエストとレスポンスです。

どの言語で実装する?

MCPサーバーはプロトコルなので、理論上はどんな言語でも実装可能です。主要な言語向けには公式・コミュニティ製のSDKが提供されており、これらを利用するのが近道です。

  • TypeScript (Node.js): 公式SDKがあり、多くの開発者に利用されています。
  • Python: 公式SDKに加え、本記事で紹介する FastMCP という強力なフレームワークが存在します。
  • その他: Go, Java, C# などのSDKもコミュニティベースで開発が進んでいます。

この記事では、Webエンジニアにとって馴染み深く、データ処理やAPI連携のライブラリが豊富な Python と、その開発を劇的に加速させるフレームワーク FastMCP を使って解説を進めます [4]

開発環境の準備 (Python + uv)

早速、開発環境を整えましょう。ここでは、uv を使用します 。

前提条件:

  • uv がインストール済み(未導入の場合は pip install uv または公式の手順でインストールしてください)
  1. プロジェクト作成
    ターミナルで以下のコマンドを実行し、プロジェクトの雛形を作成します。

    # プロジェクトディレクトリを作成し、初期化
    uv init mcp-hello
    cd mcp-hello
    
  2. 依存パッケージの追加
    次に、fastmcp をプロジェクトに追加します。

    # fastmcpをインストール
    uv add fastmcp
    

    uv が必要な依存関係を高速に解決し、仮想環境にインストールしてくれます。

これで準備は完了です。ディレクトリには pyproject.tomlmain.py などが生成されているはずです。

「Hello MCP Server」を動かしてみよう!

まずは、最もシンプルなMCPサーバーを実装し、動作を確認します。

最小サーバーの実装

hello_server.py というファイルを新規作成し、以下のコードを記述してください。

hello_server.py
"""
Hello MCP Server - 最小限のMCPサーバー実装例
"""
from fastmcp import FastMCP

# FastMCPサーバーのインスタンスを作成
mcp = FastMCP("Hello MCP Server")


@mcp.tool()
def hello(name: str) -> str:
    """
    指定された名前に対して挨拶を返すツール
    
    Args:
        name: 挨拶する相手の名前
        
    Returns:
        挨拶メッセージ
    """
    return f"Hello, {name}!"


if __name__ == "__main__":
    # stdioトランスポートでサーバーを起動
    mcp.run()

コードのポイント:

  • FastMCP(...) でサーバー本体をインスタンス化します。
  • @mcp.tool() デコレータを関数に付けるだけで、その関数がMCPの Tool としてAIに公開されます。
  • FastMCPは、関数の引数や型ヒント、docstringを解析し、AIが理解できる形式のツール定義を自動で生成してくれます。

サーバーの起動

ターミナルで以下のコマンドを実行して、サーバーを起動します。

# uvを使ってスクリプトを実行
uv run python hello_server.py

この状態で、サーバーはクライアントからのリクエストを待ち受けています。デフォルトでは、ローカル実行に適した stdio が使用されます。

Claude Desktopからの接続方法

作成したMCPサーバーを実際に使うために、Claude Desktopへの接続方法を見ていきましょう [5]

1. Claude Desktopの設定を開く

Claude Desktopのメニューから「Claude > Settings...」を選択します。

2. Developerタブで設定ファイルを編集

左サイドバーの「開発者」タブを選択し、「設定を編集」ボタンをクリックします。
これにより、以下の場所にある設定ファイルが開きます。

3. MCPサーバーを追加

設定ファイルに以下のJSONを追加します。

{
  "mcpServers": {
    "hello-server": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/mcp-hello",
        "run",
        "python",
        "hello_server.py"
      ]
    }
  }
}

4. Claude Desktopを再起動

設定ファイルを保存したら、Claude Desktopを完全に終了してから再度起動します。

実際の使用例

接続が成功すると、Claudeは自動的にhelloツールを認識します。チャットで「helloツールを使って'World'に挨拶して」のように指示すると、Claudeはツールの実行許可を求めてきます。

Claude DesktopでのMCPツール実行許可画面
ツール実行時には、セキュリティのためにユーザーの明示的な許可が必要です

「Allow for This Chat」または「Allow Once」をクリックすると、MCPサーバーが呼び出され、「Hello, World!」という結果が返されます。このように、ClaudeはMCPツールの実行前に必ずユーザーの許可を求めるため、予期せぬ操作が実行される心配はありません。

実用的なツールを作ってみる

Hello Worldだけでは物足りないので、より実践的なツールを作ってみましょう。

外部APIを叩く天気情報ツール

外部の天気予報APIを呼び出し、指定された都市の天気を返すツールです。ここでは httpx を使って非同期にAPIリクエストを行います。

まず、OpenWetherのサイトからAPI Keyを取得する必要があります。Freeプランで利用できます。
https://openweathermap.org/api

次に、httpx をインストールします。

# httpxを追加
uv add httpx

次に、weather_server.py を作成します。

weather_server.py
"""
Weather MCP Server - 外部APIを呼び出すMCPサーバー実装例
"""
import os
from typing import Optional
import httpx
from fastmcp import FastMCP

# FastMCPサーバーのインスタンスを作成
mcp = FastMCP("Weather MCP Server")


@mcp.tool()
async def get_weather(city: str, country_code: Optional[str] = None) -> str:
    """
    指定された都市の現在の天気情報を取得するツール
    
    Args:
        city: 都市名(例: Tokyo, London)
        country_code: 国コード(オプション、例: JP, UK)
        
    Returns:
        天気情報のJSON文字列
    """
    # 環境変数からAPIキーを取得
    api_key = os.getenv("OPENWEATHER_API_KEY")
    if not api_key:
        return "エラー: OPENWEATHER_API_KEY環境変数が設定されていません"
    
    location = f"{city},{country_code}" if country_code else city
    url = "https://api.openweathermap.org/data/2.5/weather"
    params = {"q": location, "appid": api_key, "units": "metric", "lang": "ja"}
    
    try:
        async with httpx.AsyncClient() as client:
            response = await client.get(url, params=params)
            response.raise_for_status() # エラーがあれば例外を発生
            return str(response.json())
    except httpx.HTTPStatusError as e:
        return f"エラー: APIリクエストが失敗しました (ステータスコード: {e.response.status_code})"
    except Exception as e:
        return f"エラー: {str(e)}"


if __name__ == "__main__":
    # このサーバーはHTTPで公開すると便利
    # 実行前に export OPENWEATHER_API_KEY="あなたのAPIキー"
    mcp.run(transport="http", port=8000)

そして、Hello MCP Serverと同様にClaude DesktopにMCPサーバーを追加して、チャットで指示してみましょう。
今日の東京の天気などを聞くと教えてくれるはずです。

MCPサーバーの設計パターン

最後に、MCPサーバーを設計する際の代表的なパターンを3つ紹介します。

  1. 薄いラッパー (Thin Wrapper) 型
    既存のREST APIのエンドポイントを、ほぼそのまま1対1でMCPのツールに変換するパターン。最も手軽に始められますが、AIにとっては少し使いにくい(粒度が細かすぎる)場合があります。

  2. ユースケース単位型
    「ユーザーの情報を取得して、その最新の注文履歴を返す」のように、人間が行う一連の業務操作を1つのツールとしてまとめるパターン。AIにとって非常に使いやすく、より自律的なタスク実行を促せます。設計にはドメイン知識が必要です。

  3. 読み取り専用スタート型
    まずは Resources プリミティブや、データの読み取り(GETリクエスト)を行う Tools だけを公開するパターン。安全性を確保しやすく、スモールスタートに適しています。AIに社内ドキュメントを検索させる、などの用途に最適です。

どのパターンを選択するかは、連携したいシステムの特性や、AIに何をさせたいかによって決まります。まずは「読み取り専用スタート型」から始め、徐々に「ユースケース単位型」のツールを追加していくのがおすすめです。

まとめ

本記事では、AIと外部世界を繋ぐ標準プロトコル「MCP」の基本から、Pythonのフレームワーク「FastMCP」を使った具体的なサーバー実装、そして外部APIと連携する実践的なツールの作り方までを解説しました。

MCPサーバーは、LLMの能力を最大限に引き出し、独自のデータやビジネスロジックと連携させるための強力な鍵となります。これまでAIには難しいとされていた、より複雑で実用的なタスクの自動化が、MCPによって現実のものとなりつつあります。

今回紹介したコードは、始まりに過ぎませんので、今後は、MCPのプリミティブの適切な設定、設計パターンの詳細、OAuth認証やAPIキーの安全な管理、本番環境で必要となる認証・認可周りの実装についても記事にしてみたいと考えています。

一読いただき、誠にありがとうございました。

参照

脚注
  1. Model Context Protocol (MCP) Official Website. https://modelcontextprotocol.io/ ↩︎

  2. Anthropic, "Introducing the Model Context Protocol". https://www.anthropic.com/news/model-context-protocol ↩︎

  3. MCP Docs, "Architecture overview". https://modelcontextprotocol.io/docs/learn/architecture ↩︎

  4. FastMCP Official Website. https://gofastmcp.com/ ↩︎

  5. MCP Docs, "Connect to local MCP servers". https://modelcontextprotocol.io/docs/develop/connect-local-servers ↩︎

MOCHIRON TECH

Discussion