MCP サーバーを公開する

ADK-Rust は McpToolset を通じて MCP サーバーを利用しますが、サーバー側のすべての SDK API をラップするわけではありません。サーバーの作成者は、クライアントとサーバーのプロトコル型の整合性を保つため、adk_tool::mcp::rmcp によって再エクスポートされた公式の rmcp SDK を使用します。

スタンドアロンのサーバークレートでは、同じ rmcp のリリースに直接依存する方法も適切です。

[dependencies]
rmcp = { version = "2.2", features = ["transport-io", "schemars"] }
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }

最小限の stdio サーバー

use rmcp::{
    ServerHandler,
    handler::server::{router::tool::ToolRouter, wrapper::Parameters},
    model::{ServerCapabilities, ServerInfo},
    schemars, tool, tool_handler, tool_router,
};
use serde::Deserialize;

#[derive(Debug, Deserialize, schemars::JsonSchema)]
struct LookupInput {
    order_id: String,
}

#[derive(Debug, Clone)]
struct OrderServer {
    tool_router: ToolRouter<Self>,
}

#[tool_router]
impl OrderServer {
    #[tool(description = "Read one order by its public order ID")]
    async fn read_order(
        &self,
        Parameters(input): Parameters<LookupInput>,
    ) -> String {
        format!("Order {} is ready for investigation", input.order_id)
    }
}

#[tool_handler]
impl ServerHandler for OrderServer {
    fn get_info(&self) -> ServerInfo {
        ServerInfo::new(ServerCapabilities::builder().enable_tools().build())
            .with_instructions("Read-only order investigation tools")
    }
}

let service = rmcp::ServiceExt::serve(
    OrderServer { tool_router: OrderServer::tool_router() },
    rmcp::transport::io::stdio(),
).await?;
service.waiting().await?;

決定論的な examples/mcp_manager フィクスチャではこのサーバー構成を使用し、MCP 検証ゲートによってコンパイルおよび実行されます。

正確な機能を公開する

ハンドラーが実装している機能のみを公開してください。クライアントは初期化レスポンスを使用して、リソース、プロンプト、補完、エリシテーション、サブスクリプション、またはタスクを呼び出してよいかどうかを判断します。

タスクに対応するツールでは、ツールのタスク対応を宣言し、tasks.requests.tools.call を公開してください。サーバーがタスク対応をネゴシエートしていない場合、クライアントはタスクを必須とするツールを拒否することがあります。

ツールはセキュリティ境界である

説明と JSON スキーマは、モデルが呼び出しを組み立てるのに役立ちますが、入力検証や認可を行うものではありません。サーバーは次のことを行う必要があります。

  • モデルとは独立してすべての入力を検証する。
  • サーバー境界でアイデンティティとテナントのスコープを解決する。
  • 特定のアクションとリソースを認可する。
  • 読み取り操作と結果を伴う書き込みを分離する。
  • シークレットや上限のないデータを返さない。
  • 副作用に対する再試行と冪等性を明示する。
  • 結果を説明するのに十分な証拠を記録する。

トランスポートを選択する

クライアントがローカルの子プロセスを所有する場合は stdio を使用します。サーバーが独立してデプロイされたサービスである場合は、Streamable HTTP を使用します。リモートデプロイメントでは、認証、リクエスト制限、セッションポリシー、可観測性、アプリケーションレベルのヘルスプローブも必要です。

サーバールーター、リソース、プロンプト、カスタムハンドラー、トランスポート、認可、および拡張 APIs については、公式の rmcp ドキュメント を参照してください。

MCP サーバーを公開する - ADK-Rust ドキュメント | ADK-Rust