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.Documentation Index
Fetch the complete documentation index at: https://docs.getbindu.com/llms.txt
Use this file to discover all available pages before exploring further.
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.| Without skills | With Bindu skills |
|---|---|
| Capabilities are implicit or undocumented | Skills are declared in a structured manifest |
| Orchestrators cannot discover what an agent does | Skills are published at /agent/skills |
| Task routing requires manual configuration | Agents can be matched to tasks by capability |
| No standard input/output contract | Each skill declares its input_modes and output_modes |
| Fine for single-agent scripts | Required for multi-agent systems |
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 askill.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 canonicalskill.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:
| File | When to use it |
|---|---|
skill.yaml | Pure metadata. Easy to diff, easy to generate from a template. The shape used by every Python example in the repo. |
SKILL.md | YAML frontmatter + a rich Markdown body. Lets you ship operator-readable documentation alongside the manifest. Used by the TypeScript SDK examples. |
| Both in the same folder | Allowed. skill.yaml provides the metadata; the Markdown body of SKILL.md is attached as markdown_content for richer documentation. |
SKILL.md file looks like this:
skill.yaml nor SKILL.md exists in the folder, the loader raises FileNotFoundError with a message naming both filenames.
The Lifecycle: Define, Register, Discover
Define
Create a folder for each skill. The folder name is what most projects use
as the directory path in the config; the Each
id field inside the manifest is
the actual identifier exposed on the wire.skill.yaml (or SKILL.md) declares the skill’s identity, tags,
input_modes, output_modes, and examples.Register
Reference the skill directories in your agent config:Bindu reads the manifests during
bindufy() and registers them
automatically. No additional code is needed.The Skill Manifest
Theskill.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
| Field | Required | Description |
|---|---|---|
id | Yes | Unique identifier for the skill. Conventionally suffixed with a version, e.g. research-v1. |
name | Yes | Human-readable name shown in the agent card. |
description | No | What the skill does — used for capability matching. |
version | No | Skill version string. Defaults to "unknown" if omitted. |
author | No | Author email or identifier. |
tags | No | Keywords for discovery and routing. |
examples | No | Sample inputs that demonstrate the skill. |
input_modes | No | MIME types the skill accepts (default: ["text/plain"]). |
output_modes | No | MIME types the skill produces (default: ["text/plain"]). |
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.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).
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./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 askills/ directory:
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
Research agent with multiple skills
Research agent with multiple skills
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.Specialized single-skill agent
Specialized single-skill agent
A focused agent that only does one thing well. Declaring a single skill
makes its purpose unambiguous and easy to route to.
Agent swarm with skill-based routing
Agent swarm with skill-based routing
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.Private skills behind an auth gate
Private skills behind an auth gate
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: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
- Loader:
bindu/utils/skills/loader.py— handles bothskill.yamlandSKILL.md, plus inline dict skills. - List endpoint:
bindu/server/endpoints/skills.py— implements/agent/skills,/agent/skills/{id}, and/agent/skills/{id}/documentation. - Agent card endpoint:
bindu/server/endpoints/agent_card.py— minimizes each skill to{id, name, documentation_path}before serializing. - Route registration:
bindu/server/applications.py— wires/.well-known/agent.json,/agent/skills, and/agent/private.json.
Related
- Private skills — serve a public catalog to everyone and a fuller catalog to allowlisted DIDs only.
- Architecture
- A2A Protocol