Propose or save an angle
Create an angle (omit angleId) or change one (pass angleId; only the fields you send change). From an agent this becomes a proposal a person accepts in Knowledge; from a person it saves. audienceIds and offerIds must already exist (see strategy_get).
Behavior
- Read-only hint
- Not declared
- Destructive hint
- Not declared
- Idempotent hint
- Not declared
- Open-world hint
- Not declared
Parameters
| Name | Type | Requirement | Description |
|---|---|---|---|
workspaceId | string | Required | The workspace id or slug (from workspace_list). |
angleId | string | Optional | No additional description. |
name | string | Optional | Two to five words. |
thesis | string | Optional | The one-line claim the client argues. |
whyItMatters | string | Optional | No additional description. |
audienceIds | array | Optional | No additional description. |
offerIds | array | Optional | No additional description. |
hooks | array | Optional | Example hooks in the client’s voice. |
stories | array | Optional | Stories the client tells on this angle. |
proof | array | Optional | Numbers, cases or quotes the client can stand behind. |
keywords | array | Optional | Search terms for creator research and idea matching. |
status | string | Optional | No additional description. |
reason | string | Required | Why this change helps, in one or two sentences. Shown to the person who accepts it. |
Input JSON Schema
Generated from the registered input schema
{
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1,
"description": "The workspace id or slug (from workspace_list)."
},
"angleId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"name": {
"description": "Two to five words.",
"type": "string",
"minLength": 1,
"maxLength": 80
},
"thesis": {
"description": "The one-line claim the client argues.",
"type": "string",
"maxLength": 300
},
"whyItMatters": {
"type": "string",
"maxLength": 1000
},
"audienceIds": {
"maxItems": 8,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"offerIds": {
"maxItems": 8,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"hooks": {
"description": "Example hooks in the client’s voice.",
"maxItems": 12,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 300
}
},
"stories": {
"description": "Stories the client tells on this angle.",
"maxItems": 12,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 600
}
},
"proof": {
"description": "Numbers, cases or quotes the client can stand behind.",
"maxItems": 12,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 600
}
},
"keywords": {
"description": "Search terms for creator research and idea matching.",
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 80
}
},
"status": {
"type": "string",
"enum": [
"active",
"paused"
]
},
"reason": {
"type": "string",
"minLength": 1,
"maxLength": 1000,
"description": "Why this change helps, in one or two sentences. Shown to the person who accepts it."
}
},
"required": [
"workspaceId",
"reason"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Call shape
Use an MCP client rather than sending this JSON directly. The client handles protocol negotiation, sessions, and authentication.
Protocol request
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "angle_upsert",
"arguments": {}
}
}