---
title: skill_list
description: List the Skills of your organization by slug, name and description, newest first.
---

Ask which Skills your organization has. The agent gets the name, the slug and the description of each Skill, newest first, and not its playbook.

> Which Skills do we have?

The agent calls this tool and shows you each Skill with its description. To run or change a Skill, it then reads the full Skill with [`skill_get`](/mcp/tools/skill-get). When your organization has more Skills than fit on one page, the agent asks for the next page. [Reuse a playbook](/mcp/tools/reuse-a-playbook) walks the whole job.

## Reference

List the active organization's ad-ops playbooks (Skills) as slug + name + description, newest first. Bodies are not returned — fetch a Skill's instructions with skill_get once you've picked one. The answer holds at most `limit` rows (default 100, maximum 500). When it carries `nextCursor`, more rows exist: call this tool again with the same arguments and `cursor` set to that value. When it carries no `nextCursor`, you have every row.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `cursor` | string, at least 1 character | no | The `nextCursor` of the previous page. Omit it to get the first page. Send it with no change, and with the same filters as the request that answered it: a cursor from a different query gets a 400 `invalid_cursor`. Do not build or change a cursor. |
| `limit` | integer, 1 to 500 | no | The greatest number of rows on the page, from 1 to 500. The default is 100. A greater value gets a 400, with `error` of `invalid_request`. Default: `100`. |

### Output

A successful call returns this object in `structuredContent`.

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `nextCursor` | string | no | Send this value as `cursor` to get the next page. It is absent on the last page. |
| `skills` | array of object | yes | The Skills of the page, newest first. |
| `skills[].description` | string | yes | When to use the Skill. An agent reads it to choose a Skill. |
| `skills[].name` | string | yes | The display name of the Skill. |
| `skills[].slug` | string | yes | The handle of the Skill in your organization. Send it as `skill_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_cursor`
- `forbidden`
- `invalid_request`
- `internal_error`

### Scope

The token must hold `skill:read`. [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.

- **Read-only.** The tool changes nothing.
- **Closed world.** The tool reads and writes the data of AdCrunch only.

### Example

The arguments:

```json
{
  "limit": 2
}
```

The result, in `structuredContent`:

```json
{
  "nextCursor": "eyJwIjpbMTc4OTkxMzYwMDAwMCwic2tsX3E4djNtMXo2azJkOXc0cDd4NW4wYzNqMSJdLCJxIjoiMjR2N3ZscTJ1OXkifQ",
  "skills": [
    {
      "description": "Use this before you write a new ad, to keep the words inside the guidelines of the brand.",
      "name": "Write ad copy",
      "slug": "write-ad-copy"
    },
    {
      "description": "Use this every Monday to find the campaigns above the target cost per action.",
      "name": "Weekly budget review",
      "slug": "weekly-budget-review"
    }
  ]
}
```
