# log_action

> 记录你（或用户）刚在某个增长条目上做过或观察到的事：发生了什么（一句话就够）、只有确知变了才填的新阶段、何时跟进，以及任何结果。

URL: https://mcp-docs.opennomos.com/zh/docs/tools/growth/log_action

> 记录你（或用户）刚在某个增长条目上做过或观察到的事：发生了什么（一句话就够）、只有确知变了才填的新阶段、何时跟进，以及任何结果。传机会 id 或 URL（未知的 URL 会自动登记）；两者都没有时，只记录这次行动。服务端从不根据行动推断阶段。不要把私信原文或个人数据写进摘要。用 idempotency_key 让重试安全。

> 以上是服务端发布的英文描述的译文；英文原文见[英文页](https://mcp-docs.opennomos.com/docs/tools/growth/log_action.md)。工具名、参数名和取值保持原样。

| 字段 | 值 |
| --- | --- |
| 工具包 | Core (`core`) |
| 每次调用的预估成本 | $0 |
| 工具包每月上限 | 无 |
| 项目 | 按顺序确定：显式的 `project` → 请求头 → 凭据默认项目 → 工作区默认项目 |

## 参数

| 参数 | 必填 | 类型 | 说明 |
| --- | --- | --- | --- |
| `project` | 否 | `string` | 项目 slug 或 id。省略则用凭据或工作区的默认项目。 |
| `opportunity_id` | 否 | `string` | 这件事涉及的机会（来自 track 或 get_briefing 的 id）。用它或 url，不要两个都用。 |
| `url` | 否 | `string (≤ 2000 字符)` | 或者传涉及的帖子/主页 URL；未知的 URL 会自动登记。 |
| `title` | 否 | `string (≤ 200 字符)` | 新登记 URL 的标题。 |
| `action` | 是 | `object` | 做了什么或观察到什么。 |
| `action.kind` | 否 | `string (≤ 50 字符)` | 行动的类型，例如 'comment'、'dm'、'post'、'email'。默认 'action'。 |
| `action.summary` | 是 | `string` | 一句话说明发生了什么，例如 'Replied with a comparison table'。不要写私信原文。 |
| `action.channel` | 否 | `string (≤ 100 字符)` | 在哪里，例如 'reddit'、'x'、'xiaohongshu'。 |
| `action.url` | 否 | `string (≤ 2000 字符)` | 指向你发布内容的链接，例如你的评论 URL。 |
| `action.occurred_at` | 否 | `ISO 时间` | 发生的时间（ISO 时间）。默认：现在。 |
| `stage` | 否 | `"discovered"` \| `"contacted"` \| `"replied"` \| `"willing_to_talk"` \| `"converted"` \| `"dropped"` | 新阶段，只有确知变了才填：discovered、contacted、replied、willing_to_talk、converted 或 dropped。 |
| `next_followup` | 否 | `ISO 时间 \| {in_days} \| {at} \| null` | 何时跟进：\{"in_days": 3\}、\{"at": ISO 时间\}，或一个 ISO 时间。null 表示清除。默认：按阶段给出的建议。 |
| `experiment_id` | 否 | `string` | 把这次行动挂到某个实验上（来自 track 的 id）。 |
| `link_code` | 否 | `string (≤ 32 字符)` | 这次行动用到的短链接的 code（来自 track type=link），用于点击归因。 |
| `outcome` | 否 | `object` | 这次行动的结果，如果有的话。 |
| `outcome.type` | 是 | `string (≤ 60 字符)` | 达成了什么，例如 'signup'、'reply'、'call_booked'。 |
| `outcome.value` | 否 | `number` | 数量，例如 1 或 49.9。 |
| `outcome.unit` | 否 | `string (≤ 20 字符)` | 数值的单位，例如 'usd'、'count'。 |
| `outcome.evidence` | 否 | `string` | 你怎么知道的，例如 'Reply in thread from the author'。 |
| `note` | 否 | `string` | 补充说明，一两句话。 |
| `idempotency_key` | 否 | `string (≤ 100 字符)` | 任意唯一字符串；用同一个 key 重复调用，不会记录两次。 |

## 示例调用

```json
{
  "project": "acme-crm",
  "url": "https://www.reddit.com/r/SaaS/comments/1abc23/looking_for_a_lightweight_crm",
  "action": {
    "kind": "comment",
    "summary": "Replied with a comparison table",
    "channel": "reddit"
  },
  "stage": "contacted",
  "experiment_id": "exp_7Hn2LpWc0",
  "idempotency_key": "2026-10-16-comment-1abc23"
}
```

REST:`POST https://service.opennomos.com/v1/tools/log_action`，以上 JSON 作为请求体。MCP:`tools/call`,`name: "log_action"`，以上 JSON 作为 `arguments`。

## 示例结果

示例里的值是示意性的；结构来自服务端代码。

```json
{
  "project": {
    "id": "prj_k3Vd9aQx2",
    "slug": "acme-crm"
  },
  "action_id": "act_Lw03pKd8",
  "opportunity": {
    "id": "opp_Qm4x9TnB1",
    "stage": "contacted",
    "next_followup_at": "2026-10-19T09:30:00.000Z",
    "events": 3
  },
  "experiment_progress": {
    "id": "exp_7Hn2LpWc0",
    "metric": "willing_to_talk",
    "current": 1,
    "target": 3,
    "deadline_at": "2026-10-30T09:00:00.000Z"
  },
  "hints": []
}
```

## 说明

- 闭环里*回写*的那一半。OpenNomos 从不发帖、回复或给任何人发消息：由你（或用户）在别处做，然后在这里记录。
- 传 `opportunity_id` 或 `url`（未知的 URL 会自动登记）。两者都没有时，只记录这次行动。
- **默认行为**：服务端从不推断阶段。省略 `stage`，阶段不变。省略 `next_followup`，跟进时间不变，**除非阶段确实变了**，这时会按新阶段设置：`contacted` +3 天，`replied` +2,`willing_to_talk` +2,`converted` 和 `dropped` 清除。`next_followup: null` 清除。详见 [log_action 的默认行为](https://mcp-docs.opennomos.com/zh/docs/growth-loop/log-action.md)。
- `outcome` 记录一个结果（`type`，可选 `value`、`unit`、`evidence`）。只有关联到机会或短链接时，才算已归因（`direct`）；否则是 `unknown`。见[归因](https://mcp-docs.opennomos.com/zh/docs/growth-loop/attribution.md)。
- `idempotency_key` 让重试变得安全：用同一个 key 重复调用，会重放第一次的结果（带 `duplicate: true`），而不是记录两次。当行动挂在某个实验上时，会出现 `experiment_progress`。
- `hints` 里可能有一行警告，例如 `outcome.type` 是 `willing_to_talk` 但阶段没有改。
- 不要把私信原文或个人数据写进 `summary` 或 `note`。

## 错误

被拒绝的调用（输入有误、id 未知、触发限流）返回 `message` 和 `code`；走 MCP 时结果带 `isError: true`。见[错误](https://mcp-docs.opennomos.com/zh/docs/reference/errors.md)。
