Propose or save a free asset
Create a free asset (omit freeAssetId) or change one (only the fields you send change). A free asset solves one exact problem and leads to an offer. It may be live only with a url and at least one offerId; otherwise keep it planned. Never invent a link. From an agent this becomes a proposal a person accepts.
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). |
freeAssetId | string | Optional | No additional description. |
name | string | Optional | No additional description. |
format | string | Optional | No additional description. |
problem | string | Optional | The exact problem it solves, in the audience’s words. |
promise | string | Optional | No additional description. |
url | union | Optional | No additional description. |
status | string | Optional | No additional description. |
offerIds | array | Optional | No additional description. |
angleIds | array | Optional | No additional description. |
audienceIds | array | Optional | No additional description. |
ctaLine | string | Optional | A suggested line, e.g. “Grab the scale-readiness checklist”. |
funnelPosition | string | Optional | No additional description. |
proof | array | Optional | Results it produced. |
notes | 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)."
},
"freeAssetId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"format": {
"type": "string",
"enum": [
"guide",
"checklist",
"template",
"video",
"vsl",
"webinar",
"call",
"audit",
"tool",
"course",
"other"
]
},
"problem": {
"description": "The exact problem it solves, in the audience’s words.",
"type": "string",
"maxLength": 400
},
"promise": {
"type": "string",
"maxLength": 600
},
"url": {
"anyOf": [
{
"type": "string",
"maxLength": 1000
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"live",
"planned",
"retired"
]
},
"offerIds": {
"maxItems": 8,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"angleIds": {
"maxItems": 24,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"audienceIds": {
"maxItems": 8,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"ctaLine": {
"description": "A suggested line, e.g. “Grab the scale-readiness checklist”.",
"type": "string",
"maxLength": 200
},
"funnelPosition": {
"type": "string",
"enum": [
"first_touch",
"middle",
"close"
]
},
"proof": {
"description": "Results it produced.",
"maxItems": 8,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 400
}
},
"notes": {
"type": "string",
"maxLength": 2000
},
"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": "freeasset_upsert",
"arguments": {}
}
}