# Propose or save the Voice

Change the Voice. Only the fields you send change; lists you send replace the stored list, while addBannedPhrases and addExamples add to it. From an agent this becomes a proposal a person accepts in Knowledge.

- Exact name: `voice_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)."
    },
    "summary": {
      "type": "string",
      "maxLength": 2000
    },
    "traits": {
      "description": "Short traits: “Direct”, “Warm, never cute”.",
      "maxItems": 12,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      }
    },
    "dos": {
      "description": "Concrete writing rules to follow.",
      "maxItems": 24,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 400
      }
    },
    "donts": {
      "description": "Concrete writing rules to avoid.",
      "maxItems": 24,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 400
      }
    },
    "signaturePhrases": {
      "description": "Phrases the client really says.",
      "maxItems": 40,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      }
    },
    "bannedPhrases": {
      "description": "Exact words or phrases never to write (replaces the list).",
      "maxItems": 120,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      }
    },
    "addBannedPhrases": {
      "description": "Exact words or phrases never to write (added to the list).",
      "maxItems": 120,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      }
    },
    "platformHabits": {
      "description": "Formatting habits per platform (replaces the list).",
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string",
            "minLength": 1,
            "maxLength": 40
          },
          "habits": {
            "maxItems": 12,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300
            }
          }
        },
        "required": [
          "platform",
          "habits"
        ]
      }
    },
    "addExamples": {
      "description": "Passages that show (good) or break (avoid) the voice.",
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4000
          },
          "verdict": {
            "type": "string",
            "enum": [
              "good",
              "avoid"
            ]
          },
          "platform": {
            "type": "string",
            "maxLength": 40
          },
          "note": {
            "type": "string",
            "maxLength": 400
          }
        },
        "required": [
          "text",
          "verdict"
        ]
      }
    },
    "notes": {
      "description": "Nuance no list holds (Markdown). Replaces the stored notes.",
      "type": "string",
      "maxLength": 60000
    },
    "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": "voice_upsert",
    "arguments": {}
  }
}
```
