> ## Documentation Index
> Fetch the complete documentation index at: https://docs.doers.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Coach

> The AI coach, on the account's own Anthropic key.

14 tools. Each one is also a REST route and a CLI command, from the same definition: the same input, the same output, the same errors.

| Tool                                                          | What it does                                   | Kind                                                    |
| ------------------------------------------------------------- | ---------------------------------------------- | ------------------------------------------------------- |
| [`count_unread_coach_messages`](#count_unread_coach_messages) | How many replies arrived since you last looked | Read · idempotent · no outside service                  |
| [`get_active_coach_stream`](#get_active_coach_stream)         | The reply being written, if there is one       | Read · idempotent · no outside service                  |
| [`get_coach_day_plan`](#get_coach_day_plan)                   | The coach's plan for a day                     | Read · idempotent · no outside service                  |
| [`get_coach_status`](#get_coach_status)                       | Whether the coach has a key                    | Read · idempotent · no outside service                  |
| [`get_coach_usage`](#get_coach_usage)                         | What your turns cost                           | Read · idempotent · no outside service                  |
| [`get_latest_coach_message`](#get_latest_coach_message)       | The last thing the coach finished saying       | Read · idempotent · no outside service                  |
| [`list_coach_messages`](#list_coach_messages)                 | Read a thread                                  | Read · idempotent · no outside service                  |
| [`clear_coach_thread`](#clear_coach_thread)                   | Clear a thread                                 | Write · destructive · idempotent · no outside service   |
| [`nudge_from_coach`](#nudge_from_coach)                       | One sentence, unprompted                       | Write · calls the Anthropic API (the account's own key) |
| [`pep_from_coach`](#pep_from_coach)                           | One line, for a focus session                  | Write · calls the Anthropic API (the account's own key) |
| [`post_coach_message`](#post_coach_message)                   | Say something to the coach                     | Write · no outside service                              |
| [`remove_coach_key`](#remove_coach_key)                       | Forget the key                                 | Write · destructive · idempotent · no outside service   |
| [`set_coach_intensity`](#set_coach_intensity)                 | Choose how hard the coach pushes               | Write · idempotent · no outside service                 |
| [`set_coach_key`](#set_coach_key)                             | Store your Anthropic key                       | Write · idempotent · no outside service                 |

## count\_unread\_coach\_messages

**How many replies arrived since you last looked.**

Counts finished coach messages written after `since`. Replies still being written are not counted: a badge that appears before there is anything to read sends the person to an empty thread.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Read · idempotent · no outside service                                          |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `GET https://api.doers.sh/v2/coach/unread`                                      |
| CLI       | `doers coach count-unread-coach-messages`                                       |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `countUnreadCoachMessages`                                                      |

### Input

| Field           | Type   | Required | Default | Allowed values | Description         |
| --------------- | ------ | -------- | ------- | -------------- | ------------------- |
| `since` (query) | number | yes      |         |                | Epoch milliseconds. |

### Output

<Accordion title="Output fields">
  | Field    | Type    | Allowed values                        | Description |
  | -------- | ------- | ------------------------------------- | ----------- |
  | `unread` | integer | -9007199254740991 to 9007199254740991 |             |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "count_unread_coach_messages",
      "arguments": {
        "since": 3
      }
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "3 unread."
        }
      ],
      "structuredContent": {
        "unread": 3
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach count-unread-coach-messages --since 3
  ```
</CodeGroup>

## get\_active\_coach\_stream

**The reply being written, if there is one.**

The coach message currently in flight, or `null`. Distinct from the latest message, which is the last **finished** one: a reply half-written is what the app shows a spinner for, and showing it as an answer would show half an answer.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Read · idempotent · no outside service                                          |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `GET https://api.doers.sh/v2/coach/stream`                                      |
| CLI       | `doers coach get-active-coach-stream`                                           |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `getActiveCoachStream`                                                          |

### Input

| Field              | Type           | Required | Default | Allowed values | Description                       |
| ------------------ | -------------- | -------- | ------- | -------------- | --------------------------------- |
| `agentKey` (query) | string \| null | no       |         |                | *No description in the registry.* |

### Output

<Accordion title="Output fields">
  | Field                 | Type           | Allowed values                     | Description         |
  | --------------------- | -------------- | ---------------------------------- | ------------------- |
  | `message`             | object \| null |                                    |                     |
  | `message.id`          | string         |                                    |                     |
  | `message.role`        | string         | `user`, `coach`                    |                     |
  | `message.content`     | string         |                                    |                     |
  | `message.streamState` | string \| null | `thinking`, `working`, `composing` |                     |
  | `message.isDump`      | boolean        |                                    |                     |
  | `message.agentKey`    | string \| null |                                    |                     |
  | `message.createdAt`   | number         |                                    | Epoch milliseconds. |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_active_coach_stream",
      "arguments": {
        "agentKey": "Notes for the Acme launch."
      }
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "In flight: thinking."
        }
      ],
      "structuredContent": {
        "message": {
          "id": "ab530a13-e459-4498-8b79-f9b7e3fba994",
          "role": "user",
          "content": "Notes for the Acme launch.",
          "streamState": "thinking",
          "isDump": true,
          "agentKey": "Notes for the Acme launch.",
          "createdAt": 1790069400000
        }
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach get-active-coach-stream --agent-key "Notes for the Acme launch."
  ```
</CodeGroup>

## get\_coach\_day\_plan

**The coach's plan for a day.**

What it proposed, framed at the top of Today. `null` when it proposed nothing.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Read · idempotent · no outside service                                          |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `GET https://api.doers.sh/v2/coach/plan/{day}`                                  |
| CLI       | `doers coach get-coach-day-plan`                                                |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `getCoachDayPlan`                                                               |

### Input

| Field        | Type   | Required | Default | Allowed values | Description                  |
| ------------ | ------ | -------- | ------- | -------------- | ---------------------------- |
| `day` (path) | string | yes      |         | `YYYY-MM-DD`   | Local day key, `YYYY-MM-DD`. |

### Output

<Accordion title="Output fields">
  | Field              | Type           | Allowed values | Description                  |
  | ------------------ | -------------- | -------------- | ---------------------------- |
  | `plan`             | object \| null |                |                              |
  | `plan.day`         | string         | `YYYY-MM-DD`   | Local day key, `YYYY-MM-DD`. |
  | `plan.note`        | string         |                |                              |
  | `plan.focusTaskId` | string \| null |                |                              |
  | `plan.taskIds`     | string\[]      |                |                              |
  | `plan.createdAt`   | number         |                | Epoch milliseconds.          |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_coach_day_plan",
      "arguments": {
        "day": "2026-09-22"
      }
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "Notes for the Acme launch."
        }
      ],
      "structuredContent": {
        "plan": {
          "day": "2026-09-22",
          "note": "Notes for the Acme launch.",
          "focusTaskId": "330571bf-d351-4dd2-8723-26c22871d591",
          "taskIds": ["0ebb429f-a86d-481c-8630-fac53db1c91c"],
          "createdAt": 1790069400000
        }
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach get-coach-day-plan --day 2026-09-22
  ```
</CodeGroup>

## get\_coach\_status

**Whether the coach has a key.**

Reports only that a key exists: never the key, which is not readable once stored.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Read · idempotent · no outside service                                          |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `GET https://api.doers.sh/v2/coach`                                             |
| CLI       | `doers coach get-coach-status`                                                  |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `getCoachStatus`                                                                |

### Input

This tool takes no arguments.

### Output

<Accordion title="Output fields">
  | Field       | Type    | Allowed values                             | Description                                           |
  | ----------- | ------- | ------------------------------------------ | ----------------------------------------------------- |
  | `hasKey`    | boolean |                                            |                                                       |
  | `unread`    | integer | -9007199254740991 to 9007199254740991      | Messages from the coach you have not seen.            |
  | `intensity` | string  | `gentle`, `steady`, `driven`, `relentless` | How hard the coach pushes, from gentle to relentless. |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_coach_status",
      "arguments": {}
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "Ready · 3 unread · gentle."
        }
      ],
      "structuredContent": {
        "hasKey": true,
        "unread": 3,
        "intensity": "gentle"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach get-coach-status
  ```
</CodeGroup>

## get\_coach\_usage

**What your turns cost.**

Every call your account made to the model, newest first, with its token counts and its price in nano-dollars under the catalogue version it was recorded with: so a price change never rewrites a past turn. At most 500 turns; narrow with `since`.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Read · idempotent · no outside service                                          |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `GET https://api.doers.sh/v2/coach/usage`                                       |
| CLI       | `doers coach get-coach-usage`                                                   |
| Touches   | `modelUsage`                                                                    |
| Operation | `getCoachUsage`                                                                 |

### Input

| Field           | Type   | Required | Default | Allowed values | Description         |
| --------------- | ------ | -------- | ------- | -------------- | ------------------- |
| `since` (query) | number | no       |         |                | Epoch milliseconds. |

### Output

<Accordion title="Output fields">
  | Field                          | Type            | Allowed values        | Description                                                               |
  | ------------------------------ | --------------- | --------------------- | ------------------------------------------------------------------------- |
  | `catalogueVersion`             | string          |                       | The version a turn recorded now would be priced under.                    |
  | `events`                       | object\[]       |                       |                                                                           |
  | `events[].id`                  | string          |                       |                                                                           |
  | `events[].operationId`         | string          |                       | The operation that made the call.                                         |
  | `events[].model`               | string          |                       |                                                                           |
  | `events[].at`                  | number          |                       | Epoch milliseconds.                                                       |
  | `events[].catalogueVersion`    | string          |                       | The price catalogue this call is priced under.                            |
  | `events[].tokens`              | object          |                       |                                                                           |
  | `events[].tokens.input`        | integer         | 0 to 9007199254740991 |                                                                           |
  | `events[].tokens.cacheWrite5m` | integer         | 0 to 9007199254740991 |                                                                           |
  | `events[].tokens.cacheWrite1h` | integer         | 0 to 9007199254740991 |                                                                           |
  | `events[].tokens.cacheRead`    | integer         | 0 to 9007199254740991 |                                                                           |
  | `events[].tokens.output`       | integer         | 0 to 9007199254740991 |                                                                           |
  | `events[].costNanoUsd`         | integer \| null | 0 to 9007199254740991 | Nano-dollars. `null` when that catalogue version does not know the model. |
  | `totals`                       | object          |                       |                                                                           |
  | `totals.tokens`                | object          |                       |                                                                           |
  | `totals.tokens.input`          | integer         | 0 to 9007199254740991 |                                                                           |
  | `totals.tokens.cacheWrite5m`   | integer         | 0 to 9007199254740991 |                                                                           |
  | `totals.tokens.cacheWrite1h`   | integer         | 0 to 9007199254740991 |                                                                           |
  | `totals.tokens.cacheRead`      | integer         | 0 to 9007199254740991 |                                                                           |
  | `totals.tokens.output`         | integer         | 0 to 9007199254740991 |                                                                           |
  | `totals.costNanoUsd`           | integer \| null | 0 to 9007199254740991 | `null` when any listed turn could not be priced.                          |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_coach_usage",
      "arguments": {
        "since": 3
      }
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "1 turn(s), $0.00."
        }
      ],
      "structuredContent": {
        "catalogueVersion": "Notes for the Acme launch.",
        "events": [
          {
            "id": "b8e1f80b-d70a-4078-8c78-55a451731b74",
            "operationId": "9bf5a24e-4aa7-4998-8ac4-1f1a0f8713ec",
            "model": "Notes for the Acme launch.",
            "at": 3,
            "catalogueVersion": "Notes for the Acme launch.",
            "tokens": {
              "input": 3,
              "cacheWrite5m": 3,
              "cacheWrite1h": 3,
              "cacheRead": 3,
              "output": 3
            },
            "costNanoUsd": 3
          }
        ],
        "totals": {
          "tokens": {
            "input": 3,
            "cacheWrite5m": 3,
            "cacheWrite1h": 3,
            "cacheRead": 3,
            "output": 3
          },
          "costNanoUsd": 3
        }
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach get-coach-usage --since 3
  ```
</CodeGroup>

## get\_latest\_coach\_message

**The last thing the coach finished saying.**

For the banner at the top of the app. Skips a reply still being written, which would otherwise appear there half-formed.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Read · idempotent · no outside service                                          |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `GET https://api.doers.sh/v2/coach/latest`                                      |
| CLI       | `doers coach get-latest-coach-message`                                          |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `getLatestCoachMessage`                                                         |

### Input

| Field           | Type   | Required | Default | Allowed values | Description         |
| --------------- | ------ | -------- | ------- | -------------- | ------------------- |
| `since` (query) | number | no       |         |                | Epoch milliseconds. |

### Output

<Accordion title="Output fields">
  | Field                 | Type           | Allowed values                     | Description         |
  | --------------------- | -------------- | ---------------------------------- | ------------------- |
  | `message`             | object \| null |                                    |                     |
  | `message.id`          | string         |                                    |                     |
  | `message.role`        | string         | `user`, `coach`                    |                     |
  | `message.content`     | string         |                                    |                     |
  | `message.streamState` | string \| null | `thinking`, `working`, `composing` |                     |
  | `message.isDump`      | boolean        |                                    |                     |
  | `message.agentKey`    | string \| null |                                    |                     |
  | `message.createdAt`   | number         |                                    | Epoch milliseconds. |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_latest_coach_message",
      "arguments": {
        "since": 3
      }
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "Notes for the Acme launch."
        }
      ],
      "structuredContent": {
        "message": {
          "id": "ab530a13-e459-4498-8b79-f9b7e3fba994",
          "role": "user",
          "content": "Notes for the Acme launch.",
          "streamState": "thinking",
          "isDump": true,
          "agentKey": "Notes for the Acme launch.",
          "createdAt": 1790069400000
        }
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach get-latest-coach-message --since 3
  ```
</CodeGroup>

## list\_coach\_messages

**Read a thread.**

The most recent 60 messages, oldest first: a thread is read from the top, but it is the recent end that matters, so the newest are selected and then reversed.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Read · idempotent · no outside service                                          |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `GET https://api.doers.sh/v2/coach/messages`                                    |
| CLI       | `doers coach list-coach-messages`                                               |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `listCoachMessages`                                                             |

### Input

| Field              | Type   | Required | Default | Allowed values      | Description                                                   |
| ------------------ | ------ | -------- | ------- | ------------------- | ------------------------------------------------------------- |
| `agentKey` (query) | string | no       |         | 0 to 200 characters | The agent whose thread this is. Absent means the coach's own. |

### Output

<Accordion title="Output fields">
  | Field                    | Type           | Allowed values                     | Description                         |
  | ------------------------ | -------------- | ---------------------------------- | ----------------------------------- |
  | `messages`               | object\[]      |                                    |                                     |
  | `messages[].id`          | string         |                                    |                                     |
  | `messages[].role`        | string         | `user`, `coach`                    |                                     |
  | `messages[].content`     | string         |                                    |                                     |
  | `messages[].streamState` | string \| null | `thinking`, `working`, `composing` |                                     |
  | `messages[].isDump`      | boolean        |                                    |                                     |
  | `messages[].agentKey`    | string \| null |                                    |                                     |
  | `messages[].createdAt`   | number         |                                    | Epoch milliseconds.                 |
  | `streaming`              | object \| null |                                    | The reply being written, if one is. |
  | `streaming.id`           | string         |                                    |                                     |
  | `streaming.role`         | string         | `user`, `coach`                    |                                     |
  | `streaming.content`      | string         |                                    |                                     |
  | `streaming.streamState`  | string \| null | `thinking`, `working`, `composing` |                                     |
  | `streaming.isDump`       | boolean        |                                    |                                     |
  | `streaming.agentKey`     | string \| null |                                    |                                     |
  | `streaming.createdAt`    | number         |                                    | Epoch milliseconds.                 |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "list_coach_messages",
      "arguments": {
        "agentKey": "Notes for the Acme launch."
      }
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "1 message(s)."
        }
      ],
      "structuredContent": {
        "messages": [
          {
            "id": "ab530a13-e459-4498-8b79-f9b7e3fba994",
            "role": "user",
            "content": "Notes for the Acme launch.",
            "streamState": "thinking",
            "isDump": true,
            "agentKey": "Notes for the Acme launch.",
            "createdAt": 1790069400000
          }
        ],
        "streaming": {
          "id": "b304adc3-3719-46cd-8b96-d6c4f1aa4662",
          "role": "user",
          "content": "Notes for the Acme launch.",
          "streamState": "thinking",
          "isDump": true,
          "agentKey": "Notes for the Acme launch.",
          "createdAt": 1790069400000
        }
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach list-coach-messages --agent-key "Notes for the Acme launch."
  ```
</CodeGroup>

## clear\_coach\_thread

**Clear a thread.**

Deletes every message in this thread. The key and the day's plans are untouched.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Write · destructive · idempotent · no outside service                           |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `DELETE https://api.doers.sh/v2/coach/messages`                                 |
| CLI       | `doers coach clear-coach-thread`                                                |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `clearCoachThread`                                                              |

### Input

| Field              | Type   | Required | Default | Allowed values      | Description                                                   |
| ------------------ | ------ | -------- | ------- | ------------------- | ------------------------------------------------------------- |
| `agentKey` (query) | string | no       |         | 0 to 200 characters | The agent whose thread this is. Absent means the coach's own. |

### Output

<Accordion title="Output fields">
  | Field     | Type    | Allowed values                        | Description |
  | --------- | ------- | ------------------------------------- | ----------- |
  | `cleared` | integer | -9007199254740991 to 9007199254740991 |             |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "clear_coach_thread",
      "arguments": {
        "agentKey": "Notes for the Acme launch."
      }
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "OK: 3 message(s) cleared."
        }
      ],
      "structuredContent": {
        "cleared": 3
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach clear-coach-thread --agent-key "Notes for the Acme launch."
  ```
</CodeGroup>

## nudge\_from\_coach

**One sentence, unprompted.**

Asks the coach for a single short sentence about what is happening: the card in the corner of the screen. No tools, no thinking: a sentence does not need to reason, and reasoning would eat the budget it has.

Returns `null` rather than failing when no key is configured, because a nudge is an embellishment and its absence must not look like a broken app.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Write · calls the Anthropic API (the account's own key)                         |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `POST https://api.doers.sh/v2/coach/nudge`                                      |
| CLI       | `doers coach nudge`                                                             |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `nudgeFromCoach`                                                                |

### Input

| Field   | Type   | Required | Default | Allowed values       | Description                       |
| ------- | ------ | -------- | ------- | -------------------- | --------------------------------- |
| `kind`  | string | yes      |         | 1 to 200 characters  | Why it is speaking.               |
| `brief` | string | yes      |         | 1 to 2000 characters | *No description in the registry.* |

### Output

<Accordion title="Output fields">
  | Field      | Type           | Allowed values | Description |
  | ---------- | -------------- | -------------- | ----------- |
  | `sentence` | string \| null |                |             |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "nudge_from_coach",
      "arguments": {
        "kind": "Notes for the Acme launch.",
        "brief": "Notes for the Acme launch."
      }
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "Notes for the Acme launch."
        }
      ],
      "structuredContent": {
        "sentence": "Notes for the Acme launch."
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach nudge "Notes for the Acme launch." "Notes for the Acme launch."
  ```
</CodeGroup>

## pep\_from\_coach

**One line, for a focus session.**

The shortest thing the coach says: one energetic line at the start of a focus session. Same shape as a nudge and deliberately not the same operation: the two are asked for at different moments and read differently.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Write · calls the Anthropic API (the account's own key)                         |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `POST https://api.doers.sh/v2/coach/pep`                                        |
| CLI       | `doers coach pep`                                                               |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `pepFromCoach`                                                                  |

### Input

| Field     | Type   | Required | Default | Allowed values       | Description                       |
| --------- | ------ | -------- | ------- | -------------------- | --------------------------------- |
| `context` | string | yes      |         | 1 to 2000 characters | *No description in the registry.* |

### Output

<Accordion title="Output fields">
  | Field      | Type           | Allowed values | Description |
  | ---------- | -------------- | -------------- | ----------- |
  | `sentence` | string \| null |                |             |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "pep_from_coach",
      "arguments": {
        "context": "Notes for the Acme launch."
      }
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "Notes for the Acme launch."
        }
      ],
      "structuredContent": {
        "sentence": "Notes for the Acme launch."
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach pep "Notes for the Acme launch."
  ```
</CodeGroup>

## post\_coach\_message

**Say something to the coach.**

Records what you said. It does **not** call the model: the reply arrives separately, so a slow or failing model never loses what you typed.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Write · no outside service                                                      |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `POST https://api.doers.sh/v2/coach/messages`                                   |
| CLI       | `doers coach post-coach-message`                                                |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `postCoachMessage`                                                              |

### Input

| Field      | Type    | Required | Default | Allowed values        | Description                                                            |
| ---------- | ------- | -------- | ------- | --------------------- | ---------------------------------------------------------------------- |
| `body`     | string  | yes      |         | 1 to 10000 characters | *No description in the registry.*                                      |
| `agentKey` | string  | no       |         | 0 to 200 characters   | The agent whose thread this is. Absent means the coach's own.          |
| `isDump`   | boolean | no       | `false` |                       | A brain-dump: shown collapsed and kept out of the instruction history. |

### Output

<Accordion title="Output fields">
  | Field                 | Type           | Allowed values                     | Description         |
  | --------------------- | -------------- | ---------------------------------- | ------------------- |
  | `message`             | object         |                                    |                     |
  | `message.id`          | string         |                                    |                     |
  | `message.role`        | string         | `user`, `coach`                    |                     |
  | `message.content`     | string         |                                    |                     |
  | `message.streamState` | string \| null | `thinking`, `working`, `composing` |                     |
  | `message.isDump`      | boolean        |                                    |                     |
  | `message.agentKey`    | string \| null |                                    |                     |
  | `message.createdAt`   | number         |                                    | Epoch milliseconds. |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "post_coach_message",
      "arguments": {
        "body": "Notes for the Acme launch.",
        "agentKey": "Notes for the Acme launch.",
        "isDump": false
      }
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "OK: said."
        }
      ],
      "structuredContent": {
        "message": {
          "id": "ab530a13-e459-4498-8b79-f9b7e3fba994",
          "role": "user",
          "content": "Notes for the Acme launch.",
          "streamState": "thinking",
          "isDump": true,
          "agentKey": "Notes for the Acme launch.",
          "createdAt": 1790069400000
        }
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach post-coach-message --body "Notes for the Acme launch." --agent-key "Notes for the Acme launch." --is-dump false
  ```
</CodeGroup>

## remove\_coach\_key

**Forget the key.**

The thread is kept. What was already said stays readable without a key.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Write · destructive · idempotent · no outside service                           |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `DELETE https://api.doers.sh/v2/coach/key`                                      |
| CLI       | `doers coach remove-coach-key`                                                  |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `removeCoachKey`                                                                |

### Input

This tool takes no arguments.

### Output

<Accordion title="Output fields">
  | Field    | Type    | Allowed values | Description |
  | -------- | ------- | -------------- | ----------- |
  | `hasKey` | boolean | `false`        |             |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "remove_coach_key",
      "arguments": {}
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "OK: key forgotten."
        }
      ],
      "structuredContent": {
        "hasKey": false
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach remove-coach-key
  ```
</CodeGroup>

## set\_coach\_intensity

**Choose how hard the coach pushes.**

Sets the coach's intensity for your account: one of four named steps, from gentle to relentless. It changes the voice of every reply, nudge and pep from the next one on; nothing already said is rewritten. Use it when the coach is too soft or too harsh.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Write · idempotent · no outside service                                         |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `PUT https://api.doers.sh/v2/coach/intensity`                                   |
| CLI       | `doers coach set-coach-intensity`                                               |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `setCoachIntensity`                                                             |

### Input

| Field       | Type   | Required | Default | Allowed values                             | Description                  |
| ----------- | ------ | -------- | ------- | ------------------------------------------ | ---------------------------- |
| `intensity` | string | yes      |         | `gentle`, `steady`, `driven`, `relentless` | The step to use from now on. |

### Output

<Accordion title="Output fields">
  | Field       | Type   | Allowed values                             | Description |
  | ----------- | ------ | ------------------------------------------ | ----------- |
  | `intensity` | string | `gentle`, `steady`, `driven`, `relentless` |             |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "set_coach_intensity",
      "arguments": {
        "intensity": "gentle"
      }
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "OK: gentle."
        }
      ],
      "structuredContent": {
        "intensity": "gentle"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach set-coach-intensity --intensity gentle
  ```
</CodeGroup>

## set\_coach\_key

**Store your Anthropic key.**

Encrypted at rest and never returned. Fails with a 409 when the server has no encryption key configured: storing it in the clear instead is not on offer.

|           |                                                                                 |
| --------- | ------------------------------------------------------------------------------- |
| Kind      | Write · idempotent · no outside service                                         |
| Auth      | Bearer token: a personal API token (`pc_…`) or an OAuth access token (`pcat_…`) |
| REST      | `PUT https://api.doers.sh/v2/coach/key`                                         |
| CLI       | `doers coach set-coach-key`                                                     |
| Touches   | `coachMessages`, `coachPlanTasks`, `coachPlans`, `coachSettings`, `secrets`     |
| Operation | `setCoachKey`                                                                   |

### Input

| Field | Type   | Required | Default | Allowed values      | Description                       |
| ----- | ------ | -------- | ------- | ------------------- | --------------------------------- |
| `key` | string | yes      |         | 1 to 256 characters | *No description in the registry.* |

### Output

<Accordion title="Output fields">
  | Field    | Type    | Allowed values | Description |
  | -------- | ------- | -------------- | ----------- |
  | `hasKey` | boolean | `true`         |             |
</Accordion>

### Example

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "set_coach_key",
      "arguments": {
        "key": "sk-ant-example"
      }
    }
  }
  ```

  ```json Response theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
      "content": [
        {
          "type": "text",
          "text": "OK: key stored."
        }
      ],
      "structuredContent": {
        "hasKey": true
      }
    }
  }
  ```

  ```bash CLI theme={null}
  doers coach set-coach-key --key sk-ant-example
  ```
</CodeGroup>
