mcpField
D
Dive MCP Host

Dive MCP Host

github.com/openagentplatformデスクトップアプリ4815 週間前に更新

Dive MCP Host について

Dive MCP Host は、Model Context Protocol 向けの Python 製ホストランタイムです。複数の LLM とトランスポートに対応し、複数の MCP サーバーを一つのエージェントバックエンドにまとめます。Dive デスクトップアプリの中核であり、単独のサービスやライブラリとしても利用できます。

主な機能

  1. 01LangChain 経由の複数 LLM プロバイダー対応
  2. 02stdio、SSE、ストリーミング HTTP、WebSocket のサポート
  3. 03ツールとプロンプトの機能ネゴシエーション
  4. 04OAuth と elicitation のフロー
  5. 05SQLite や Postgres によるスレッドの永続化

活用シーン

  1. 01Dive デスクトップアプリのバックエンドとしての利用
  2. 02Python アプリケーションへの MCP ホストの組み込み
  3. 03コマンドラインや HTTP API からのチャットセッションの実行

MCP 対応

MCP クライアントのホストとして動作し、mcp_config.json に定義された MCP サーバーを接続します。各サーバーが公開する機能のみを照会し、ツールとプロンプトを一覧化して呼び出します。

詳細

🌊 Dive MCP Host

Model Context Protocol 向けの本番環境対応 Python ホスト — 複数の LLM、複数のトランスポート、仕様準拠。

Python 3.12+ License: MIT MCP Spec LangGraph

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/configMCP とモデル設定のホットリロード
/api/skillsMarkdown で定義されたスキル(frontmatter 付き)
/v1/openaiOpenAI 互換のチャット補完エンドポイント
/model_verifyLLM プロバイダーの認証情報を一度だけ検証

🧪 開発

# 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 を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。