MCP(Model Context Protocol)とFastMCPの概要

MCP(Model Context Protocol)はAnthropicが策定したオープンスタンダードで、AIエージェントが外部ツール・データソース・APIにアクセスするための統一インターフェースを提供します。2024年末に公開されてから急速に採用が広がり、NVIDIAのNeMo Agent ToolkitもMCPをネイティブサポートしています。

FastMCPはMCPサーバーをPythonで高速に構築するためのフレームワークです。デコレータベースのシンプルな記法で、関数をMCPツールとして公開できます。NeMo Agent Toolkit v1.5からFastMCPが統合されたことで、ツール定義からサーバー公開まで最小限のコードで完結するようになりました。

MCPはHTTP/SSEまたはstdio(標準入出力)をトランスポートとして使用します。NeMo Agent ToolkitのFastMCP実装はHTTP/SSEをデフォルトとしており、複数のエージェントや外部クライアントからの同時接続に対応しています。

NemoClawの全体像についてはNemoClawとは何かの解説記事を、既存のAPIとの比較はAPI統合ガイドを参照してください。

MCPのアーキテクチャ:ホスト・クライアント・サーバーの関係

MCPは3つのコンポーネントで構成されます。

コンポーネント役割NeMo環境での例
MCPホストLLMを実行し、ツール呼び出しを調整するアプリケーションNemoClawのOpenShellランタイム
MCPクライアントMCPサーバーへの接続を管理するライブラリNeMo Agent Toolkitの接続レイヤー
MCPサーバーツール・リソース・プロンプトを提供するサービスFastMCPで構築したカスタムサーバー

NemoClawのOpenShellはMCPホストとして機能し、登録されたMCPサーバーのツールをエージェントに透過的に提供します。開発者がFastMCPでサーバーを実装してNemoClawに登録すれば、エージェントは自動的にそのツールを発見して使用できます。

NeMo Agent Toolkit v1.5の主な変更点

v1.5ではFastMCP統合以外にも重要な変更が含まれています。

機能v1.4以前v1.5
MCPサーバー構築独自プロトコル実装が必要FastMCPデコレータで自動化
ホットリロードサーバー再起動が必要--dev-modeでコード変更を即時反映
ツール登録設定ファイルに手動記述@mcp.tool()デコレータで自動登録
型検証なしPydanticモデルで自動バリデーション
OpenAPI統合手動実装自動生成(/docs エンドポイント)

NeMo Agent Toolkit v1.5のインストールとFastMCP環境構築

NeMo Agent Toolkit v1.5のインストールからFastMCPサーバーの起動まで、ステップバイステップで説明します。前提条件はPython 3.10以上とDockerです。

インストール手順

# 1. NeMo Agent Toolkitのインストール
pip install nemo-agent-toolkit>=1.5.0

# FastMCPの依存関係を含める場合
pip install nemo-agent-toolkit[mcp]>=1.5.0

# または開発版(最新機能)
pip install git+https://github.com/NVIDIA/NeMo-Agent-Toolkit.git@main#egg=nemo-agent-toolkit[mcp]
# 2. NemoClawとの統合(既にNemoClawインストール済みの場合)
nemoclaw plugin install nemo-agent-toolkit
nemoclaw toolkit --version
# 出力例: NeMo Agent Toolkit v1.5.2

NemoClawのインストール自体はインストール完全ガイドを参照してください。

最初のFastMCPサーバーを作成する

最もシンプルなFastMCPサーバーの例です。Pythonファイル1つで動作します。

# server.py
from nemo_agent_toolkit.mcp import FastMCP

mcp = FastMCP("my-tools-server")

@mcp.tool()
def get_weather(city: str) -> dict:
    """指定した都市の天気情報を返す"""
    # 実際の実装では天気APIを呼び出す
    return {
        "city": city,
        "temperature": 22,
        "condition": "晴れ",
        "humidity": 55
    }

@mcp.tool()
def calculate_tax(amount: float, rate: float = 0.10) -> dict:
    """消費税を計算する"""
    tax = amount * rate
    return {
        "subtotal": amount,
        "tax": round(tax, 2),
        "total": round(amount + tax, 2)
    }

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

