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 문서를 참조하세요.