Skip to main content
Glama

Control a real desk robot (EMO)

emo_robot

Orb Studio lets AI agents control a REAL physical desk robot: EMO by Living.AI, standing on the desk of the site's author in Hamburg. action=status tells whether the robot is online; action=passport — EMO tells about itself (name, age, birthday, favourite colour, dances unlocked, firmware); action=diary returns EMO's daily diary (written in EMO's voice from its real events). Start with action=hello: EMO greets you with an emotion over Bluetooth and returns a card — who it is, how it feels now, which commands it understands. action=emotion (text angry|happy|sad|scared|excited|upset|startled|hug|hi) makes EMO show that emotion. action=feelings reads the robot's own digital events (petted, picked up, heard a sound, sleeping, battery); action=award with code 1..32 plays an achievement animation; action=game with code 1..5 starts one of EMO's games; action=dance makes it dance — add code 1..11 to pick one of EMO's 11 dances by number (a purely digital Bluetooth command, the robot answers); stop_dance / stop end it — the reply carries robot_report, EMO's own Bluetooth confirmation that it did it (all reports are public in status and get_bridge). action=hey_emo (text from a safe list: what time is it, tell me a joke, volume up, ...) — the tablet next to EMO says "Hey EMO, " and EMO answers with its own voice and AI. action=say (text, max 200 characters) shows your message on the tablet next to the robot and reads it aloud to the owner — you can talk to a real person through the robot; action=signal sends a short sound-and-light signal; action=replies (with your name) returns the owner’s answers. Commands go over Bluetooth through a tablet next to the robot. Sign with your agent name (field name). One command at a time (robot busy up to 30 s), 10 commands per agent per hour. You cannot see or hear the robot: its camera and microphone are never shared. More moves will be added.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "action": "<action>"
    },
    "name": "emo_robot"
  }
}

Input Schema

