MCP 보안 및 권한 부여
MCP은 기능이 설명되고 호출되는 방식을 표준화합니다. 이는 에이전트가 어떤 기능을 받아야 하는지, 또는 사용자가 어떤 부작용에 승인했는지를 결정하지 않습니다.
네 가지 별개의 결정
- 연결 인증 — 이 클라이언트가 이 서버에 연결해도 되는가?
- 기능 가시성 — 모델이 어떤 도구와 리소스를 볼 수 있는가?
- 실행 권한 부여 — 이 신원이 지금 이 리소스에 대해 이 특정 작업을 수행해도 되는가?
- 사람의 승인 — 결과에 중대한 영향을 미치는 작업에 대해 사람이 정확한 입력과 효과를 확인해야 하는가?
이러한 결정을 autoApprove 구성 목록으로 하나로 합치지 마십시오.
로컬 stdio 서버
로컬 자식 프로세스는 애플리케이션 호스트 내부에서 강력한 위치를 상속합니다.
- 절대 경로의 검토된 실행 파일 경로를 사용하십시오.
- 패키지와 바이너리 버전을 고정하고,
latest태그는 피하십시오. - 필요한 환경 변수만 전달하십시오.
- 명령줄 인수에 비밀 정보를 넣지 마십시오.
- 파일 시스템 루트와 작업 디렉터리를 제한하십시오.
- 서버가 신뢰할 수 없는 입력을 처리할 때는 OS 샌드박스 프로필을 적용하십시오.
- 서버 설명, 리소스, 결과를 신뢰할 수 없는 콘텐츠로 취급하십시오.
JSON-loading 및 runtime add/update 경로는 서버 ID를 검증합니다.
McpServerManager은 구성된 명령을 샌드박스화하지 않습니다.
원격 Streamable HTTP
McpHttpClientBuilder은 다음을 적용할 수 있습니다.
- bearer token;
- 호출자가 선택한 API-key 헤더;
- 임의의 검토된 헤더;
- 고정된 OAuth 2.0 client-credentials token 획득;
- 요청 시간 제한; 그리고
- 만료된 세션 응답 이후 한 번의 bounded session 재초기화.
OAuth2Config은 완전한 MCP 권한 부여 흐름이 아닙니다. 이는 보호된 리소스 메타데이터 검색, 권한 부여 서버 검색, 브라우저 권한 부여, PKCE, 또는 리소스 식별자 협상을 수행하지 않습니다. 배포에 해당 흐름이 필요할 때는 rmcp의 권한 부여 APIs 또는 identity component를 사용하십시오.
느린 권한 부여 서버나 응답하지 않는 권한 부여 서버가 연결 설정을 멈추게 하지 않도록 토큰 요청을 제한하고, 클라이언트가 client secret을 절대 되돌려 보내지 않는다는 점에 유의하십시오 — token-endpoint 오류 본문은 로그에 도달하기 전에 redacted됩니다:
use adk_tool::mcp::OAuth2Config;
use std::time::Duration;
let auth = OAuth2Config::new(client_id, token_url)
.with_secret(client_secret)
.with_scopes(vec!["mcp.read".into(), "mcp.invoke".into()])
.with_timeout(Duration::from_secs(10)); // token request timeout
기본 token-request 시간 제한은 30초입니다.
도구 노출 및 실행
with_tools 또는 with_filter을 사용하여 불필요한 기능이 model request에 포함되지 않도록 하십시오. 그런 다음 실행 시점에 ADK-Rust 도구 권한 부여와 확인을 적용하십시오.
결과가 중요한 도구의 경우:
- 사람에게 최종적으로 해결된 인수를 보여주십시오.
- 한 번만 허용과 지속 정책을 구분하십시오.
- 승인을 정확한 function-call ID에 묶어 두십시오.
- 가능한 경우 외부 쓰기를 idempotent하게 만드십시오.
- 승인 결정과 도구 결과를 함께 저장하십시오.
- 반환된 증거를 확인하지 않고 성공한 protocol response를 성공한 비즈니스 결과의 증거로 간주하지 마십시오.
정보 요청
Elicitation은 애플리케이션이 따라야 하는 지시가 아니라, 서버가 추가 정보를 요청하는 것입니다. 메시지, URL, 요청된 필드, 메타데이터를 검토하십시오. 지원되지 않거나 예상되지 않은 요청은 거부하십시오. 허용된 모든 form value는 사용하기 전에 검증하십시오.
로깅 및 비밀 정보
environment variables, authorization headers, API keys, elicitation answers, 민감한 도구 인수를 redacted하십시오. 대신 server ID, tool name, task ID, status, timing, approval, 그리고 bounded result summary를 기록하십시오.