Apidog

オールインワン協働API開発プラットフォーム

API設計

APIドキュメント

APIデバッグ

APIモック

API自動テスト

MCPサーバーとは?明確に解説

@apidog

@apidog

Updated on 3月 26, 2025

モデルコンテキストプロトコル(MCP)は、2024年11月26日にAnthropicによって導入されたオープンスタンダードであり、AIモデルと外部データソースのギャップを埋めることを目的としています。このプロトコルは、重要な課題に対処します。高度な大規模言語モデル(LLM)であっても、テキスト生成には強力ですが、リアルタイムデータやツールから孤立していることが多く、実用性が制限されます。MCPサーバーは、ClaudeのようなAIアシスタントがファイル、データベース、APIなどにアクセスできるようにする不可欠なコンポーネントであり、関連性の高い行動可能な応答を提供する能力を高めます。

MCPの重要性は、統合の標準化によるものであり、AI開発を苦しめてきた断片化を減少させることにあります。ユニバーサルプロトコルを提供することにより、情報のサイロとレガシーシステムの障壁を打破し、最前線のモデルがより良く、より関連性のある応答を生成する手助けを目指しています。

2025年3月25日時点で、コミュニティの貢献や企業の採用が急速に進展しており、BlockやApolloのような早期採用者がMCPをシステムに統合しています。

💡
すべてのAPIテストワークフローを1つの場所で統合できる最高のポストマン代替ツールを見つける必要がありますか?
Apidogを今すぐ無料でダウンロードし、あなたのワークフローがどのように変革されるかを発見してください!
button

MCPサーバーとは?

MCPサーバーは、モデルコンテキストプロトコル(MCP)の一部で、AnthropicのようなAIモデルが外部データやツールに接続して使用するのを助ける特別なプログラムです。2024年11月に導入され、AIは単にテキストを生成するだけでなく、コンピュータ上のファイルやデータベース、さらにGitHubのようなサービスにもアクセスできるようになります。すべてが安全で標準化された方法で行われます。

MCPサーバーを、AIが外部世界と相互作用できる橋のように考えてみましょう。USBポートが異なるデバイスをコンピュータに接続できるようにするのと同様です。たとえば、AIに文書を要約するように依頼すると、そのファイルを直接システムから取得することができます。また、GitHubの問題を作成する必要がある場合、MCPサーバーのおかげでAIもそれを実行できます。これにより、ファイルやデータを提供したり(ファイルのようなデータ)、ツール(API呼び出しのような操作)やプロンプト(相互作用のガイド)を使ったりすることで、AIがコーディング、研究、プロジェクト管理などのタスクに役立つようになります。

出典: Norah Sakalのブログ

驚くべきことに、コミュニティの成長は非常に迅速であり、公式の統合やコミュニティの貢献を含む250以上のサーバーがすでに利用可能で、急速に拡大している活気あるエコシステムを示しています。

MCPサーバーの動作原理(およびAPIとの違い)

MCPは、ドキュメントに記載されているように、クライアント-サーバーモデルで操作します。アーキテクチャには次の要素が含まれます:

  • MCPホスト: 外部データを活用しようとするClaudeデスクトップ、IDE、またはAIツールなどのアプリケーション。
  • MCPクライアント: サーバーとの安全で1対1の接続を維持し、効率的なコミュニケーションを確保するプロトコルクライアント。
  • MCPサーバー: 標準化されたモデルコンテキストプロトコルを介して特定の機能を公開する軽量プログラム。この構造によりシームレスな統合が可能になり、ホストはクライアントを使用してさまざまなサーバーに接続し、それぞれが固有の機能を提供します。プロトコルは、次の3つの主な種類の公開をサポートしています:
  • リソース: AIがコンテキストに読み込むことができるデータソース(ファイル、文書、データベースクエリなど)。たとえば、ファイルシステムサーバーはローカルドキュメントへのアクセスを許可するかもしれません。
  • ツール: AIが実行できるアクション(API呼び出しの作成やコマンドの実行など)。GitHubサーバーはリポジトリ管理を可能にする例です。
  • プロンプト: LLMの相互作用のための再利用可能なテンプレートであり、特定のシナリオでAIの動作を導きます。
出典: Tahir

このプロトコルはJSON-RPC 2.0に基づいており、クライアントとサーバー間の状態保持接続と機能交渉を確保しています。この技術的基盤により、進捗追跡、キャンセル、エラーレポートなどの機能が信頼性を高める堅牢で安全なコミュニケーションが可能になります。