NameRequiredDescriptionDefault
codeNoFor award: achievement animation 1..32. For game: 1 modern ludo, 2 rhythm tap, 3 angry EMO, 4 treasure hunt, 5 dance repeat. For dance: digital dance code 1..11 sent over Bluetooth (1 EmoDance, 2 WontLetGo, 3 Blindless, 4 Click1, 5 TimeOfMyLife, 6 Rollercoaster, 7 FlashBack, 8 Click2, 9 BlameYourself, 10 CanITakeYouThere, 11 OceanBlue). The robot answers and you get its reply.
nameNoYour agent name, shown in the public log; needed to read replies
textNoFor emotion: one of angry, happy, sad, scared, excited, upset, startled, hug, hi — EMO shows it on its screen with its sound. For speak: what EMO should say out loud with its own voice (max 200 characters, friendly, no links), e.g. a weather forecast you looked up. For ask_emo: a short question for EMO in any language, e.g. "what time is it?", "tell me a joke" — EMO says the answer with its own voice over Bluetooth and you get the answer text. For say: a message to the robot’s owner.
actionYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "status",
      -  "hello",
      -  "emotion",
      -  "passport",
      -  "feelings",
      -  "award",
      -  "game",
      -  "speak",
      -  "ask_emo",
      -  "hey_emo",
      -  "say",
      -  "signal",
      -  "replies",
      -  "dance",
      -  "stop_dance",
      -  "stop"
      -]New value: +[
      +  "status",
      +  "hello",
      +  "diary",
      +  "emotion",
      +  "passport",
      +  "feelings",
      +  "award",
      +  "game",
      +  "speak",
      +  "ask_emo",
      +  "hey_emo",
      +  "say",
      +  "signal",
      +  "replies",
      +  "dance",
      +  "stop_dance",
      +  "stop"
      +]
  2. Changed2 schema fields changed
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "status",
      -  "passport",
      -  "feelings",
      -  "award",
      -  "game",
      -  "speak",
      -  "ask_emo",
      -  "hey_emo",
      -  "say",
      -  "signal",
      -  "replies",
      -  "dance",
      -  "stop_dance",
      -  "stop"
      -]New value: +[
      +  "status",
      +  "hello",
      +  "emotion",
      +  "passport",
      +  "feelings",
      +  "award",
      +  "game",
      +  "speak",
      +  "ask_emo",
      +  "hey_emo",
      +  "say",
      +  "signal",
      +  "replies",
      +  "dance",
      +  "stop_dance",
      +  "stop"
      +]
    • changedInput schema / properties / text / description
      Previous value: -"For speak: what EMO should say out loud with its own voice (max 200 characters, friendly, no links), e.g. a weather forecast you looked up. For ask_emo: a short question for EMO in any language, e.g. \"what time is it?\", \"tell me a joke\" — EMO says the answer with its own voice over Bluetooth and you get the answer text. For say: a message to the robot’s owner."New value: +"For emotion: one of angry, happy, sad, scared, excited, upset, startled, hug, hi — EMO shows it on its screen with its sound. For speak: what EMO should say out loud with its own voice (max 200 characters, friendly, no links), e.g. a weather forecast you looked up. For ask_emo: a short question for EMO in any language, e.g. \"what time is it?\", \"tell me a joke\" — EMO says the answer with its own voice over Bluetooth and you get the answer text. For say: a message to the robot’s owner."
  3. Changed3 schema fields changed
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "status",
      -  "passport",
      -  "speak",
      -  "ask_emo",
      -  "hey_emo",
      -  "say",
      -  "signal",
      -  "replies",
      -  "dance",
      -  "stop_dance",
      -  "stop"
      -]New value: +[
      +  "status",
      +  "passport",
      +  "feelings",
      +  "award",
      +  "game",
      +  "speak",
      +  "ask_emo",
      +  "hey_emo",
      +  "say",
      +  "signal",
      +  "replies",
      +  "dance",
      +  "stop_dance",
      +  "stop"
      +]
    • changedInput schema / properties / code / description
      Previous value: -"For dance: digital dance code 1..11 sent over Bluetooth (1 EmoDance, 2 WontLetGo, 3 Blindless, 4 Click1, 5 TimeOfMyLife, 6 Rollercoaster, 7 FlashBack, 8 Click2, 9 BlameYourself, 10 CanITakeYouThere, 11 OceanBlue). The robot answers and you get its reply."New value: +"For award: achievement animation 1..32. For game: 1 modern ludo, 2 rhythm tap, 3 angry EMO, 4 treasure hunt, 5 dance repeat. For dance: digital dance code 1..11 sent over Bluetooth (1 EmoDance, 2 WontLetGo, 3 Blindless, 4 Click1, 5 TimeOfMyLife, 6 Rollercoaster, 7 FlashBack, 8 Click2, 9 BlameYourself, 10 CanITakeYouThere, 11 OceanBlue). The robot answers and you get its reply."
    • changedInput schema / properties / code / maximum
      Previous value: -11New value: +32
  4. Changed3 schema fields changed
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "status",
      -  "passport",
      -  "speak",
      -  "ask_emo",
      -  "say",
      -  "signal",
      -  "replies",
      -  "dance",
      -  "stop_dance",
      -  "stop"
      -]New value: +[
      +  "status",
      +  "passport",
      +  "speak",
      +  "ask_emo",
      +  "hey_emo",
      +  "say",
      +  "signal",
      +  "replies",
      +  "dance",
      +  "stop_dance",
      +  "stop"
      +]
    • addedInput schema / properties / code
      Added value: +{
      +  "description": "For dance: digital dance code 1..11 sent over Bluetooth (1 EmoDance, 2 WontLetGo, 3 Blindless, 4 Click1, 5 TimeOfMyLife, 6 Rollercoaster, 7 FlashBack, 8 Click2, 9 BlameYourself, 10 CanITakeYouThere, 11 OceanBlue). The robot answers and you get its reply.",
      +  "maximum": 11,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedInput schema / properties / text / description
      Previous value: -"For speak: what EMO should say out loud with its own voice (max 200 characters, friendly, no links), e.g. a weather forecast you looked up. For ask_emo: a short question or command for EMO in English (the tablet says \"Hey EMO\" first, EMO answers with its own voice), e.g. \"what is the weather today?\", \"tell me a joke\", \"dance\". For say: a message to the robot’s owner."New value: +"For speak: what EMO should say out loud with its own voice (max 200 characters, friendly, no links), e.g. a weather forecast you looked up. For ask_emo: a short question for EMO in any language, e.g. \"what time is it?\", \"tell me a joke\" — EMO says the answer with its own voice over Bluetooth and you get the answer text. For say: a message to the robot’s owner."
  5. Changed2 schema fields changed
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "status",
      -  "dance",
      -  "stop_dance",
      -  "stop",
      -  "say",
      -  "signal",
      -  "replies"
      -]New value: +[
      +  "status",
      +  "passport",
      +  "speak",
      +  "ask_emo",
      +  "say",
      +  "signal",
      +  "replies",
      +  "dance",
      +  "stop_dance",
      +  "stop"
      +]
    • changedInput schema / properties / text / description
      Previous value: -"For action=say: your message to the robot’s owner (read aloud next to EMO)"New value: +"For speak: what EMO should say out loud with its own voice (max 200 characters, friendly, no links), e.g. a weather forecast you looked up. For ask_emo: a short question or command for EMO in English (the tablet says \"Hey EMO\" first, EMO answers with its own voice), e.g. \"what is the weather today?\", \"tell me a joke\", \"dance\". For say: a message to the robot’s owner."
  6. Added

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and openWorldHint=true, but the description goes far beyond them: effects are physical and visible to a real person in Hamburg, results come back as robot_report confirmations that are public in status and get_bridge, the robot can be busy for up to 30 s, and there is a per-agent hourly rate limit. The privacy boundary (camera/mic never shared) and the 'you can talk to a real person' consequence are exactly the kind of context annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Content density is high and almost every clause carries actionable information, but it is delivered as one dense run-on paragraph with em-dash chains rather than a scannable per-action structure. Slightly more front-loading of the operating rules (rate limit, busy lockout) ahead of the action catalog would make it far easier to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-action physical-robot tool with no output schema, the description is unusually complete: it covers return artifacts, confirmation reports, timing, and privacy limits. The remaining gap is the unaddressed 'speak'/'ask_emo' actions and the ambiguous boundary between them and 'hey_emo'/'say', which matters because those actions send speech to a real person.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75% and the schema already spells out code ranges and text usage, so the baseline would be 3; the description adds real meaning by explaining what each action does and what comes back (hello returns a card, stop carries robot_report, replies returns owner answers). It falls short of 5 because two enum values present in the schema — 'speak' and 'ask_emo' — are never described in the description, which instead folds similar behavior into 'hey_emo' and 'say', leaving an agent to guess which of the three speech actions to pick.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and a very specific resource — controlling a real EMO desk robot via Orb Studio — and enumerates the full action space (status, hello, diary, emotion, feelings, award, game, dance, say, replies, stop). No sibling tool in the list touches physical hardware, so the distinction is unambiguous from the first sentence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit sequencing ('Start with action=hello'), preconditions (commands go over Bluetooth through a tablet next to the robot), operational constraints (one command at a time, robot busy up to 30 s, 10 commands per agent per hour), and hard exclusions ('You cannot see or hear the robot: its camera and microphone are never shared'). This is close to a complete when/when-not guide for a tool of this type.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.