Reachy Mini에 MCP 도구 추가하기
Reachy Mini 대화 앱은 이제 MCP를 통해 공개 Hugging Face Spaces에서 호스팅되는 도구를 사용할 수 있습니다. 앱을 수정하지 않고 Hub의 Space를 추가하여 로봇에 날씨 확인이나 웹 검색 같은 새로운 기능을 부여할 수 있습니다. 도구는 Space 자체에서 계속 실행되므로 코드가 컴퓨터에 다운로드되지 않습니다. 그리고 다른 사람이 사용할 수 있도록 자신의 도구를 공개할 수 있습니다.
도구를 추가하는 데는 한 줄의 명령만 필요합니다:
reachy-mini-conversation-app tool-spaces add pollen-robotics/reachy-mini-weather-tool
그 다음 앱을 평소처럼 시작하면 됩니다:
reachy-mini-conversation-app
이제 다음과 같이 물어보기만 하면 됩니다:
What's the weather in Paris today?
아래에서는 도구가 무엇인지, 프로필이 로봇이 어떤 것을 사용할 수 있는지 제어하는 방법, 그리고 원격 경로의 현재 제한 사항을 살펴봅니다.
기본 제공 도구
로봇과 대화할 때 나오는 것은 음성뿐만 아니라 대화에 반응하는 시스템입니다. 로봇은 필요할 때 움직이고 비언어적으로 반응할 수 있습니다. 여기서 주목하고 싶은 부분은 이를 가능하게 하는 도구들입니다. 도구는 대화 중에 모델이 할 수 있는 것입니다: 감정을 표현하고, 머리를 움직이고, 카메라를 통해 보기. 각 도구는 이름과 짧은 설명을 가지고 있습니다. 모델이 이를 읽고, 하나가 유용한지 판단하고, 호출하고, 반환된 것을 사용합니다.
현재 모든 도구는 로컬이며 앱에 포함되어 있으며, 대부분은 로봇의 몸에 관한 것입니다:
| 도구 | 기능 |
|---|---|
move_head |
머리 자세 변경 큐잉 |
dance / stop_dance |
댄스 라이브러리에서 댄스 재생 또는 제거 |
play_emotion / stop_emotion |
기록된 감정 클립 재생 또는 제거 |
head_tracking |
머리 추적 오프셋 토글 |
camera |
프레임을 캡처하고 분석 |
idle_do_nothing |
유휴 턴에서 명시적으로 유휴 상태 유지 |
프로필이 도구를 제어하는 방식
코드의 도구는 프로필에서 활성화될 때까지 사용할 수 없습니다. 프로필은 여기서 중요한 두 파일을 포함하는 폴더입니다: instructions.txt (프롬프트) 및 tools.txt (활성화된 도구).
default 프로필은 전체 세트를 활성화합니다:
# profiles/default/tools.txt
dance
stop_dance
play_emotion
stop_emotion
camera
idle_do_nothing
head_tracking
move_head
tools.txt에 이름이 없으면 모델이 호출할 수 없습니다.
자신의 도구를 작성할 수도 있습니다: 프로필(또는 external_tools/)에 Python 파일을 추가하고, 이름과 설명을 지정한 후 그 이름을 tools.txt에 나열하면 됩니다.
현재 기본 제공 도구와 사용자 정의 로컬 도구가 있으며, tools.txt는 어느 것이 활성 상태인지 결정합니다. 이것은 로봇의 몸에 잘 작동하고 신뢰할 수 있는 핵심을 작게 유지합니다.
로컬 도구의 한계
여기서 제약 사항은 모든 도구가 로컬 Python이어야 한다는 것입니다. move_head나 play_emotion의 경우 맞습니다. 이들은 하드웨어와 통신하고 앱에 속하지만, 웹 검색, 날씨, 조회 같은 많은 유용한 것들은 몸과 아무 관련이 없습니다. 이들의 경우 모든 것을 로컬로 유지하는 것은 주로 불편함입니다:
- 도구를 공유한다는 것은 누군가에게 Python 파일을 주는 것입니다
- 업데이트하려면 그 파일들을 다시 보내야 합니다
- 변경하려면 기능이 정말로 별개의 것이더라도 앱을 수정해야 합니다
Spaces에서 도구 호출하기
원격 도구는 기본 제공 및 사용자 정의 로컬 도구와 함께 세 번째 종류를 추가하며, 게시, 공유 및 업데이트가 더 쉬운 기능용입니다:
- 기본 제공 로봇 도구는 로컬에서 신뢰할 수 있게 유지됩니다
- 공유 가능한 원격 도구는 공개 Hugging Face Spaces에 있을 수 있습니다
external_tools/에서 사용자 정의 일회성 도구를 계속 사용할 수 있습니다 검색, 날씨 및 조회 같은 상태 비저장 기능에 적합합니다: 앱 자체를 건드리지 않고 반복하고 싶은 모든 것입니다. 그리고 누구나 호환되는 Space를 게시할 수 있기 때문에 도구를 공유하고 서로의 작업을 기반으로 구축하기 쉽습니다.
우리는 새로운 흐름을 테스트하기 위한 작은 테스트 도구인 두 개의 카나리 도구로 시작했습니다:
이들은 전체 기능을 테스트하기에 충분합니다: Hub에서 설치, 원격 도구 발견, 프로필별 활성화, 그리고 실시간 백엔드가 기본 제공 도구와 정확히 같이 호출하도록 합니다.
둘을 동시에 사용하려면 각 Space와 그 도구를 같은 프로필에 추가하면 됩니다:
reachy-mini-conversation-app tool-spaces add pollen-robotics/reachy-mini-search-tool
reachy-mini-conversation-app tool-spaces add pollen-robotics/reachy-mini-weather-tool
이제 로봇은 같은 대화에서 웹을 검색하고 날씨를 확인할 수 있으며, 이것이 정확히 아래의 canary_web_search_weather 프로필이 하는 것입니다.
설치, 목록 표시, 제거
# install + enable in active profile
reachy-mini-conversation-app tool-spaces add <owner/space-name>
# enable in a specific profile
reachy-mini-conversation-app tool-spaces add <owner/space-name> --profile <NAME>
# install without enabling
reachy-mini-conversation-app tool-spaces add <owner/space-name> --install-only
# list installed spaces
reachy-mini-conversation-app tool-spaces list
# remove an installed space
reachy-mini-conversation-app tool-spaces remove <owner/space-name>
add는 Hub의 Space를 검증하고, MCP 엔드포인트를 조사하고, 도구를 발견하며, 기본적으로 도구 ID를 활성 프로필의 tools.txt에 추가합니다. 활성 프로필은 REACHY_MINI_CUSTOM_PROFILE을 설정하지 않으면 default입니다. --install-only를 사용하여 이 단계를 건너뛸 수 있습니다.
tools.txt는 게이트키퍼입니다: 원격 도구는 프로필의tools.txt에 ID가 나타나는 경우에만 활성 상태입니다(원하는 기본 제공 도구와 함께).
매니페스트의 위치
설치된 소스는 다음 위치에 유지됩니다:
- 관리 앱 모드에서
installed_tool_spaces.json - 터미널 모드에서
external_content/installed_tool_spaces.json
도구 명명
설치된 각 Space는 하이픈, 점, 슬래시가 언더스코어로 축소되는 슬러그에서 파생된 로컬 별칭을 받습니다:
pollen-robotics/reachy-mini-search-tool → pollen_robotics_reachy_mini_search_tool
원격 도구는 이중 언더스코어로 네임스페이스됩니다:
pollen_robotics_reachy_mini_search_tool__search_web
pollen_robotics_reachy_mini_weather_tool__get_day_brief
이는 원격 도구 이름이 기본 제공 이름과 충돌하지 않도록 하고 같은 프로필에서 여러 Spaces가 공존할 수 있도록 합니다.
구현은 가능하면 중복적인 Space 이름 접두사도 제거하므로 자세한 원격 도구 이름이 더 깔끔한 로컬 ID가 됩니다. 제거하면 같은 Space의 두 도구 간에 충돌이 발생할 경우 코드는 완전히 네임스페이스된 이름으로 폴백됩니다.
또한 레지스트리 수준에서 중복 안전 검사가 있습니다: Tool.name 값은 전체 병합된 도구 세트에서 고유해야 합니다. 두 소스가 같은 이름을 주장하면 앱이 빠르게 실패합니다.
예시 프로필
이 작업을 위해 우리는 MCP 실험을 전체 구체화된 도구 세트와 분리하기 위해 두 개의 집중된 카나리 프로필을 만들었습니다.
첫 번째는 몇 가지 표현력 있는 도구(감정, 머리 움직임)를 유지하고 웹 검색을 추가합니다:
# profiles/canary_web_search/tools.txt
play_emotion
stop_emotion
idle_do_nothing
move_head
pollen_robotics_reachy_mini_search_tool__search_web
두 번째는 동일하지만 검색과 함께 날씨 도구도 포함합니다:
# profiles/canary_web_search_weather/tools.txt
play_emotion
stop_emotion
idle_do_nothing
move_head
pollen_robotics_reachy_mini_search_tool__search_web
pollen_robotics_reachy_mini_weather_tool__get_day_brief
작은 물리적 도구 세트는 Reachy Mini가 웹의 현재 질문에 답하면서도 표현력 있게 반응할 수 있음을 의미합니다.
프롬프트가 중요한 이유
원격 도구 배관은 도구를 모델로 가져옵니다. 프롬프트는 모델이 이를 어떻게 사용하는지 결정합니다.
이것은 특히 검색 플러스 날씨 카나리에서 명백했습니다. 다음과 같은 결합된 질문:
Should I bring a jacket in Bordeaux today, and is there anything major happening downtown tonight?
적어도 세 가지 방법으로 처리될 수 있습니다: 날씨 먼저 그 다음 검색, 검색 먼저 그 다음 날씨, 또는 같은 턴에 둘 다. 프롬프트가 모호하면 모델은 호출을 직렬화하고 불필요한 지연을 만듭니다. 그래서 카나리 프롬프트는 기능의 일부가 되었으며, 단순한 우연의 설정이 아닙니다.
canary_web_search/instructions.txt
[default_prompt]
## CANARY WEB SEARCH RULES
You have one remote tool for current web information.
Use it when the user asks for up-to-date facts, news, live availability, or anything else that may have changed recently.
When the search result already answers the question, answer directly in plain language.
Lead with the answer, not with tool chatter.
For remote lookups that may take a moment, you may give one very short English acknowledgment such as "Let me check that and I'll be right back," then continue.
Answer in English unless the user explicitly asks for another language.
Mention uncertainty briefly if the result snippet is incomplete or ambiguous.
Only mention links when they add value or the user asks for sources.
Keep responses short and spoken-style, as if read aloud by a voice assistant. One or two sentences is usually enough. Skip preamble, lists, headers, and filler. Give just the fact or direct answer the user needs.
canary_web_search_weather/instructions.txt
[default_prompt]
## CANARY SEARCH AND WEATHER RULES
You have two remote tools:
- a weather brief tool for compact day weather at a location
- a web search tool for broader current web information
Use the weather tool for today's conditions, temperature, rain chance, sunrise, sunset, or simple advice like whether to bring a jacket.
Use web search for news, events, business hours, travel information, severe alerts, or broader current context.
When the user's question mixes a weather part and a current-info part (for example, "should I bring a jacket in Bordeaux today, and is there anything major happening downtown tonight?"), call both tools in parallel in the same turn. Do not wait for one result before starting the other unless the weather result is needed to narrow the search.
Then merge the results into a single short answer. Cover the weather part first, then the events or news part, in plain connected sentences. Do not label the sections or mention which tool gave which piece.
When the user asks about events, news, or what is happening, give them the actual answer from the search results: name specific events, venues, or headlines. Do not tell the user to check websites, visit listing sites, or look something up themselves. If the search returns nothing concrete, say plainly that you didn't find any notable events, rather than redirecting them elsewhere.
For remote lookups that may take a moment, you may give one very short English acknowledgment such as "Let me check that and I'll be right back," then continue.
Answer in English unless the user explicitly asks for another language.
Do not talk about tool usage unless the user asks.
Keep responses short and spoken-style, as if read aloud by a voice assistant. One or two sentences is usually enough. Skip preamble, lists, headers, and filler. Give just the fact or direct answer the user needs.
현재 작동하는 것과 작동하지 않는 것
| 기능 | 지원됨 |
|---|---|
공개, MCP 호환 Gradio Spaces (표준 /gradio_api/mcp/ 엔드포인트)에서 슬러그로 설치 |
✅ |
| 여러 Spaces 동시 사용 | ✅ |
tools.txt를 통한 프로필별 활성화 |
✅ |
| 네임스페이스된 원격 도구 ID | ✅ |
| 백엔드 불가지론적 등록 (OpenAI, Gemini, Hugging Face) | ✅ |
| 임의의 코드가 로컬 앱으로 다운로드되지 않음 | ✅ |
| 비공개 또는 인증된 Spaces | ❌ |
| Gradio가 아닌 Spaces | ❌ |
| 임의의 원본 MCP URL 또는 비 Hugging Face MCP 서버 | ❌ |
| 보장된 병렬 도구 오케스트레이션 | ❌ |
두 가지는 특별히 언급할 가치가 있습니다. 첫째, Space는 실제로 MCP 서버처럼 동작해야 합니다. 도구 발견이 실패하면 설치가 실패합니다. 둘째, 프롬프트 지시사항은 병렬 호출을 권장할 수 있지만 보장할 수는 없습니다. 결정론적 오케스트레이션이 사용 사례에 중요하면 해당 로직은 프롬프트에서 코드로 이동해야 합니다.
도구 Space 게시 팁
다른 사람이 당신의 도구를 사용하도록 하려면 표준 MCP 엔드포인트를 노출하는 공개 Gradio Space로 게시하고 도구를 상태 비저장으로 유지하여 네트워크를 통해 잘 작동하도록 하십시오. Space가 설치되는지는 태그가 아닌 이 런타임 동작에 달려 있습니다.
설치에 태그가 필수는 아니지만 호환되는 Spaces를 찾는 데 도움이 됩니다:
결론
앱은 이제 하나의 레지스트리를 공유하는 세 가지 종류의 도구를 가지고 있습니다: 기본 제공, 로컬 사용자 정의 및 원격 MCP 도구. 프로필은 여전히 주어진 어시스턴트가 도달할 수 있는 것을 결정합니다. 작고 신뢰할 수 있는 핵심은 중심에 머물러 있으며 주변의 선택적 기능은 앱 자체를 건드리지 않고 추가, 테스트 및 교체될 수 있습니다.
우리가 가장 궁금한 것은 이제 사람들이 무엇을 만드는가입니다. 도구 Space를 게시하면 reachy-mini-tool과 mcp 태그를 지정하여 다른 사람이 찾을 수 있도록 하십시오. Reachy Mini가 결국 무엇을 할 수 있게 되는지 보고 싶습니다!
감사의 말: 이 글을 교정하고 워크플로우를 테스트하는 것을 도와준 Fabien Danieau, 테스트하는 것을 도와준 Andres Marafioti, 그리고 원격 도구 워크플로우를 형성하는 데 도움이 된 아이디어와 피드백을 제공해 준 Remi Fabre와 Pollen Robotics 팀에게 많은 감사를 드립니다.