---
title: skill_create
description: Create a new ad-ops playbook (Skill) in your organization from an agent session.
---

Creates a new **Skill** (ad-ops playbook) in your organization. This is one of the AdCrunch MCP tools that **writes** — it requires the `skill:write` scope. A common pattern: you teach the agent a workflow once, then ask it to save that workflow as a Skill so your whole team's agents can reuse it.

## Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | `string` | yes | Human-readable display name. |
| `description` | `string` | yes | When to use this Skill — what agents read to decide whether to load it. Invest here. |
| `body` | `string` | yes | The playbook instructions (markdown). |
| `slug` | `string` | no | Optional explicit handle; normalized to kebab-case. Defaults to one derived from the `name`. |

## Output

The created Skill: `{ id, slug, name, description, body, revision, createdBy, … }`. New Skills start at `revision` 1.

## Example

> _"Save what we just did as a skill called 'weekly meta audit' so I can run it every Monday."_

```ts
skill_create({
  name: 'Weekly Meta Audit',
  description:
    'Audit Meta campaign performance for the last 14 days and flag overspend. Use every Monday.',
  body: '# Weekly Meta Audit\n1. list_entities(type: "campaign") for each Meta advertiser\n2. query_insights for the last 14 days…\n3. Flag any campaign with CPA above target.',
});
// → { slug: 'weekly-meta-audit', revision: 1, … }
```

:::info[Slugs are derived from the name]

Leave `slug` out and AdCrunch kebab-cases the name (`Weekly Meta Audit` → `weekly-meta-audit`). Pass `slug` only when you want a specific handle.

:::

## Errors

- **Slug already exists** — a live Skill with that slug already exists in your organization. Pick a different name or slug (no silent suffixing).
- **Invalid slug** — the name (or slug) has no letters or digits to derive a slug from. Provide one that does.
- `401` or `403` — see [Errors](/mcp/errors), which every tool shares. This one needs `skill:write`.

## Reference

Create an ad-ops playbook (Skill) in the active organization. The slug (its stable handle) is derived from the name unless an explicit slug is provided. Fails if a Skill with the same slug already exists in the organization.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `body` | string | yes | The playbook instructions (the Skill body, markdown). |
| `description` | string | yes | When to use this Skill — what an agent reads to decide whether to load it. |
| `name` | string | yes | Human-readable display name. |
| `slug` | string | no | Optional explicit slug handle; normalized to kebab-case. Defaults to a slug derived from the name. |

### Failure codes

A failed call has `isError` set, and `structuredContent.error` holds one of these codes. [Errors](/mcp/errors) describes the shape of a failed call.

- `invalid_slug`
- `slug_conflict`
- `forbidden`
- `invalid_request`
- `internal_error`

### Scope

The token must hold `skill:write`. [Auth & scopes](/mcp/auth) lists each scope.

### Annotations

A client reads these hints. A hint that the tool does not declare has the default value of the MCP specification.

- **Writes.** The tool can change data.
- **Destructive.** The tool can make a change that you cannot undo. A client can ask you to confirm before it calls the tool.
- **Not idempotent.** A second call with the same arguments can change more.
- **Closed world.** The tool reads and writes the data of AdCrunch only.