では、MCPは実際に何ができるの?

MCPサーバーは多用途に設計されており、さまざまなニーズに対応しています。実装に応じてローカルまたはリモートで実行でき、安全性を最優先に考慮して構築されています。各サーバーは自身のリソースを制御し、不正アクセスを防ぐために明確なシステム境界を維持します。

このセキュリティは特に重要であり、機密データを扱う際には、接続が安全であり、権限が厳しく管理されることを保証します。

技術的には、サーバーはJSON-RPCエンドポイントを通じてその機能を公開しており、クライアントは利用可能なリソース、ツール、プロンプトをクエリできます。

例えば、サーバーが指定されたファイルの内容を返す「readFile」リソースを公開したり、GitHubのAPIと対話する「createIssue」ツールを公開したりすることができます。また、プロトコルはサーバーから開始される動作、例えばサンプリングをサポートし、エージェント的なAIの相互作用を可能にします。これは仕様で説明されています。

MCPサーバーに興味がありますか?今すぐ試すことができます

MCPサーバーのエコシステムは豊富で成長しており、次のリポジトリに示されるように、ユーティリティを示す多数の例があります:GitHub - awesome-mcp-servers

  • ファイルシステムMCPサーバー: AIがファイルを読み書きできるようにし、個人的なメモやスクリプトにアクセスするのに便利です。参考実装はGitHub - filesystemにあります。
  • GitHub MCPサーバー: 問題の作成やコードのコミットなどの相互作用を促進し、開発者のワークフローを向上させます。詳細はGitHub - githubにあります。
  • ウェブスクレイピングMCPサーバー: AIがウェブコンテンツを検索・抽出でき、リアルタイムデータを提供します。tavily-ai/tavily-mcpのようなコミュニティサーバーで言及されています。
  • データベースMCPサーバー: SQLまたはNoSQLデータベース(PostgreSQLやMongoDBなど)へのアクセスを提供し、データクエリを可能にします。詳細はGitHub - postgresにあります。
  • API統合MCPサーバー: Slack、Trello、または天気APIなどのサービスに接続し、AIの知識ベースを拡張します。例としてはGitHub - slackのようなもので、これらのサーバーはプロトコルの柔軟性を示しており、Kubernetes管理サーバーなどのコミュニティの貢献がエコシステムに追加されています。サードパーティのサーバーについては、GitHub - serversをご覧ください。
💡
1000以上のMCPサーバーを探索したいですか?

Himcp.aiで詳細を確認してください!
button

MCPサーバーとAPIの違いは何ですか?

出典: Norah Sakalのブログ

MCPサーバーと従来のAPIは、ソフトウェアが外部サービスと相互作用することを可能にしますが、その目的はAIコンテキストにおいて異なります:

  • 目的: 従来のAPIは、AIモデルへのクエリ送信や外部サービスへのアクセスに一般的に使用されるソフトウェア通信のためのインターフェースです。MCPサーバーは、データ、ツール、プロンプトに標準化された形式でコンテキストを提供するように特別に設計されています。
  • 相互作用: 従来のAPIでは、AIモデルがAPIの呼び出し方、応答を解析し、その情報をコンテキストに統合する方法を知る必要があります。MCPサーバーでは、サーバーがデータソースまたはツールとの相互作用を処理し、AIモデルが簡単に理解し使用できる方法で情報を提示します。
  • 標準化: MCPは標準化されたプロトコルを提供し、さまざまなサーバーに対してプラグアンドプレイを可能にしますが、従来のAPIでは各サービスに対してカスタム統合が必要になることがあります。
  • セキュリティ: MCPサーバーは、内蔵の認証とアクセス制御に最適化されており、従来のAPIは実装に応じて追加のセキュリティ対策が必要になることがあります。

たとえば、従来のセットアップでは、AIが天気データを取得するためにREST APIを呼び出す必要があり、JSON応答を解析してコンテキストに統合します。MCPサーバーでは、サーバーが「get_weather」ツールを公開し、AIはパラメータを使用してそれを呼び出し、使用する準備が整ったフォーマット化されたデータを受け取ります。

MCPサーバーをセットアップする方法(例としてClaudeを使って)

モデルコンテキストプロトコル(MCP)は、強力なフレームワークであり、

MCPサーバーは主に3種類の機能を提供できます:

  • リソース: クライアントが読むことができるファイルのようなデータ(API応答やファイルの内容など)
  • ツール: LLMによって呼び出される関数(ユーザーの承認が必要)
  • プロンプト: ユーザーが特定のタスクを達成するのを助けるための事前作成されたテンプレート

