Custom Skills
Custom skills are reusable playbooks: a short description (when to use it) plus a markdown body (the steps). The agent sees every visible skill's name + description and loads the body only when relevant.
How skills work
- You author a skill via the API/SDK (or an agent authors one mid-run)
- At the start of each run, visible skills are materialized into the workspace
- When the task matches a skill's
description, the agent loads thebody
A skill created mid-run applies from the next run (skills load at process start), like memories. v1 is markdown-only. Tool calls the skill suggests still go through the normal permission gate.
Scope
A skill is scoped like memory:
- account (default): visible to all your agents.
- teammate: visible to one agent only (pass
scope="teammate"andteammate_id).
When an account skill and an agent-scoped skill share a slug, the agent-scoped one wins for that agent.
Create a skill
from m8tes import M8tes
client = M8tes()
client.skills.create(
name="cut wasted ad spend",
description="Use when reviewing a Google Ads account for wasted spend before a weekly report.",
body="""# Steps
1. Pull search terms from the last 30 days
2. Flag terms with spend and no conversions
3. Add them as negative keywords""",
)The slug (the SKILL.md handle) is derived from name server-side and stays stable across renames. To scope a skill to one agent, pass scope="teammate" and teammate_id:
client.skills.create(
name="bot playbook",
description="Steps only the PPC bot should follow.",
body="# Do this\n...",
scope="teammate",
teammate_id=bot.id,
)Manage skills
The slug is immutable; rename, edit the body, disable (stops loading it without deleting), or delete:
for skill in client.skills.list(user_id="customer_123"):
print(f"[{skill.id}] {skill.name}: {skill.scope} ({skill.source})")
one = client.skills.get(7)
client.skills.update(7, body="# Updated steps\n...")
client.skills.update(7, status="disabled") # stop loading it; re-enable with status="active"
client.skills.delete(7)The source field is "user" for skills you author, or "agent" for skills an agent authored itself (shown with a "Created by agent" badge in the app).
Per-end-user skills (multi-tenancy)
Pass user_id to scope a skill to one of your end-users. Isolation is strict: an end-user's runs see only that end-user's skills, never your account-level ones. When you pass user_id to get/update/delete, it must match the skill's end-user or you get a 404.
client.skills.create(user_id="cust_123", name="acme refund playbook", description="...", body="...")
client.skills.list(user_id="cust_123")
client.skills.delete(7, user_id="cust_123")Agent-authored skills (built-in tool)
An agent can codify a repeatable workflow mid-run with the built-in create_skill tool. Agent-authored skills are not auto-approved: in auto (safe) mode the owner approves create_skill like any gated tool. Edit, disable, or delete them in Settings → Apps (source: "agent"). Applies from the agent's next run.
Limits
- Name: max 200 characters
- Description: max 500 characters (this is what tells an agent the skill is relevant; keep it specific and trigger-oriented)
- Body: max 20,000 characters (markdown only in v1, no bundled scripts/assets)
- Per account: max 50 skills per
user_idscope - Scoping: account (all agents) or teammate (one agent); strictly isolated per
user_id
Next: Memories · Custom tools · Users