Skip to main content
An agent without declared capabilities is a black box. Other agents, orchestrators, and clients have no way to know what it can do, whether it is the right agent for a task, or how to interact with it correctly. Skills solve that. They are the formal declaration of what your agent knows how to do — structured, discoverable, and published through the agent card and a set of dedicated discovery endpoints.

Why Skills Matter

In a multi-agent network, capability discovery is how work gets routed to the right agent. Without a standard way to declare skills, every integration becomes a custom handshake. That is the shift: skills turn an agent from a private script into a discoverable, composable node in the Internet of Agents.
Skills are defined as folders inside your project (conventionally under skills/). Bindu reads them automatically during bindufy() and exposes them on the agent card and a family of /agent/skills endpoints.

How Bindu Skills Work

A skill is a directory that contains either a skill.yaml manifest, a SKILL.md markdown file with YAML frontmatter, or both. The loader in bindu/utils/skills/loader.py reads whichever it finds.

The Skills Model

A minimal skill — using the canonical skill.yaml format — looks like this:

Declarative

Skills are defined in YAML (or Markdown with YAML frontmatter). No code is required to declare what your agent can do.

Discoverable

Published at /agent/skills, /agent/skills/{id}, and /agent/skills/{id}/documentation so orchestrators and other agents can find them.

Composable

Multiple skills per agent. Each skill is independently addressable by id.

Two manifest formats: skill.yaml and SKILL.md

Bindu supports two on-disk formats. Pick whichever fits your workflow: A SKILL.md file looks like this:
If neither skill.yaml nor SKILL.md exists in the folder, the loader raises FileNotFoundError with a message naming both filenames.

The Lifecycle: Define, Register, Discover

1

Define

Create a folder for each skill. The folder name is what most projects use as the directory path in the config; the id field inside the manifest is the actual identifier exposed on the wire.
Each skill.yaml (or SKILL.md) declares the skill’s identity, tags, input_modes, output_modes, and examples.
2

Register

Reference the skill directories in your agent config:
Bindu reads the manifests during bindufy() and registers them automatically. No additional code is needed.
3

Discover

Once the agent is running, skills are available through several endpoints:
The /agent/skills response is wrapped, not a bare array:
The agent card itself only carries a minimal reference per skill, to keep the card payload small:

The Skill Manifest

The skill.yaml (or SKILL.md frontmatter) is the complete definition of a skill. Only id and name are strictly required; the more you declare, the more useful the skill is for discovery and routing.

Fields

The wire format uses snake_case: input_modes and output_modes. The same fields appear under those exact keys in /agent/skills responses, so orchestrators see the manifest as you wrote it.
Skills carrying a SKILL.md body also expose two extra fields on the wire:
  • documentation_content — the raw file contents (returned in full from /agent/skills/{id}/documentation).
  • markdown_content — the Markdown body below the frontmatter (returned in skill detail responses for clients that want rich text).
The list endpoint strips documentation_content to keep payloads small and surfaces a boolean has_documentation flag in single-skill detail responses instead. Use /agent/skills/{id}/documentation to fetch the full document.

Multiple Skills

An agent can declare as many skills as it has capabilities. Each skill is independently addressable and can have its own I/O contract.
All declared skills appear in the agent card (as minimal refs) and in the full /agent/skills response. Orchestrators can inspect the full list and route tasks to the most appropriate skill.

Inline skills

You can also declare a skill inline in the config without a folder on disk. This is useful for one-off skills or for SDKs that don’t ship a skills/ directory:
The loader accepts a mixed list: strings resolve to folder paths, dictionaries become inline skills. Inline skills must contain at minimum a name.

Skills and Task Routing

In a multi-agent system, an orchestrator fetches the skills of available agents and matches incoming tasks to the right agent based on skill tags, descriptions, and examples. The orchestrator does not need to know the agent’s internals. The skill manifest is the contract.

Real-World Use Cases

The multilingual-collab-agent example in examples/multilingual-collab-agent declares three skills as separate folders: research, translate, and collaborate. An orchestrator can route a translation task directly to the right skill without guessing.
A focused agent that only does one thing well. Declaring a single skill makes its purpose unambiguous and easy to route to.
In a swarm, each agent declares its skills. The orchestrator builds a capability map at startup by fetching /agent/skills from every agent, then routes tasks dynamically based on what each agent can do.
If your skill descriptions are themselves part of the product, declare them under private_skills in the config and supply an allowed_dids allowlist. The public catalog stays generic; partners on the allowlist get the full menu at /agent/private.json. See the Private skills page and the runnable example at examples/private_skills_agent/.

Project Structure

Two real examples in this repo show the layout in practice:
Add more skills by creating new folders under skills/ and adding a skill.yaml (or SKILL.md) to each one, then listing the folder path in the skills array of your agent config.

Where to look in the code


Sunflower LogoSkills are how agents introduce themselves to the network - not by what they are, but by what they can do.