このファイルをワンコマンドで公開します。

# MCPサーバーを起動(デフォルトポート: 8765)
python server.py

# または明示的にポートを指定
python server.py --host 0.0.0.0 --port 8765

@mcp.tool() デコレータを付けた関数は自動的にMCPツールとして登録されます。関数のdocstringがツールの説明として使われ、型アノテーションがパラメータスキーマとして自動生成されます。

開発者ホットリロードモードの活用

NeMo Agent Toolkit v1.5の目玉機能の一つが開発者ホットリロードモード(--dev-mode)です。サーバーを再起動することなく、Pythonコードの変更を即時反映できます。

ホットリロードモードの起動方法

# ホットリロードモードで起動
python server.py --dev-mode

# または環境変数で指定
NEMO_MCP_DEV=1 python server.py

ホットリロードモードでは以下の動作になります。

  • server.pyのコード変更を検知(watchdogライブラリ使用)
  • 0.5秒以内にモジュールをリロード
  • 既存の接続を維持したままツール定義を更新
  • デバッグログを詳細出力(--log-level debug 相当)
モードコード変更の反映接続の維持推奨環境
通常モードサーバー再起動が必要—(切断)本番環境
ホットリロードモード自動・即時反映維持開発・テスト環境

開発効率を上げるデバッグTips

ホットリロードモードと組み合わせて使うと効果的な開発手法を紹介します。

  • MCPインスペクター: NeMo Toolkitに付属の nemoclaw mcp inspect コマンドで登録済みツールの一覧・スキーマをリアルタイム確認できます
  • テストクライアント: nemoclaw mcp test-call get_weather --args '{"city": "東京"}' でターミナルから直接ツールを呼び出せます
  • ログストリーミング: --log-file ./mcp.log を指定すると、エージェントからのツール呼び出し履歴をファイルに記録できます

NemoClawのblueprint.yaml設定ファイルリファレンスでMCPサーバーの接続設定方法も確認してください。

ツールパブリッシング設定とNemoClawへの登録

FastMCPサーバーをNemoClawのエージェントから利用できるようにするには、blueprint.yamlへの登録が必要です。ここではツールの公開設定から本番登録までを解説します。

ツールメタデータと公開設定

@mcp.tool() デコレータには詳細なメタデータを設定できます。

from nemo_agent_toolkit.mcp import FastMCP, ToolConfig
from pydantic import BaseModel, Field

mcp = FastMCP(
    name="enterprise-tools",
    version="1.0.0",
    description="社内業務自動化ツール群"
)

class SearchInput(BaseModel):
    query: str = Field(..., description="検索キーワード")
    max_results: int = Field(10, ge=1, le=100, description="最大件数")
    category: str = Field("all", description="カテゴリフィルター")

@mcp.tool(
    name="search_knowledge_base",
    description="社内ナレッジベースを検索する",
    tags=["search", "knowledge"],
    requires_auth=True,   # 認証必須ツール
    rate_limit=100        # 1分間100回まで
)
def search_knowledge_base(params: SearchInput) -> dict:
    """社内ドキュメントデータベースを全文検索する"""
    # 実装省略
    return {"results": [], "total": 0}

blueprint.yamlへのMCPサーバー登録

NemoClawのblueprint.yamlにFastMCPサーバーを登録する設定例です。

mcp:
  servers:
    - name: enterprise-tools
      url: http://localhost:8765/mcp
      auth:
        type: bearer
        token: ${MCP_SERVER_TOKEN}
      tools:
        - search_knowledge_base
        - calculate_tax
      timeout: 30
      retry:
        max_attempts: 3
        backoff: exponential

NemoClawのOpenShellは起動時にこの設定を読み込み、登録されたMCPサーバーへの接続をテストします。エラーが発生した場合はnemoclaw health-checkコマンドで診断できます。セキュリティ機能の解説では認証設定の詳細を説明しています。

本番環境でのFastMCPサーバーデプロイ

本番環境ではDockerコンテナとしてデプロイすることを推奨します。

# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY server.py .
EXPOSE 8765
CMD ["python", "server.py", "--host", "0.0.0.0", "--port", "8765"]
# docker-compose.yml
services:
  mcp-server:
    build: .
    ports:
      - "8765:8765"
    environment:
      - MCP_SERVER_TOKEN=${MCP_SERVER_TOKEN}
    restart: always
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8765/health"]
      interval: 30s
      timeout: 10s
      retries: 3

エンタープライズ導入事例ではKubernetes上でのMCPサーバー運用例も紹介しています。

FastMCPの高度な機能:リソース・プロンプト・ストリーミング

FastMCPはツール以外にも、リソース(大容量データへのアクセス)とプロンプトテンプレートを提供する機能を持ちます。

リソース:ファイル・DBへのアクセス提供

MCPリソースは、LLMがコンテキストとして参照できる大容量データを提供します。

@mcp.resource("company://documents/{doc_id}")
def get_document(doc_id: str) -> str:
    """社内ドキュメントの本文を返す"""
    # DBからドキュメントを取得して返す
    return fetch_document_from_db(doc_id)

@mcp.resource("company://products/catalog")
def get_product_catalog() -> str:
    """商品カタログ全体をJSON文字列で返す"""
    return json.dumps(get_all_products(), ensure_ascii=False)

エージェントはリソースURIを指定してコンテキストとして読み込めます。巨大なデータをすべてプロンプトに入れる必要がなく、必要な部分だけを効率的にLLMに渡せます。

ストリーミング対応ツールの実装

長時間かかる処理(データ分析・レポート生成など)にはストリーミング対応ツールが有効です。

from nemo_agent_toolkit.mcp import FastMCP
import asyncio

mcp = FastMCP("streaming-tools")

@mcp.tool(streaming=True)
async def generate_report(topic: str):
    """レポートを逐次生成してストリーミング出力する"""
    sections = ["概要", "現状分析", "課題", "対策案", "まとめ"]
    for section in sections:
        yield {"section": section, "content": f"{section}の内容を生成中..."}
        await asyncio.sleep(0.5)  # 実際にはLLM推論

ストリーミングツールを使うことで、エージェントが長い処理の途中経過をリアルタイムにユーザーに表示できます。NemoClawのOpenShellはストリーミングMCPツールをネイティブサポートしています。

NemoClawエージェントとFastMCPの統合実践例

実際のビジネス業務でNemoClawエージェントとFastMCPサーバーを統合したシナリオを紹介します。

CRM統合エージェントの構築例

Salesforce CRMへのアクセスを提供するFastMCPサーバーと、それを利用するNemoClawエージェントの例です。

# crm_server.py
from nemo_agent_toolkit.mcp import FastMCP
import simple_salesforce

mcp = FastMCP("crm-server")
sf = simple_salesforce.Salesforce(
    username=os.environ["SF_USERNAME"],
    password=os.environ["SF_PASSWORD"],
    security_token=os.environ["SF_TOKEN"]
)

@mcp.tool()
def get_customer(account_id: str) -> dict:
    """CRMから顧客情報を取得する"""
    return sf.Account.get(account_id)

@mcp.tool()
def create_opportunity(account_id: str, name: str, amount: float) -> dict:
    """商談を作成する"""
    return sf.Opportunity.create({
        "AccountId": account_id,
        "Name": name,
        "Amount": amount,
        "StageName": "Prospecting",
        "CloseDate": "2026-12-31"
    })

このサーバーをblueprint.yamlに登録すると、NemoClawエージェントは「顧客Aの最近の取引履歴を確認して商談を作成して」といった自然言語指示を実行できるようになります。

セキュリティとアクセス制御の実装

MCPサーバーへのアクセス制御はNemoClawのセキュリティ機能と組み合わせて実装します。

セキュリティ層実装方法担当
トランスポート暗号化TLS/HTTPSNginxリバースProxy
サーバー認証BearerトークンまたはmTLSFastMCPサーバー設定
ツールアクセス制御blueprint.yamlのrequires_authNeMo Agent Toolkit
ポリシーガードレールNemoClawのOpenShellポリシーNemoClaw
監査ログツール呼び出し履歴のログFastMCPサーバー

チャットボット構築チュートリアルでは、MCPサーバーと統合した実用的なチャットボットの全実装例を確認できます。