MCP-Server

KaiCalls

com.kaicalls/kaicalls
Business & Betrieb Kommunikation Vertrieb & CRM Öffentlich und erreichbar MCP 2026-07-28

Was dieses MCP kann

Provides AI phone reception, outbound calling campaigns, call transcripts and recordings, lead management, routing, staff alerts, and business phone configuration.

add_team_phone
Add Team Phone
Add a teammate's (or the owner's) cell to the phone system's team ring group so it rings before Kai answers. Idempotent — a cell already in the group reports ring_group already_member. Owners and admins are also registered on the admin roster, so calling the business line from that cell reaches the admin secretary; a member only rings. The business's own forwarded-from office line is refused (forwarding_loop) because ringing it would bounce the call straight back. Requires the phone system to be set up first (set_up_phone_system). Mirrors POST /api/v1/phone-system action=add_ring_group_member.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['phone_number'], 'properties': {'name': {'type': 'string', 'description': 'Display name for this teammate (optional).'}, 'role': {'enum': ['owner', 'admin', 'member'], 'type': 'string', 'description': 'member only rings; owner and admin also get admin-secretary access from this cell. Defaults to admin.'}, 'business_id': {'type': 'string', 'description': 'Business ID (required when the token can access multiple businesses).'}, 'phone_number': {'type': 'string', 'description': 'The cell to add, US format (e.g. (908) 555-1234 or +19085551234).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'code': {'type': 'string', 'description': 'Present when success is false.'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'member': {'type': 'object', 'properties': {'name': {'type': ['string', 'null']}, 'role': {'type': 'string'}, 'ring_group': {'enum': ['added', 'already_member'], 'type': 'string'}, 'admin_roster': {'enum': ['registered', 'skipped_member_role', 'failed'], 'type': 'string'}, 'phone_number': {'type': 'string'}}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business_id': {'type': 'string'}}, 'additionalProperties': True}
attach_number
Attach Phone Number
Assign a phone number already in the KaiCalls registry pool to a business (and optionally route it directly to an agent). Does NOT purchase a new number — use search_available_numbers + buy_number for that. Mirrors POST /api/v1/phone-numbers.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['phone_number'], 'properties': {'agent_id': {'type': 'string', 'description': 'Agent ID to route this number to directly (optional).'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}, 'phone_number': {'type': 'string', 'description': 'E.164 phone number already in the registry.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'number': {'type': 'object'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business_id': {'type': 'string'}}, 'additionalProperties': True}
buy_number
Buy Phone Number
Request a real phone-number purchase. This is APPROVAL-GATED: the carrier bills immediately on execution, so the tool only prepares a request for authenticated owner review. Caller-supplied human_confirmed, dashboard_session, or system_policy fields never authorize execution. Relay the stored request and review URL to the owner; do not claim a number was purchased while approval is pending. Existing entitlement and carrier reservation checks still apply. Mirrors POST /api/v1/phone-numbers/purchase via numbers.purchase. On the acquisition surface, set_owner_phone must run first (or record a decline) — never buy a number for a signup with no way to be reached.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['phone_number'], 'properties': {'actor': {'type': 'object', 'description': 'Who is asking: { type: agent|human|system|integration, id, display_name }.'}, 'reason': {'type': 'string', 'description': 'Optional reason recorded in the durable audit.'}, 'dry_run': {'type': 'boolean', 'description': 'Validate tenant, scope, and policy without buying anything.'}, 'agent_id': {'type': 'string', 'description': 'Agent ID to route this number to directly once purchased (optional; requires the number to also be voice-runtime-imported, which is not guaranteed at purchase time — prefer a follow-up attach_number call).'}, 'authority': {'type': 'object', 'description': 'Attribution only. human_confirmed and other caller-supplied modes cannot authorize a purchase. Authenticated owner review of the exact stored request is required.'}, 'source_ref': {'type': 'string', 'description': 'External source reference, such as a ticket or automation run ID.'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}, 'phone_number': {'type': 'string', 'description': 'The exact E.164 phone number to purchase, as returned by search_available_numbers.'}, 'idempotency_key': {'type': 'string', 'description': 'Stable key for the purchase request; repeating it returns the original outcome. Defaults to a key derived from the phone number — pass your own to retry a previously failed purchase.'}, 'queue_for_approval': {'type': 'boolean', 'description': 'Create a durable owner-review request (default true). Setting false returns needs_approval, but an authority-envelope retry still cannot execute.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'code': {'type': ['string', 'null']}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'result': {'type': ['object', 'null'], 'description': 'On executed: { number, vapi_registered, agent_attached, compliance: { high_risk_category, disclosure_note } }.'}, 'status': {'type': 'string'}, 'message': {'type': ['string', 'null']}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'summary': {'type': ['object', 'null']}, 'approval': {'type': ['object', 'null']}, 'request_id': {'type': ['string', 'null']}, 'risk_level': {'type': ['string', 'null']}, 'business_id': {'type': ['string', 'null']}}, 'additionalProperties': True}
check_call_status
Check Call Status
Check the status of a call by its ID
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['call_id'], 'properties': {'call_id': {'type': 'string', 'description': 'The call ID to check'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'call': {'type': 'object', 'properties': {'id': {'type': 'string'}, 'status': {'type': 'string'}, 'lead_id': {'type': ['string', 'null']}, 'summary': {'type': ['string', 'null']}, 'agent_id': {'type': ['string', 'null']}, 'agent_name': {'type': ['string', 'null']}, 'created_at': {'type': 'string'}, 'business_id': {'type': 'string'}, 'recording_url': {'type': ['string', 'null']}, 'conversation_id': {'type': ['string', 'null']}, 'duration_seconds': {'type': ['number', 'null']}, 'quality_dimensions': {'type': ['object', 'array', 'null']}}}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}}, 'additionalProperties': True}
choose_customer_route
Choose Customer Route
APPROVAL-GATED. After setup proof is complete, save forwarding, published_number, both, or testing. This unlocks the command center but does not claim customer coverage; selected live routes remain pending until independently verified. A number is not fully set up until the owner's own phone is on file (see get_activation_status / set_owner_phone) and forwarding is verified.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': ['business_id', 'activation_session_id', 'choice', 'idempotency_key'], 'properties': {'choice': {'enum': ['forwarding', 'published_number', 'both', 'testing'], 'type': 'string'}, 'authority': {'type': 'object'}, 'business_id': {'type': 'string'}, 'source_phone': {'type': 'string', 'description': 'Existing business number, required for forwarding or both.'}, 'idempotency_key': {'type': 'string'}, 'activation_session_id': {'type': 'string'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'routes': {'type': 'array', 'items': {'type': 'object'}}, 'status': {'type': 'string'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business_id': {'type': 'string'}, 'instructions': {'type': 'array', 'items': {'type': 'string'}}, 'deployment_choice': {'type': 'string'}, 'activation_session_id': {'type': 'string'}, 'command_center_unlocked': {'type': 'boolean'}, 'customer_coverage_active': {'type': 'boolean'}}, 'additionalProperties': True}
configure_agent_business_rules
Configure Agent Business Rules
Safely add or replace a named operational rules section inside an agent inbound prompt, then route the prompt patch through the governed agent.patch broker. Use this for cross-business handoffs, callback language, alert promises, and client-specific operating rules without round-tripping the whole prompt manually.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['agent_id', 'rules'], 'properties': {'mode': {'type': 'string', 'description': 'replace (default) or append.'}, 'actor': {'type': 'object', 'description': 'Who is asking: { type: agent|human|system|integration, id, display_name }.'}, 'rules': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Plain-language operational rules to insert as bullets, e.g. callback capture, sister-location boundaries, urgent alert handling.'}, 'dry_run': {'type': 'boolean', 'description': 'Validate and show the prompt patch metadata without writing.'}, 'agent_id': {'type': 'string', 'description': 'KaiCalls agent ID to update'}, 'authority': {'type': 'object', 'description': 'Attribution only. Caller-supplied authority cannot authorize live changes; authenticated owner review of the stored request is required.'}, 'source_ref': {'type': 'string', 'description': 'External source reference, such as a support ticket or assistant conversation ID.'}, 'business_id': {'type': 'string', 'description': 'Business ID. Required when the agent has multiple accessible assignments.'}, 'section_title': {'type': 'string', 'description': 'Prompt section heading to replace/append. Default: Operational handoff rules.'}, 'idempotency_key': {'type': 'string', 'description': 'Required for writes. Reuse the same key when retrying the same proposed prompt change.'}, 'queue_for_approval': {'type': 'boolean', 'description': 'When authority is missing, create a pending dashboard approval instead of returning needs_approval.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'code': {'type': ['string', 'null']}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'result': {'type': ['object', 'null']}, 'status': {'type': 'string'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'summary': {'type': ['object', 'null']}, 'agent_id': {'type': ['string', 'null']}, 'approval': {'type': ['object', 'null']}, 'request_id': {'type': ['string', 'null']}, 'business_id': {'type': ['string', 'null']}, 'rules_count': {'type': ['integer', 'null']}, 'section_title': {'type': ['string', 'null']}}, 'additionalProperties': True}
configure_staff_alerts
Configure Staff Alerts
Save business-owned staff alert recipients and post-call escalation rules. Saving settings does not prove provider delivery or owner receipt; activation notification proof is tracked separately.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'properties': {'dry_run': {'type': 'boolean', 'description': 'Validate and show the proposed settings without writing.'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token has exactly one accessible business)'}, 'escalation_rules': {'type': 'array', 'items': {'type': 'object', 'required': ['when'], 'properties': {'id': {'type': 'string'}, 'then': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Action keys. v1 supports text_owner.'}, 'when': {'type': 'string', 'description': 'Natural-language trigger, e.g. "Caller needs a same-day callback from the recovery room".'}, 'enabled': {'type': 'boolean'}}}, 'description': 'Post-call escalation rules evaluated against completed transcripts. Each rule is { id?, when, then, enabled? }. v1 action then includes text_owner.'}, 'sms_notifications': {'type': 'boolean', 'description': 'Enable or disable SMS staff alerts for this business.'}, 'notification_email': {'type': ['string', 'array'], 'items': {'type': 'string'}, 'description': 'Comma-separated string or array of staff email addresses that receive escalation emails.'}, 'notification_phone': {'type': ['string', 'array'], 'items': {'type': 'string'}, 'description': 'Comma-separated string or array of staff phone numbers that receive SMS escalation alerts.'}, 'email_notifications': {'type': 'boolean', 'description': 'Enable or disable email staff alerts for this business.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'dry_run': {'type': 'boolean'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'settings': {'type': 'object'}, 'business_id': {'type': 'string'}, 'current_settings': {'type': ['object', 'null']}, 'proposed_settings': {'type': 'object'}}, 'additionalProperties': True}
configure_textable_links
Configure Textable Links
Create or repair the business_links entries used by the send_link/send_sms tools. Use this when callers need booking, directions, cancellation, sister-location, or service-specific links texted without exposing raw URLs in the voice prompt.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': ['links'], 'properties': {'links': {'type': 'array', 'items': {'type': 'object', 'properties': {'label': {'type': 'string', 'description': 'Human label for the link.'}, 'link_key': {'type': 'string', 'description': 'Snake_case key the agent/tool uses, e.g. recovery_directions.'}, 'is_active': {'type': 'boolean', 'description': 'Whether this link can be sent.'}, 'destination_url': {'type': 'string', 'description': 'HTTPS destination URL. kaicalls.com destinations are rejected.'}}}, 'description': 'Links to create/update by link_key. New links require label and destination_url. Existing links can be deactivated with is_active=false.'}, 'dry_run': {'type': 'boolean', 'description': 'Validate and show create/update plan without writing.'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token has exactly one accessible business)'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'plan': {'type': 'array', 'items': {'type': 'object'}}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'links': {'type': 'array', 'items': {'type': 'object'}}, 'dry_run': {'type': 'boolean'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business_id': {'type': 'string'}}, 'additionalProperties': True}
confirm_notification_destination
Confirm Activation Notification Destination
APPROVAL-GATED. Save the owner-approved SMS or email destination for the exact active activation session. Delivery starts only when the inbound call artifact is ready, and settings alone never count as delivery proof.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': ['business_id', 'activation_session_id', 'channel', 'destination', 'idempotency_key'], 'properties': {'channel': {'enum': ['sms', 'email'], 'type': 'string'}, 'authority': {'type': 'object'}, 'business_id': {'type': 'string'}, 'destination': {'type': 'string'}, 'idempotency_key': {'type': 'string'}, 'activation_session_id': {'type': 'string'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'status': {'type': 'string'}, 'attempt': {'type': ['object', 'null']}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business_id': {'type': 'string'}, 'delivery_started': {'type': 'boolean'}, 'destination_masked': {'type': ['string', 'null']}, 'activation_session_id': {'type': 'string'}}, 'additionalProperties': True}
create_agent
Create Agent
Create a new KaiCalls agent — the secretary that answers this business’s calls (the live voice agent plus KaiCalls records) — with a system prompt, greeting, voice, and model. Mirrors POST /api/v1/agents. Every subsequent mutation to this agent is versioned (assistant_config_versions) and reversible via rollback_config — inspect history with get_change_history / list_config_versions. Compliance: KaiCalls automatically applies state-aware AI-disclosure and consent handling to every agent it provisions, and flags high-risk business categories for extra review.
Externer Zugriff
Eingabeschema
{'type': 'object', 'required': ['business_id', 'name', 'system_prompt'], 'properties': {'name': {'type': 'string', 'description': 'Agent display name.'}, 'model': {'type': 'object', 'description': 'Language model selection: { provider, model, temperature } (optional).'}, 'voice': {'type': 'object', 'description': 'Raw voice selection: { provider, voiceId } (optional).'}, 'metadata': {'type': 'object', 'description': 'Extra KaiCalls metadata to store (optional).'}, 'business_id': {'type': 'string', 'description': 'Business ID to create the agent under.'}, 'first_message': {'type': 'string', 'description': 'Spoken greeting (optional).'}, 'system_prompt': {'type': 'string', 'description': "The agent's inbound system prompt / instructions."}, 'voice_catalog_id': {'type': 'string', 'description': 'Preferred: a curated catalog id from list_voices (optional).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'agent': {'type': 'object'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'compliance': {'type': 'object', 'properties': {'disclosure_note': {'type': 'string'}, 'high_risk_category': {'type': 'boolean'}}}}, 'additionalProperties': True}
create_campaign
Create Campaign
Create an outbound call campaign (cadence + lead batch) and optionally launch it immediately. Launching queues calls for the orchestrator; existing TCPA/consent gating still applies at dial time. Requires admin role on the business.
Destruktiv Externer Zugriff
Eingabeschema
{'type': 'object', 'required': ['name', 'cadence_config'], 'properties': {'name': {'type': 'string', 'description': 'Campaign name.'}, 'launch': {'type': 'boolean', 'description': 'When true, launch the campaign immediately after creating it.'}, 'agent_id': {'type': 'string', 'description': 'Agent ID to place the calls. Required when launch is true.'}, 'lead_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Lead IDs to enroll in the campaign (optional at create time).'}, 'business_id': {'type': 'string', 'description': 'Business ID (required only when the token can access multiple businesses).'}, 'description': {'type': 'string', 'description': 'Optional campaign description.'}, 'cadence_config': {'type': 'object', 'properties': {'attempts': {'type': 'integer', 'maximum': 10, 'minimum': 1}, 'template': {'type': 'string'}}, 'description': 'Cadence configuration. { template: standard|aggressive|nurture|custom, attempts: number }.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'queued': {'type': ['integer', 'null']}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'campaign': {'type': 'object'}, 'launched': {'type': 'boolean'}, 'sequence_id': {'type': ['string', 'null']}, 'total_leads': {'type': ['integer', 'null']}}, 'additionalProperties': True}
create_checkout
Create or Resume Checkout
Create or resume an owner-bound hosted Stripe checkout for a current plan from list_plans. Requires business_id, plan_id, and a durable idempotency_key. Reuse the same key for retries; a changed plan requires a new key. The owner must open the returned link and authorize payment in Stripe. This tool never proves payment or phone activation. After checkout, use get_checkout_status with the returned session_id.
Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['business_id', 'plan_id', 'idempotency_key'], 'properties': {'plan_id': {'type': 'string'}, 'business_id': {'type': 'string'}, 'idempotency_key': {'type': 'string', 'maxLength': 128, 'minLength': 8}}, 'additionalProperties': False}
delete_webhook
Delete Webhook
Remove a business outbound webhook by ID. Mirrors DELETE /api/v1/webhooks.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Webhook ID to remove.'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'message': {'type': 'string'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business_id': {'type': 'string'}}, 'additionalProperties': True}
detach_number
Detach Phone Number
Release a phone number from a business back to the unassigned registry pool. Mirrors DELETE /api/v1/phone-numbers.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': ['phone_number'], 'properties': {'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}, 'phone_number': {'type': 'string', 'description': 'E.164 phone number to release.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean'}, 'business_id': {'type': 'string'}, 'released_phone_number': {'type': 'string'}}, 'additionalProperties': True}
get_activation_status
Get Activation Status
Read the persisted proof-first activation status for one accessible business. Returns masked evidence, the exact next action, and whether the command center/full MCP surface is unlocked. It cannot assert or advance proof. A number is not fully set up until the owner's own phone is on file (see owner_phone_on_file) and forwarding is verified — do not report the line as live/working on the strength of proof state alone.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token reaches exactly one business).'}, 'oauth_transaction_id': {'type': 'string', 'description': 'Opaque OAuth transaction identifier used only to bind a completed receipt.'}, 'activation_session_id': {'type': 'string', 'description': 'Optional exact session ID. A superseded or foreign session is rejected.'}, 'origin_conversation_id': {'type': 'string', 'description': 'Opaque client conversation identifier used only to bind a completed receipt.'}, 'receipt_idempotency_key': {'type': 'string', 'description': 'Client key for replay-safe delivery of a completed activation receipt.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'proof': {'type': 'object'}, 'state': {'type': ['string', 'null']}, 'routes': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business_id': {'type': 'string'}, 'next_action': {'type': 'string'}, 'activation_receipt': {'type': ['object', 'null']}, 'owner_phone_on_file': {'type': 'boolean', 'description': "Whether the owner's own mobile number is on file. False means no SMS nudge, ring-first, or forwarding verification can reach a human — the line is not fully set up regardless of proof state."}, 'activation_session_id': {'type': ['string', 'null']}, 'notification_attempts': {'type': 'array', 'items': {'type': 'object'}}, 'command_center_unlocked': {'type': 'boolean'}}, 'additionalProperties': True}
get_analytics
Get Analytics
Get a dashboard summary (lead counts by status, conversion rate, call volume and duration, top agents, and business outcomes by type) over a recent time window.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'days': {'type': 'integer', 'maximum': 90, 'minimum': 1, 'description': 'Lookback window in days (default 30, max 90)'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'calls': {'type': 'object'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'leads': {'type': 'object'}, 'agents': {'type': 'object'}, 'period': {'type': 'object'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'outcomes': {'type': 'object'}, 'outcomes_total': {'type': 'integer'}}, 'additionalProperties': True}
get_balance
Get Balance
Get plan terms and usage for accessible businesses. No-card trials report 25 lifetime minutes, zero price and no overage; paid plans report the mapped subscription price and billing-cycle usage. Answered-call allowance usage is the raw billable call count, matching dashboard and right-sizing. A separate weighted count is informational only, not allowance consumption or right-sizing. Phone allowance includes purchased extra lines. A balance does not prove activation or inbound routing. Mirrors GET /api/v1/balance; unavailable billing data returns an error.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'businesses': {'type': 'array', 'items': {'type': 'object', 'required': ['business_id', 'plan_key', 'plan_name', 'price_monthly', 'allowance_model', 'minutes_used', 'minutes_allowance', 'answered_calls_used', 'answered_calls_raw', 'answered_calls_weighted', 'answered_calls_allowance', 'phone_numbers', 'phone_numbers_allowance', 'subscription_status', 'overage_allowed', 'period_start', 'period_end', 'period_kind'], 'properties': {'plan_key': {'type': 'string'}, 'plan_name': {'type': 'string'}, 'period_end': {'type': ['string', 'null'], 'description': 'Null for lifetime trial usage; does not imply the trial cannot expire.'}, 'business_id': {'type': 'string'}, 'period_kind': {'enum': ['lifetime_trial', 'billing_cycle'], 'type': 'string'}, 'minutes_used': {'type': 'number'}, 'period_start': {'type': 'string'}, 'phone_numbers': {'type': 'integer', 'description': 'Active registered numbers, including unassigned numbers.'}, 'price_monthly': {'type': 'number', 'description': 'Mapped subscription base price in USD; zero for no-card trial. Excludes add-ons and tax.'}, 'allowance_model': {'enum': ['minutes', 'answered_calls'], 'type': 'string'}, 'overage_allowed': {'type': 'boolean'}, 'minutes_allowance': {'type': 'number'}, 'answered_calls_raw': {'type': ['number', 'null'], 'description': 'Unweighted billable call count for reporting.'}, 'answered_calls_used': {'type': ['number', 'null'], 'description': 'Raw billable call count used for allowance reporting, matching dashboard and right-sizing; null for minute plans.'}, 'subscription_status': {'type': 'string'}, 'answered_calls_weighted': {'type': ['number', 'null'], 'description': 'Informational only, not allowance consumption or right-sizing: ordinary calls 1, human-answered silent-listen calls 0.5; null for minute plans.'}, 'phone_numbers_allowance': {'type': 'integer'}, 'answered_calls_allowance': {'type': ['number', 'null']}}}}}, 'additionalProperties': True}
get_business_info
Get Business Info
Read back what a business already has: profile details, how many agents are configured, and recent call volume. Start here when someone wants a business number that answers missed calls, so nothing is created twice.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'business_id': {'type': 'string', 'description': 'Business ID (optional, defaults to first accessible business)'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business': {'type': 'object'}, 'agent_count': {'type': 'integer'}, 'calls_last_30_days': {'type': 'integer'}}, 'additionalProperties': True}
get_call_recording
Get Call Recording
Get the real call recording URL for a call so reviewers can listen to the voice/audio instead of relying only on the transcript.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['call_id'], 'properties': {'call_id': {'type': 'string', 'description': 'The KaiCalls call ID to get the recording for'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'call': {'type': 'object', 'properties': {'id': {'type': 'string'}, 'status': {'type': 'string'}, 'agent_id': {'type': ['string', 'null']}, 'agent_name': {'type': ['string', 'null']}, 'created_at': {'type': 'string'}, 'business_id': {'type': 'string'}, 'recording_url': {'type': ['string', 'null']}, 'conversation_id': {'type': ['string', 'null']}, 'duration_seconds': {'type': ['number', 'null']}}}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'recording_available': {'type': 'boolean'}}, 'additionalProperties': True}
get_change_history
Get Agent Change History
List an agent's recent config-change audit trail (change_type, change_source, old/new value, timestamp) from admin_change_history — the same record the admin_get_change_history voice tool reads over the phone. Every mutation KaiCalls makes to an agent (via update_agent_config, configure_agent_business_rules, the admin call-in secretary, or the dashboard) is logged here and reversible with rollback_config.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['agent_id'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Max results to return (default 20, max 100).'}, 'agent_id': {'type': 'string', 'description': 'Agent ID to fetch change history for.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'changes': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'agent_id': {'type': 'string'}}, 'additionalProperties': True}
get_checkout_status
Get Checkout Status
Read a Stripe-verified subscription checkout receipt for a business you own. Requires business_id and session_id from checkout. Confirmed billing does not prove agent, number, or call activation; use get_activation_status for setup proof. This tool never creates checkout or retries provisioning.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['business_id', 'session_id'], 'properties': {'session_id': {'type': 'string'}, 'business_id': {'type': 'string'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'checkout': {'type': 'object'}, 'billing_only': {'type': 'boolean'}, 'activation_verified': {'type': 'boolean'}}, 'additionalProperties': True}
get_conversation
Get SMS Conversation
Get a single SMS conversation thread by ID. Mirrors GET /api/v1/sms/conversations?id=.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['conversation_id'], 'properties': {'conversation_id': {'type': 'string', 'description': 'The conversation ID to fetch.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'conversation': {'type': 'object'}}, 'additionalProperties': True}
get_extra_number_status
Get Extra Number Request Status
Read an owner-authorized extra-number request. Billing, assignment and live activation are distinct. Unknown checkout or provider outcomes retain the original request and number; never start a replacement purchase.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['business_id', 'request_id'], 'properties': {'request_id': {'type': 'string'}, 'business_id': {'type': 'string'}}, 'additionalProperties': False}
get_lead
Get Lead
Get full details for a single lead by ID, including the latest AI lead score and explanation.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['lead_id'], 'properties': {'lead_id': {'type': 'string', 'description': 'The lead ID to fetch'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'lead': {'type': 'object'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}}, 'additionalProperties': True}
get_operational_settings
Get Operational Settings
Audit the business-level operational setup required before changing a live account: staff alert recipients, SMS/email alert flags, escalation rules, textable send-link entries, and assigned agent voice/model/greeting metadata.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'business_id': {'type': 'string', 'description': 'Business ID (optional, defaults to first accessible business)'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'agents': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business': {'type': 'object'}, 'business_links': {'type': 'array', 'items': {'type': 'object'}}, 'available_setup_tools': {'type': 'array', 'items': {'type': 'string'}}, 'notification_settings': {'type': ['object', 'null']}}, 'additionalProperties': True}
get_phone_flow
Get Phone Flow
Read how calls ring on the business's hosted phone system: which cells and desk phones ring, for how many seconds, and whether after-hours callers go straight to the AI receptionist. Reconciled from the phone system on every call. Mirrors POST /api/v1/phone-system action=get_flow. Returns 409 when the hosted phone system is not set up for this business.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'business_id': {'type': 'string', 'description': 'Business ID (required when the token can access multiple businesses).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'flow': {'type': 'object'}, 'line': {'type': ['string', 'null']}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'readback': {'type': 'string', 'description': 'One-sentence plain-English description.'}, 'kai_extension': {'type': 'string'}, 'business_hours_available': {'type': 'boolean'}}, 'additionalProperties': True}
get_phone_system_status
Get Phone System Status
Read whether the business's hosted phone system is set up: Kai's extension, the team ring group and dial plan ids (never secrets), the phone-system line, and `next_step` — the one line to relay to the owner. Use it to confirm a set_up_phone_system run or before adding team phones. Mirrors GET /api/v1/phone-system.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'business_id': {'type': 'string', 'description': 'Business ID (required when the token can access multiple businesses).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'ids': {'type': 'object'}, 'line': {'type': ['string', 'null']}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'next_step': {'type': 'string'}, 'business_id': {'type': 'string'}, 'provisioned': {'type': 'boolean'}, 'kai_extension': {'type': ['string', 'null']}, 'provisioned_at': {'type': ['string', 'null']}}, 'additionalProperties': True}
get_setup_recovery_status
Get Setup Recovery Status
Read an owner-authorized setup recovery request by its business and idempotency key. Running requests are never automatically stolen, including stale requests. A ready receipt does not prove live activation.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['business_id', 'idempotency_key'], 'properties': {'business_id': {'type': 'string'}, 'idempotency_key': {'type': 'string'}}, 'additionalProperties': False}
get_text_registration
Get Text Registration
Read where a business stands on its own carrier registration for business texting: saved details (never the EIN; only whether one is on file), payment, filing stage, whether sales texts are allowed, and the one next step. Also returns `known` (details already on file from signup, the owner's account and any caller ID registration, to confirm with the owner) `missing` (only the questions still to ask, in order, each with a one-line `why` the carriers need it) and `next_question` (ask the owner this one, then the next). Mirrors the dashboard's text registration page. Read-only.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['business_id'], 'properties': {'business_id': {'type': 'string'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'addon': {'type': 'object'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'known': {'type': 'object'}, 'chasers': {'type': 'object'}, 'missing': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'next_step': {'type': 'string'}, 'setup_url': {'type': 'string'}, 'ein_on_file': {'type': 'boolean'}, 'registration': {'type': ['object', 'null']}, 'next_question': {'type': ['object', 'null']}, 'next_step_text': {'type': 'string'}}, 'additionalProperties': True}
get_transcript
Get Transcript
Get the transcript and summary of a completed call
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['call_id'], 'properties': {'call_id': {'type': 'string', 'description': 'The call ID to get the transcript for'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'call': {'type': 'object'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'transcript': {'type': ['string', 'null']}, 'transcript_length': {'type': 'integer'}, 'transcript_available': {'type': 'boolean'}, 'transcript_truncated': {'type': 'boolean'}}, 'additionalProperties': True}
get_usage
Get API Usage
List recent API usage events (endpoint, method, status code, cost) for the caller's account. Mirrors GET /api/v1/usage.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'end': {'type': 'string', 'description': 'ISO date/time upper bound (optional).'}, 'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Max results to return (default 100, max 500).'}, 'start': {'type': 'string', 'description': 'ISO date/time lower bound (optional).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'usage': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'has_more': {'type': 'boolean'}}, 'additionalProperties': True}
get_webhook
Get Webhook Configuration
List the configured outbound webhook(s) for a business, including supported event types. Mirrors GET /api/v1/webhooks.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'events': {'type': 'array', 'items': {'type': 'string'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'webhooks': {'type': 'array', 'items': {'type': 'object'}}, 'business_id': {'type': 'string'}}, 'additionalProperties': True}
list_agents
List Agents
List the KaiCalls agents on the authenticated account. Use this before setting anything up, to see whether this business already has a secretary answering its calls.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Max results to return (default 50, max 100)'}, 'offset': {'type': 'integer', 'minimum': 0, 'description': 'Zero-based pagination offset (default 0)'}, 'business_id': {'type': 'string', 'description': 'Business ID to filter by (optional, must be accessible)'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'count': {'type': 'integer'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'limit': {'type': 'integer'}, 'agents': {'type': 'array', 'items': {'type': 'object'}}, 'offset': {'type': 'integer'}, 'filters': {'type': 'object'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'has_more': {'type': 'boolean'}, 'next_offset': {'type': ['integer', 'null']}}, 'additionalProperties': True}
list_campaigns
List Campaigns
List outbound call campaigns for the authenticated business.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Max results to return (default 25, max 100)'}, 'offset': {'type': 'integer', 'minimum': 0, 'description': 'Zero-based pagination offset (default 0)'}, 'status': {'type': 'string', 'description': 'Filter by campaign status (optional)'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'count': {'type': 'integer'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'limit': {'type': 'integer'}, 'offset': {'type': 'integer'}, 'filters': {'type': 'object'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'has_more': {'type': 'boolean'}, 'campaigns': {'type': 'array', 'items': {'type': 'object'}}, 'next_offset': {'type': ['integer', 'null']}}, 'additionalProperties': True}
list_config_versions
List Agent Config Versions
List an agent's hashed, redacted assistant config version history (rollback lineage included). Pass `version` to fetch one version's full redacted config_snapshot instead of the list. Mirrors GET /api/v1/agents/versions.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['agent_id'], 'properties': {'limit': {'type': 'integer', 'description': 'Max versions to return when listing (optional, default 50, max 100).'}, 'version': {'type': 'integer', 'description': 'Fetch a single version by its per-agent version_number, including its redacted config_snapshot (optional; omit to list).'}, 'agent_id': {'type': 'string', 'description': 'Agent ID (required).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'version': {'type': ['object', 'null']}, 'agent_id': {'type': 'string'}, 'versions': {'type': 'array', 'items': {'type': 'object'}}}, 'additionalProperties': True}
list_conversations
List SMS Conversations
List SMS conversation threads (counterparty timeline metadata) for the authenticated business, most recent first. Mirrors GET /api/v1/sms/conversations.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Max results to return (default 50, max 100).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'has_more': {'type': 'boolean'}, 'conversations': {'type': 'array', 'items': {'type': 'object'}}}, 'additionalProperties': True}
list_evals
List Agent Evals
List canned mock-conversation eval scenarios for an agent (or all accessible agents). Mirrors GET /api/v1/evals.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'agent_id': {'type': 'string', 'description': 'Filter by agent ID (optional).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'evals': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}}, 'additionalProperties': True}
list_knowledge
List Agent Knowledge
List agent knowledge base entries for a business. Mirrors GET /api/v1/knowledge.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'query': {'type': 'string', 'description': 'Free-text search over title/content (optional).'}, 'category': {'type': 'string', 'description': 'Filter by category (optional).'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'knowledge': {'type': 'array', 'items': {'type': 'object'}}}, 'additionalProperties': True}
list_leads
List Leads
List leads for the authenticated business, with optional status/source/agent filters. Includes the latest AI lead score when available.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Max results to return (default 50, max 100)'}, 'offset': {'type': 'integer', 'minimum': 0, 'description': 'Zero-based pagination offset (default 0)'}, 'source': {'type': 'string', 'description': 'Filter by lead source (optional)'}, 'status': {'type': 'string', 'description': 'Filter by lead status (optional)'}, 'agent_id': {'type': 'string', 'description': 'Filter by agent ID (optional)'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'count': {'type': 'integer'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'leads': {'type': 'array', 'items': {'type': 'object'}}, 'limit': {'type': 'integer'}, 'offset': {'type': 'integer'}, 'filters': {'type': 'object'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'has_more': {'type': 'boolean'}, 'next_offset': {'type': ['integer', 'null']}}, 'additionalProperties': True}
list_numbers
List Phone Numbers
List phone numbers assigned to the accessible business(es), with capability and compliance flags. Assignment does not prove inbound routing, activation, or customer coverage — and a number is not fully set up until the owner's own phone is on file (see get_activation_status / set_owner_phone) and forwarding is verified. Mirrors GET /api/v1/numbers.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'business_id': {'type': 'string', 'description': 'Business ID to filter by (optional).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'numbers': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}}, 'additionalProperties': True}
list_observability_events
List Observability Events
List a business-scoped timeline of compact call-runtime events and redacted integration-delivery attempts. Mirrors GET /api/v1/observability-events and uses bounded keyset pagination.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'to': {'type': 'string', 'format': 'date-time'}, 'from': {'type': 'string', 'format': 'date-time'}, 'limit': {'type': 'integer', 'default': 50, 'maximum': 100, 'minimum': 1}, 'cursor': {'type': 'string', 'description': 'Opaque next_cursor returned by the previous page.'}, 'source': {'enum': ['all', 'runtime', 'delivery'], 'type': 'string', 'description': 'Event stream to read (default: all).'}, 'call_id': {'type': 'string', 'description': 'Runtime-event call UUID filter.'}, 'outcome': {'enum': ['success', 'failure'], 'type': 'string', 'description': 'Integration-delivery filter.'}, 'provider': {'type': 'string', 'description': 'Integration-delivery filter.'}, 'severity': {'enum': ['info', 'warning', 'error'], 'type': 'string', 'description': 'Runtime-event filter.'}, 'object_id': {'type': 'string', 'description': 'Integration-delivery filter.'}, 'operation': {'type': 'string', 'description': 'Integration-delivery filter.'}, 'event_type': {'type': 'string', 'description': 'Runtime-event filter.'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}, 'object_type': {'type': 'string', 'description': 'Integration-delivery filter.'}, 'connection_id': {'type': 'string', 'description': 'Integration connection UUID filter.'}, 'correlation_id': {'type': 'string', 'description': 'Runtime-event filter.'}, 'conversation_id': {'type': 'string', 'description': 'Runtime-event filter.'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'events': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'pagination': {'type': 'object', 'properties': {'limit': {'type': 'integer'}, 'has_more': {'type': 'boolean'}, 'next_cursor': {'type': ['string', 'null']}}}, 'business_id': {'type': 'string'}}, 'additionalProperties': True}
list_overage_charges
List Overage Charges
List the idempotent overage-minutes ledger from billing_overage_charges (legacy per-minute-overage tiers only — 2026 plans carry no overage). GET /v1/balance/get_balance only returns an aggregate; this returns the underlying per-period ledger rows. Mirrors GET /api/v1/overage-charges.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'to': {'type': 'string', 'format': 'date-time'}, 'from': {'type': 'string', 'format': 'date-time'}, 'limit': {'type': 'integer', 'default': 50, 'maximum': 100, 'minimum': 1}, 'status': {'enum': ['pending', 'synced', 'skipped', 'error'], 'type': 'string'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'charges': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business_id': {'type': 'string'}}, 'additionalProperties': True}
list_plans
List Plans
Read the canonical public KaiCalls plan catalog, monthly USD prices and allowances. Does not select a plan, create checkout, or change billing.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'plans': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}}, 'additionalProperties': True}
list_products
List Agent Products
List a business's agent product catalog. Mirrors GET /api/v1/products.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'query': {'type': 'string', 'description': 'Free-text search over name/description (optional).'}, 'category': {'type': 'string', 'description': 'Filter by category (optional).'}, 'inventory': {'type': 'boolean', 'description': 'Include current inventory quantity per product (optional).'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'products': {'type': 'array', 'items': {'type': 'object'}}}, 'additionalProperties': True}
list_recent_calls
List Recent Calls
List recent calls for the authenticated business
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Max results to return (default 20, max 100)'}, 'offset': {'type': 'integer', 'minimum': 0, 'description': 'Zero-based pagination offset (default 0)'}, 'status': {'type': 'string', 'description': 'Filter by status (optional)'}, 'agent_id': {'type': 'string', 'description': 'Filter by agent ID (optional)'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'calls': {'type': 'array', 'items': {'type': 'object'}}, 'count': {'type': 'integer'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'limit': {'type': 'integer'}, 'offset': {'type': 'integer'}, 'filters': {'type': 'object'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'has_more': {'type': 'boolean'}, 'next_offset': {'type': ['integer', 'null']}}, 'additionalProperties': True}
list_rightsize_recommendations
List Plan Right-Size Recommendations
List per-period auto-right-size decisions from plan_rightsize_recommendations, including the dry_run -> notified -> (kept | applied | superseded) lifecycle. Answers "is this business about to get right-sized". Mirrors GET /api/v1/rightsize-recommendations.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'to': {'type': 'string', 'format': 'date-time'}, 'from': {'type': 'string', 'format': 'date-time'}, 'limit': {'type': 'integer', 'default': 50, 'maximum': 100, 'minimum': 1}, 'action': {'enum': ['none', 'upgrade', 'downgrade', 'handoff_custom'], 'type': 'string'}, 'status': {'enum': ['dry_run', 'notified', 'kept', 'applied', 'superseded'], 'type': 'string'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business_id': {'type': 'string'}, 'recommendations': {'type': 'array', 'items': {'type': 'object'}}}, 'additionalProperties': True}
list_sms_messages
List SMS Messages
List recent SMS messages for the authenticated business. Filter by conversation or direction (inbound/outbound).
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Max results to return (default 50, max 100)'}, 'offset': {'type': 'integer', 'minimum': 0, 'description': 'Zero-based pagination offset (default 0)'}, 'direction': {'type': 'string', 'description': 'Filter by direction: inbound or outbound (optional)'}, 'conversation_id': {'type': 'string', 'description': 'Filter by conversation ID (optional)'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'count': {'type': 'integer'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'limit': {'type': 'integer'}, 'offset': {'type': 'integer'}, 'filters': {'type': 'object'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'has_more': {'type': 'boolean'}, 'messages': {'type': 'array', 'items': {'type': 'object'}}, 'next_offset': {'type': ['integer', 'null']}}, 'additionalProperties': True}
list_subscription_history
List Subscription Change History
List plan/price change history from subscription_change_history — the billing analogue of admin_change_history, written from the Stripe webhook and the right-size apply job. Mirrors GET /api/v1/subscription-history.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'to': {'type': 'string', 'format': 'date-time'}, 'from': {'type': 'string', 'format': 'date-time'}, 'limit': {'type': 'integer', 'default': 50, 'maximum': 100, 'minimum': 1}, 'source': {'type': 'string', 'description': 'e.g. stripe_webhook, rightsize_apply_job.'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}, 'change_type': {'enum': ['plan_change', 'created', 'canceled', 'reactivated', 'rightsize'], 'type': 'string'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'changes': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business_id': {'type': 'string'}}, 'additionalProperties': True}
list_tool_execution_logs
List Tool Execution Logs
List per-call voice-agent tool execution traces — outcome, latency, timeout, and a redacted result preview for each routed tool call. Mirrors GET /api/v1/tool-execution-logs. Answers "did this tool call actually work".
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'to': {'type': 'string', 'format': 'date-time'}, 'from': {'type': 'string', 'format': 'date-time'}, 'limit': {'type': 'integer', 'default': 50, 'maximum': 100, 'minimum': 1}, 'call_id': {'type': 'string', 'description': 'Call/conversation id filter.'}, 'tool_name': {'type': 'string', 'description': 'Tool name filter (e.g. send_sms).'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}, 'tool_call_id': {'type': 'string', 'description': 'Exact tool_call_id filter.'}, 'outcome_status': {'type': 'string', 'description': 'Outcome envelope status filter (e.g. success, needs_clarification, unavailable, queued, retryable_delay, hard_failure).'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'logs': {'type': 'array', 'items': {'type': 'object'}}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business_id': {'type': 'string'}}, 'additionalProperties': True}
list_voicemails
List Voicemails
List recent voicemails for the authenticated business, including transcripts and recording URLs.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Max results to return (default 20, max 100)'}, 'offset': {'type': 'integer', 'minimum': 0, 'description': 'Zero-based pagination offset (default 0)'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'count': {'type': 'integer'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'limit': {'type': 'integer'}, 'offset': {'type': 'integer'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'has_more': {'type': 'boolean'}, 'voicemails': {'type': 'array', 'items': {'type': 'object'}}, 'next_offset': {'type': ['integer', 'null']}}, 'additionalProperties': True}
list_voices
List Voice Catalog
List the curated, credential-free voice catalog (id, display name, accent, language, gender, sample URL) used to configure agent voices. Mirrors GET /api/v1/voices.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'gender': {'type': 'string', 'description': 'Filter by gender: male or female.'}, 'language': {'type': 'string', 'description': 'Filter by language label, e.g. English or Spanish.'}, 'provider': {'type': 'string', 'description': 'Filter by voice provider id, e.g. 11labs or azure.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'voices': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}}, 'additionalProperties': True}
list_workflow_templates
List Workflow Templates
List the cadence/campaign workflow templates KaiCalls can run (standard, aggressive, nurture, custom), including each template's retry interval, defaults (call windows, days, attempts), and a ready-to-use cadence_config example. Call this before create_campaign so an external agent can trigger a multi-step sequence with launch=true instead of guessing the cadence_config shape blind. Static catalog — no per-business state.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'usage': {'type': 'string'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'defaults': {'type': 'object'}, 'templates': {'type': 'array', 'items': {'type': 'object'}}, 'cadence_config_fields': {'type': 'array', 'items': {'type': 'object'}}}, 'additionalProperties': True}
make_call
Make Call
Place an outbound call through a KaiCalls AI agent: a voice preview so the owner can hear Kai, or a call made on the owner's behalf (a landlord, clinic, pharmacy, school or utility) with the task in context. A call never proves inbound routing or advances activation. When the person asking writes in another language, pass report_language so Kai gathers exact details and the result is relayed in that language; Kai speaks call_language (English by default) on the phone. Requires a plan with a card on file. Pass an idempotency_key to make the request safely retryable.
Destruktiv Externer Zugriff
Eingabeschema
{'type': 'object', 'required': ['agent_id', 'to'], 'properties': {'to': {'type': 'string', 'description': 'Phone number to call (E.164 format, e.g. +19085551234)'}, 'name': {'type': 'string', 'description': 'Caller/lead name (optional)'}, 'context': {'type': 'string', 'description': 'Call context or reason (optional)'}, 'lead_id': {'type': 'string', 'description': 'Existing lead ID to associate (optional)'}, 'agent_id': {'type': 'string', 'description': 'KaiCalls agent ID to use for the call'}, 'call_language': {'enum': ['en', 'es'], 'type': 'string', 'description': 'Language Kai speaks on the call (optional, default en)'}, 'first_message': {'type': 'string', 'description': 'Override the agent greeting message (optional)'}, 'idempotency_key': {'type': 'string', 'description': 'Client-chosen key that makes this call exactly-once: retries with the same key never place a second call (optional but recommended)'}, 'report_language': {'type': 'string', 'description': 'Language the person asking reads, as a code or name (e.g. ar, ht, tr, bn, es, zh, vi). Kai confirms names, dates and numbers so the result can be relayed in this language (optional)'}, 'connector_activation_call': {'type': 'boolean', 'description': 'True only for the one-time connector activation call the recipient explicitly requested in this conversation. This is not permission for marketing, SMS, or future calls.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'call': {'type': 'object', 'properties': {'id': {'type': ['string', 'null']}, 'to': {'type': 'string'}, 'status': {'type': 'string'}, 'lead_id': {'type': ['string', 'null']}, 'agent_id': {'type': 'string'}, 'business_id': {'type': 'string'}, 'conversation_id': {'type': ['string', 'null']}}}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'replayed': {'type': 'boolean'}, 'intent_id': {'type': 'string'}, 'preview_only': {'type': 'boolean'}, 'call_language': {'type': 'string'}, 'idempotency_key': {'type': 'string'}, 'report_language': {'type': 'string'}, 'counts_toward_activation': {'type': 'boolean'}}, 'additionalProperties': True}
report_issue
Report an Issue
Report a problem with your KaiCalls agent, phone number, billing, or account. Saves the report to your change history and notifies KaiCalls support so a person can follow up — use this any time something is broken or not working as expected.
Eingabeschema
{'type': 'object', 'required': ['summary', 'description'], 'properties': {'summary': {'type': 'string', 'description': 'One-line summary of the problem (max 200 characters).'}, 'category': {'enum': ['agent_behavior', 'call_quality', 'billing', 'integration', 'phone_number', 'other'], 'type': 'string', 'default': 'other', 'description': 'What part of the product this issue relates to.'}, 'severity': {'enum': ['low', 'medium', 'high', 'urgent'], 'type': 'string', 'default': 'medium', 'description': 'How badly this is affecting the business.'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}, 'description': {'type': 'string', 'description': 'Full details: what happened, what you expected, and any relevant call or time.'}, 'reporter_email': {'type': 'string', 'description': 'Email address support should reply to, if different from the account email.'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'category': {'type': 'string'}, 'severity': {'type': 'string'}, 'report_id': {'type': 'string'}, 'business_id': {'type': 'string'}, 'support_notified': {'type': 'boolean'}}, 'additionalProperties': True}
request_extra_number
Review an Extra Number
Reserve an exact pool number and request an owner-only browser review of its recurring extra-line price. Requires numbers:write and billing:write. Never charges included or prepaid capacity; use attach_number for included allocation. This tool does not approve payment or prove activation.
Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['business_id', 'agent_id', 'phone_number', 'idempotency_key'], 'properties': {'agent_id': {'type': 'string'}, 'business_id': {'type': 'string'}, 'phone_number': {'type': 'string'}, 'idempotency_key': {'type': 'string'}}, 'additionalProperties': False}
request_kaicalls_update
Request KaiCalls Update
Ask the KaiCalls on-behalf update broker to perform a scoped, governed mutation. Supported intents: phone.emergency_address.set, transcripts.sink.configure, agent.patch, numbers.purchase, agent.config.rollback. Prefer update_agent_config for prompt/voice/model edits, configure_agent_business_rules for a single named operational prompt section, upsert_lead for lead create/update, send_sms for outbound texts, configure_staff_alerts for alert recipients/rules, and configure_textable_links for send-link setup. Mutating requests need an idempotency_key; high-risk changes need human authority. The broker returns needs_user_input, needs_approval, pending_approval, executed, denied, or unsupported — never an unaudited side effect.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['intent'], 'properties': {'actor': {'type': 'object', 'description': 'Who is asking: { type: agent|human|system|integration, id, display_name }.'}, 'intent': {'type': 'string', 'description': 'Update intent: phone.emergency_address.set, transcripts.sink.configure, agent.patch, numbers.purchase, or agent.config.rollback'}, 'reason': {'type': 'string', 'description': 'Required when changing the raw voice-agent configuration; recorded in the durable audit.'}, 'target': {'type': 'object', 'description': 'Target identifiers, e.g. { phone_number } for E911 or { agent_id } for agent.patch.'}, 'dry_run': {'type': 'boolean', 'description': 'Validate tenant, scope, schema, authority, and policy without executing.'}, 'payload': {'type': 'object', 'description': 'Intent payload. E911: address + disclosure_acknowledged=true. transcripts: webhook_url + events. agent.patch: name, inbound_prompt, outbound_prompt, sms_prompt, first_message, voice, model, max_duration, metadata, vapi_config, transfer_enabled, transfer_phone_number.'}, 'authority': {'type': 'object', 'description': 'How the change was authorized: { mode: none|agent_asserted|human_confirmed|dashboard_session|system_policy, confirmed_by, confirmed_at, confirmation_ref }. human_confirmed requires all three confirmation fields.'}, 'requester': {'type': 'object', 'description': 'Optional legacy requester metadata for audit trails (prefer actor).'}, 'source_ref': {'type': 'string', 'description': 'External source reference, such as a Discord message or automation run ID.'}, 'business_id': {'type': 'string', 'description': 'Business ID. Required when the API key can access multiple businesses.'}, 'idempotency_key': {'type': 'string', 'description': 'Required for any mutating request. Repeating a key returns the original outcome instead of re-running provider side effects.'}, 'queue_for_approval': {'type': 'boolean', 'description': 'When authority is missing, create a pending dashboard approval instead of returning needs_approval.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'code': {'type': ['string', 'null']}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'intent': {'type': ['string', 'null']}, 'result': {'type': ['object', 'null']}, 'status': {'type': 'string'}, 'message': {'type': ['string', 'null']}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'summary': {'type': ['object', 'null']}, 'approval': {'type': ['object', 'null']}, 'request_id': {'type': ['string', 'null']}, 'risk_level': {'type': ['string', 'null']}, 'business_id': {'type': ['string', 'null']}, 'missing_fields': {'type': ['array', 'null'], 'items': {'type': 'string'}}}, 'additionalProperties': True}
retry_activation_notification
Retry Activation Notification
APPROVAL-GATED. Retry only the current terminal or time-eligible activation notification channel for the exact active session. Requires a new idempotency key; ambiguous provider outcomes are never blindly resent.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': ['business_id', 'activation_session_id', 'channel', 'idempotency_key'], 'properties': {'channel': {'enum': ['sms', 'email'], 'type': 'string'}, 'authority': {'type': 'object'}, 'business_id': {'type': 'string'}, 'idempotency_key': {'type': 'string'}, 'activation_session_id': {'type': 'string'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'status': {'type': 'string'}, 'attempt': {'type': ['object', 'null']}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'business_id': {'type': 'string'}, 'activation_session_id': {'type': 'string'}}, 'additionalProperties': True}
retry_setup
Reconcile Existing Setup
Reconcile database pointers for an existing imported signup phone reservation. Owner-only, entitlement-checked, single-flight and idempotent. Never creates agents, buys numbers, changes provider routing or sends messages. PBX, missing imports, and stale claims return review blockers. Reuse the same key to read/replay the outcome; a failed request requires review before a new key. Ready means database agreement, not activation.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': ['business_id', 'agent_id', 'idempotency_key'], 'properties': {'agent_id': {'type': 'string'}, 'business_id': {'type': 'string'}, 'idempotency_key': {'type': 'string'}}, 'additionalProperties': False}
rollback_config
Rollback Agent Configuration
Request a rollback to a prior assistant_config_versions snapshot. This changes live greeting, voice, prompt and model settings. When the business owner or an admin is signed in through this connector, the rollback applies immediately; otherwise authenticated owner review of the exact stored request is required (the owner is notified with a review link). Caller-supplied authority fields never authorize execution. Discover a target with list_config_versions or get_change_history; relay the pending request's review URL. The agent.config.rollback executor preserves version recording and secret exclusion after trusted approval.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': ['agent_id'], 'properties': {'actor': {'type': 'object', 'description': 'Who is asking: { type: agent|human|system|integration, id, display_name }.'}, 'reason': {'type': 'string', 'description': 'Optional human-readable reason recorded in the audit trail.'}, 'dry_run': {'type': 'boolean', 'description': 'Validate tenant, scope, and policy without touching the live config.'}, 'agent_id': {'type': 'string', 'description': 'Agent ID to roll back.'}, 'authority': {'type': 'object', 'description': 'Attribution only. Caller-supplied modes cannot authorize a rollback; authenticated owner review of the exact stored request is required.'}, 'source_ref': {'type': 'string', 'description': 'External source reference, such as a ticket or automation run ID.'}, 'version_id': {'type': 'string', 'description': 'Target assistant_config_versions row id to restore. One of version_number/version_id is required.'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}, 'version_number': {'type': 'integer', 'description': 'Target assistant_config_versions.version_number to restore. One of version_number/version_id is required.'}, 'idempotency_key': {'type': 'string', 'description': 'Stable key for the rollback request; repeating it returns the original outcome. Defaults to a key derived from agent + version — pass a fresh key to repeat a rollback that already executed.'}, 'queue_for_approval': {'type': 'boolean', 'description': 'Create a durable owner-review request (default true). Setting false returns needs_approval, but an authority-envelope retry still cannot execute.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'code': {'type': ['string', 'null']}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'result': {'type': ['object', 'null'], 'description': 'On executed: { agent_id, restored_from_version, restored_fields, skipped_fields, new_version_number, warning? }.'}, 'status': {'type': 'string'}, 'message': {'type': ['string', 'null']}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'summary': {'type': ['object', 'null']}, 'agent_id': {'type': 'string'}, 'approval': {'type': ['object', 'null']}, 'request_id': {'type': ['string', 'null']}, 'risk_level': {'type': ['string', 'null']}, 'business_id': {'type': ['string', 'null']}}, 'additionalProperties': True}
run_eval
Run Agent Eval
Run a single eval scenario (eval_id) or every scenario for an agent (agent_id) against its live voice agent and grade the result. Bills voice-agent compute. Mirrors POST /api/v1/evals/run.
Destruktiv Externer Zugriff
Eingabeschema
{'type': 'object', 'properties': {'wait': {'type': 'boolean', 'description': 'Block until the run completes (default true).'}, 'eval_id': {'type': 'string', 'description': 'Run a single eval scenario by ID.'}, 'agent_id': {'type': 'string', 'description': 'Run every eval scenario for this agent.'}, 'max_wait_ms': {'type': 'integer', 'description': 'Per-run wait cap in ms when wait is true (default 60000, max 110000).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'total': {'type': ['integer', 'null']}, 'failed': {'type': ['integer', 'null']}, 'passed': {'type': ['boolean', 'null']}, 'run_id': {'type': ['string', 'null']}, 'status': {'type': ['string', 'null']}, 'results': {'type': ['array', 'object', 'null']}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'completed': {'type': ['integer', 'null']}, 'vapi_run_id': {'type': ['string', 'null']}}, 'additionalProperties': True}
save_text_registration_details
Save Text Registration Details
Save a business's legal name, entity type, industry, website, address, authorized contact and what it will text (service only, or service and sales) for its own carrier registration. Business owner only. Pass only what the owner told you: anything omitted is filled from what is already on file (see get_text_registration `known`). Ask one question at a time and save each answer as you go: answers given so far are kept, and while questions remain the result lists `saved_steps`, `missing` and the `next_question` to ask. The owner can finish here or on the registration page. Never takes the EIN: the owner types it on the registration page returned as setup_url. Refused once a filing is already with the carriers. Charges nothing and files nothing.
Idempotent
Eingabeschema
{'type': 'object', 'required': ['business_id'], 'properties': {'city': {'type': 'string'}, 'state': {'enum': ['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC', 'FL', 'GA', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY', 'PR', 'VI', 'GU', 'AS', 'MP'], 'type': 'string'}, 'street': {'type': 'string', 'description': 'Must match the address the IRS has.'}, 'industry': {'enum': ['AUTOMOTIVE', 'AGRICULTURE', 'BANKING', 'CONSTRUCTION', 'CONSUMER', 'EDUCATION', 'ENGINEERING', 'ENERGY', 'OIL_AND_GAS', 'FAST_MOVING_CONSUMER_GOODS', 'FINANCIAL', 'FINTECH', 'FOOD_AND_BEVERAGE', 'GOVERNMENT', 'HEALTHCARE', 'HOSPITALITY', 'INSURANCE', 'LEGAL', 'MANUFACTURING', 'MEDIA', 'ONLINE', 'PROFESSIONAL_SERVICES', 'RAW_MATERIALS', 'REAL_ESTATE', 'RELIGION', 'RETAIL', 'JEWELRY', 'TECHNOLOGY', 'TELECOMMUNICATIONS', 'TRANSPORTATION', 'TRAVEL', 'ELECTRONICS', 'NOT_FOR_PROFIT'], 'type': 'string'}, 'text_types': {'enum': ['service', 'service_and_sales'], 'type': 'string', 'description': 'service: replies and follow-ups to people who contacted the business. service_and_sales: also lets sales texts go to people who opted in to marketing.'}, 'business_id': {'type': 'string'}, 'postal_code': {'type': 'string', 'description': '5-digit ZIP, or ZIP+4.'}, 'website_url': {'type': 'string', 'description': 'Carriers check the site loads.'}, 'business_type': {'enum': ['Sole Proprietorship', 'Partnership', 'Limited Liability Corporation', 'Co-operative', 'Non-profit Corporation', 'Corporation'], 'type': 'string'}, 'contact_email': {'type': 'string'}, 'contact_phone': {'type': 'string', 'description': 'A US number the carriers can reach.'}, 'contact_title': {'type': 'string', 'description': 'As the contact signs, e.g. Owner.'}, 'contact_last_name': {'type': 'string'}, 'contact_first_name': {'type': 'string'}, 'legal_business_name': {'type': 'string', 'description': 'Exactly as on the IRS EIN letter.'}, 'contact_job_position': {'enum': ['Director', 'GM', 'VP', 'CEO', 'CFO', 'General Counsel', 'Other'], 'type': 'string'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'saved': {'type': 'boolean'}, 'missing': {'type': 'array', 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'next_step': {'type': 'string'}, 'setup_url': {'type': 'string'}, 'consent_url': {'type': 'string'}, 'saved_steps': {'type': 'array', 'items': {'type': 'string'}}, 'registration': {'type': 'object'}, 'next_question': {'type': 'object'}, 'next_step_text': {'type': 'string'}}, 'additionalProperties': True}
search_available_numbers
Search Available Numbers
Search the carrier for phone numbers available to purchase (live number inventory). Mirrors GET /api/v1/phone-numbers/search. On the acquisition surface, call set_owner_phone first (or record a decline) — don't search or buy a number for a signup with no way to be reached.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 20, 'minimum': 1, 'description': 'Max results to return (default 10, max 20).'}, 'country': {'type': 'string', 'description': 'Two-letter country code (default US).'}, 'area_code': {'type': 'string', 'description': 'Preferred area code (optional).'}, 'business_id': {'type': 'string', 'description': "Search that business's carrier inventory (optional; defaults to the platform carrier)."}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'available_numbers': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': True}
send_sms
Send SMS
Send an outbound text message from one of your agents' phone lines to a recipient, routed through the governed messaging API. Compliance gates (opt-out / Do-Not-Call / quiet-hours), rate limits, and message logging all apply. Provide from_agent_id (the sending agent), to (recipient phone in E.164), and message. Optionally link lead_id to attribute the text and respect that lead's automation-pause state.
Destruktiv Externer Zugriff
Eingabeschema
{'type': 'object', 'required': ['from_agent_id', 'to', 'message'], 'properties': {'to': {'type': 'string', 'description': 'Recipient phone number in E.164 format (e.g. +18135551234).'}, 'lead_id': {'type': 'string', 'description': "Optional lead ID to link and honor the lead's automation-pause state."}, 'message': {'type': 'string', 'description': 'Text message body.'}, 'from_agent_id': {'type': 'string', 'description': 'Agent ID whose phone line the text is sent from.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key. A replay with the same key returns the original send outcome instead of sending again — use it when retrying after an uncertain response.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'to': {'type': ['string', 'null']}, 'from': {'type': ['string', 'null']}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'message_sid': {'type': ['string', 'null']}}, 'additionalProperties': True}
set_branded_caller_id
Set Branded Caller ID
File the business name that landlines show when the business's number calls out (caller ID name). Included with the business's own text registration once it is paid; charges nothing. Business owner only. The name must be at most 15 characters, start with a letter, and use only letters, numbers, periods, commas and spaces (get_text_registration returns a suggestion in branded_caller_id.suggestedName). Files with the carriers once the business profile is approved; review then takes a day or two and carriers show it within 72 hours. US local numbers only. Never claim it is showing on calls from this result.
Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['business_id', 'display_name'], 'properties': {'business_id': {'type': 'string'}, 'display_name': {'type': 'string', 'description': 'Up to 15 characters, e.g. SUMMIT ROOFING.'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'charged': {'type': 'boolean'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'branded_caller_id': {'type': 'object'}}, 'additionalProperties': True}
set_owner_phone
Set Owner Phone
Call this BEFORE search_available_numbers/buy_number (#2086) — do not find or buy a number for someone who has not given a reachable number. Ask for it as "the number I'll text you at whenever I take a call for you", not as a generic form field. Saves the owner's own mobile number on the business record so Kai can ring it first and so activation/forwarding follow-ups can reach a human — connecting a number alone does not prove the owner can be reached. US numbers only; normalized to E.164 and rejected if it cannot be validated as a US mobile/landline number. When ring_first is true (default), also configures ring-first routing so calls hit this cell before overflowing to the secretary — the same path used at signup. If the caller declines to give a number, pass declined=true instead of owner_phone: this records the signup as an inquiry (a KaiCalls lead, not a provisioned business+number) and you must not call find_number/buy_number for this business afterward.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'declined': {'type': 'boolean', 'description': 'Set true (instead of owner_phone) when the caller will not give a reachable number. Records the business as an inquiry lead instead of a provisioned number — never buy a number after this.'}, 'ring_first': {'type': 'boolean', 'description': 'When true (default), ring this number first and overflow to the secretary. When false, only saves the number.'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}, 'owner_phone': {'type': 'string', 'description': "The owner's own mobile number, US format (e.g. (908) 555-1234 or +19085551234). Required unless declined is true."}, 'contact_name': {'type': 'string', 'description': 'Only used with declined=true: the caller name, for the inquiry record.'}, 'contact_email': {'type': 'string', 'description': 'Only used with declined=true: an email for the inquiry record, if given.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'status': {'type': 'string'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'next_step': {'type': 'string'}, 'business_id': {'type': 'string'}, 'ring_first_status': {'type': ['string', 'null']}, 'owner_phone_masked': {'type': ['string', 'null']}, 'ring_first_applied': {'type': 'boolean'}, 'owner_phone_present': {'type': 'boolean'}}, 'additionalProperties': True}
set_up_phone_system
Set Up Phone System
Turn the business's number into a hosted phone system: Kai is installed as extension 700, the owner's mobile joins a team ring group, and a dial plan rings the team first and hands the call to Kai when nobody picks up. Idempotent and resumable — a re-run reuses everything already created and reports it under `reused`. Needs a complete US street address on file (the emergency-services and tax location) and the owner's mobile: when either is missing the tool fails with `code` missing_address or missing_owner_mobile plus `required_field` and `next_action` saying exactly what to collect — pass it back as business_address or owner_mobile. Returns the status shape (extension, ring group, dial plan ids, the phone-system line) and `next_step`, the one line to relay to the owner (forward your line here / dial 700 from any office phone). Mirrors POST /api/v1/phone-system action=provision.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'properties': {'persona': {'enum': ['cell_only', 'office'], 'type': 'string', 'description': "Which phones the business runs on, if the owner said: cell_only (just the owner's cell) or office (desk phones / an existing office line that will forward in). Shapes next_step; optional."}, 'business_id': {'type': 'string', 'description': 'Business ID (required when the token can access multiple businesses).'}, 'owner_mobile': {'type': 'string', 'description': "The owner's own mobile number (US). Optional when set_owner_phone already saved one; required when the last attempt returned missing_owner_mobile."}, 'business_address': {'type': 'object', 'required': ['street', 'city', 'state', 'zip'], 'properties': {'zip': {'type': 'string', 'description': '5-digit US ZIP code.'}, 'city': {'type': 'string'}, 'state': {'type': 'string', 'description': 'Two-letter US state code.'}, 'street': {'type': 'string', 'description': 'Street number and name.'}}, 'description': 'The business street address to save before provisioning. Optional when a complete address is already on file; required when the last attempt returned missing_address.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'ids': {'type': 'object'}, 'code': {'type': 'string', 'description': 'Present when success is false.'}, 'line': {'type': ['string', 'null'], 'description': 'The phone-system line (E.164), if a number is attached.'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'issues': {'type': 'array', 'items': {'type': 'object', 'properties': {'field': {'type': 'string'}, 'message': {'type': 'string'}}}, 'description': 'Address fields to correct when code is invalid_address.'}, 'reused': {'type': 'array', 'items': {'type': 'string'}}, 'created': {'type': 'array', 'items': {'type': 'string'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'next_step': {'type': 'string', 'description': 'The one line to relay to the owner.'}, 'business_id': {'type': 'string'}, 'next_action': {'type': 'string', 'description': 'What to collect and how to retry, when blocked.'}, 'provisioned': {'type': 'boolean'}, 'kai_extension': {'type': 'string'}, 'required_field': {'enum': ['business_address', 'owner_mobile'], 'type': 'string', 'description': 'Present when setup is blocked on a missing input.'}}, 'additionalProperties': True}
set_webhook
Set Webhook
Create or update a business outbound webhook (URL + subscribed events). Returns a webhook secret on first creation only. Mirrors POST /api/v1/webhooks.
Destruktiv Externer Zugriff
Eingabeschema
{'type': 'object', 'required': ['webhook_url'], 'properties': {'id': {'type': 'string', 'description': 'Existing webhook ID to update (omit to create new).'}, 'events': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Event types to subscribe to (see get_webhook for the supported list).'}, 'is_active': {'type': 'boolean', 'description': 'Enable or disable delivery.'}, 'business_id': {'type': 'string', 'description': 'Business ID (optional only when the token can access exactly one business).'}, 'description': {'type': 'string', 'description': 'Human label for this webhook.'}, 'webhook_url': {'type': 'string', 'description': 'HTTPS/HTTP destination URL for event delivery.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'events': {'type': 'array', 'items': {'type': 'string'}}, 'message': {'type': 'string'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'webhook': {'type': 'object'}, 'business_id': {'type': 'string'}, 'webhook_secret': {'type': ['string', 'null']}}, 'additionalProperties': True}
start_text_registration_checkout
Start Text Registration Checkout
Create the payment link for a business's own carrier registration (a one-time filing fee plus a monthly campaign fee). Business owner only, and only once the details and the EIN are saved. Returns checkout_url for the owner to open and pay; nothing is charged by this tool, and filing starts only after payment. Never claim the registration is paid or filed from a checkout_url. On a plan that includes registration there is nothing to pay: the tool sends it to the carriers straight away and returns included_in_plan and filed true instead of a link, so call it only after the owner confirms the details.
Externer Zugriff
Eingabeschema
{'type': 'object', 'required': ['business_id'], 'properties': {'business_id': {'type': 'string'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'filed': {'type': 'boolean'}, 'charged': {'type': 'boolean'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'monthly_usd': {'type': 'number'}, 'checkout_url': {'type': 'string'}, 'one_time_usd': {'type': 'number'}, 'included_in_plan': {'type': 'boolean'}}, 'additionalProperties': True}
update_agent_config
Update Agent Configuration
Edit an agent's live runtime configuration — greeting/first message, inbound or SMS prompt, voice, language model, max call duration, and call-transfer settings — routed through the governed update broker so every change keeps the consent + audit trail (a versioned config snapshot and change history). Every write here is reversible: inspect what changed with get_change_history or list_config_versions, then undo it with rollback_config. Mutating changes need an idempotency_key. When the business owner or an admin is signed in through this connector, their own changes apply immediately. High-impact live changes made with an API key or on someone else's behalf queue for the owner's review instead (the owner is notified with a review link). For just a single named operational-rules section, prefer configure_agent_business_rules.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['agent_id'], 'properties': {'name': {'type': 'string', 'description': 'Agent display name.'}, 'actor': {'type': 'object', 'description': 'Who is asking: { type: agent|human|system|integration, id, display_name }.'}, 'model': {'type': 'object', 'description': 'Language model selection: { provider, model, temperature }.'}, 'voice': {'type': 'object', 'description': 'Voice selection: { provider, voiceId }.'}, 'dry_run': {'type': 'boolean', 'description': 'Validate and summarize the change without writing.'}, 'agent_id': {'type': 'string', 'description': 'KaiCalls agent ID to update.'}, 'authority': {'type': 'object', 'description': 'Attribution only. Caller-supplied authority cannot authorize live changes; authenticated owner review of the stored request is required.'}, 'sms_prompt': {'type': 'string', 'description': 'SMS reply prompt.'}, 'source_ref': {'type': 'string', 'description': 'External source reference, such as a support ticket or conversation ID.'}, 'business_id': {'type': 'string', 'description': 'Business ID. Required when the agent has multiple accessible assignments.'}, 'max_duration': {'type': 'integer', 'description': 'Maximum call duration in seconds.'}, 'first_message': {'type': 'string', 'description': 'Spoken greeting / first message callers hear.'}, 'inbound_prompt': {'type': 'string', 'description': 'Full inbound system prompt that drives the agent.'}, 'idempotency_key': {'type': 'string', 'description': 'Required for writes. Reuse the same key when retrying the same change.'}, 'outbound_prompt': {'type': 'string', 'description': 'Outbound (campaign) system prompt.'}, 'transfer_enabled': {'type': 'boolean', 'description': 'Enable/disable live call transfer.'}, 'queue_for_approval': {'type': 'boolean', 'description': 'When authority is missing, create a pending dashboard approval instead of returning needs_approval.'}, 'transfer_phone_number': {'type': 'string', 'description': 'Number to transfer qualified calls to.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'code': {'type': ['string', 'null']}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'result': {'type': ['object', 'null']}, 'status': {'type': 'string'}, 'message': {'type': ['string', 'null']}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'summary': {'type': ['object', 'null']}, 'agent_id': {'type': ['string', 'null']}, 'approval': {'type': ['object', 'null']}, 'request_id': {'type': ['string', 'null']}, 'risk_level': {'type': ['string', 'null']}, 'business_id': {'type': ['string', 'null']}}, 'additionalProperties': True}
update_phone_flow
Update Phone Flow
Replace how calls ring on the business's hosted phone system with a full phone flow: { version: 1, hours: { mode: 'always' | 'business_hours', afterHours: 'kai' }, ring: { members: [{ kind: 'cell', phone: E.164, label, requirePressOne } | { kind: 'desk_phone' | 'user', userId, label }], timeoutSeconds: 5-120 }, overflow: 'kai' }. Applied idempotently (only real differences are written); every member passes the forwarding-loop guard; business_hours mode derives the schedule from the business hours already on file. Read the current flow with get_phone_flow first and send it back with your edits. Mirrors POST /api/v1/phone-system action=save_flow.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': ['flow'], 'properties': {'flow': {'type': 'object', 'description': 'The complete phone flow to apply.'}, 'business_id': {'type': 'string', 'description': 'Business ID (required when the token can access multiple businesses).'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'flow': {'type': 'object'}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'changes': {'type': 'array', 'items': {'type': 'string'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'readback': {'type': 'string'}}, 'additionalProperties': True}
upsert_knowledge
Create or Update Agent Knowledge
Create a new agent knowledge base entry, or update one when `id` is provided. Mirrors POST /api/v1/knowledge. Creating requires title, content, and content_type.
Destruktiv
Eingabeschema
{'type': 'object', 'properties': {'id': {'type': 'string', 'description': 'Knowledge item ID to update (omit to create).'}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'title': {'type': 'string'}, 'content': {'type': 'string'}, 'category': {'type': 'string'}, 'business_id': {'type': 'string', 'description': 'Business ID. Required for create when the token can access multiple businesses.'}, 'content_type': {'type': 'string'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'knowledge': {'type': ['object', 'null']}}, 'additionalProperties': True}
upsert_lead
Create or Update Lead
Create a new lead or update existing leads for the authenticated business, routed through the governed leads API (business access-checked, usage-logged, and audited). To create one, pass `lead` with at least one of name/phone/email plus optional status/source/notes/agent_id/etc. To update, pass `updates`: an array of { id, ...fields } for one or many existing leads (status, name, phone, email, notes, address, city, state, zip). Updates are access-checked per row and report partial success.
Destruktiv
Eingabeschema
{'type': 'object', 'properties': {'lead': {'type': 'object', 'description': 'Fields for a NEW lead: name, first_name, last_name, phone, email, status, source, notes, address, city, state, zip, agent_id, message. At least one of name/phone/email is required.'}, 'updates': {'type': 'array', 'items': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Lead ID to update.'}}}, 'description': 'Update existing leads. Each item is { id, ...fields } where fields are a subset of name, first_name, last_name, email, phone, status, source, notes, address, city, state, zip. Max 100 per call.'}, 'business_id': {'type': 'string', 'description': 'Business ID. Required for create when the API key can access multiple businesses.'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'lead': {'type': ['object', 'null']}, 'error': {'type': 'string', 'description': 'Present when success is false'}, 'failed': {'type': ['integer', 'null']}, 'results': {'type': ['array', 'null'], 'items': {'type': 'object'}}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}, 'updated': {'type': ['integer', 'null']}, 'operation': {'type': 'string', 'description': 'create or update'}}, 'additionalProperties': True}
upsert_product
Create or Update Agent Product
Create a new product row, or update one when `id` is provided. Mirrors POST /api/v1/products. Creating requires name and business_id. Pass `quantity` to set/update inventory.
Destruktiv
Eingabeschema
{'type': 'object', 'properties': {'id': {'type': 'string', 'description': 'Product ID to update (omit to create).'}, 'sku': {'type': 'string'}, 'name': {'type': 'string'}, 'price': {'type': 'number'}, 'category': {'type': 'string'}, 'quantity': {'type': 'number', 'description': 'Inventory quantity to set (optional).'}, 'attributes': {'type': 'object'}, 'business_id': {'type': 'string', 'description': 'Business ID. Required for create when the token can access multiple businesses.'}, 'description': {'type': 'string'}}}
Ausgabeschema
{'type': 'object', 'required': ['success'], 'properties': {'error': {'type': 'string', 'description': 'Present when success is false'}, 'product': {'type': ['object', 'null']}, 'success': {'type': 'boolean', 'description': 'Whether the tool completed successfully'}}, 'additionalProperties': True}
Geändert
search_available_numbers
1. October 2026 02:53
Hinzugefügt
set_branded_caller_id
1. October 2026 02:53
Hinzugefügt
start_text_registration_checkout
1. October 2026 02:53
Hinzugefügt
save_text_registration_details
1. October 2026 02:53
Hinzugefügt
get_text_registration
1. October 2026 02:53
Geändert
make_call
1. October 2026 02:53
Geändert
rollback_config
27. September 2026 02:53
Geändert
buy_number
27. September 2026 02:53
Geändert
search_available_numbers
27. September 2026 02:53
Geändert
set_owner_phone
27. September 2026 02:53
Geändert
update_agent_config
27. September 2026 02:53
Geändert
set_up_phone_system
23. September 2026 02:53
Hinzugefügt
report_issue
17. September 2026 12:35
Hinzugefügt
list_rightsize_recommendations
17. September 2026 12:35
Hinzugefügt
list_overage_charges
17. September 2026 12:35
Hinzugefügt
list_subscription_history
17. September 2026 12:35
Hinzugefügt
list_tool_execution_logs
17. September 2026 12:35
Hinzugefügt
list_observability_events
17. September 2026 12:35
Hinzugefügt
rollback_config
17. September 2026 12:35
Hinzugefügt
get_change_history
17. September 2026 12:35
Hinzugefügt
list_config_versions
17. September 2026 12:35
Hinzugefügt
upsert_product
17. September 2026 12:35
Hinzugefügt
list_products
17. September 2026 12:35
Hinzugefügt
upsert_knowledge
17. September 2026 12:35
Hinzugefügt
list_knowledge
17. September 2026 12:35
Hinzugefügt
buy_number
17. September 2026 12:35
Hinzugefügt
search_available_numbers
17. September 2026 12:35
Hinzugefügt
detach_number
17. September 2026 12:35
Hinzugefügt
set_owner_phone
17. September 2026 12:35
Hinzugefügt
attach_number
17. September 2026 12:35