環境のセットアップ

始める前に、次のものを用意してください:

  • Python 3.10以上がインストールされていること
  • Node.js(JavaScript/TypeScriptの実装を使用する場合)
  • PythonまたはJavaScriptプログラミングに対する基本的な理解
  • ClaudeのようなLLMについての理解

UVパッケージマネージャーのインストール

UVはPython MCPプロジェクトに推奨されるパッケージマネージャーです:

# MacOS/Linux
curl -LsSf <https://astral.sh/uv/install.sh> | sh

# その後、ターミナルを再起動することを忘れないでください

MCPサーバーの構築

簡単な天気サーバーを例として構築してみましょう。

このサーバーは、get-alertsget-forecastの2つのツールを提供します。

ステップ1: プロジェクト構造を設定する

# プロジェクト用の新しいディレクトリを作成する
uv init weather
cd weather

# 仮想環境を作成して有効化する
uv venv
source .venv/bin/activate  # Windowsの場合: .venv\\\\Scripts\\\\activate

# 依存関係をインストールする
uv add "mcp[cli]" httpx

# サーバーファイルを作成する
touch weather.py

ステップ2: サーバーを実装する

こちらが私たちの天気サーバーの完全な実装(weather.py内)です:

from typing import Any
import httpx
from mcpserver.fastmcp import FastMCP

# FastMCPサーバーを初期化
mcp = FastMCP("weather")

# 定数
NWS_API_BASE = "<https://api.weather.gov>"
USER_AGENT = "weather-app/1.0"

async def make_nws_request(url: str) -> dict[str, Any] | None:
    """適切なエラーハンドリングを用いてNWS APIにリクエストを送ります。"""
    headers = {
        "User-Agent": USER_AGENT,
        "Accept": "application/geo+json"
    }
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=headers, timeout=30.0)
            response.raise_for_status()
            return response.json()
        except Exception:
            return None

def format_alert(feature: dict) -> str:
    """アラート機能を読みやすい文字列にフォーマットします。"""
    props = feature["properties"]
    return f"""
Event: {props.get('event', 'Unknown')}
Area: {props.get('areaDesc', 'Unknown')}
Severity: {props.get('severity', 'Unknown')}
Description: {props.get('description', 'No description available')}
Instructions: {props.get('instruction', 'No specific instructions provided')}
"""

@mcp.tool()
async def get_alerts(state: str) -> str:
    """米国の州に対する気象アラートを取得します。

    Args:
        state: 2文字の米国州コード(例: CA, NY)
    """
    url = f"{NWS_API_BASE}/alerts/active/area/{state}"
    data = await make_nws_request(url)

    if not data or "features" not in data:
        return "アラートを取得できないか、アラートが見つかりません。"

    if not data["features"]:
        return "この州に有効なアラートはありません。"

    alerts = [format_alert(feature) for feature in data["features"]]
    return "\\\\n---\\\\n".join(alerts)

@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:
    """位置の気象予報を取得します。

    Args:
        latitude: 位置の緯度
        longitude: 位置の経度
    """
    # まず予報グリッドエンドポイントを取得します
    points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
    points_data = await make_nws_request(points_url)

    if not points_data:
        return "この位置の予報データを取得できません。"

    # ポイント応答から予報URLを取得
    forecast_url = points_data["properties"]["forecast"]
    forecast_data = await make_nws_request(forecast_url)

    if not forecast_data:
        return "詳細な予報を取得できません。"

    # 期間をフォーマットして読みやすい予報にします
    periods = forecast_data["properties"]["periods"]
    forecasts = []
    for period in periods[:5]:  # 次の5期間のみ表示します
        forecast = f"""
{period['name']}: Temperature: {period['temperature']}°{period['temperatureUnit']}
Wind: {period['windSpeed']} {period['windDirection']}
Forecast: {period['detailedForecast']}
"""
        forecasts.append(forecast)

    return "\\\\n---\\\\n".join(forecasts)

if __name__ == "__main__":
    # サーバーを初期化して実行します
    mcp.run(transport='stdio')

ステップ3: サーバーを実行する

サーバーを直接テストするには、次のコマンドを実行します:

uv run weather.py

Claude for Desktopに接続する

Claude for Desktopは、MCPサーバーと対話するためのシンプルな方法です。

ステップ1: Claude for Desktopをインストール

Claude for Desktopをインストールし、最新バージョンに更新してください。

ステップ2: Claude for Desktopを構成する

  1. テキストエディタでClaude for Desktopアプリの設定を開きます:
