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

io.github.seldonframe/seldonframe-mcp

NPM · @SELDONFRAME/MCP · SCANNED AUG 3

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

Available components

+16 this week 59 Trust /100

Deprecated

This server is marked deprecated in the MCP registry.

Trust breakdown (6 categories)

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

Supply Chain 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
Install

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

npm · @seldonframe/mcp

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

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

  • 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.

Diagnostics

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

Captured 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.

MCP tools — 151 exposed · ~25,838 tokens

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

Tool Tokens
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).

NameTypeReqDescription
fieldobjectyesBookingFormField object: { id (kebab-case, unique, NOT 'fullName'/'email'), type, label, required?, placeholder?, options? for select fields }.
positionintegerOptional 0-based insert position. Default: append. Must be >= 2 (0/1 are reserved for standards).
workspace_idstringyesWorkspace 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).

NameTypeReqDescription
positionintegerOptional 0-based insert position. Default: appended at the end. Use get_landing_structure to find the right slot first.
treeobjectyesComposite 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_idstringyesWorkspace 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.

NameTypeReqDescription
hostnamestringyesHostname to register, lowercased and without scheme. Examples: 'joescuts.com', 'www.joescuts.com', 'shop.joescuts.com'.
workspace_idstringyesWorkspace 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.

NameTypeReqDescription
fieldobjectyesThe new IntakeQuestion object: { id (kebab-case, unique), type, label, required?, helper?, options?, ratingScale?, validation? }.
positionintegerOptional 0-based insert index. Default: append. Use get_intake_structure to find the right slot.
workspace_idstringyesWorkspace 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.

NameTypeReqDescription
positionintegerOptional 0-based insert position. Default: append at the end.
treeobjectyesComposite 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_idstringyesWorkspace 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>' })

NameTypeReqDescription
design_md_contentstringyesFull 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_idstringOptional 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' })

NameTypeReqDescription
presetstringyesThe 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_idstringOptional 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).

NameTypeReqDescription
agency_idstringyesAgency id from register_partner_agency.
target_workspace_idstringyesWorkspace 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_idstringyesWorkspace 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" })

NameTypeReqDescription
agency_idstringyesAgency id the workspace will inherit chrome from.
workspace_idstringyesClient 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).

NameTypeReqDescription
anthropic_api_keystringOptional 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 =…
faqarrayOperator-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.
greetingstringFirst 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?'
namestringyesAgent display name (e.g. 'Cypress & Pine HVAC Assistant'). Surfaces in chat header.
pricing_factsarrayONLY 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_idstringyesWorkspace 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_...' }).

NameTypeReqDescription
booking_idstringyesRequired. UUID of the booking to cancel.
workspace_idstringOptional. 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.

NameTypeReqDescription
immediatebooleanIf true, terminate now. Default: cancel at period end.
subscription_idstringyesSubscription to cancel.
workspace_idstringOptional. 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' })

NameTypeReqDescription
namestringyesName for the new workspace.
source_workspace_idstringyesWorkspace 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' })

NameTypeReqDescription
emailstringyesOperator email — used as the welcome email recipient AND as the unique key for the SeldonFrame CRM lead.
namestringOptional operator name (used in the email greeting and on the CRM lead).
workspace_idstringOptional 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.

NameTypeReqDescription
workspace_idstringyesWorkspace 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.

NameTypeReqDescription
descriptionstringOptional description.
duration_minutesnumberOptional new duration in minutes.
titlestringOptional new title.
workspace_idstringOptional. 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.

NameTypeReqDescription
api_keystringAPI 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…
providerstringyesLLM provider. v1.26 ships full Anthropic support (tool use, streaming-ready). OpenAI support for chat is partial — recommend Anthropic for production agents.
workspace_idstringyesWorkspace 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' })

NameTypeReqDescription
domainstringyesFully qualified domain, e.g. client.example.com.
workspace_idstringOptional 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.

NameTypeReqDescription
device_labelstringOptional 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.
emailstringyesOperator's email — must match an email associated with the workspace owner. Magic link is sent here.
workspace_slugstringyesWorkspace 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' })

NameTypeReqDescription
bodystringOptional multi-line detail (≤4000 chars).
completed_atstringOptional ISO timestamp if logging a completed past action.
contact_idstringContact to log against. Either contact_id or deal_id is required.
deal_idstringDeal to log against. Either contact_id or deal_id is required.
metadataobjectOptional JSON metadata — e.g., { agentId: 'agt_...', confidence: 0.87 }
scheduled_atstringOptional ISO timestamp if the activity is planned for a future time (e.g., a task).
subjectstringOne-line title (≤200 chars). Either subject or body is required.
typestringyestask | note | email | sms | call | meeting | stage_change | payment | review_request | agent_action
workspace_idstringOptional. 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).…

NameTypeReqDescription
archetypestringyesAgent shape. v1.26.x ships website-chatbot with full feature support; voice-receptionist + sms-followup-bot are queued for v1.27/v1.28.
capabilitiesarrayOptional 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…
channelstringyesDelivery channel. v1.26.x ships web_chat only (embed.js bubble). Other channels queued.
faqarrayOperator-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…
greetingstringOptional first message shown when the chat opens (default: 'Hi! How can I help you today?').
namestringyesAgent display name (e.g. 'Cypress HVAC Assistant'). Surfaces in the chat header.
pricing_factsarrayONLY 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_idstringyesWorkspace 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 }).

