Module decorated with @skill. The decorator makes it an RPC method and publishes it as an MCP tool: the docstring and type annotations become the tool schema the LLM sees.
The contract
- Parameters must be JSON-serializable primitives (
str,int,float,bool,list,dict). - The docstring is the tool description. It is not documentation for humans; it is the only context the LLM has about when and how to call this skill. Write it the way you would brief an operator: what it does, when to use it, an example call.
- Return a string or an image. The return value goes into the agent’s conversation history and drives its next decision. “Done” is a bad return; “Moved 0.5 m forward, now facing the door” is a good one.
- Skills live in ordinary modules, so they can hold streams, state, and
Specreferences to other modules (a navigation skill holds a reference to the navigation module and callsset_goalon it).
From skill to tool: the two MCP modules
Every agentic blueprint includes both halves:McpServer(dimos/agents/mcp/mcp_server.py) discovers every@skillmethod across all deployed modules via RPC and serves them as MCP tools over HTTP on port9990. Any MCP-capable client can connect - the DimOS agent, the CLI, or an external tool like Claude Code.McpClient(dimos/agents/mcp/mcp_client.py) is the built-in LLM agent. At startup it callstools/liston the server and hands the tools to the model.
Drive skills without an LLM
Prove your stack works before involving a model. With any agentic blueprint running:--arg takes KEY=VALUE pairs and JSON-decodes the values, so lists and numbers work too.
If a skill misbehaves here, it will misbehave worse under an LLM. Debug at this layer first.
Built-in skills
The ground truth is alwaysdimos mcp list-tools on your running stack. The common ones on the Go2 agentic blueprint:
System prompts
The system prompt is robot policy, not boilerplate. The default Go2 prompt (dimos/agents/system_prompt.py) tells the agent what robot it controls, what its skills do, and how to behave with people around. If you add or remove skills, update the prompt to match - an agent prompted about skills that do not exist will hallucinate calls to them, and an agent not told about a new skill will underuse it.
Set it per-blueprint: McpClient.blueprint(system_prompt=...).
Next
- Tutorial: add your own skill - end to end, verified at each step
- Tutorial: drive the Go2 with language
