Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, email [email protected] and we’ll put it right.

io.github.seldonframe/seldonframe-mcp

NPM · @SELDONFRAME/MCP · SCANNED AUG 4

Open-source GoHighLevel alternative for agencies. White-label CRM, booking, intake, chatbot via MCP.

Available components

+35 this week 59 Trust /100

Deprecated

This server is marked deprecated in the MCP registry.

Trust breakdown (6 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score →

Supply Chain Security83
  • No malware found by supply-chain analysis.Pass
  • CVE check failed: a known medium-severity CVE affects hono 4.12.33, reached via @modelcontextprotocol/sdk > hono. A fixed version is available. View diagnostics → Fail
  • No install/post-install scripts declared.Pass
  • Only part of the dependency tree could be resolved (94 of 98), so this covers what we could see, not the whole tree. View diagnostics → Partial
Provenance & Transparency45
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
  • Clear OSI-approved license (AGPL-3.0-or-later).Pass
  • Actively maintained (last published 27 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability29
  • AI-judged instruction clarity (poor).Fail
  • Context-footprint check failed: tool/resource definitions use about 29711 tokens (~196/item across 151 items; 151 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
  • Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage99
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 98% of tool parameters carry a description.Partial
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.

npm · @seldonframe/mcp

# add to Claude Code
claude mcp add seldonframe-seldonframe-mcp -- npx -y @seldonframe/mcp
# add to Codex CLI
codex mcp add seldonframe-seldonframe-mcp -- npx -y @seldonframe/mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "seldonframe-seldonframe-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@seldonframe/mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add seldonframe-seldonframe-mcp --command npx --arg -y --arg @seldonframe/mcp
# ~/.hermes/config.yaml
mcp_servers:
  seldonframe-seldonframe-mcp:
    command: "npx"
    args: ["-y", "@seldonframe/mcp"]
// mcp.json
{
  "mcpServers": {
    "seldonframe-seldonframe-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@seldonframe/mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Aug 26 0
    • CVE-2026-69207 affects this package: medium security
    • Known CVEs: partial → fail security
  • 2 Aug 26 +41
    • Provenance: unverified → fail security
    • Known CVEs: unverified → partial security
    • Install scripts: unverified → pass security
    • Malware scan: unverified → pass security
    • Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
    • Maintenance: unverified → pass functional
    • Schema quality: unverified → poor functional
    • Dependency health: unverified → partial functional
    • License: unverified → pass functional
    • Stability: unverified → 0.20 functional
    • MCP protocol: unverified → pass functional
    • Licence: AGPL-3.0-or-later functional
  • 1 Aug 26 +13
    • Tool coverage: unverified → 100 functional
  • 31 Jul 26 −20
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 30 Jul 26 +1
    • Malware scan: pass → unverified security
    • Tool coverage: unverified → 100 functional
  • 28 Jul 26 −19
    • Tool coverage: 100 → unverified functional
    • First check of Schema quality: unverified functional
  • 27 Jul 26 43

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Aug 2026 · Analysed npm/@seldonframe/[email protected]

Provenance none

Ecosystem: npm · Outcome: none

Vulnerabilities 1 finding
ID CVE Severity Vector Fix available
GHSA-8j4g-w8fx-2239 CVE-2026-69207 medium CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L yes
Dependencies 94 packages

94 packages in the resolved dependency tree · 94 deprecated · 29 stale.

The dependency tree was only partially resolved, so these counts may be incomplete.

MCP tools — 151 exposed · ~25,838 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.

Tool Tokens
preview_portal ~122

Render the workspace's portal template against a SPECIFIC contact's data. Returns HTML + CSS so you can visually verify the template before customers see it. Pass contact_id of any contact in the workspace; if the id doesn't belong to this workspace, you get a 404. Use after add_portal_section / update_portal_section to confirm the per-customer embeds resolve correctly with real data.

NameTypeReqDescription
contact_idstringyesContact id of an existing customer in this workspace. Use list_contacts to discover ids.
workspace_idstringyesWorkspace id.

No output schema declared.

No examples provided.

publish_agent ~212

USE WHEN USER SAYS: 'put my chatbot live', 'enable the agent', 'switch agent to test mode', 'pause the chatbot', 'go live with the assistant', 'turn off the chatbot temporarily'. Changes an agent's status: draft → test (sandboxed playground), test → live (real bookings, real escalations, customer-facing), live → paused (chat bubble disabled). EVAL GATE (v1.26.2+): flipping to 'live' AUTO-RUNS the 8-scenario eval suite — rejects with error='eval_gate_failed' if pass rate < 87.5%. The response includes evalSummary so you can show the operator which scenarios failed and route them to /agents/[id]/settings to fix. Use { force: true } to bypass (logged; SF emergencies only).

NameTypeReqDescription
agent_idstringyesAgent id from create_agent.
statusstringyesTarget status.
workspace_idstringyesWorkspace id (bearer workspace).

No output schema declared.

No examples provided.

publish_landing_page ~86

Flip a landing page between draft and published. Publishing busts the public-URL cache immediately and emits landing.published. Pass published=false to unpublish.

NameTypeReqDescription
page_idstringyesLanding page to publish.
publishedbooleantrue = publish (default), false = unpublish.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

read_brain_path ~162

Read a single brain note from the workspace's layer-1 brain. Returns the body (markdown), confidence (0-1), uses (times read), wins (times the consuming interaction was successful), and metadata. Reading a note increments its `uses` counter — that's how the feedback loop knows the note has been consumed. Use BEFORE generating blocks: check for relevant entries (voice/copy-that-works.md, customers/recurring.md, learnings.md) so your generation reflects what's been observed about this workspace.

NameTypeReqDescription
pathstringyesNote path. Examples: voice/copy-that-works.md, customers/recurring.md, pipeline/closed-won-patterns.md, learnings.md.
workspace_idstringyesWorkspace id.

No output schema declared.

No examples provided.

refund_payment ~124

Refund a payment. Omit amount to refund the full payment; pass amount for a partial refund. reason should be 'duplicate' | 'fraudulent' | 'requested_by_customer'.

NameTypeReqDescription
amountnumberOptional partial-refund amount in the payment's currency. Omit to refund in full.
payment_idstringyesPayment to refund.
reasonstring'duplicate' | 'fraudulent' | 'requested_by_customer'. Default: requested_by_customer.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

regenerate_block ~384

Get the bundle needed to regenerate ONE v2 page block with new operator instructions. Use this when the operator asks for a targeted change to an existing block ('make the hero punchier', 'add a card about kids cuts', 'rewrite the FAQ to be less salesy'). Returns: current_props (so your LLM can iterate rather than start fresh), workspace_summary (business name, industry, services, voice from the workspace's soul), brain_patterns (anonymized cross-workspace patterns for this vertical), customization_history (previous edits — useful for understanding what NOT to revert), and the operator's new_instructions (echoed back so they're visible in your context). The next move is YOURS: fetch the block's SKILL.md via get_block_skill, generate new props that satisfy the prop schema while applying new_instructions, then call persist_block with `customization: { prompt: <new_instructions> }` to record the change. If the block has never been persisted (status=first_generation), this is a normal first-time generation path — same downstream flow, just no current_props to iterate from. Antifragile design note: this tool only ASSEMBLES context. Your LLM does the creative work. As models improve, regeneration quality improves with zero MCP changes.

NameTypeReqDescription
block_namestringyesBlock name to regenerate. Must match a v2 block: hero, services, about, faq, cta, booking, intake.
new_instructionsstringOptional: the operator's natural-language regeneration request ('make it more urgent', 'shorter copy', 'less salesy'). When provided, surfaced in the response and used in the customization field of t…
workspace_idstringyesWorkspace id from create_workspace_v2.

No output schema declared.

No examples provided.

register_partner_agency ~436

Register a partner agency. Used by Scale-tier customers who resell SeldonFrame's Business OS to SMBs (HVAC contractors, dentists, lawyers, realtors) under their OWN brand. Once registered, the agency can attach client workspaces via attach_workspace_to_agency; those workspaces will show the agency's logo / colors / support links instead of SeldonFrame's. Plan gate: at least one workspace owned by the caller must be on Scale tier; otherwise the agency is created in 'pending' status and chrome substitution doesn't activate until the upgrade lands. Provide name (required) + slug (auto-derived from name if omitted). Optional: logo_url (uploaded image URL), primary_color / accent_color (hex like #5b21b6), support_email + support_url (where the agency's clients go for help — these REPLACE SeldonFrame's docs/Discord pointers in client chrome), hide_powered_by_badge (true to suppress the 'Powered by SeldonFrame' footer on clients' public pages — Scale-tier perk).

NameTypeReqDescription
accent_colorstringOptional hex color like #a78bfa.
hide_powered_by_badgebooleanHide the 'Powered by SeldonFrame' footer on the agency's clients' public landing pages. Scale-tier feature.
logo_urlstringOptional logo URL (https://...). Use upload_workspace_image to host one if needed.
namestringyesAgency display name (e.g. 'Acme AI'). 2+ chars.
primary_colorstringOptional hex color like #5b21b6.
slugstringOptional URL-safe slug. Default: derived from name. Must be unique among non-archived agencies.
support_emailstringOptional. Where the agency's clients email for help.
support_urlstringOptional. Where the agency's clients click for docs/help.
workspace_idstringyesWorkspace id (any workspace owned by the caller — used to resolve the owning user for the new agency).

No output schema declared.

No examples provided.

register_partner_agency ~414

Create a partner-agency entity for white-label SaaS reselling. STEP 1 of agency onboarding. The agency owns multiple client workspaces; chrome (brand name, logo, colors, support URLs) is substituted on each workspace when its parent_agency_id is set to this agency. Plan-gate: caller must own a workspace on the Scale tier ($99/mo). If not, the agency is created in 'pending' status (gated_pending=true) — caller upgrades a workspace and re-runs to flip it. After this call succeeds: optionally register a sender domain (register_partner_agency_sender_domain), then attach client workspaces (attach_workspace_to_partner_agency). Example: register_partner_agency({ name: "Acme Digital", primary_color: "#1FAE85", support_email: "[email protected]" })

NameTypeReqDescription
accent_colorstringOptional brand accent color (hex). Used for secondary surfaces.
hide_powered_by_badgebooleanHide the 'Powered by SeldonFrame' footer badge. Defaults to false. Scale tier feature.
logo_urlstringOptional logo URL (publicly accessible PNG/SVG). Replaces SeldonFrame logo in chrome.
namestringyesAgency display name (2+ chars). Surfaces as the brand_name in operator-facing chrome.
primary_colorstringOptional brand primary color (hex, e.g. '#1FAE85'). Cascades to UI components.
slugstringOptional URL-safe slug. Defaults to slugified name. Must be unique across all agencies.
support_emailstringOptional support email shown in operator-facing chrome (e.g., '[email protected]').
support_urlstringOptional support URL shown in chrome (e.g., 'https://acmedigital.com/help').
workspace_idstringWorkspace bearer that owns the agency. Falls back to default workspace if omitted.

No output schema declared.

No examples provided.

register_partner_agency_sender_domain ~284

Register a sender domain for a partner agency so the agency can send transactional emails (welcome, magic-link, portal-access-code) FROM their own domain instead of [email protected]. The SeldonFrame backend creates the domain in Resend (under our SF Resend account), and returns the DNS records (SPF, DKIM, MX) the agency must add at THEIR registrar. The agency does NOT need their own Resend account. The default sender_local_part is 'welcome' — final sender becomes welcome@<domain>. Override with sender_local_part='hello' to get hello@<domain>. After this call: the agency adds the DNS records, waits 5-60 min for propagation, then calls verify_partner_agency_sender_domain. Once Resend confirms verification, the agency's clients' transactional emails switch to the agency's sender automatically.

NameTypeReqDescription
agency_idstringyesAgency id from register_partner_agency.
domainstringyesDomain to send from (e.g. 'acmeai.com'). Without scheme. The agency must control DNS for this domain.
sender_local_partstringOptional local-part of the sender address (default: 'welcome'). Final sender becomes <local>@<domain>.
workspace_idstringyesWorkspace id (the bearer's workspace; used to resolve owning user).

No output schema declared.

No examples provided.

register_partner_agency_sender_domain ~264

Register a custom email-sender domain for a partner-agency. STEP 2 of agency onboarding (optional but recommended — without it, agency emails ship from [email protected]). Calls Resend's /domains endpoint, persists the resend_domain_id on the agency row, and returns the DNS records the agency must add at their registrar (Cloudflare / Namecheap / GoDaddy / etc.). DNS propagation typically takes 5-60 minutes. After propagation, call verify_partner_agency_sender_domain to poll Resend + flip verified_sender_at. Requires: RESEND_API_KEY configured on the SeldonFrame backend. Example: register_partner_agency_sender_domain({ agency_id: "uuid", domain: "acmedigital.com", sender_local_part: "hello" })

NameTypeReqDescription
agency_idstringyesAgency id from register_partner_agency response.
domainstringyesDomain to register (e.g., 'acmedigital.com'). The agency's customer-facing emails ship from <local>@<domain> once verified.
sender_local_partstringOptional local part for the sender address. Defaults to 'welcome'. Final address: <local>@<domain>.
workspace_idstringWorkspace bearer that owns the agency.

No output schema declared.

No examples provided.

remove_chatbot_from_landing ~115

USE WHEN USER SAYS: 'remove the chatbot from the landing', 'take the chat bubble off the page', 'unembed the chatbot', 'hide the chat from visitors'. Clears the workspace's chatbot embed setting so the public page renderer stops injecting the script tag. The agent itself is NOT deleted — it's still available via /agents/[id]/test for sandbox conversations and can be re-embedded with embed_chatbot_on_workspace_landing.

NameTypeReqDescription
workspace_idstringyesWorkspace id (bearer workspace).

No output schema declared.

No examples provided.

remove_workspace_domain ~82

Remove a custom domain from the workspace. Routes immediately stop responding for the removed hostname; SSL cert is preserved on Vercel for 30 days in case the operator wants to re-add it. Idempotent — no error if the domain was already removed.

NameTypeReqDescription
hostnamestringyesHostname to remove.
workspace_idstringyesWorkspace id.

No output schema declared.

No examples provided.

reorder_landing_sections ~280

Reorder the sections of a workspace's landing page WITHOUT changing their content. Use when the operator says 'move FAQ to the bottom', 'put services after the about section', 'rearrange so the CTA is below testimonials'. Pass `new_order` as the full ordered array of section types as they should appear top-to-bottom. The multiset of types in new_order MUST equal the current landing's section types — no add/remove. Section types include: hero, services-grid, about, mid-cta, faq, testimonials, trust-strip, emergency-strip, service-area, partners, footer (the actual set depends on what's currently on the page). Returns the new sections_order on success or validation_errors on failure (missing/extra types, duplicates). For content edits use update_landing_section. To regenerate a block's content use regenerate_block. To get the current order, fetch the workspace's landing or call regenerate_block (which exposes block names) — most landing pages start as: hero → services → about → faq → mid-cta.

NameTypeReqDescription
new_orderarrayyesOrdered array of section type strings. Must contain EVERY section type currently on the landing page, exactly once each. Example: ["hero", "services-grid", "about", "mid-cta", "faq"].
workspace_idstringyesWorkspace id.

No output schema declared.

No examples provided.

replay_conversation ~138

USE WHEN USER SAYS: 'will my new FAQ break the booking flow?', 'replay this chat against the new blueprint', 'regression test the chatbot', 'test if my recent change still answers this conversation correctly'. Replays a past conversation's user messages against the agent's CURRENT blueprint, returning the original responses + the new responses side-by-side. Lets you regression-test a blueprint change without touching production. Creates a new ephemeral test-status conversation tagged with replay_of=<original>; the original is untouched.

NameTypeReqDescription
conversation_idstringyesOriginal conversation id to replay.
workspace_idstringyesWorkspace id (bearer workspace).

No output schema declared.

No examples provided.

reschedule_booking ~231

Move a scheduled booking to a new starts_at. Preserves the original duration — endsAt tracks the move so a 30-min consult stays 30 mins at the new time. Updates the Google Calendar event in place (event id preserved; attendees see the time change on their existing invite) and emits booking.rescheduled with both previousStartsAt and newStartsAt so follow-up agents can describe the change. Rejects past-dated new starts_at (400) and refuses to reschedule a cancelled booking (422 — reviving a cancellation should be a new create_booking). Does NOT change appointment type; does NOT touch linked payments. Example: reschedule_booking({ booking_id: 'bkg_...', starts_at: '2026-05-02T15:00:00Z' }).

NameTypeReqDescription
booking_idstringyesRequired. UUID of the booking to move.
starts_atstringyesRequired. New ISO 8601 timestamp. Must be in the future. Duration is preserved from the current booking.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

revoke_bearer ~181

Revoke workspace bearer tokens. Useful if a device token has leaked or if a builder wants to rotate. Modes (pick exactly one): `{}` revokes ALL tokens except the current device's (safe default — other devices kicked off, this device keeps working); `{ token_id }` revokes a specific token by its UUID; `{ all: true }` revokes every token including the current one — requires SELDONFRAME_API_KEY because it locks this device out. After revoking the current token the MCP clears the local entry from ~/.seldonframe/device.json.

NameTypeReqDescription
allbooleanRevoke ALL tokens including caller. Requires SELDONFRAME_API_KEY.
token_idstringUUID of a specific token to revoke (from api_keys.id).
workspace_idstringOptional workspace override. Defaults to active workspace.

No output schema declared.

No examples provided.

rotate_secret ~62

Rotate or delete a workspace secret. Omit new_value to delete.

NameTypeReqDescription
keystringyesSecret name to rotate.
new_valuestringNew plaintext value. Omit to delete the secret.
workspace_idstringOptional workspace override.

No output schema declared.

No examples provided.

run_agent_evals ~205

USE WHEN USER SAYS: 'test the chatbot against safety scenarios', 'run evals', 'check if my agent passes the safety suite', 'is the chatbot safe?', 'why did my agent fail the publish gate?'. Runs the platform's 8-scenario safety + behavior eval suite against this agent: prompt-injection probes (ignore-instructions, role-swap), PII probes (customer-list leak), pricing discipline (refuses invented prices, refuses competitor match), scope refusal (off-topic), greeting + escalation. Each scenario runs through the live blueprint as an ephemeral test conversation; results persist to agent_evals. publish_agent({status:'live'}) AUTOMATICALLY runs this and gates on ≥87.5% pass. Call THIS tool directly to dry-run before publishing or to verify after a blueprint update.

NameTypeReqDescription
agent_idstringyesAgent id from list_agents / create_agent.
workspace_idstringyesWorkspace id (bearer workspace).

No output schema declared.

No examples provided.

send_conversation_turn ~202

Route an incoming message through the Conversation Primitive runtime. Loads prior turns for (contact, channel), generates a Soul-aware reply with Claude, writes both inbound + outbound turns, and emits conversation.turn.received / sent events. Use when building an always-on conversational agent (speed-to-lead, qualification chatbot). Example: send_conversation_turn({ contact_id: 'ctc_123', channel: 'sms', message: 'Do you have Saturday appointments?' })

NameTypeReqDescription
channelstringyesTransport channel: 'email' | 'sms'.
contact_idstringyesCRM contact to converse with.
conversation_idstringOptional existing conversation id. Omit to let the runtime reuse the most recent active thread or open a new one.
messagestringyesIncoming message content to reason about.
subjectstringOptional subject for email threads.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

send_email ~173

Send a one-off email through the workspace's configured provider (Resend by default). Checks the suppression list before sending and skips with {suppressed: true} if the recipient has opted out. Example: send_email({ to: '[email protected]', subject: 'Welcome', body: 'Thanks for signing up', contact_id: 'ctc_123' })

NameTypeReqDescription
bodystringyesPlain-text body — rendered into the default HTML shell.
contact_idstringOptional. Links the email to a CRM contact for threading.
providerstringOptional. Force a specific provider (default: resend).
subjectstringyesEmail subject line.
tostringyesRecipient email address.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

send_invoice ~56

Dispatch a draft invoice to the contact via Stripe (Stripe emails the invoice + provides a hosted pay page).

NameTypeReqDescription
invoice_idstringyesInvoice to send.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

send_sms ~168

Send an SMS via the workspace's Twilio integration. Checks the SMS suppression list first (STOP keyword + carrier blocks + manual opt-outs) and skips with {suppressed: true} if the recipient has opted out. Example: send_sms({ to: '+15551234567', body: 'Your appointment is confirmed for Tuesday 2pm', contact_id: 'ctc_123' })

NameTypeReqDescription
bodystringyesSMS body. Twilio will segment if over 160 chars; charges per segment.
contact_idstringOptional. Links the message to a CRM contact for threading.
tostringyesRecipient phone number. E.164 or 10-digit US will be normalized.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

send_welcome_email ~129

Email the active workspace's four key URLs (landing, booking, intake, admin dashboard) to a user. Use this AFTER create_workspace, only when the user has explicitly given their email — never auto-send. The admin URL is bearer-token-scoped and expires in 7 days. Example: send_welcome_email({ email: '[email protected]', name: 'Alice' }).

NameTypeReqDescription
emailstringyesRecipient email address.
namestringOptional recipient name (used in the greeting).
workspace_idstringOptional workspace override. Defaults to active workspace.

No output schema declared.

No examples provided.

store_secret ~79

Store a workspace-scoped secret (encrypted at rest). Example: store_secret({ key: 'STRIPE_API_KEY', value: 'sk_…' })

NameTypeReqDescription
keystringyesSecret name, e.g. 'STRIPE_API_KEY'.
valuestringyesSecret plaintext value.
workspace_idstringOptional workspace override.

No output schema declared.

No examples provided.

submit_soul ~120

Save a business profile to the active workspace. The profile drives the landing page, intake form copy, and AI-agent context. Call this after fetch_source_for_soul or after gathering details from the user. Triggers a re-render of the public landing page so changes are visible immediately.

NameTypeReqDescription
soulobjectyesBusiness profile. Expected keys: business_name, tagline, soul_description, phone, email, address, offerings, faqs, testimonials. Additional keys allowed — they're preserved for future use.
workspace_idstringOptional workspace override.

No output schema declared.

No examples provided.

suppress_email ~102

Add an email address to the workspace suppression list so future sends skip it. Use for manual unsubscribes or policy blocks.

NameTypeReqDescription
emailstringyesEmail address to suppress.
reasonstringReason code: 'manual' | 'unsubscribe' | 'bounce' | 'complaint'. Default: 'manual'.
sourcestringOptional free-form provenance tag.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

suppress_phone ~131

Add a phone number to the SMS suppression list so future SMS sends skip it. STOP replies + carrier permanent-failure codes auto-suppress via the Twilio webhook; use this for manual opt-outs.

NameTypeReqDescription
phonestringyesPhone number to suppress. E.164 or 10-digit US will be normalized.
reasonstringReason code: 'manual' | 'stop_keyword' | 'carrier_block' | 'complaint'. Default: 'manual'.
sourcestringOptional free-form provenance tag.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

switch_workspace ~34

Set the active workspace. Subsequent tool calls act on it by default.

NameTypeReqDescription
workspace_idstringyesTarget workspace id.

No output schema declared.

No examples provided.

tail_agent_conversations ~212

USE WHEN USER SAYS: 'show me recent chats with the agent', 'what are customers asking the chatbot', 'tail conversations', 'list the latest 20 chatbot sessions', 'what's been happening on the agent today?'. Lists recent conversations for an agent — newest first. Excludes eval-runs and replay-runs by default (set include_eval_runs=true to see them). Each row includes status, turn_count, tokens, llm_cost_cents, and the customer's first message preview so you can spot patterns (most common questions, escalations, etc.) without opening each transcript. Use BEFORE get_agent_conversation to pick which conversation to drill into.

NameTypeReqDescription
agent_idstringyesAgent id from list_agents.
include_eval_runsbooleanInclude eval/replay synthetic runs in the list (default false).
limitintegerHow many conversations to return (default 20, max 100).
workspace_idstringyesWorkspace id (bearer workspace).

No output schema declared.

No examples provided.

unsuppress_email ~54

Remove an email address from the workspace suppression list so future sends go through again.

NameTypeReqDescription
emailstringyesEmail address to un-suppress.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

unsuppress_phone ~54

Remove a phone number from the SMS suppression list so future sends go through again.

NameTypeReqDescription
phonestringyesPhone number to un-suppress.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

update_agent_blueprint ~300

USE WHEN USER SAYS: 'add this FAQ to the chatbot', 'update agent pricing', 'change the greeting', 'remove booking from the agent', 'the chatbot answer for X is wrong, fix it', 'add another service to the agent'. Updates an agent's blueprint (FAQ, pricing facts, greeting, capabilities). Bumps current_version + writes a new agent_versions row for rollback. The agent's status is unchanged — flip to test/live separately. PATCH SEMANTICS: arrays REPLACE (not merge). If you want to ADD a single FAQ pair, fetch the current blueprint first via list_agents, append your new pair, and submit the full updated array. After a blueprint change, RE-RUN evals before promoting to live (use run_agent_evals or just call publish_agent({status:'live'}) which auto-runs them). Common reasons to call this: operator added new FAQ entries; pricing changed; greeting needs A/B testing; restricting capabilities (e.g. removing book_appointment to make agent answer-only).

NameTypeReqDescription
agent_idstringyesAgent id from create_agent.
patchobjectyesPartial blueprint patch. Fields: faq, pricing_facts, greeting, capabilities, archetype. Arrays REPLACE.
publish_notesstringOptional one-line note for the audit log (e.g. 'Added emergency-call FAQ').
workspace_idstringyesWorkspace id (bearer workspace).

No output schema declared.

No examples provided.

update_appointment_type ~220

Update an existing appointment type. Partial — omit fields to keep them. Example: update_appointment_type({ booking_slug: 'default', duration_minutes: 60, price: 200 }). Pass booking_slug='default' to edit the auto-seeded 'Book a call' template.

NameTypeReqDescription
booking_slugstringyesSlug of the appointment type. Use 'default' for the auto-seeded template.
buffer_after_minutesnumberOptional. 0–120.
buffer_before_minutesnumberOptional. 0–120.
descriptionstringOptional new description (≤800 chars). Empty string clears it.
duration_minutesnumberOptional new duration (5–240).
max_bookings_per_daynumberOptional. 1–100. Pass null to remove cap.
pricenumberOptional new price. 0 = free.
titlestringOptional new title.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

update_booking_field ~144

Patch ONE booking field (extra) by index. Patch can include any subset of: id, type, label, required, placeholder, options. Standards (fullName, email) cannot be patched — index must be >= 2. ID changes blocked from colliding with another field OR with reserved standard ids.

NameTypeReqDescription
indexintegeryes0-based index of the field to patch. Must be >= 2.
patchobjectyesSubset of BookingFormField fields to overwrite. Empty patch is rejected. ID changes blocked from colliding (with another field or with reserved 'fullName'/'email').
workspace_idstringyesWorkspace id.

No output schema declared.

No examples provided.

update_composite_section ~233

Replace the tree of an EXISTING composite section. Use when the operator asks to refine a custom section you previously created ('shorten the comparison', 'add another stat', 'make the cards muted'). Index must point at a section of type=composite — for typed sections (hero, services, faq, etc.) use update_landing_section, regenerate_block, or persist_block. First call get_landing_structure to find the right index — composite sections show preview text starting with 'composite — <headline>'. Then generate the new tree (typically by reading current_props equivalent — for composite sections this means fetching the existing tree, mutating, and submitting; today the simplest path is to regenerate from scratch using operator instructions + soul). Same validation + voice-scan as add_composite_section. Returns the same payload with index unchanged.

NameTypeReqDescription
indexintegeryes0-based index of the composite section to update (from get_landing_structure).
treeobjectyesReplacement tree. Same shape as add_composite_section — kind=section root with children.
workspace_idstringyesWorkspace id.

No output schema declared.

No examples provided.

update_contact ~117

Update fields on an existing contact. Partial — omit fields you don't want to change. Example: update_contact({ contact_id: '...', status: 'customer' }).

NameTypeReqDescription
contact_idstringyesUUID of the contact to update.
emailstringOptional new email.
first_namestringOptional new first name.
last_namestringOptional new last name.
statusstringOptional new lifecycle stage.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

update_deal ~125

Update a deal. Partial — omit fields to keep them. For stage-only moves prefer move_deal_stage (clearer intent). Example: update_deal({ deal_id: '...', value: 7500 }).

NameTypeReqDescription
deal_idstringyesUUID of the deal.
probabilitynumberOptional new probability (0-100).
stagestringOptional new stage.
titlestringOptional new title.
valuenumberOptional new value.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

update_form ~141

Update a form. Partial — omit fields to keep them. Replacing `fields` replaces the whole array (each field: { key, label, type, required, options? }). Example: update_form({ form: 'intake', fields: [...] }).

NameTypeReqDescription
fieldsarrayOptional new field array. Whole replacement.
formstringyesForm id (uuid) or slug.
is_activebooleanOptional. Toggle publish state.
namestringOptional new name.
slugstringOptional new slug (URL-safe).
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

update_intake_field ~171

Patch ONE intake field by index. Patch can include any subset of: id, type, label, helper, required, options, ratingScale, validation, showIf. Only the fields you pass are changed; everything else stays. Use for content edits ('rename phone to mobile', 'make email optional', 'add a fourth option to property type', 'change the helper text'). ID changes must not collide with another field's id (server rejects). For structural changes (add/remove fields) use the dedicated tools.

NameTypeReqDescription
indexintegeryes0-based index of the field to patch.
patchobjectyesSubset of IntakeQuestion fields to overwrite. Empty patch is rejected. ID changes are allowed but must not collide with another field.
workspace_idstringyesWorkspace id.

No output schema declared.

No examples provided.

update_landing_content ~154

Rewrite the workspace's public landing page hero — headline, subhead, and primary CTA label. C3.4 made this blueprint-aware: the operator's edit lands without losing any of the renderer's visual polish (typography, layered-shadow buttons, animations, etc.). Use this for the most common copy edits; for granular per-section / per-item edits use update_landing_section.

NameTypeReqDescription
cta_labelstringPrimary call-to-action button text, e.g. 'Book a call'.
headlinestringMain hero heading. Keep short; 1 line.
subheadstringOne-sentence supporting line under the headline.
workspace_idstringOptional workspace override.

No output schema declared.

No examples provided.

update_landing_page ~101

Update a landing page's title and/or Puck payload. Validates puck_data on the way through. Does not change publish status — use publish_landing_page for that.

NameTypeReqDescription
page_idstringyesLanding page to update.
puck_dataobjectOptional new Puck payload. Pass null to clear.
titlestringOptional new title.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.

update_landing_section ~215

Granular per-field landing edit — change any single slot in any section of the blueprint-rendered landing page. Use when update_landing_content's three fields aren't enough. Section types: emergency-strip, hero, trust-strip, services-grid, about, mid-cta, testimonials, service-area, faq, footer. Field is a dot-segmented path on that section (e.g. 'headline', 'subhead', 'items.0.title', 'items.2.answer', 'showHours'). Value is the new value (string for copy, boolean for flags, etc.).

NameTypeReqDescription
fieldstringyesDot-segmented field path on the section. Examples: 'headline', 'subhead', 'items.0.title', 'items.2.answer', 'showHours'.
sectionstringyes
valueyesNew value for the field. String for copy, number for ratings, boolean for flags, object/array for richer slots.
workspace_idstringOptional workspace override.

No output schema declared.

No examples provided.

update_portal_section ~95

Replace the tree of an existing portal-template section. Use to refine ('shorten the welcome', 'add a CTA to the documents section'). Index must exist. Validation runs same as add_portal_section.

NameTypeReqDescription
indexintegeryes0-based index of the portal section to replace.
treeobjectyesReplacement tree. Same shape as add_portal_section.
workspace_idstringyesWorkspace id.

No output schema declared.

No examples provided.

update_theme ~109

Change workspace theme: mode (dark|light), primary_color (#hex), accent_color (#hex), font_family. Any subset. Available fonts: Inter, DM Sans, Playfair Display, Space Grotesk, Lora, Outfit.

NameTypeReqDescription
accent_colorstringHex color.
font_familystring
modestring
primary_colorstringHex color like '#14b8a6'.
workspace_idstringOptional workspace override.

No output schema declared.

No examples provided.

update_website_chatbot ~413

USE WHEN USER SAYS: 'update the chatbot's FAQ', 'add new pricing to the agent', 'change the greeting', 'add a new service to the chatbot', 'the chatbot answer for X needs updating'. ONE-CALL bundle for updating an existing website-chatbot (peer to build_website_chatbot which CREATES). Looks up the workspace's website-chatbot agent (or accepts an explicit agent_id), merges your patch into the current blueprint, bumps version, returns refreshed embed_url + dashboard_url + version + next_steps. PATCH SEMANTICS: arrays REPLACE (not merge) per update_agent_blueprint convention — pass the FULL desired faq[] / pricing_facts[], not a delta. Greeting + capabilities are scalar replaces. If you want to ADD one FAQ pair, fetch current via get_workspace_state first and submit the full updated array. AFTER UPDATE: re-run evals (call run_agent_evals or use the dashboard) before promoting back to live, since blueprint changes can affect agent behavior.

NameTypeReqDescription
agent_idstringAgent id. Optional — if omitted, the bundle finds the workspace's first website-chatbot agent (most workspaces have one).
capabilitiesarrayFULL desired capability list (REPLACES). Default 7-tool list for website-chatbot: look_up_availability, book_appointment, find_my_existing_appointment, reschedule_appointment, cancel_appointment, esc…
faqarrayFULL desired FAQ list (REPLACES existing). Each item: { q, a }.
greetingstringNew greeting text. Omit to keep current.
pricing_factsarrayFULL desired pricing list (REPLACES existing). Each item: { label, amount, currency }.
publish_notesstringOptional one-line audit note (e.g. 'Added emergency-call FAQ').
workspace_idstringyesWorkspace id (bearer workspace).

No output schema declared.

No examples provided.

upload_workspace_image ~711

Upload an image to a workspace and apply it to one of two slots: 'logo' (replaces organizations.theme.logoUrl, surfaces in header / footer / og-image / favicon) or 'hero_background' (replaces the hero section's background image and re-renders the landing page). Use when the operator says 'use this as my logo', 'replace the hero image with this photo', 'change the header logo'. PICK ONE source — the others are mutually exclusive: (a) `image_url` (PREFERRED, v1.10.1+) — public HTTPS URL to the image. The SF backend fetches it directly. Best path for Cloudinary, Unsplash, S3, or any image already on the web. file_name + content_type are auto-derived from the URL — you don't need to pass them. (b) `local_file_path` (v1.10.1+) — absolute path on the operator's machine. The MCP server (running locally) reads the file and forwards bytes to the backend. Best path for files on the operator's desktop. file_name + content_type derived from the path. (c) `image_data_b64` (legacy v1.10.0) — image bytes base64-encoded. Use only when you've generated bytes yourself (e.g. dynamic image gen) and there's no URL or path. Be aware: the encoded string consumes your tool-call token budget; for files >~12 KB raw, prefer (a) or (b). Max 5 MB across all paths. Allowed types: image/png, image/jpeg, image/webp, image/svg+xml, image/gif. Returns the public Blob URL on success; that URL is now live on the workspace's public surface within seconds. Antifragile design: server only validates file shape + applies URL to the right column. Your LLM picks which slot ('they said logo, that maps to slot=logo'). As you get better at intent-mapping, the harness doesn't change.

NameTypeReqDescription
content_typestringOptional MIME type (auto-derived from image_url or local_file_path extension). REQUIRED with image_data_b64. Must be one of: image/png, image/jpeg, image/webp, image/svg+xml, image/gif.
file_namestringOptional filename (auto-derived from image_url or local_file_path). REQUIRED with image_data_b64.
image_data_b64stringImage bytes, base64-encoded. LEGACY path — prefer image_url or local_file_path because base64 consumes your tool-call token budget. Max 5 MB after decoding.
image_urlstringPublic HTTPS URL to the image. PREFERRED source. SF backend fetches directly (no base64 round-trip). file_name + content_type auto-derived. https:// only; loopback / private / link-local IPs rejected.
local_file_pathstringAbsolute path to a file on the operator's machine (the MCP server runs there). MCP reads the file and forwards bytes to the backend. file_name + content_type auto-derived from the path. Use when the…
slotstringyesImage slot: 'logo' (workspace logo, used in header/footer/og-image) or 'hero_background' (hero section background image). Other slots may be added in future versions.
workspace_idstringyesWorkspace id.

No output schema declared.

No examples provided.

verify_domain ~122

Re-check DNS for a previously-added custom domain. Returns { verified: true } once Vercel sees the correct DNS record AND issues SSL — usually 5 minutes after the operator adds the CNAME / A record at their registrar, sometimes up to 24 hours depending on TTL. Returns { verified: false, recommended_records } when DNS still hasn't propagated; surface those recommendations to the operator so they can fix their registrar config.

NameTypeReqDescription
hostnamestringyesThe hostname to re-verify (must already be added).
workspace_idstringyesWorkspace id.

No output schema declared.

No examples provided.

verify_partner_agency_sender_domain ~124

Trigger Resend's DNS verification for a partner agency's sender domain. Call this AFTER the agency has added the SPF/DKIM/MX records at their registrar. Returns the current verification status. When status flips to 'verified', the agency's verified_sender_at timestamp is set and chrome substitution kicks in for outbound emails on attached workspaces. Idempotent — safe to call repeatedly while DNS is propagating.

NameTypeReqDescription
agency_idstringyesAgency id from register_partner_agency.
workspace_idstringyesWorkspace id (the bearer's workspace).

No output schema declared.

No examples provided.

verify_partner_agency_sender_domain ~159

Poll Resend for sender-domain verification status. STEP 3 of agency onboarding. Run this after the agency has added the DNS records returned by register_partner_agency_sender_domain and DNS has had time to propagate (usually 5-60 minutes; some registrars can take longer). On success: sets verified_sender_at on the agency row + populates sender_email_address. The branding resolver then exposes the verified sender to outbound email paths automatically. Idempotent + safe to call repeatedly while waiting on DNS. Example: verify_partner_agency_sender_domain({ agency_id: "uuid" })

NameTypeReqDescription
agency_idstringyesAgency id from register_partner_agency response.
workspace_idstringWorkspace bearer that owns the agency.

No output schema declared.

No examples provided.

void_invoice ~59

Void an invoice (undo a billing error). Only valid for draft / open invoices; paid invoices must be refunded instead.

NameTypeReqDescription
invoice_idstringyesInvoice to void.
workspace_idstringOptional. Falls back to the active workspace.

No output schema declared.

No examples provided.