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
Deprecated
This server is marked deprecated in the MCP registry.
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
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
claude mcp add seldonframe-seldonframe-mcp -- npx -y @seldonframe/mcp
codex mcp add seldonframe-seldonframe-mcp -- npx -y @seldonframe/mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"seldonframe-seldonframe-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"@seldonframe/mcp"
],
"enabled": true
}
}
} openclaw mcp add seldonframe-seldonframe-mcp --command npx --arg -y --arg @seldonframe/mcp
mcp_servers:
seldonframe-seldonframe-mcp:
command: "npx"
args: ["-y", "@seldonframe/mcp"] {
"mcpServers": {
"seldonframe-seldonframe-mcp": {
"command": "npx",
"args": [
"-y",
"@seldonframe/mcp"
]
}
}
} 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.
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.
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.
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.
| Name | Type | Req | Description |
|---|---|---|---|
| contact_id | string | yes | Contact id of an existing customer in this workspace. Use list_contacts to discover ids. |
| workspace_id | string | yes | Workspace 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).
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | string | yes | Agent id from create_agent. |
| status | string | yes | Target status. |
| workspace_id | string | yes | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| page_id | string | yes | Landing page to publish. |
| published | boolean | — | true = publish (default), false = unpublish. |
| workspace_id | string | — | Optional. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Note path. Examples: voice/copy-that-works.md, customers/recurring.md, pipeline/closed-won-patterns.md, learnings.md. |
| workspace_id | string | yes | Workspace 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'.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | — | Optional partial-refund amount in the payment's currency. Omit to refund in full. |
| payment_id | string | yes | Payment to refund. |
| reason | string | — | 'duplicate' | 'fraudulent' | 'requested_by_customer'. Default: requested_by_customer. |
| workspace_id | string | — | Optional. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| block_name | string | yes | Block name to regenerate. Must match a v2 block: hero, services, about, faq, cta, booking, intake. |
| new_instructions | string | — | Optional: 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_id | string | yes | Workspace 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).
| Name | Type | Req | Description |
|---|---|---|---|
| accent_color | string | — | Optional hex color like #a78bfa. |
| hide_powered_by_badge | boolean | — | Hide the 'Powered by SeldonFrame' footer on the agency's clients' public landing pages. Scale-tier feature. |
| logo_url | string | — | Optional logo URL (https://...). Use upload_workspace_image to host one if needed. |
| name | string | yes | Agency display name (e.g. 'Acme AI'). 2+ chars. |
| primary_color | string | — | Optional hex color like #5b21b6. |
| slug | string | — | Optional URL-safe slug. Default: derived from name. Must be unique among non-archived agencies. |
| support_email | string | — | Optional. Where the agency's clients email for help. |
| support_url | string | — | Optional. Where the agency's clients click for docs/help. |
| workspace_id | string | yes | Workspace 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]" })
| Name | Type | Req | Description |
|---|---|---|---|
| accent_color | string | — | Optional brand accent color (hex). Used for secondary surfaces. |
| hide_powered_by_badge | boolean | — | Hide the 'Powered by SeldonFrame' footer badge. Defaults to false. Scale tier feature. |
| logo_url | string | — | Optional logo URL (publicly accessible PNG/SVG). Replaces SeldonFrame logo in chrome. |
| name | string | yes | Agency display name (2+ chars). Surfaces as the brand_name in operator-facing chrome. |
| primary_color | string | — | Optional brand primary color (hex, e.g. '#1FAE85'). Cascades to UI components. |
| slug | string | — | Optional URL-safe slug. Defaults to slugified name. Must be unique across all agencies. |
| support_email | string | — | Optional support email shown in operator-facing chrome (e.g., '[email protected]'). |
| support_url | string | — | Optional support URL shown in chrome (e.g., 'https://acmedigital.com/help'). |
| workspace_id | string | — | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| agency_id | string | yes | Agency id from register_partner_agency. |
| domain | string | yes | Domain to send from (e.g. 'acmeai.com'). Without scheme. The agency must control DNS for this domain. |
| sender_local_part | string | — | Optional local-part of the sender address (default: 'welcome'). Final sender becomes <local>@<domain>. |
| workspace_id | string | yes | Workspace 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" })
| Name | Type | Req | Description |
|---|---|---|---|
| agency_id | string | yes | Agency id from register_partner_agency response. |
| domain | string | yes | Domain to register (e.g., 'acmedigital.com'). The agency's customer-facing emails ship from <local>@<domain> once verified. |
| sender_local_part | string | — | Optional local part for the sender address. Defaults to 'welcome'. Final address: <local>@<domain>. |
| workspace_id | string | — | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| workspace_id | string | yes | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| hostname | string | yes | Hostname to remove. |
| workspace_id | string | yes | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| new_order | array | yes | Ordered 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_id | string | yes | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| conversation_id | string | yes | Original conversation id to replay. |
| workspace_id | string | yes | Workspace 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' }).
| Name | Type | Req | Description |
|---|---|---|---|
| booking_id | string | yes | Required. UUID of the booking to move. |
| starts_at | string | yes | Required. New ISO 8601 timestamp. Must be in the future. Duration is preserved from the current booking. |
| workspace_id | string | — | Optional. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| all | boolean | — | Revoke ALL tokens including caller. Requires SELDONFRAME_API_KEY. |
| token_id | string | — | UUID of a specific token to revoke (from api_keys.id). |
| workspace_id | string | — | Optional 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.
| Name | Type | Req | Description |
|---|---|---|---|
| key | string | yes | Secret name to rotate. |
| new_value | string | — | New plaintext value. Omit to delete the secret. |
| workspace_id | string | — | Optional 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.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | string | yes | Agent id from list_agents / create_agent. |
| workspace_id | string | yes | Workspace 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?' })
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | yes | Transport channel: 'email' | 'sms'. |
| contact_id | string | yes | CRM contact to converse with. |
| conversation_id | string | — | Optional existing conversation id. Omit to let the runtime reuse the most recent active thread or open a new one. |
| message | string | yes | Incoming message content to reason about. |
| subject | string | — | Optional subject for email threads. |
| workspace_id | string | — | Optional. 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' })
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | Plain-text body — rendered into the default HTML shell. |
| contact_id | string | — | Optional. Links the email to a CRM contact for threading. |
| provider | string | — | Optional. Force a specific provider (default: resend). |
| subject | string | yes | Email subject line. |
| to | string | yes | Recipient email address. |
| workspace_id | string | — | Optional. 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).
| Name | Type | Req | Description |
|---|---|---|---|
| invoice_id | string | yes | Invoice to send. |
| workspace_id | string | — | Optional. 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' })
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | SMS body. Twilio will segment if over 160 chars; charges per segment. |
| contact_id | string | — | Optional. Links the message to a CRM contact for threading. |
| to | string | yes | Recipient phone number. E.164 or 10-digit US will be normalized. |
| workspace_id | string | — | Optional. 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' }).
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | Recipient email address. | |
| name | string | — | Optional recipient name (used in the greeting). |
| workspace_id | string | — | Optional 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_…' })
| Name | Type | Req | Description |
|---|---|---|---|
| key | string | yes | Secret name, e.g. 'STRIPE_API_KEY'. |
| value | string | yes | Secret plaintext value. |
| workspace_id | string | — | Optional 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.
| Name | Type | Req | Description |
|---|---|---|---|
| soul | object | yes | Business profile. Expected keys: business_name, tagline, soul_description, phone, email, address, offerings, faqs, testimonials. Additional keys allowed — they're preserved for future use. |
| workspace_id | string | — | Optional 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.
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | Email address to suppress. | |
| reason | string | — | Reason code: 'manual' | 'unsubscribe' | 'bounce' | 'complaint'. Default: 'manual'. |
| source | string | — | Optional free-form provenance tag. |
| workspace_id | string | — | Optional. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| phone | string | yes | Phone number to suppress. E.164 or 10-digit US will be normalized. |
| reason | string | — | Reason code: 'manual' | 'stop_keyword' | 'carrier_block' | 'complaint'. Default: 'manual'. |
| source | string | — | Optional free-form provenance tag. |
| workspace_id | string | — | Optional. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| workspace_id | string | yes | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | string | yes | Agent id from list_agents. |
| include_eval_runs | boolean | — | Include eval/replay synthetic runs in the list (default false). |
| limit | integer | — | How many conversations to return (default 20, max 100). |
| workspace_id | string | yes | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | Email address to un-suppress. | |
| workspace_id | string | — | Optional. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| phone | string | yes | Phone number to un-suppress. |
| workspace_id | string | — | Optional. 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).
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | string | yes | Agent id from create_agent. |
| patch | object | yes | Partial blueprint patch. Fields: faq, pricing_facts, greeting, capabilities, archetype. Arrays REPLACE. |
| publish_notes | string | — | Optional one-line note for the audit log (e.g. 'Added emergency-call FAQ'). |
| workspace_id | string | yes | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| booking_slug | string | yes | Slug of the appointment type. Use 'default' for the auto-seeded template. |
| buffer_after_minutes | number | — | Optional. 0–120. |
| buffer_before_minutes | number | — | Optional. 0–120. |
| description | string | — | Optional new description (≤800 chars). Empty string clears it. |
| duration_minutes | number | — | Optional new duration (5–240). |
| max_bookings_per_day | number | — | Optional. 1–100. Pass null to remove cap. |
| price | number | — | Optional new price. 0 = free. |
| title | string | — | Optional new title. |
| workspace_id | string | — | Optional. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| index | integer | yes | 0-based index of the field to patch. Must be >= 2. |
| patch | object | yes | Subset of BookingFormField fields to overwrite. Empty patch is rejected. ID changes blocked from colliding (with another field or with reserved 'fullName'/'email'). |
| workspace_id | string | yes | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| index | integer | yes | 0-based index of the composite section to update (from get_landing_structure). |
| tree | object | yes | Replacement tree. Same shape as add_composite_section — kind=section root with children. |
| workspace_id | string | yes | Workspace 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' }).
| Name | Type | Req | Description |
|---|---|---|---|
| contact_id | string | yes | UUID of the contact to update. |
| string | — | Optional new email. | |
| first_name | string | — | Optional new first name. |
| last_name | string | — | Optional new last name. |
| status | string | — | Optional new lifecycle stage. |
| workspace_id | string | — | Optional. 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 }).
| Name | Type | Req | Description |
|---|---|---|---|
| deal_id | string | yes | UUID of the deal. |
| probability | number | — | Optional new probability (0-100). |
| stage | string | — | Optional new stage. |
| title | string | — | Optional new title. |
| value | number | — | Optional new value. |
| workspace_id | string | — | Optional. 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: [...] }).
| Name | Type | Req | Description |
|---|---|---|---|
| fields | array | — | Optional new field array. Whole replacement. |
| form | string | yes | Form id (uuid) or slug. |
| is_active | boolean | — | Optional. Toggle publish state. |
| name | string | — | Optional new name. |
| slug | string | — | Optional new slug (URL-safe). |
| workspace_id | string | — | Optional. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| index | integer | yes | 0-based index of the field to patch. |
| patch | object | yes | Subset of IntakeQuestion fields to overwrite. Empty patch is rejected. ID changes are allowed but must not collide with another field. |
| workspace_id | string | yes | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| cta_label | string | — | Primary call-to-action button text, e.g. 'Book a call'. |
| headline | string | — | Main hero heading. Keep short; 1 line. |
| subhead | string | — | One-sentence supporting line under the headline. |
| workspace_id | string | — | Optional 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.
| Name | Type | Req | Description |
|---|---|---|---|
| page_id | string | yes | Landing page to update. |
| puck_data | object | — | Optional new Puck payload. Pass null to clear. |
| title | string | — | Optional new title. |
| workspace_id | string | — | Optional. 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.).
| Name | Type | Req | Description |
|---|---|---|---|
| field | string | yes | Dot-segmented field path on the section. Examples: 'headline', 'subhead', 'items.0.title', 'items.2.answer', 'showHours'. |
| section | string | yes | — |
| value | — | yes | New value for the field. String for copy, number for ratings, boolean for flags, object/array for richer slots. |
| workspace_id | string | — | Optional 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.
| Name | Type | Req | Description |
|---|---|---|---|
| index | integer | yes | 0-based index of the portal section to replace. |
| tree | object | yes | Replacement tree. Same shape as add_portal_section. |
| workspace_id | string | yes | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| accent_color | string | — | Hex color. |
| font_family | string | — | — |
| mode | string | — | — |
| primary_color | string | — | Hex color like '#14b8a6'. |
| workspace_id | string | — | Optional 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.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | string | — | Agent id. Optional — if omitted, the bundle finds the workspace's first website-chatbot agent (most workspaces have one). |
| capabilities | array | — | FULL 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… |
| faq | array | — | FULL desired FAQ list (REPLACES existing). Each item: { q, a }. |
| greeting | string | — | New greeting text. Omit to keep current. |
| pricing_facts | array | — | FULL desired pricing list (REPLACES existing). Each item: { label, amount, currency }. |
| publish_notes | string | — | Optional one-line audit note (e.g. 'Added emergency-call FAQ'). |
| workspace_id | string | yes | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| content_type | string | — | Optional 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_name | string | — | Optional filename (auto-derived from image_url or local_file_path). REQUIRED with image_data_b64. |
| image_data_b64 | string | — | Image 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_url | string | — | Public 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_path | string | — | Absolute 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… |
| slot | string | yes | Image 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_id | string | yes | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| hostname | string | yes | The hostname to re-verify (must already be added). |
| workspace_id | string | yes | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| agency_id | string | yes | Agency id from register_partner_agency. |
| workspace_id | string | yes | Workspace 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" })
| Name | Type | Req | Description |
|---|---|---|---|
| agency_id | string | yes | Agency id from register_partner_agency response. |
| workspace_id | string | — | Workspace 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.
| Name | Type | Req | Description |
|---|---|---|---|
| invoice_id | string | yes | Invoice to void. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.