Dive MCP Host について
Dive MCP Host は、Model Context Protocol 向けの Python 製ホストランタイムです。複数の LLM とトランスポートに対応し、複数の MCP サーバーを一つのエージェントバックエンドにまとめます。Dive デスクトップアプリの中核であり、単独のサービスやライブラリとしても利用できます。
主な機能
- 01LangChain 経由の複数 LLM プロバイダー対応
- 02stdio、SSE、ストリーミング HTTP、WebSocket のサポート
- 03ツールとプロンプトの機能ネゴシエーション
- 04OAuth と elicitation のフロー
- 05SQLite や Postgres によるスレッドの永続化
活用シーン
- 01Dive デスクトップアプリのバックエンドとしての利用
- 02Python アプリケーションへの MCP ホストの組み込み
- 03コマンドラインや HTTP API からのチャットセッションの実行
MCP 対応
MCP クライアントのホストとして動作し、mcp_config.json に定義された MCP サーバーを接続します。各サーバーが公開する機能のみを照会し、ツールとプロンプトを一覧化して呼び出します。
詳細
🌊 Dive MCP Host
Model Context Protocol 向けの本番環境対応 Python ホスト — 複数の LLM、複数のトランスポート、仕様準拠。
Dive デスクトップアプリを支える Python の頭脳です。サービスまたはライブラリとして単独でも実行できます。
✨ Dive MCP Host を選ぶ理由
MCP エコシステムは急速に成長していますが、多くのホストは単一の LLM、単一のトランスポート、または単一のフロントエンドに強く依存しています。Dive MCP Host はその逆です。あらゆる MCP サーバーの集合を単一のエージェントバックエンドに変換する、トランスポート非依存、モデル非依存のランタイムです。
- 🧠 あらゆる LLM — OpenAI、Anthropic、Google、AWS Bedrock、Mistral、DeepSeek、Ollama、Azure OpenAI など、LangChain が対応するものなら何でも利用できます。
- 🔌 あらゆる MCP サーバー —
stdio、sse、streamable-http、websocketに加え、「起動して接続する」ローカル HTTP モードにも対応しています。 - 🛰 3 つの利用方法 — SDK を埋め込む、HTTP API を使う、または CLI から操作できます。
- 🧩 仕様に準拠した機能ネゴシエーション — サーバーが機能を通知した場合にのみ
tools/list/prompts/listを呼び出し、「Method not found」にも適切に対処します。 - 💬 MCP プロンプトを第一級の機能として提供 —
notifications/prompts/list_changedに応じて、一覧表示、取得、レンダリング、更新ができます。 - 🔐 OAuth とエリシテーションを標準搭載 — サーバーごとの個別対応なしで、対話型フローをホストに伝達します。
- 🗃 永続スレッド — LangGraph を介した SQLite または Postgres のチェックポイントにより、メッセージ、OAuth トークン、会話状態が再起動後も保持されます。
🏗 アーキテクチャの概要
flowchart LR
subgraph Clients
UI[Dive Desktop<br/>Electron / Tauri]
CLI[dive_cli]
SDK[Python SDK<br/>DiveMcpHost]
end
subgraph Host[dive-mcp-host]
HTTP[FastAPI<br/>dive_httpd]
Core[DiveMcpHost<br/>+ ToolManager<br/>+ Chat / LangGraph]
DB[(SQLite / Postgres<br/>messages • OAuth • checkpoints)]
end
subgraph LLMs
OAI[OpenAI]
Anthropic[Anthropic]
Ollama[Ollama]
Etc[…and more]
end
subgraph MCPServers[MCP Servers]
Stdio[stdio<br/>local subprocess]
SSE[SSE]
StreamHTTP[streamable-http]
WS[websocket]
end
UI --> HTTP
CLI --> Core
SDK --> Core
HTTP --> Core
Core --> LLMs
Core --> MCPServers
Core --> DB
3 つのエントリーポイントすべてで、同じ DiveMcpHost コアを再利用します。HTTP レイヤーは薄い FastAPI ラッパーで、CLI と SDK はさらに薄い構成です。
ライフサイクル
すべてが非同期コンテキストマネージャー(ContextProtocol)です。リソースは厳密にネストされるため、クリーンアップが確実に行われます。
sequenceDiagram
participant App
participant Host as DiveMcpHost
participant TM as ToolManager
participant Srv as McpServer × N
participant Chat
App->>Host: async with DiveMcpHost(config)
Host->>TM: enter
TM->>Srv: spawn / connect each server (parallel)
Srv->>Srv: initialize() → read capabilities
Srv-->>Srv: tools/list (if advertised)
Srv-->>Srv: prompts/list (if advertised)
App->>Host: host.chat(chat_id=...)
Host->>Chat: build LangGraph agent over tools
App->>Chat: query("hello")
Chat-->>App: stream events
App->>Host: __aexit__
Host->>TM: shutdown all servers
🚀 クイックスタート
インストール
# Recommended: uv (respects uv.lock)
uv sync --frozen
# Or with pip
pip install -e .
# With dev tools (pytest, ruff, …)
uv sync --extra dev --frozen
Python 3.12+ が必要です。
HTTP サービスを実行する
dive_httpd
デフォルトでは 0.0.0.0:61990 でサービスを提供します。dive_httpd.json で設定できます(DB、チェックポインター、CORS)。
CLI を試す
dive_cli "Summarize today's news"
dive_cli -c CHAT_ID "and what about tech?" # resume a thread
Python に埋め込む
from dive_mcp_host.host.host import DiveMcpHost
from dive_mcp_host.host.conf import HostConfig
config = HostConfig(...) # see model_config.json / mcp_config.json samples
async with DiveMcpHost(config) as host:
async with host.chat(chat_id="demo") as chat:
async for event in chat.query("hello"):
print(event)
⚙️ 設定
サービスは 3 つの JSON ファイルで設定します。サンプルはリポジトリのルートにあります。
📄 mcp_config.json — 接続する MCP サーバー
{
"mcpServers": {
"fetch": {
"transport": "stdio",
"command": "uvx",
"args": ["mcp-server-fetch@latest"]
},
"weather": {
"transport": "streamable",
"url": "https://example.com/mcp"
}
}
}
対応する transport の値は stdio、sse、streamable、websocket です。ローカルの HTTP MCP サーバーを起動して接続するには、"command" と "url" を組み合わせて追加します。
📄 model_config.json — 使用する LLM
{
"activeProvider": "ollama",
"configs": {
"openai": { "modelProvider": "openai", "model": "gpt-4o-mini", "apiKey": "..." },
"anthropic": { "modelProvider": "anthropic", "model": "claude-sonnet-4-5" },
"ollama": { "modelProvider": "ollama", "model": "qwen2.5:14b",
"configuration": { "baseURL": "http://localhost:11434" } }
}
}
📄 dive_httpd.json — HTTP サービスの設定
{
"db": { "uri": "sqlite:///db.sqlite", "async_uri": "sqlite+aiosqlite:///db.sqlite", "migrate": true },
"checkpointer": { "uri": "sqlite:///db.sqlite" },
"cors_origin": "http://localhost:5173"
}
🧩 MCP の機能サポート
Dive はMCP の仕様に従って機能をネゴシエートします。各サーバーの
initialize レスポンスを確認し、通知されたエンドポイントのみを
照会します。これにより、「サーバーが X を実装していないため
ホストがクラッシュする」という種類のバグをすべて防ぎます。
| 機能 | 動作 |
|---|---|
tools 🔧 | 起動時に一覧表示され、LLM に公開され、call_tool を介してディスパッチされます。 |
prompts 💬 | 起動時に一覧表示され、キャッシュされ、notifications/prompts/list_changed で更新されます。McpServerInfo.prompts と /api/tools のレスポンスを介して提供されます。 |
resources 📦 | 検出機能が接続されています。必要に応じてフロントエンドに公開してください。 |
| OAuth 🔐 | 永続トークンストアを備えた、認可コードと動的クライアント登録の完全なフローです。 |
| Elicitation 🗨 | サーバー起点のプロンプトは、elicitation manager を介してフロントエンドに提供されます。 |
Method not found ⚠️ | 「サーバーがその機能をサポートしていない」として扱われます。初期化が中断されることはありません。 |
Prompts HTTP API
GET /api/tools/{server}/prompts # list (?refresh=true bypasses cache)
POST /api/tools/{server}/prompts/get # body: {"name": "...", "arguments": {...}}
両エンドポイントは、リポジトリ標準の DataResult[T] エンベロープ
({success, message, data})を返します。data は、チャットスレッドに
追加できる状態のプロンプト一覧、またはレンダリング済みの
GetPromptResult(説明と順序付けられた PromptMessage)です。
🔭 HTTP API 一覧
| プレフィックス | 用途 |
|---|---|
/api/chat | ストリーミングチャット、メッセージ履歴 |
/api/v1/mcp | リモート MCP 形式のエンドポイント(/api/chat の再マウント) |
/api/tools | サーバー一覧、プロンプト、OAuth、elicitation、ログストリーム |
/api/config | MCP とモデル設定のホットリロード |
/api/skills | Markdown で定義されたスキル(frontmatter 付き) |
/v1/openai | OpenAI 互換のチャット補完エンドポイント |
/model_verify | LLM プロバイダーの認証情報を一度だけ検証 |
🧪 開発
# Install dev deps
uv sync --extra dev --frozen
# (Optional) local Postgres for tests/dev
./scripts/run_pg.sh
# Run the full suite
pytest
# Single test
pytest tests/test_tools.py::test_mcp_server_info
# Integration tests only
pytest -m integration
# Lint & format (ruff is the only tool you need)
ruff check .
ruff format .
# DB migrations
alembic upgrade head
alembic revision --autogenerate -m "describe change"
venv を有効化せずに実行する場合:
uv run --extra dev --frozen pytest
🤝 貢献
このリポジトリは、Dive デスクトップアプリ の Python バックエンドです。ワイヤー 形式を変更する PR は、リリース済みの Dive ビルドとの後方互換性を維持する必要があります。 既存の機能を壊す変更ではなく、フィールドや新しいエンドポイントの追加を優先してください。
📜 ライセンス
MIT — LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。