Connector action

create_event

WriteNot idempotent10 calls per day

Create an event

Creates an event with a name and an optional date, under the same rules as the dashboard: the free first event, an active subscription, or otherwise a locked event that waits for payment in the dashboard.

What the client is told

The description an MCP client receives from tools/list, word for word:

Creates a new event with a name and optional date. Applies the same rules as the dashboard (free first event, subscription, otherwise the event is created locked and needs payment in the dashboard). Returns the event id and dashboard link.

Annotations

json
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": false,
  "openWorldHint": false
}

Parameters

ParameterTypeRequiredDescription
event_namestring, up to 120 charactersYesThe event name shown to you and to guests.
event_datedate (YYYY-MM-DD)NoThe event date. Leave it out when the date is not set yet.
Input schema as JSON Schema
inputSchema
{
  "type": "object",
  "properties": {
    "event_name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "event_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    }
  },
  "required": [
    "event_name"
  ]
}

Example

Request

tools/call
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "create_event",
    "arguments": {
      "event_name": "Okafor Baby Shower",
      "event_date": "2026-12-05"
    }
  }
}

With curl

bash
curl -X POST https://www.happyhearaudio.com/api/mcp \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2025-06-18" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"create_event","arguments":{"event_name":"Okafor Baby Shower","event_date":"2026-12-05"}}}'

Response

Fake data in a real shape. content[0].text is the same object as a JSON string for clients that read text only.

json
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"event_id\":\"3e9a7b51-0d2c-4a8e-b7f3-6c1d8e2f4a05\",\"dashboard_url\":\"https://www.happyhearaudio.com/dashboard/events/3e9a7b51-0d2c-4a8e-b7f3-6c1d8e2f4a05\",\"unlocked\":false,\"requires_payment\":true}"
      }
    ],
    "structuredContent": {
      "event_id": "3e9a7b51-0d2c-4a8e-b7f3-6c1d8e2f4a05",
      "dashboard_url": "https://www.happyhearaudio.com/dashboard/events/3e9a7b51-0d2c-4a8e-b7f3-6c1d8e2f4a05",
      "unlocked": false,
      "requires_payment": true
    }
  }
}

Errors

Each of these comes back as a normal JSON-RPC result with isError: true and the message as its single text item. Arguments the schema rejects are a JSON-RPC -32602 error instead. See Errors for the HTTP-level refusals that happen before any tool runs.

MessageWhen
<a validation message>The name is empty or over 120 characters, or the date is not a real calendar day.
Daily limit reached: your AI assistant has already made 10 new events in the last 24 hours, so nothing was changed. You can do this in your Happy Hear dashboard now, or ask again tomorrow. If this looks wrong, email hello@happyhearaudio.com.The account already made 10 calls to this tool in the last 24 hours. The refusal is logged and does not count toward the limit.
Something went wrong on our side. Try again in a minute.An unexpected failure inside the write. Nothing was changed.

Limits

  • 60 requests per minute per operator across all actions, answered with HTTP 429 and a Retry-After header past that.
  • 10 successful calls per operator in any rolling 24 hours, the same on every plan. The refusal does not count toward the cap.

Worth knowing

  • requires_payment is true when the new event is locked. The dashboard link is where the operator unlocks it; no payment ever runs through the connector.
  • A note field appears when the account's free event is held for review.
  • Nothing else is set at creation: branding, player style, call-in and sharing are configured in the dashboard.
  • Not idempotent. Calling twice with the same name creates two events.
Claude and ChatGPT ask the operator to approve a write action before it runs unless the operator turns that off on their side. Design your client the same way: confirm before calling.

See also