# macOS
code ~/Library/Application\\\\ Support/Claude/claude_desktop_config.json

2. サーバー設定を追加します:

{
  "mcpServers": {
    "weather": {
      "command": "uv",
      "args": [
        "--directory",
        "/ABSOLUTE/PATH/TO/PARENT/FOLDER/weather",
        "run",
        "weather.py"
      ]
    }
  }
}

以下を確保してください:

  • サーバーディレクトリの絶対パスを使用すること
  • コマンドがあなたの環境に一致すること(例:uvまたはuvへの完全パス)

ステップ3: Claude for Desktopを再起動

設定を保存した後、Claude for Desktopを完全に再起動します。

ステップ4: サーバーをテストする

Claude for Desktopの入力ボックスの右下隅にハンマーアイコンが表示されます。クリックするとサーバーのツールが表示されるはずです。

Claudeに次のような質問をすることができます:

  • "サクラメントの天気はどうですか?"
  • "テキサスの有効な気象アラートは何ですか?"

Claude MCPサーバー用のカスタムMCPクライアントを構築する

Claude for Desktopの代わりに、独自のカスタムクライアントを構築できます。

ステップ1: クライアントプロジェクトをセットアップする

# プロジェクトディレクトリを作成
uv init mcp-client
cd mcp-client

# 仮想環境を作成
uv venv
source .venv/bin/activate  # Windowsの場合: .venv\\\\Scripts\\\\activate

# 必要なパッケージをインストール
uv add mcp anthropic python-dotenv

# メインファイルを作成する
touch client.py

ステップ2: APIキーを設定する

あなたのAnthropic APIキーを含む.envファイルを作成します:

ANTHROPIC_API_KEY=<your key here>

ステップ3: クライアントを実装する

次に、基本的なクライアント実装(client.py内)を示します:

import asyncio
import sys
from typing import Optional
from contextlib import AsyncExitStack

from mcp.client.stdio import ClientSession, StdioServerParameters, stdio_client
from anthropic import Anthropic
from dotenv import load_dotenv

load_dotenv()  # .envから環境変数をロード

class MCPClient:
    def __init__(self):
        # セッションとクライアントオブジェクトを初期化
        self.session: Optional[ClientSession] = None
        self.exit_stack = AsyncExitStack()
        self.anthropic = Anthropic()

    async def connect_to_server(self, server_script_path: str):
        """MCPサーバーに接続します

        Args:
            server_script_path: サーバースクリプトへのパス(pyまたはjs)
        """
        is_python = server_script_path.endswith('.py')
        is_js = server_script_path.endswith('.js')

        if not (is_python or is_js):
            raise ValueError("サーバースクリプトは.pyまたは.jsファイルである必要があります")

        command = "python" if is_python else "node"
        server_params = StdioServerParameters(command=command, args=[server_script_path], env=None)

        stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params))
        self.stdio, self.write = stdio_transport
        self.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write))
        await self.session.initialize()

        # 利用可能なツールをリスト
        response = await self.session.list_tools()
        tools = response.tools
        print("\\\\nサーバーにツールが接続されました:", [tool.name for tool in tools])

    async def process_query(self, query: str) -> str:
        """Claudeと利用可能なツールを使用してクエリを処理します"""
        messages = [
            {
                "role": "user",
                "content": query
            }
        ]

        response = await self.session.list_tools()
        available_tools = [{
            "name": tool.name,
            "description": tool.description,
            "input_schema": tool.input_schema
        } for tool in response.tools]

        # 初期のClaude API呼び出し
        response = self.anthropic.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=1000,
            messages=messages,
            tools=available_tools
        )

        # 応答を処理し、ツール呼び出しを管理
        final_text = []
        assistant_message_content = []

        for content in response.content:
            if content.type == 'text':
                final_text.append(content.text)
                assistant_message_content.append(content)
            elif content.type == 'tool_use':
                tool_name = content.name
                tool_args = content.input

                # ツール呼び出しを実行
                result = await self.session.call_tool(tool_name, tool_args)
                final_text.append(f"[ツール {tool_name}を引数 {tool_args}で呼び出しています]")
                assistant_message_content.append(content)

                messages.append({
                    "role": "assistant",
                    "content": assistant_message_content
                })

                messages.append({
                    "role": "user",
                    "content": [
                        {
                            "type": "tool_result",
                            "tool_use_id": content.id,
                            "content": result
                        }
                    ]
                })

                # Claudeからの次の応答を取得
                response = self.anthropic.messages.create(
                    model="claude-3-5-sonnet-20241022",
                    max_tokens=1000,
                    messages=messages,
                    tools=available_tools
                )

                final_text.append(response.content[0].text)

        return "\\\\n".join(final_text)

    async def chat_loop(self):
        """インタラクティブなチャットループを実行します"""
        print("\\\\nMCPクライアントが起動しました!")
        print("クエリを入力するか、「quit」と入力して終了してください。")

        while True:
            try:
                query = input("\\\\nクエリ: ").strip()
                if query.lower() == 'quit':
                    break

                response = await self.process_query(query)
                print("\\\\n" + response)
            except Exception as e:
                print(f"\\\\nエラー: {str(e)}")

    async def cleanup(self):
        """リソースをクリーンアップします"""
        await self.exit_stack.aclose()