NameTypeReqDescription
booking_slugstringOptional. URL-safe slug. Auto-derived from title if omitted.
buffer_after_minutesnumberOptional. 0–120. Defaults to 0.
buffer_before_minutesnumberOptional. 0–120. Defaults to 0.
descriptionstringOptional. Up to 800 chars. Shown on the public booking page.
duration_minutesnumberOptional. 5–240. Defaults to 30.
max_bookings_per_daynumberOptional. Hard daily cap (1–100). Omit for unlimited.
pricenumberOptional. Defaults to 0 (free). Non-zero prices route through Stripe checkout on submit (requires Stripe connected).
titlestringyesRequired. Human-readable name, e.g., 'Strategy call'.
workspace_idstringOptional. 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' })

NameTypeReqDescription
appointment_type_idstringyesRequired. Appointment-type template id from list_appointment_types.
contact_idstringyesRequired. CRM contact being booked.
notesstringOptional free-form booking notes.
starts_atstringyesRequired. ISO 8601 timestamp for the appointment start (e.g. 2026-05-01T15:00:00Z). Duration is read from the appointment type.
workspace_idstringOptional. 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' }).

NameTypeReqDescription
emailstringOptional but strongly recommended — unlocks form auto-linking and email sends.
first_namestringyesRequired. Contact's first name.
last_namestringOptional. Last name.
sourcestringOptional source tag (e.g., 'manual', 'intake-form', 'import').
statusstringOptional lifecycle stage (e.g., 'lead', 'prospect', 'customer'). Defaults to 'lead'.
workspace_idstringOptional. 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' })

NameTypeReqDescription
amount_offnumberFlat discount in the currency's major unit (e.g., 25.00 for $25 off). Either percent_off or amount_off is required.
codestringOptional fixed redeemable code string. If omitted, Stripe auto-generates one.
currencystringOnly used with amount_off. 3-letter ISO code. Defaults to usd.
durationstring'once' (default) | 'forever' | 'repeating'. 'repeating' requires duration_in_months.
duration_in_monthsnumberRequired when duration='repeating'.
expires_atstringOptional ISO timestamp. Code becomes invalid after this moment. Prefer expires_in_days for agent archetypes.
expires_in_daysnumberRelative 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_redemptionsnumberMax total redemptions. Default 1 — per-contact unique code.
namestringOptional display name for the coupon (≤60 chars).
percent_offnumberDiscount percentage (0 < n ≤ 100). Either percent_off or amount_off is required.
workspace_idstringOptional. 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' }).

NameTypeReqDescription
contact_idstringyesUUID of the contact this deal belongs to.
probabilitynumberOptional win probability 0-100. Defaults to 0.
stagestringOptional stage name (e.g. 'Discovery', 'Proposal'). Defaults to the first stage of the default pipeline.
titlestringyesHuman-readable deal name.
valuenumberOptional deal value in workspace's default currency. Defaults to 0.
workspace_idstringOptional. 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 }] }).

NameTypeReqDescription
fieldsarrayOptional field list. Overrides template fields. Each: { key, label, type ('text'|'email'|'tel'|'textarea'|'select'), required, options? }.
is_activebooleanOptional. Defaults to true.
namestringOptional. Falls back to template name or 'New intake form'.
slugstringOptional URL-safe slug. Falls back to template defaultSlug or slugified name.
template_idstringOptional. One of: blank, contact, lead-qualification, booking-request, nps-feedback, event-registration.
workspace_idstringOptional. 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'] })

NameTypeReqDescription
addressstringOptional business address.
business_descriptionstringyesOne 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_namestringyesBusiness display name (e.g. 'Summit Air Comfort').
certificationsarrayOptional — credentials like ['EPA-certified', 'NATE-certified']. Surfaces in trust strip.
citystringyesOperator's city. Drives timezone inference.
emailstringOptional contact email surfaced in the landing footer (NOT the operator's account email — that comes via finalize_workspace).
emergency_servicebooleanOptional — operator offers 24/7 emergency service. Surfaces in nav + hero.
phonestringyesBusiness phone, any format. Renders in nav, hero, footer.
review_countnumberOptional — number of reviews. Surfaces in trust strip + hero proof metric.
review_ratingnumberOptional — average star rating (e.g. 4.7). Surfaces in trust strip.
same_daybooleanOptional — same-day service available. Surfaces in trust strip.
service_areaarrayOptional — cities or neighborhoods served (e.g. ['Scottsdale', 'Tempe']).
servicesarrayyesServices / 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).
statestringyesUS state code or full name (or Canadian province). Drives timezone inference.
trust_signalsarrayOptional — 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' })

NameTypeReqDescription
contact_idstringyesCRM contact to bill.
currencystring3-letter ISO currency code. Defaults to USD.
due_atstringISO timestamp for invoice due date. Defaults to 30 days out.
itemsarrayyesLine items. Each: {description, quantity, unit_amount} (unit_amount in the workspace's currency).
workspace_idstringOptional. 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 })

