# 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.

- Exact name: `freeasset_upsert`
- Category: Other
- Required access: write
- Allowed agent roles: admin, content_writer
- MCP endpoint: `https://api.funnels.akera.agency/`

## Annotations

- None declared

## Input JSON Schema

```json
{
  "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

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "freeasset_upsert",
    "arguments": {}
  }
}
```
