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/HTTPS | NginxリバースProxy |
| サーバー認証 | BearerトークンまたはmTLS | FastMCPサーバー設定 |
| ツールアクセス制御 | blueprint.yamlのrequires_auth | NeMo Agent Toolkit |
| ポリシーガードレール | NemoClawのOpenShellポリシー | NemoClaw |
| 監査ログ | ツール呼び出し履歴のログ | FastMCPサーバー |
チャットボット構築チュートリアルでは、MCPサーバーと統合した実用的なチャットボットの全実装例を確認できます。