NameTypeReqDescription
contact_idstringyesCRM contact to subscribe.
price_idstringyesStripe Price id (e.g., 'price_1ABC...') from the workspace's Stripe dashboard.
trial_daysnumberOptional free trial days before first charge.
workspace_idstringOptional. 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…

NameTypeReqDescription
addressstringOptional full address line from the listing.
business_descriptionstringyes1-2 sentence summary synthesized from Maps categories + 'About' / 'From the business' section.
business_namestringyesBusiness display name (top of the Maps listing).
certificationsarrayOptional — credentials mentioned in the listing (['EPA-certified', ...]).
citystringyesCity parsed from the Maps address line.
emailstringOptional contact email from the listing (NOT the operator's account email).
emergency_servicebooleanOptional — listing shows 'open 24 hours' or '24/7'.
google_place_urlstringOptional — the Google Maps share URL for the listing. Stored on soul.business.maps_url for audit.
phonestringyesPhone number from the Maps phone icon row, any format.
review_countnumberOptional — review count from '★ (N)' display.
review_ratingnumberOptional — average star rating (e.g. 4.7).
same_daybooleanOptional — listing mentions 'same-day service'.
service_areaarrayOptional — cities/neighborhoods from the 'Service area' section.
servicesarrayyesServices derived from the Maps categories + 'Services' chips, deduped. 5-12 strings.
statestringyesUS state code or full name parsed from the Maps address line.
testimonialsarrayOPTIONAL 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_signalsarrayOptional — 'Licensed', 'Bonded', 'Insured', 'Family-owned' if surfaced.
weekly_hoursobjectCanonical 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.

NameTypeReqDescription
addressstringOptional business address.
business_descriptionstringyesOne paragraph describing the business — drives the personality classifier and feeds into block prompts.
business_namestringyesBusiness display name.
certificationsarray
citystringyesOperator's city. Drives timezone inference.
emailstringOptional contact email surfaced in the landing footer (NOT the operator's account email).
emergency_serviceboolean
phonestringyesBusiness phone, any format.
review_countnumberOptional — number of reviews.
review_ratingnumberOptional — average star rating.
same_dayboolean
service_areaarray
servicesarrayyesServices / offerings the business provides — each as a plain string.
statestringyesUS state code or full name (or Canadian province).
trust_signalsarray

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.

NameTypeReqDescription
fieldsarrayReplacement field list.
form_namestringOptional new display name for the default form.
workspace_idstringOptional. 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).

NameTypeReqDescription
indexintegeryes0-based index. Must be >= 2 (standards locked).
workspace_idstringyesWorkspace 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: '...' }).

NameTypeReqDescription
contact_idstringyesUUID of the contact to delete.
workspace_idstringOptional. 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: '...' }).

NameTypeReqDescription
deal_idstringyesUUID of the deal.
workspace_idstringOptional. 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' }).

NameTypeReqDescription
formstringyesForm id (uuid) or slug.
workspace_idstringOptional. 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.

NameTypeReqDescription
indexintegeryes0-based index of the field to delete.
workspace_idstringyesWorkspace 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.

NameTypeReqDescription
indexintegeryes0-based index to delete.
workspace_idstringyesWorkspace 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.

NameTypeReqDescription
indexintegeryes0-based index of the section to delete (from get_landing_structure response).
workspace_idstringyesWorkspace 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.

NameTypeReqDescription
target_workspace_idstringyesWorkspace id to detach (often the same as workspace_id).
workspace_idstringyesWorkspace 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" })

NameTypeReqDescription
workspace_idstringyesClient 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.

NameTypeReqDescription
agent_idstringyesAgent id from build_website_chatbot's response or list_agents. Must belong to the workspace and be in status=test or live.
workspace_idstringyesWorkspace id (bearer workspace).

No output schema declared.

No examples provided.

export_agent ~31

Export the current workspace as a portable .agent/ bundle.

NameTypeReqDescription
workspace_idstringOptional 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.

NameTypeReqDescription
urlstringyesAbsolute 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' })

NameTypeReqDescription
emailstringyesOperator email — used as the welcome email recipient AND as the unique key for the SeldonFrame CRM lead.
namestringOptional operator name (used in the email greeting and on the CRM lead).
workspace_idstringOptional 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' })

NameTypeReqDescription
existingobjectOptional existing Puck payload to revise rather than start fresh.
promptstringyesOne-sentence page description. The more specific, the better.
workspace_idstringOptional. 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.

NameTypeReqDescription
conversation_idstringyesConversation id (from tail_agent_conversations or admin /conversations page).
workspace_idstringyesWorkspace 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.

NameTypeReqDescription
agent_idstringyesAgent id from list_agents.
since_hoursintegerTime window in hours (default 24). Pass 168 for last 7 days, 720 for last 30 days.
workspace_idstringyesWorkspace 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.

NameTypeReqDescription
block_namestringyesBlock name. Use list_blocks to discover. As of v1.4: hero, services, faq.

No output schema declared.

No examples provided.