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

  1. You author a skill via the API/SDK (or an agent authors one mid-run)
  2. At the start of each run, visible skills are materialized into the workspace
  3. When the task matches a skill's description, the agent loads the body

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" and teammate_id).

When an account skill and an agent-scoped skill share a slug, the agent-scoped one wins for that agent.

Create a skill

Python
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:

Python
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:

Python
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.

Python
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_id scope
  • Scoping: account (all agents) or teammate (one agent); strictly isolated per user_id

Next: Memories · Custom tools · Users

Was this page helpful?