io.github.seldonframe/seldonframe-mcp
NPM · @SELDONFRAME/MCP · SCANNED AUG 3
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 Security86
- No malware found by supply-chain analysis.Pass
- Only part of the dependency tree could be resolved (94 of 98), so this covers what we could see, not the whole tree.Partial
- 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 26 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 Management23
- Stability observed for 7 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.
- 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
- Stability: unverified → 0.20 ▲ functional
- Dependency health: unverified → partial ▲ functional
- License: unverified → pass ▲ 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 3 Aug 2026 · Analysed npm/@seldonframe/[email protected]
Provenance none
Ecosystem: npm · Outcome: none
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.
add_booking_field ~216
Add ONE field to the booking form (after the standard fullName + email). Field shape: { id, type, label, required?, placeholder?, options? }. Types: text, textarea, email, phone, select. Use when the operator wants to capture extra info from bookers — service address, equipment type, preferred technician, party size, etc. ID must be unique within the form (cannot be 'fullName' or 'email' — those are reserved). Position defaults to appending at the end. Insert positions must be >= 2 (slots 0/1 are reserved for the standards).
| Name | Type | Req | Description |
|---|---|---|---|
| field | object | yes | BookingFormField object: { id (kebab-case, unique, NOT 'fullName'/'email'), type, label, required?, placeholder?, options? for select fields }. |
| position | integer | — | Optional 0-based insert position. Default: append. Must be >= 2 (0/1 are reserved for standards). |
| workspace_id | string | yes | Workspace id. |
No output schema declared.
No examples provided.
add_composite_section ~516
Add a CUSTOM landing-page section by composing low-level primitives (heading / text / image / list / button / card / row / col / stat / embed / divider / spacer) into a tree. Use this when the operator asks for a section type that doesn't fit hero/services/about/faq/mid-cta — e.g. 'a 2-column comparison of us vs DIY', 'a pricing tier section', 'a how-it-works in 4 steps', 'a stats row with 4 numbers', 'a side-by-side image + bullet-list'. The agent's job: read operator intent + the workspace soul (voice, services, brand) and emit a `tree` JSON object. Server validates (Zod schema, depth ≤ 4, children-per-container caps, heading-level descent), voice-scans against soul.voice.avoidWords (warnings, not errors), then renders + persists. Tree root MUST be kind=section. Leaves can include kind=embed with ref ∈ {services, faq, testimonials, hours, phone} to pull workspace-data into the section without re-typing it. Phone embed renders as a tel: link. Pattern library (typical compositions): COMPARISON = section { row{cols:2, [card{heading,list-check}, card{variant:muted, heading,list-x}]}}. STATS = section { row{cols:4, [stat,stat,stat,stat]}}. HOW-IT-WORKS = section { row{cols:4, [card{heading,text}, card{heading,text}, card{heading,text}, card{heading,text}]}}. SIDE-BY-SIDE = section { row{cols:2, [col{image}, col{heading,text,button}]}}. Returns the new section's index, the full sections list with previews, validation_warnings (voice violations the agent should fix on retry), and the public_url. Use position to insert at a specific index (default: append).
| Name | Type | Req | Description |
|---|---|---|---|
| position | integer | — | Optional 0-based insert position. Default: appended at the end. Use get_landing_structure to find the right slot first. |
| tree | object | yes | Composite tree root. MUST be kind=section with optional eyebrow/headline/subhead and a children array. See the COMPOSITE_BLOCK_SKILL.md (fetch via get_block_skill('composite')) for the full primitive… |
| workspace_id | string | yes | Workspace id. |
No output schema declared.
No examples provided.
add_custom_domain ~179
Add a custom hostname (e.g. 'joescuts.com', 'www.joescuts.com', 'bookings.joescuts.com') to the workspace. PAID FEATURE — requires Growth ($29/mo) or Scale ($99/mo); returns 402 upgrade_required on free tier. Returns DNS instructions the operator needs to add at their registrar (Cloudflare, Namecheap, GoDaddy, etc.). Once DNS propagates (typically 5min - 24h), call verify_domain to mark verified + enable routing. Vercel auto-provisions SSL once DNS resolves.
| Name | Type | Req | Description |
|---|---|---|---|
| hostname | string | yes | Hostname to register, lowercased and without scheme. Examples: 'joescuts.com', 'www.joescuts.com', 'shop.joescuts.com'. |
| workspace_id | string | yes | Workspace id. |
No output schema declared.
No examples provided.
add_intake_field ~239
Add ONE field to the intake form. Field shape: { id, type, label, required?, helper?, options?, validation?, ratingScale? }. Types: text, textarea, email, phone, number, select, multi-select, rating, date. ID must be unique within the form (server rejects duplicates — IDs are the bind key for answers). For select/multi-select pass an `options` array. Use when the operator wants a new question on the intake form ('add a phone field', 'ask about budget', 'add a checkbox for newsletter signup'). For content edits to existing fields use update_intake_field. Position is optional — defaults to appending at the end. Use get_intake_structure first if you want to insert between specific fields.
| Name | Type | Req | Description |
|---|---|---|---|
| field | object | yes | The new IntakeQuestion object: { id (kebab-case, unique), type, label, required?, helper?, options?, ratingScale?, validation? }. |
| position | integer | — | Optional 0-based insert index. Default: append. Use get_intake_structure to find the right slot. |
| workspace_id | string | yes | Workspace id. |
No output schema declared.
No examples provided.
add_portal_section ~314
Add a composite-tree section to the workspace's portal template. The template renders on every customer's portal — same composite primitive vocabulary as landing (12 node kinds), PLUS 5 customer.* embed refs that pull per-customer data: customer.contact_info (name + email + phone), customer.next_appointment (upcoming booking card), customer.recent_appointments (history list), customer.documents (download links), customer.deals (active jobs/deals). Read get_block_skill('composite') for the primitive vocabulary + voice rules. Tree root MUST be kind=section. Validation runs (Zod + structural rules + voice scan) same as add_composite_section. Typical patterns: WELCOME = section { headline: 'Welcome back', children: [text + customer.contact_info] }. NEXT-APPOINTMENT = section { headline: 'Your next visit', children: [embed: customer.next_appointment, button: book] }. DOCS = section { headline: 'Your documents', children: [embed: customer.documents] }. Position is optional — defaults to appending. Use get_portal_structure first if you want to insert between specific sections.
| Name | Type | Req | Description |
|---|---|---|---|
| position | integer | — | Optional 0-based insert position. Default: append at the end. |
| tree | object | yes | Composite tree root (kind=section with optional eyebrow/headline/subhead and children). See get_block_skill('composite') for the primitive vocabulary. Customer.* embed refs are valid here. |
| workspace_id | string | yes | Workspace id. |
No output schema declared.
No examples provided.
apply_design_md ~217
Apply a DESIGN.md file (the Google Labs format: YAML front matter for tokens + Markdown for rationale) to the workspace theme. Maps tokens.colors.primary, tokens.colors.accent, tokens.mode, and tokens.typography.body to OrgTheme fields. Unmapped tokens (spacing, custom shadows, etc.) are returned so Claude Code can decide whether to apply them via update_landing_page or surface to the operator. USE-WHEN the operator says: 'apply my DESIGN.md', 'use this brand kit', 'match my company's design tokens', 'import my design system', or 'theme my workspace from this file'. Example: apply_design_md({ design_md_content: '<full file content as string>' })
| Name | Type | Req | Description |
|---|---|---|---|
| design_md_content | string | yes | Full content of the DESIGN.md file as a string. The MCP client reads the file in the operator's process (e.g. via fs.readFile in Claude Code) and passes the content here. Server caps at 256KB. |
| workspace_id | string | — | Optional workspace override. |
No output schema declared.
No examples provided.
apply_motion_preset ~230
Set the workspace's motion intensity preset. Stored on OrgTheme.motionPreset and read by the renderer + Claude Code as a hint for content generation. Presets: 'minimal' (no motion, accessibility-first), 'subtle' (fade-up reveals only), 'balanced' (reveals + stagger + hover-lift — the default), 'editorial' (full effects: counters, magnetic CTAs, text-reveal). USE-WHEN the operator says: 'make my pages feel more premium', 'tone down the animation', 'I want it editorial', 'respect reduced motion', 'no animation please', or directly references a preset name. Example: apply_motion_preset({ preset: 'editorial' })
| Name | Type | Req | Description |
|---|---|---|---|
| preset | string | yes | The motion intensity preset to apply. 'minimal'=no motion (accessibility-first). 'subtle'=fade-up reveals only. 'balanced'=reveals + stagger + hover-lift (default). 'editorial'=full effects (counters… |
| workspace_id | string | — | Optional workspace override. |
No output schema declared.
No examples provided.
attach_workspace_to_agency ~162
Attach a workspace to a partner agency. The workspace's chrome (admin dashboard logo, public landing footer, customer portal branding) flips to the agency's brand. Caller must own BOTH the agency and the workspace. Agency must be in 'active' status (not pending — register first, upgrade if needed).
| Name | Type | Req | Description |
|---|---|---|---|
| agency_id | string | yes | Agency id from register_partner_agency. |
| target_workspace_id | string | yes | Workspace id of the workspace you want to attach to the agency. Often this is the SAME as workspace_id (the workspace running the MCP); for an agency operator with multiple client workspaces, this is… |
| workspace_id | string | yes | Workspace id (the bearer's workspace; also the workspace to attach). |
No output schema declared.
No examples provided.
attach_workspace_to_partner_agency ~197
Attach a client workspace to a partner-agency so chrome substitution applies on that workspace's operator-facing surfaces. STEP 4 of agency onboarding — run once per client workspace the agency manages. Caller must own both the workspace AND the agency. Effect is immediate: next page load in that workspace renders the agency's brand_name, logo, colors, support URLs (replacing SeldonFrame's defaults). The workspace's own data (contacts, bookings, agents, etc.) is unchanged. Reversible via detach_workspace_from_partner_agency. Example: attach_workspace_to_partner_agency({ workspace_id: "phoenix-hvac-uuid", agency_id: "acme-digital-uuid" })
| Name | Type | Req | Description |
|---|---|---|---|
| agency_id | string | yes | Agency id the workspace will inherit chrome from. |
| workspace_id | string | yes | Client workspace id to attach. Caller's bearer workspace doesn't have to match — caller just has to own this workspace. |
No output schema declared.
No examples provided.
build_website_chatbot ~521
USE WHEN USER SAYS: 'build me a chatbot for [business]', 'add a chatbot to my website', 'create a website chatbot', 'put a chat widget on my homepage', 'set up an AI assistant for my landing page'. ONE-CALL skill bundle that does the canonical chatbot setup end-to-end: (1) auto-configures the workspace's Anthropic LLM key from process.env.ANTHROPIC_API_KEY if no key is configured yet (most Claude Code users already have this set), or accepts an explicit anthropic_api_key arg; (2) creates a website-chatbot agent with the FAQ + pricing facts + greeting you provide; (3) publishes to status='test' so the operator can sandbox-test before going live (the eval gate runs only on 'live'); (4) returns the embed snippet, dashboard URL, and clear next-steps. USE THIS as the default for natural-language 'create a chatbot' requests. Fall back to the primitive tools (configure_llm_provider + create_agent + publish_agent) only when you need a custom flow (e.g. agency managing multiple operators with separate Anthropic billing — pass anthropic_api_key explicitly per workspace).
| Name | Type | Req | Description |
|---|---|---|---|
| anthropic_api_key | string | — | Optional explicit Anthropic API key (sk-ant-...). If omitted, reads from process.env.ANTHROPIC_API_KEY in the MCP server's environment. Pass explicitly for white-label scenarios (different operator =… |
| faq | array | — | Operator-curated FAQ pairs. Each item is { q, a }. Pass at least 3-5 covering the top customer questions: hours, service area, common issues, what to expect. |
| greeting | string | — | First message shown when chat opens (~120 chars). E.g. 'Hi! Asking about HVAC service in Phoenix? I can book you in or answer common questions.' Default if omitted: 'Hi! How can I help you today?' |
| name | string | yes | Agent display name (e.g. 'Cypress & Pine HVAC Assistant'). Surfaces in chat header. |
| pricing_facts | array | — | ONLY prices the agent may quote. Critical for safety — without this, agent refuses ALL price questions (safer default). With this, agent can quote ONLY listed amounts; anything else gets validator-bl… |
| workspace_id | string | yes | Workspace id (bearer workspace). |
No output schema declared.
No examples provided.
cancel_booking ~159
Cancel a scheduled booking. Sets status to 'cancelled', stamps cancelledAt, deletes the Google Calendar event, and emits booking.cancelled. Idempotent — re-cancelling an already-cancelled booking is a 200 no-op with alreadyCancelled=true (no duplicate events, no calendar errors). Past-dated bookings CAN be cancelled (legitimate retroactive cleanup). Does NOT touch linked payments — linkedPaymentIds is returned so the agent can compose refund_payment explicitly if the business rule is 'cancel AND refund'. Example: cancel_booking({ booking_id: 'bkg_...' }).
| Name | Type | Req | Description |
|---|---|---|---|
| booking_id | string | yes | Required. UUID of the booking to cancel. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
cancel_subscription ~84
Cancel a subscription. Default: cancel at period end (contact keeps access until renewal date). Pass immediate=true for an instant termination + prorated refund.
| Name | Type | Req | Description |
|---|---|---|---|
| immediate | boolean | — | If true, terminate now. Default: cancel at period end. |
| subscription_id | string | yes | Subscription to cancel. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
clone_workspace ~61
Clone an existing workspace as a template. Example: clone_workspace({ source_workspace_id: 'wsp_x', name: 'Copy' })
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name for the new workspace. |
| source_workspace_id | string | yes | Workspace to clone from. |
No output schema declared.
No examples provided.
collect_operator_email ~281
MANDATORY post-workspace step. Send the operator's welcome email + record them as a lead in SeldonFrame's CRM. EVERY workspace creation flow MUST end with this call — it is the only thing that triggers the welcome email (with the live URLs), creates their account so the admin login keeps working past the 7-day token, captures them in our pipeline so we can follow up, and lets Stripe pre-fill their email on upgrade. Skipping it leaves the operator with a one-shot URL and no way to recover access. Flow: after create_workspace returns, ask the user verbatim 'What email should I use for your account? This is where you'll get your login link and any notifications.' Then call this tool with whatever email they give you. If you'd rather use the wrapper, call `finalize_workspace({ email })` instead — same effect plus a formatted summary at the end. Example: collect_operator_email({ email: '[email protected]', name: 'Max' })
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | Operator email — used as the welcome email recipient AND as the unique key for the SeldonFrame CRM lead. | |
| name | string | — | Optional operator name (used in the email greeting and on the CRM lead). |
| workspace_id | string | — | Optional workspace override. Defaults to the workspace just created. |
No output schema declared.
No examples provided.
complete_workspace_v2 ~89
Mark the v2 flow finished for a workspace. Returns which blocks landed vs. were skipped (skipped ones still render via the v1 default pipeline), plus the next steps. Call after every recommended_block has been persisted via persist_block. The operator-facing summary (admin URL, etc.) still requires finalize_workspace afterward.
| Name | Type | Req | Description |
|---|---|---|---|
| workspace_id | string | yes | Workspace id from create_workspace_v2. |
No output schema declared.
No examples provided.
configure_booking ~92
DEPRECATED alias for update_appointment_type({ booking_slug: 'default', ... }). Kept so existing Claude Code sessions don't break. Prefer update_appointment_type for new scripts.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | — | Optional description. |
| duration_minutes | number | — | Optional new duration in minutes. |
| title | string | — | Optional new title. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
configure_llm_provider ~422
USE WHEN USER SAYS: 'set up Anthropic key for my agents', 'add my OpenAI key', 'configure BYOK for agents', 'why is my chatbot saying it's not configured?' FIRST-RUN setup BEFORE create_agent. Sets the LLM API key for this workspace's agents (BYOK — Bring Your Own Key). The OPERATOR pays the LLM provider directly (Anthropic / OpenAI / etc.); SF charges separately for agent platform usage. Stored encrypted at rest using the deployment's ENCRYPTION_KEY. Operators get keys from console.anthropic.com (recommended for v1.26.x — best tool-use support) or platform.openai.com. v1.28+ AUTO-DETECT: pass api_key='env' (or omit api_key entirely) and the MCP server will read process.env.ANTHROPIC_API_KEY / OPENAI_API_KEY from its own environment. Most Claude Code users already have this set (it's how Claude Code works), so this lets a solo SF client onboard with zero key-paste step. Returns { ok: false, error: 'no_env_key' } if the env var isn't set; in that case the user must paste the key explicitly. Skip if the workspace already has a key — agents fail-graceful with 'I'm not set up yet' if no key configured, so a 'not configured' chatbot response means CALL THIS TOOL.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | string | — | API key. Anthropic keys start with 'sk-ant-...'. Stored encrypted; never echoed back. v1.28+ AUTO-DETECT: pass 'env' (literal string) or omit entirely to read process.env.{ANTHROPIC,OPENAI}_API_KEY f… |
| provider | string | yes | LLM provider. v1.26 ships full Anthropic support (tool use, streaming-ready). OpenAI support for chat is partial — recommend Anthropic for production agents. |
| workspace_id | string | yes | Workspace id (bearer workspace). |
No output schema declared.
No examples provided.
connect_custom_domain ~70
Connect + verify a custom domain. Pro capability — requires SELDONFRAME_API_KEY. Example: connect_custom_domain({ domain: 'app.mysite.com' })
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | Fully qualified domain, e.g. client.example.com. |
| workspace_id | string | — | Optional workspace override. |
No output schema declared.
No examples provided.
connect_workspace ~203
Connect this device/IDE to an EXISTING SeldonFrame workspace via magic-link email. Use when the operator already has a workspace (e.g. created from another device) and wants to admin it from this Claude Code / Cursor / Windsurf session. Sends a confirmation email with a one-click approval link; the tool polls until approval (5-min timeout) then stores the workspace bearer locally. For brand-new workspaces, use create_workspace_v2 instead.
| Name | Type | Req | Description |
|---|---|---|---|
| device_label | string | — | Optional human-readable label shown to the operator on the approval page so they can verify they're authorizing the right device. Defaults to a hostname-based label. |
| string | yes | Operator's email — must match an email associated with the workspace owner. Magic link is sent here. | |
| workspace_slug | string | yes | Workspace slug (the subdomain prefix). Example: 'iron-oak-barbershop' for iron-oak-barbershop.app.seldonframe.com. |
No output schema declared.
No examples provided.
create_activity ~308
Append an activity-log entry to a contact (and/or deal). Use this instead of stuffing agent reminders into contacts.notes — notes gets overwritten on updates; activities are append-only. Valid types: task, note, email, sms, call, meeting, stage_change, payment, review_request, agent_action. Example: create_activity({ contact_id: 'ctc_...', type: 'agent_action', subject: 'Speed-to-Lead agent booked consult', body: 'Scheduled for 2026-05-01' })
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | — | Optional multi-line detail (≤4000 chars). |
| completed_at | string | — | Optional ISO timestamp if logging a completed past action. |
| contact_id | string | — | Contact to log against. Either contact_id or deal_id is required. |
| deal_id | string | — | Deal to log against. Either contact_id or deal_id is required. |
| metadata | object | — | Optional JSON metadata — e.g., { agentId: 'agt_...', confidence: 0.87 } |
| scheduled_at | string | — | Optional ISO timestamp if the activity is planned for a future time (e.g., a task). |
| subject | string | — | One-line title (≤200 chars). Either subject or body is required. |
| type | string | yes | task | note | email | sms | call | meeting | stage_change | payment | review_request | agent_action |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
create_agent ~860
USE WHEN USER SAYS: 'add a chatbot to my website', 'add an AI assistant to my landing page', 'put a chat widget on my site', 'create a website chatbot', 'add an AI agent that answers customer questions', 'I want chat on my homepage', 'build me a chatbot for [business]'. DON'T confuse with: list_blocks (chat widgets are NOT a block type — agents are a separate primitive); send_conversation_turn (that's for inbound SMS/email auto-reply, NOT a website widget). If the operator wants chat on their website, THIS is the tool. Creates a new agent for this workspace. Agents are conversational interfaces (web chat, voice, SMS) that answer FAQs, book appointments, and escalate to humans — composed from typed primitives + the workspace's Soul (industry, voice, services). WHAT GETS COMPOSED AUTOMATICALLY: persona derived from soul.industry + soul.voice; FAQ knowledge from your `faq` array; pricing facts from `pricing_facts` (validators block any $-amount the agent invents that's not in this list); typed tools (look_up_availability, book_appointment, find_my_existing_appointment, escalate_to_human, provide_faq_answer). WHAT YOU PROVIDE: name, archetype (website-chatbot for v1.26.x+; voice-receptionist + sms-followup-bot queued), channel (web_chat / voice / sms / email), inline FAQ pairs, allowed pricing facts, optional greeting. STATUS LIFECYCLE: created in 'draft' (not callable). Flip to 'test' to chat with it in sandbox. Flip to 'live' once you're confident — v1.26.2+ eval-gates 'live' until 8-scenario suite passes ≥87.5%. SAFETY: response validators run on every turn — quotes_only_from_soul_pricing (critical, blocks hallucinated $X), no_prompt_injection_echo (critical), no_pii_leak (critical), no_avoid_words (warning), response_length_under_cap (warning). Critical fail = agent says 'let me check + escalate' instead of sending the bad response. OUTPUT: the agent's embed URL (one-line <script> for the operator's website) and turn URL (POST endpoint for direct API integration).…
| Name | Type | Req | Description |
|---|---|---|---|
| archetype | string | yes | Agent shape. v1.26.x ships website-chatbot with full feature support; voice-receptionist + sms-followup-bot are queued for v1.27/v1.28. |
| capabilities | array | — | Optional explicit subset of typed tools the agent may call. Default: all five (look_up_availability, book_appointment, find_my_existing_appointment, escalate_to_human, provide_faq_answer). Restrict i… |
| channel | string | yes | Delivery channel. v1.26.x ships web_chat only (embed.js bubble). Other channels queued. |
| faq | array | — | Operator-curated FAQ pairs. Each item is { q: string, a: string }. The agent has these in its system prompt; visitors get answers without an LLM round-trip when the question is a clear match. v1.27 a… |
| greeting | string | — | Optional first message shown when the chat opens (default: 'Hi! How can I help you today?'). |
| name | string | yes | Agent display name (e.g. 'Cypress HVAC Assistant'). Surfaces in the chat header. |
| pricing_facts | array | — | ONLY prices the agent may quote. Validators block any $-amount in the agent's response that's not in this list (or doesn't match exactly). If you want the agent to refuse all price questions, omit th… |
| workspace_id | string | yes | Workspace id (bearer workspace). |
No output schema declared.
No examples provided.
create_appointment_type ~262
Create a new appointment type with its own public /book/<slug> URL. Defaults availability to Mon–Fri 9am–5pm (edit on /bookings to change). Example: create_appointment_type({ title: 'Strategy call', duration_minutes: 45, price: 150 }).
| Name | Type | Req | Description |
|---|---|---|---|
| booking_slug | string | — | Optional. URL-safe slug. Auto-derived from title if omitted. |
| buffer_after_minutes | number | — | Optional. 0–120. Defaults to 0. |
| buffer_before_minutes | number | — | Optional. 0–120. Defaults to 0. |
| description | string | — | Optional. Up to 800 chars. Shown on the public booking page. |
| duration_minutes | number | — | Optional. 5–240. Defaults to 30. |
| max_bookings_per_day | number | — | Optional. Hard daily cap (1–100). Omit for unlimited. |
| price | number | — | Optional. Defaults to 0 (free). Non-zero prices route through Stripe checkout on submit (requires Stripe connected). |
| title | string | yes | Required. Human-readable name, e.g., 'Strategy call'. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
create_booking ~235
Schedule a real booking against an existing appointment type. Looks up the template by id, creates a scheduled row on the workspace calendar, stamps the contact's name + email, emits booking.created, and — if the appointment type has a price > 0 — returns a Stripe Checkout URL routed to the SMB's connected Stripe account so the builder / agent can text or email the payment link to the contact. Example: create_booking({ contact_id: 'ctc_...', appointment_type_id: 'appt_...', starts_at: '2026-05-01T15:00:00Z' })
| Name | Type | Req | Description |
|---|---|---|---|
| appointment_type_id | string | yes | Required. Appointment-type template id from list_appointment_types. |
| contact_id | string | yes | Required. CRM contact being booked. |
| notes | string | — | Optional free-form booking notes. |
| starts_at | string | yes | Required. ISO 8601 timestamp for the appointment start (e.g. 2026-05-01T15:00:00Z). Duration is read from the appointment type. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
create_contact ~178
Create a new contact. Typical use: 'Add Jane Doe [email protected] as a lead'. Example: create_contact({ first_name: 'Jane', last_name: 'Doe', email: '[email protected]', status: 'lead' }).
| Name | Type | Req | Description |
|---|---|---|---|
| string | — | Optional but strongly recommended — unlocks form auto-linking and email sends. | |
| first_name | string | yes | Required. Contact's first name. |
| last_name | string | — | Optional. Last name. |
| source | string | — | Optional source tag (e.g., 'manual', 'intake-form', 'import'). |
| status | string | — | Optional lifecycle stage (e.g., 'lead', 'prospect', 'customer'). Defaults to 'lead'. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
create_coupon ~391
Create a Stripe coupon + matching per-contact redeemable promotion code on the workspace's connected Stripe account. Use for Win-Back / retention agents that need UNIQUE codes per recipient (shared codes are vulnerable to abuse + lose attribution signal). Default max_redemptions=1 + auto-generated code string. Requires the workspace to have completed Stripe Connect onboarding. Example: create_coupon({ percent_off: 20, duration: 'once', name: 'Win-Back 20% off' })
| Name | Type | Req | Description |
|---|---|---|---|
| amount_off | number | — | Flat discount in the currency's major unit (e.g., 25.00 for $25 off). Either percent_off or amount_off is required. |
| code | string | — | Optional fixed redeemable code string. If omitted, Stripe auto-generates one. |
| currency | string | — | Only used with amount_off. 3-letter ISO code. Defaults to usd. |
| duration | string | — | 'once' (default) | 'forever' | 'repeating'. 'repeating' requires duration_in_months. |
| duration_in_months | number | — | Required when duration='repeating'. |
| expires_at | string | — | Optional ISO timestamp. Code becomes invalid after this moment. Prefer expires_in_days for agent archetypes. |
| expires_in_days | number | — | Relative expiry: code becomes invalid N days after this call fires (1–365). Preferred over expires_at for agent archetypes so the window stays meaningful no matter when the agent was last deployed. |
| max_redemptions | number | — | Max total redemptions. Default 1 — per-contact unique code. |
| name | string | — | Optional display name for the coupon (≤60 chars). |
| percent_off | number | — | Discount percentage (0 < n ≤ 100). Either percent_off or amount_off is required. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
create_deal ~183
Create a new deal attached to a contact on the default pipeline. Typical use: 'Create a $5k deal for Jane Doe at the Discovery stage'. Example: create_deal({ contact_id: '...', title: 'Q2 retainer', value: 5000, stage: 'Discovery' }).
| Name | Type | Req | Description |
|---|---|---|---|
| contact_id | string | yes | UUID of the contact this deal belongs to. |
| probability | number | — | Optional win probability 0-100. Defaults to 0. |
| stage | string | — | Optional stage name (e.g. 'Discovery', 'Proposal'). Defaults to the first stage of the default pipeline. |
| title | string | yes | Human-readable deal name. |
| value | number | — | Optional deal value in workspace's default currency. Defaults to 0. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
create_form ~246
Create a new intake form. Pass template_id to pre-fill fields from a built-in template (contact, lead-qualification, booking-request, nps-feedback, event-registration, blank). Example: create_form({ template_id: 'contact' }) → uses 'Contact us' template. Or pass explicit fields: create_form({ name: 'Intake', fields: [{ key: 'email', label: 'Email', type: 'email', required: true }] }).
| Name | Type | Req | Description |
|---|---|---|---|
| fields | array | — | Optional field list. Overrides template fields. Each: { key, label, type ('text'|'email'|'tel'|'textarea'|'select'), required, options? }. |
| is_active | boolean | — | Optional. Defaults to true. |
| name | string | — | Optional. Falls back to template name or 'New intake form'. |
| slug | string | — | Optional URL-safe slug. Falls back to template defaultSlug or slugified name. |
| template_id | string | — | Optional. One of: blank, contact, lead-qualification, booking-request, nps-feedback, event-registration. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
create_full_workspace ~686
PREFERRED for new workspaces. Atomic, server-side workspace creation: takes structured business info and creates everything in ONE call — workspace, business profile, CRM with industry-specific pipeline stages, booking page with availability, intake form, themed landing page, all deployed with live URLs. Use this instead of create_workspace + a long sequence of customization tools. The pipeline runs server-side with a fixed order — same input always produces same output, no retries, no 404s. MANDATORY FOLLOW-UP: After this returns `status: 'ready'`, ask the operator verbatim 'What email should I use for your account? This is where you'll get your login link and notifications.' Then call `finalize_workspace({ workspace_id, email })`. The admin dashboard URL is ONLY created by finalize_workspace — it does not exist in this response (so there's nothing for you to display prematurely). Example: create_full_workspace({ business_name: 'Summit Air Comfort', city: 'Phoenix', state: 'AZ', phone: '(480) 555-2100', services: ['AC repair', 'heating installation', 'duct cleaning'], business_description: 'Residential and commercial HVAC in Phoenix', review_count: 950, review_rating: 4.7, trust_signals: ['licensed', 'bonded', 'insured'], emergency_service: true, same_day: true, service_area: ['Scottsdale', 'Tempe', 'Mesa'] })
| Name | Type | Req | Description |
|---|---|---|---|
| address | string | — | Optional business address. |
| business_description | string | yes | One paragraph describing the business — drives the hero subhead, about section, and (critically) the personality classifier. Include industry words verbatim ('residential HVAC', 'family-owned plumbin… |
| business_name | string | yes | Business display name (e.g. 'Summit Air Comfort'). |
| certifications | array | — | Optional — credentials like ['EPA-certified', 'NATE-certified']. Surfaces in trust strip. |
| city | string | yes | Operator's city. Drives timezone inference. |
| string | — | Optional contact email surfaced in the landing footer (NOT the operator's account email — that comes via finalize_workspace). | |
| emergency_service | boolean | — | Optional — operator offers 24/7 emergency service. Surfaces in nav + hero. |
| phone | string | yes | Business phone, any format. Renders in nav, hero, footer. |
| review_count | number | — | Optional — number of reviews. Surfaces in trust strip + hero proof metric. |
| review_rating | number | — | Optional — average star rating (e.g. 4.7). Surfaces in trust strip. |
| same_day | boolean | — | Optional — same-day service available. Surfaces in trust strip. |
| service_area | array | — | Optional — cities or neighborhoods served (e.g. ['Scottsdale', 'Tempe']). |
| services | array | yes | Services / offerings the business provides — each as a plain string. The classifier reads these to pick the right CRM personality (HVAC, legal, dental, coaching, agency, default). |
| state | string | yes | US state code or full name (or Canadian province). Drives timezone inference. |
| trust_signals | array | — | Optional — short claims like ['licensed', 'bonded', 'insured']. Surfaces in trust strip. |
No output schema declared.
No examples provided.
create_invoice ~193
Draft a Stripe invoice on the workspace's connected Stripe account. Invoice is created but not sent — call send_invoice separately so agents can review before dispatch. Contact must have an email. Example: create_invoice({ contact_id: 'ctc_123', items: [{ description: '1 hr consulting', quantity: 1, unit_amount: 200 }], due_at: '2026-05-21T00:00:00Z' })
| Name | Type | Req | Description |
|---|---|---|---|
| contact_id | string | yes | CRM contact to bill. |
| currency | string | — | 3-letter ISO currency code. Defaults to USD. |
| due_at | string | — | ISO timestamp for invoice due date. Defaults to 30 days out. |
| items | array | yes | Line items. Each: {description, quantity, unit_amount} (unit_amount in the workspace's currency). |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
create_subscription ~141
Start a recurring subscription for a contact against a Stripe Price id. The Price must already exist in the workspace's Stripe dashboard — v1 does not create Prices. Example: create_subscription({ contact_id: 'ctc_123', price_id: 'price_1ABCxyz', trial_days: 14 })
| Name | Type | Req | Description |
|---|---|---|---|
| contact_id | string | yes | CRM contact to subscribe. |
| price_id | string | yes | Stripe Price id (e.g., 'price_1ABC...') from the workspace's Stripe dashboard. |
| trial_days | number | — | Optional free trial days before first charge. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
create_workspace_from_google_paste ~1,103
PREFERRED when the operator pastes a Google Maps business listing. Same atomic pipeline as create_full_workspace; this tool's docs guide the paste-to-fields extraction. Claude Code parses the paste BEFORE calling this tool — never pass the raw paste text. EXTRACTION RULES (apply in order): 1) business_name → the bold business title at the top of the listing. 2) phone → the digits next to the phone icon. 3) address → the line next to the location pin. Parse city + state from this address into separate fields (city/state). 4) services → derive from BOTH the categories chip row (e.g. 'Plumber · Emergency plumbing service') AND any explicit 'Services' section ('Drain cleaning', 'Water heater repair'). Dedupe; keep 5-12 distinct strings. 5) business_description → synthesize 1-2 sentences from the categories + 'About' / 'From the business' section. Include industry words verbatim (the personality classifier reads this). 6) review_rating + review_count → the '4.7 ★ (950)' element. 7) trust_signals → 'Licensed', 'Bonded', 'Insured', 'Family-owned' if mentioned. 8) emergency_service / same_day → set true if 'open 24 hours', '24/7', 'same-day service' appears. 9) service_area → cities mentioned in 'Service area' section. 10) weekly_hours → parse the hours block ('Monday: 9 AM-5 PM, Tuesday: closed, ...') into the canonical shape: {monday:{enabled:true,start:'09:00',end:'17:00'},tuesday:{enabled:false,start:'09:00',end:'17:00'},...}. Keys MUST be FULL DAY NAMES (sunday/monday/.../saturday); times MUST be HH:MM 24-hour. 'Closed' → enabled:false (start/end are placeholders). 'Open 24 hours' → start:'00:00', end:'23:59'. These hours are written DIRECTLY to the booking template's availability — wrong shape = booking page falls back to Mon-Fri 9-5 default. 11) google_place_url → the Maps URL the operator pasted, if visible. Optional, stored on soul.business.maps_url for audit. MANDATORY FOLLOW-UP: same as create_full_workspace — after this returns `status: 'ready'`, ask 'What emai…
| Name | Type | Req | Description |
|---|---|---|---|
| address | string | — | Optional full address line from the listing. |
| business_description | string | yes | 1-2 sentence summary synthesized from Maps categories + 'About' / 'From the business' section. |
| business_name | string | yes | Business display name (top of the Maps listing). |
| certifications | array | — | Optional — credentials mentioned in the listing (['EPA-certified', ...]). |
| city | string | yes | City parsed from the Maps address line. |
| string | — | Optional contact email from the listing (NOT the operator's account email). | |
| emergency_service | boolean | — | Optional — listing shows 'open 24 hours' or '24/7'. |
| google_place_url | string | — | Optional — the Google Maps share URL for the listing. Stored on soul.business.maps_url for audit. |
| phone | string | yes | Phone number from the Maps phone icon row, any format. |
| review_count | number | — | Optional — review count from '★ (N)' display. |
| review_rating | number | — | Optional — average star rating (e.g. 4.7). |
| same_day | boolean | — | Optional — listing mentions 'same-day service'. |
| service_area | array | — | Optional — cities/neighborhoods from the 'Service area' section. |
| services | array | yes | Services derived from the Maps categories + 'Services' chips, deduped. 5-12 strings. |
| state | string | yes | US state code or full name parsed from the Maps address line. |
| testimonials | array | — | OPTIONAL real review excerpts extracted from the Maps paste, VERBATIM (do not rewrite). Each entry: { quote, name?, role?, rating? }. quote = the actual review text the customer wrote (≤800 chars). n… |
| trust_signals | array | — | Optional — 'Licensed', 'Bonded', 'Insured', 'Family-owned' if surfaced. |
| weekly_hours | object | — | Canonical weekly schedule extracted from the Maps hours block. Keys are FULL DAY NAMES (sunday/monday/tuesday/wednesday/thursday/friday/saturday). Each value is { enabled: boolean, start: 'HH:MM', en… |
No output schema declared.
No examples provided.
create_workspace_v2 ~504
PREFERRED for new workspaces (v1.4+). MCP-native workspace creation: bootstraps the workspace via the v1 orchestrator (CRM, booking, intake, theme, pipeline) AND returns a list of v2 page blocks the IDE agent will now generate using its own LLM. Flow: 1) call this tool with the operator's business info; 2) for each block in `v2.recommended_blocks`, call get_block_skill(name) and use your LLM to generate props matching the SKILL.md prompt + schema; 3) call persist_block({ workspace_id, block_name, generation_prompt, props }) for each; 4) call complete_workspace_v2({ workspace_id }). MANDATORY FOLLOW-UP: After this returns `status: 'ready'` AND after all blocks land via persist_block + complete_workspace_v2, ask the operator verbatim 'What email should I use for your account?' Then call finalize_workspace({ workspace_id, email }). The admin dashboard URL is created by finalize_workspace, not here. Why v2: v1 generated all copy server-side from a hardcoded personality system, which produced layer-mismatch bugs every time a new niche was tested. v2 puts the LLM in your context (the IDE agent), reads from one SKILL.md per block, and the generated copy is naturally niche-aware. The operator can later say 'change the hero' and you customize it via persist_block with a customization payload.
| Name | Type | Req | Description |
|---|---|---|---|
| address | string | — | Optional business address. |
| business_description | string | yes | One paragraph describing the business — drives the personality classifier and feeds into block prompts. |
| business_name | string | yes | Business display name. |
| certifications | array | — | — |
| city | string | yes | Operator's city. Drives timezone inference. |
| string | — | Optional contact email surfaced in the landing footer (NOT the operator's account email). | |
| emergency_service | boolean | — | — |
| phone | string | yes | Business phone, any format. |
| review_count | number | — | Optional — number of reviews. |
| review_rating | number | — | Optional — average star rating. |
| same_day | boolean | — | — |
| service_area | array | — | — |
| services | array | yes | Services / offerings the business provides — each as a plain string. |
| state | string | yes | US state code or full name (or Canadian province). |
| trust_signals | array | — | — |
No output schema declared.
No examples provided.
customize_intake_form ~92
DEPRECATED alias for update_form({ form: 'intake', fields }). Only edits the auto-seeded default form; prefer update_form for new scripts so you can target any form in the workspace.
| Name | Type | Req | Description |
|---|---|---|---|
| fields | array | — | Replacement field list. |
| form_name | string | — | Optional new display name for the default form. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
delete_booking_field ~100
Remove ONE booking field (extra). Standards (fullName, email at indices 0/1) cannot be deleted — index must be >= 2. Floor is 'just the 2 standards' (different from intake's 'minimum 1' rule because booking forms always have 2 standards).
| Name | Type | Req | Description |
|---|---|---|---|
| index | integer | yes | 0-based index. Must be >= 2 (standards locked). |
| workspace_id | string | yes | Workspace id. |
No output schema declared.
No examples provided.
delete_contact ~70
Delete a contact and all linked deals/activities (cascades via FK). Irreversible. Example: delete_contact({ contact_id: '...' }).
| Name | Type | Req | Description |
|---|---|---|---|
| contact_id | string | yes | UUID of the contact to delete. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
delete_deal ~58
Delete a deal. Irreversible. Example: delete_deal({ deal_id: '...' }).
| Name | Type | Req | Description |
|---|---|---|---|
| deal_id | string | yes | UUID of the deal. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
delete_form ~78
Delete a form. Irreversible. Submissions are NOT deleted (form_submissions has ON DELETE SET NULL on form_id). Example: delete_form({ form: 'old-survey' }).
| Name | Type | Req | Description |
|---|---|---|---|
| form | string | yes | Form id (uuid) or slug. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
delete_intake_field ~109
Remove ONE intake field. Refuses to leave 0 fields (the public submit becomes meaningless without any inputs — minimum is 1). Use when the operator wants to remove a question from the form ('drop the property type field', 'remove the rating question'). For content edits use update_intake_field. Run get_intake_structure first to find the right index.
| Name | Type | Req | Description |
|---|---|---|---|
| index | integer | yes | 0-based index of the field to delete. |
| workspace_id | string | yes | Workspace id. |
No output schema declared.
No examples provided.
delete_portal_section ~72
Remove ONE portal-template section. UNLIKE landing's delete_section, leaving 0 portal sections is valid — the portal just shows built-in tabs (Documents, Bookings) without a Custom tab.
| Name | Type | Req | Description |
|---|---|---|---|
| index | integer | yes | 0-based index to delete. |
| workspace_id | string | yes | Workspace id. |
No output schema declared.
No examples provided.
delete_section ~188
Remove ONE landing-page section atomically. Identifies the section by INDEX (run get_landing_structure first). Refuses to leave 0 sections — minimum is 1 — so you can't accidentally wipe the page. Use when the workspace has a duplicate section type (e.g. two services-grid sections, one of which was an unintended generation artifact) and the operator wants the duplicate gone. Disambiguate WHICH duplicate via the preview text from get_landing_structure (e.g. 'stats — 4 numbers' vs '3 services (grid-3)'). For content edits, use update_landing_section. For replacing a section's content, use persist_block. delete_section is structural — it removes the section from the page entirely.
| Name | Type | Req | Description |
|---|---|---|---|
| index | integer | yes | 0-based index of the section to delete (from get_landing_structure response). |
| workspace_id | string | yes | Workspace id. |
No output schema declared.
No examples provided.
detach_workspace_from_agency ~79
Detach a workspace from its current agency. Chrome falls back to SeldonFrame defaults on next render. Either the workspace owner OR the agency owner can detach.
| Name | Type | Req | Description |
|---|---|---|---|
| target_workspace_id | string | yes | Workspace id to detach (often the same as workspace_id). |
| workspace_id | string | yes | Workspace id (the bearer's workspace). |
No output schema declared.
No examples provided.
detach_workspace_from_partner_agency ~140
Detach a client workspace from its parent partner-agency. The workspace's chrome falls back to SeldonFrame defaults on next page load. Use when an agency loses a client or when the workspace transitions out of agency management. Caller must own the workspace OR own the agency the workspace is attached to (either authorizes detach). Workspace data is unchanged; only parent_agency_id is set to null. Reversible via attach_workspace_to_partner_agency. Example: detach_workspace_from_partner_agency({ workspace_id: "phoenix-hvac-uuid" })
| Name | Type | Req | Description |
|---|---|---|---|
| workspace_id | string | yes | Client workspace id to detach from its agency. |
No output schema declared.
No examples provided.
embed_chatbot_on_workspace_landing ~249
USE WHEN USER SAYS: 'add the chatbot to my landing page', 'embed this on the website', 'put the agent on every page', 'make the chat bubble appear', 'wire the chatbot to the public site'. Wires a published agent's embed.js URL into the workspace's organization settings. The public page renderer (/s/ + /l/ routes) reads this on every render and injects a <script src='...' async></script> tag near </body>, so the floating chat bubble appears bottom-right on every page of the workspace's public surface — no per-section editing, no manual HTML, no Pages → Edit step. Agent must already be in status='test' or status='live' (call publish_agent first if it's still draft). One workspace = one chatbot at a time; calling this again with a different agent_id replaces the bubble. Pair with remove_chatbot_from_landing to clear it.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | string | yes | Agent id from build_website_chatbot's response or list_agents. Must belong to the workspace and be in status=test or live. |
| workspace_id | string | yes | Workspace id (bearer workspace). |
No output schema declared.
No examples provided.
export_agent ~31
Export the current workspace as a portable .agent/ bundle.
| Name | Type | Req | Description |
|---|---|---|---|
| workspace_id | string | — | Optional workspace override. |
No output schema declared.
No examples provided.
fetch_source_for_soul ~84
Fetch a URL and return normalized text (headings + body, up to 256KB). Use this to gather raw content from the operator's existing website; then extract a structured business profile and save it with submit_soul. Zero LLM cost to SeldonFrame — extraction runs in this session.
| Name | Type | Req | Description |
|---|---|---|---|
| url | string | yes | Absolute URL to fetch. |
No output schema declared.
No examples provided.
finalize_workspace ~257
ONE-CALL CLOSING WRAPPER for the workspace creation flow. Bundles email collection (welcome email + lead capture via collect_operator_email) AND produces the final operator-facing summary (live URLs, what's configured, admin link). Call this as the LAST step of every workspace creation. After create_workspace returns, ask the user 'What email should I use for your account? This is where you'll get your login link and any notifications.' Then call this tool with the email they give you. Returns a `summary` string Claude Code should paraphrase verbatim to the operator. Use this instead of calling collect_operator_email directly when you want a single tool call to close the loop. Skipping this is the same as skipping email collection — leaves the operator with a one-shot URL and no recovery path. Example: finalize_workspace({ email: '[email protected]', name: 'Max' })
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | Operator email — used as the welcome email recipient AND as the unique key for the SeldonFrame CRM lead. | |
| name | string | — | Optional operator name (used in the email greeting and on the CRM lead). |
| workspace_id | string | — | Optional workspace override. Defaults to the workspace just created. |
No output schema declared.
No examples provided.
generate_landing_page ~138
Generate a Puck landing-page payload from a natural-language prompt using Claude + the workspace's Soul + theme. Returns the payload (validated against the Puck schema) but does NOT persist — pair with create_landing_page to save the result. Example: generate_landing_page({ prompt: 'A landing for a Laval dental clinic, focus on new-patient consultations' })
| Name | Type | Req | Description |
|---|---|---|---|
| existing | object | — | Optional existing Puck payload to revise rather than start fresh. |
| prompt | string | yes | One-sentence page description. The more specific, the better. |
| workspace_id | string | — | Optional. Falls back to the active workspace. |
No output schema declared.
No examples provided.
get_agent_conversation ~197
USE WHEN USER SAYS: 'show me that conversation in detail', 'why did the chatbot say X?', 'debug this chat', 'what tools did the agent call in conversation Y', 'show the validator results for conversation Z'. Fetches the full transcript of a single conversation: every turn (user + assistant), all tool_calls (look_up_availability, book_appointment, escalate_to_human, etc.) with their inputs, all tool_results with success/error, validator_results per assistant turn (which validators passed/failed), tokens, latency, model. Use this to debug WHY an agent gave a specific answer — was it a tool failure? a validator gating? wrong info in blueprint? Pair with replay_conversation to test a blueprint fix.
| Name | Type | Req | Description |
|---|---|---|---|
| conversation_id | string | yes | Conversation id (from tail_agent_conversations or admin /conversations page). |
| workspace_id | string | yes | Workspace id (bearer workspace). |
No output schema declared.
No examples provided.
get_agent_metrics ~189
USE WHEN USER SAYS: 'is my chatbot healthy?', 'how's the agent performing?', 'show me agent stats', 'what's my chatbot's pass rate this week?', 'agent dashboard ping'. Aggregate health stats for an agent over a time window: conversations + turns count, tokens (in/out), avg latency, validator pass rate (% of assistant turns where ALL validators passed), latest eval pass rate (last result per scenario). Use as a dashboard ping. If validator_pass_rate drops or eval_pass_rate falls below the 87.5% gate, the agent shouldn't be promoted to live.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | string | yes | Agent id from list_agents. |
| since_hours | integer | — | Time window in hours (default 24). Pass 168 for last 7 days, 720 for last 30 days. |
| workspace_id | string | yes | Workspace id (bearer workspace). |
No output schema declared.
No examples provided.
get_block_skill ~122
Fetch the SKILL.md (the full generation prompt + prop schema + voice rules + worked examples + validator definitions) for one v2 page block. Returns raw markdown text. Read it carefully BEFORE generating props — the prop schema in the YAML frontmatter is enforced by the persist_block endpoint, and the validators run on every save. Generation that ignores the SKILL.md will fail validation and the operator will see worse output.
| Name | Type | Req | Description |
|---|---|---|---|
| block_name | string | yes | Block name. Use list_blocks to discover. As of v1.4: hero, services, faq. |
No output schema declared.
No examples provided.