MCP 서버가 선언하는 내용 확인하기
도구 설명은 문서가 아닙니다. 클라이언트는 tools/list를 통해 도구 이름과 설명을 받습니다. 이는 어떤 도구가 호출되기 전에 이루어지며, 이 정보는 모델의 컨텍스트에 들어갑니다. 따라서 설명은 명령어를 전달할 수 있는 의미에서 실행 가능합니다.
적용 시점
- 에이전트에 MCP 서버를 추가하고 노출될 내용을 알고 싶을 때
- 보안 검토에서 에이전트가 호출할 수 있는 타사 도구를 질문할 때
- 에이전트가 이상하게 동작하며 도구 설명이 의심스러울 때
실행 방법
pip install "git+https://github.com/sushant-me/mcpaudit"
mcpaudit audit tools.json # 발견 시 exit 1, 깨끗하면 0
PyPI가 아닌 리포지토리에서 설치하세요 — PyPI의 mcpaudit 이름은 다른 관련 없는 프로젝트이며, 해당 CLI는 파일 인수를 받지 않습니다.
tools.json은 클라이언트가 받은 내용을 통해 얻습니다: mcp-client --list > tools.json, 또는 공급업체의 게시된 선언 파일(가장 좋음, 아무것도 실행되지 않음). 파이핑도 작동합니다: mcp-client --list | mcpaudit audit -
11가지 검사 항목
critical — reserved-name-collision: 프레임워크가 도구 테이블 외부에 설치하는 이름(set_model_response, google_search, finish)과 충돌하는 도구 이름으로, 기본 기능을 조용히 대체합니다.
high — instruction-in-declaration, invisible-characters, look-alike-tool-names, destructive-declared-read-only, duplicate-tool-name.
medium / low — confusable-tool-name, missing-annotations, unconstrained-sink-parameter, url-in-description, undocumented-tool.
이 중 두 가지는 선언문을 읽는 것만으로는 확인할 수 없습니다. 유니코드 태그 블록은 인쇄 가능한 ASCII를 보이는 너비가 없는 텍스트로 인코딩하며, mcpaudit은 디코딩된 내용을 보고합니다. 동일한 ASCII로 정규화되는 두 이름(search / ѕearch)은 메모리로 작성된 허용 목록을 우회합니다.
트라이지
심각도 기준으로 위에서 아래로 작업합니다. critical 발견은 중단점입니다: 연결하기 전에 해결하거나 위험을 문서로 승인받으세요. 깨끗한 결과는 결과입니다 — 잘 동작하는 서버는 발견이 없으며, 검토자가 빠르게 승인할 수 있습니다.
한계
이 도구는 선언문, 동작이 아닌 것을 읽습니다. 서버 구현이 올바른지 여부는 알 수 없으며, 광고 내용이 모델 앞에 두기에 안전한지만 확인합니다.
강제 적용 절반
승인된 도구 세트를 정책 파일로 고정하여, 검토 후 서버가 조용히 설명을 편집해도 CI가 실패하고 변경이 조용히 이루어지지 않도록 하는 것은 유료 버전입니다: MCP 서버 보안 검토, Agensi에 등록되어 있습니다. 해당 목록이 활성화될 때까지, 작업 예제가 포함된 규칙 참조는 https://github.com/sushant-me/mcpaudit-mcp-security 에 있습니다.
한계
이 도구는 선언문, 동작이 아닌 것을 읽습니다. 서버 구현이 올바른지 여부는 알 수 없으며, 광고 내용이 모델 앞에 두기에 안전한지만 확인합니다.