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 ドキュメント を参照してください。