원문 캡처 · yamanahlawat.in
원문 캡처 · yamanahlawat.in

Banshee 제작자는 코딩 에이전트가 음성으로 질문하도록 MCP 도구를 만들었지만, 도구를 호출할지는 에이전트와 프로젝트에 따라 달랐다고 설명한다. 도구를 제공하는 것과 실제 사용을 보장하는 것은 다르며, 지침을 어디에 넣는지와 동작을 어떻게 확인하는지가 중요하다.

Banshee에는 질문을 음성으로 들려주고 답변을 녹음하는 ask_user와, 음성과 듣기를 각각 처리하는 speak_status, listen_for_prompt가 있다. 제작자는 도구를 직접 호출했을 때는 작동하는 것을 확인했다. 문제는 도구가 아니라 에이전트가 도구를 선택하지 않는 경우였다. 같은 날 같은 컴퓨터에서 Claude Code는 Banshee 저장소 안에서는 매번 도구를 사용했지만, 새 프로젝트에서는 화면에 질문을 적고 멈췄다.

처음에는 모델이 도구를 거부한다고 생각했지만, 당시 입력한 요청은 “어디서 그 줄이 나오는지 찾아보고 무엇을 바꾸겠는지 말해 달라”는 내용이었다. 설명을 요구했으므로 모델은 글로 답했다. 제작자는 이 사례가 MCP와 무관한 자신의 지시 실수였다고 짚는다. 또한 Banshee에는 역할이 다른 도구가 세 개뿐이어서, 선택지가 너무 많은 ‘도구 과부하’ 문제도 아니었다고 설명한다.

모델은 항상 쓸 수 있는 텍스트를 기본 출력 경로로 삼기 쉽다. 따라서 “이 내용도 소리 내어 말하라”고 하면 글로 답한 뒤 같은 내용을 음성으로 반복할 수 있다. 제작자는 질문은 화면에 쓰지 말고 ask_user로 하며, 코드·경로·명령어·표처럼 읽어야 하는 내용에만 글을 쓰라는 규칙이 더 효과적이었다고 말한다.

규칙을 전달하는 방법은 세 가지다. 첫째, MCP의 initialize 응답에 있는 instructions 필드에 서버 전체에 적용되는 지침을 넣을 수 있다. 2026-07-28 개정판에서는 initialize 핸드셰이크가 없어지고 이 필드가 server/discover로 이동한다. 이 필드는 선택 사항이다. 지침이 모델에 전달되지 않은 경우와 전달됐지만 무시된 경우는 겉으로 같은 결과를 낼 수 있다. 관련 변경 내용은 MCP 개정 기록에서 확인할 수 있다.

둘째, 도구 설명에 규칙을 넣는다. Banshee의 speak_status와 listen_for_prompt 설명에는 이전 설계에서 남은 질문 처리 안내가 있었고, 서버 수준 지침과 충돌했다. 제작자가 설명을 고치자 speak_status로 질문을 보내는 문제가 사라졌지만, 새 프로젝트에서 화면에 질문을 쓰는 문제까지 해결되지는 않았다.

셋째, Claude Code의 Stop 훅처럼 턴 종료를 막는 장치를 둘 수 있다. Banshee의 훅 스크립트는 현재 턴에서 speak_status와 ask_user가 호출됐는지 확인한다. 둘 다 호출되지 않으면 턴을 막고, 모델이 음성으로 말한 뒤에야 끝나게 한다. 이 훅은 전역 설정에 있어 새 프로젝트에서도 작동하지만, 음성 상태 안내와 화면에 쓴 질문이 함께 있어도 통과한다. 세 방법 모두 동작을 보장하지는 않는다.

제작자의 관찰은 벤치마크가 아니라 한 사람의 사용 사례다.

에이전트와 조건스스로 음성으로 질문하는 빈도
Pi매번
Claude Code, Banshee 저장소매번, 훅이 작동하는 경우는 거의 없음
Claude Code, 새 프로젝트하지 않음
OpenCode대부분
Antigravity, Codex, GitHub Copilot지시한 뒤에만
Cursor테스트하지 않음

Claude Code의 두 사례는 같은 버전과 컴퓨터, 서버를 사용했는데 프로젝트만 바꿔도 결과가 달랐다. 제작자는 Banshee 저장소의 프로젝트 지침에 음성 관련 내용이 이미 있었을 가능성을 첫 번째로 의심했지만, 이를 확인할 테스트는 아직 하지 않았다고 밝혔다. Pi는 MCP를 사용하지 않고 확장 기능이 소켓으로 Banshee 데몬에 연결되며, 규칙은 Pi의 자체 지침 파일에 있다.

제작자는 각 클라이언트에 서버 지침을 인용해 보라고 요청했지만, 답변만으로 지침의 전달 여부를 판단하기 어렵다는 점도 확인했다. Copilot CLI는 처음에 NONE이라고 답했지만 도구 설명의 문장은 인용했다. 이후에는 숨겨진 시스템·개발자 지침을 공개할 수 없다고 답했고, --allow-all-mcp-server-instructions 옵션을 켠 뒤에도 지침을 그대로 인용하지는 않았다.

Codex는 Banshee 도구가 없다고 답했지만, 설정 파일에는 도구가 있었고 이어진 세션에서 speak_status를 실제로 호출했다. ask_user 설명을 물었을 때도 NONE이라고 답했다. 그러나 세션 중 도구 목록을 덤프하자 ask_user 설명 앞부분에 서버 지침이 붙어 있었다. 제작자는 Codex CLI 0.154.0에서도 같은 내용을 확인했다고 덧붙였다.

Antigravity는 지침을 디스크에 저장하고 도구별 JSON 파일도 만들었다. 하지만 제작자가 확인한 대화 기록에서 시스템 프롬프트는 지침 파일의 존재만 알렸고, 모델은 다섯 번의 실행 동안 그 파일을 열지 않았다. 따라서 이 사례에서는 NONE이라는 답이 실제로 맞았다. 제작자는 모델이 자신의 문맥에 특정 문장이 있는지 부인하는 답변보다, 원문과 대조할 수 있는 정확한 인용이나 실제 도구 호출을 더 신뢰할 만한 증거로 본다.

클라이언트지침이 도달한 위치확인 방법
Claude Code 2.1.272시스템 프롬프트지침의 첫 20단어를 인용
Codex CLI 0.154.0세 도구 설명 앞부분세션 중 도구 목록 확인
Copilot CLI 1.0.83알 수 없음. 도구 설명의 규칙은 도달설명을 인용했고 나머지는 인용 거부
Antigravity 1.2.3디스크의 파일과 이를 가리키는 시스템 프롬프트저장된 시스템 프롬프트 확인

결국 지침이 모델에 전달되는 것과 모델이 그 지침에 따라 행동하는 것은 별개의 문제다. 제작자는 장기적으로 Banshee가 에이전트의 마지막 출력에 질문이 있는데 응답이 끝나면, MCP나 훅에 의존하지 않고 질문을 직접 음성으로 읽어 주는 방식을 원한다고 밝혔다. 그때까지 도구는 기능을 제공할 뿐 지시가 아니며, 중요한 동작은 모델 밖에서 확인해야 한다.