async def main():
    if len(sys.argv) < 2:
        print("使用法: python client.py <server_scriptへのパス>")
        sys.exit(1)

    client = MCPClient()

    try:
        await client.connect_to_server(sys.argv[1])
        await client.chat_loop()
    finally:
        await client.cleanup()

if __name__ == "__main__":
    asyncio.run(main())

ステップ4: クライアントを実行する

天気サーバーとクライアントを使用するには:

uv run client.py /path/to/weather.py

Claude for Desktopの事前構築済みMCPサーバーの使用

Claude for Desktopは、さまざまな事前構築済みのMCPサーバーをサポートしています。ファイルシステムサーバーを例として使用する方法を見てみましょう。

ステップ1: ファイルシステムサーバーを構成する

  1. Claude for Desktopの設定を開き、「Edit Config」をクリックします。
  2. 構成ファイルを次のように更新します:
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/username/Desktop",
        "/Users/username/Downloads"
      ]
    }
  }
}

usernameを実際のユーザー名に置き換え、必要に応じてパスを調整してください。

ステップ2: 再起動とテスト

Claude for Desktopを再起動した後、ファイルシステムツールを使用して次のことができます:

  • ファイルを読む
  • ファイルを書く
  • ファイルを検索する
  • ファイルを移動する

例のプロンプト:

  • "詩を書いて、デスクトップに保存できますか?"
  • "ダウンロードフォルダにある仕事関連のファイルは何ですか?"
  • "デスクトップ上のすべての画像を新しい「Images」というフォルダに移動できますか?"

結論

MCPサーバーはAI機能の重要な進展を示しており、強力な言語モデルと外部ツールとのギャップを埋めることができます。このガイドを通じて、あなたはMCPサーバーを作成、構成、使用してClaudeの機能を向上させる方法を学びました。

モデルコンテキストプロトコルの標準化アプローチにより、AIモデルはリアルタイムデータにアクセスし、アクションを実行し、安全で制御された方法でシステムと相互作用できるようになります。これにより、AIアシスタントの開発、データ分析、コンテンツ制作などの実世界のアプリケーションにおいてより実用的になります。

MCPエコシステムが成長し続ける中で、開発者はますます洗練されたサーバーを作成し、AIで可能なことを拡大しています。事前構築されたサーバーを使用するか、カスタムソリューションを開発するかにかかわらず、MCPはより強力なAIアプリケーションを構築するための柔軟な基盤を提供します。



MCPサーバーはAPI統合を伴うことが多いため、MCP実装ワークフローを補完できる包括的なAPI開発プラットフォームであるApidogを探索することをお勧めします。

Apidogは、API設計、文書化、デバッグ、自動テストのためのオールインワンソリューションを提供します。その直感的なインターフェースにより、次のことが簡単になります:

  • 視覚インターフェースを使用してAPIを設計するか、既存の仕様をインポートする
  • コードと同期して自動生成される文書を保持する
  • 強力なリクエストビルダーでAPIエンドポイントをテストする
  • API用の自動テストシナリオを作成する
  • チームメンバーと共有ワークスペースを通じてコラボレーションする

外部APIと対話するMCPサーバーを開発する際、Apidogはエンドポイントを検証し、応答構造を理解し、統合がサーバーコードに実装される前に正しく機能することを保証するのに役立ちます。

MCP開発においてApidogの使用を開始するには、Apidogのウェブサイトを訪問し、API開発ワークフローを向上させる方法を探ってください。

button


MCPサーバーとApidogのような効率的なAPI開発ツールを組み合わせることで、AIシステムと外部サービス間のより堅牢で信頼性の高い接続を作成でき、AIアプリケーションをさらに強力にできます。