io.github.seldonframe/mcp
NPM · @SELDONFRAME/MCP · 2 COMPONENTS · SCANNED AUG 3
Build, deploy, and sell AI agents for local-service businesses - from your IDE.
Available components
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 Usability28
- AI-judged instruction clarity (poor).Fail
- Context-footprint check failed: tool/resource definitions use about 32433 tokens (~203/item across 159 items; 159 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 Management0
- Stability not yet verified: two runs of the same published version returned different tool surfaces, so we cannot tell a change in the package from a difference in our own sandbox run.Unverified
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
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
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-mcp -- npx -y @seldonframe/mcp
codex mcp add seldonframe-mcp -- npx -y @seldonframe/mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"seldonframe-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"@seldonframe/mcp"
],
"enabled": true
}
}
} openclaw mcp add seldonframe-mcp --command npx --arg -y --arg @seldonframe/mcp
mcp_servers:
seldonframe-mcp:
command: "npx"
args: ["-y", "@seldonframe/mcp"] {
"mcpServers": {
"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.
- 3 Aug 26 0
- Stability: Stability not yet verified: two runs of the same published version returned different tool surfaces, so we cannot tell a change in the package from a difference in our own sandbox run. security
- 2 Aug 26 +37
- 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
- Tool coverage: 100 → unverified ▼ functional
- MCP protocol: unverified → pass ▲ functional
- Maintenance: unverified → pass ▲ functional
- Schema quality: unverified → poor ▲ functional
- License: unverified → pass ▲ functional
- Dependency health: unverified → partial ▲ functional
- Licence: AGPL-3.0-or-later functional
- 31 Jul 26 −7
- 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 −14
- Malware scan: pass → unverified ▼ security
- 28 Jul 26 −4
- 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_improvement ~330
USE WHEN USER SAYS: 'apply that improvement', 'go with the proposed fix', 'apply the patch', 'yes, use the better version', 'accept the improve_agent proposal'. Applies a previously PROPOSED patch (from improve_agent's `proposalId`) after human review — this is the ONLY tool that can move an improve proposal's patch onto the live blueprint. Re-validates the patch against the agent's CURRENT blueprint before writing (it may have moved since the proposal was created) and creates a new agent_versions snapshot, exactly like update_agent_blueprint. Version drift doesn't block the apply — if the blueprint changed since the proposal was made, the result just carries a `note: 'applied over vN'` so you know it landed on a newer base than it was proposed against. Rejects (ok:false, 422) with a reason when the proposal can't be applied: 'not_found' (wrong id/org, or already resolved), 'not_proposed' (already applied or dismissed — improve proposals are one-shot), 'revalidation_failed' (the patch no longer passes the guardrail against the current blueprint). None of these ever touch the blueprint. After applying, the agent is on a new version — suggest re-running run_agent_evals or publish_agent({status:'live'}) (which auto-evals) to confirm the new version still passes the safety gate before the operator relies on it.
| Name | Type | Req | Description |
|---|---|---|---|
| proposal_id | string | yes | Proposal id from improve_agent's `proposalId` field. |
| workspace_id | string | yes | Workspace id (bearer workspace). |
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 ~705
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). v1.59.2 — CONSENT REQUIRED before storing an env-detected key: if no anthropic_api_key is passed and process.env.ANTHROPIC_API_KEY is found, this tool does NOT store it on the first call. It reports what it found and stops (nothing else in the bundle runs yet). Ask the user for permission, then re-call with confirm_store_env_key: true to proceed with the full bundle. If neither an explicit key nor an env key is present, the bundle proceeds anyway on the SeldonFrame platform key — no consent needed because nothing of the operator's is transmitted.
| 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 (subject to the confirm_store_env_key consent gate below). Pass… |
| confirm_store_env_key | boolean | — | Set true ONLY after the user has explicitly confirmed storing the API key found in this machine's environment variables in their SeldonFrame workspace. |
| 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 ~546
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) to read process.env.ANTHROPIC_API_KEY / OPENAI_API_KEY from the MCP server's own environment. v1.59.2 — CONSENT REQUIRED before storing an env-detected key: ask the user first ('I found an Anthropic key in your environment — OK to store it in your SeldonFrame workspace?'), then re-call with confirm_store_env_key: true. Without that flag, this tool reports the env var it found and stops — it does NOT transmit the value. A key passed explicitly via api_key is consent by definition and is never gated. 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… |
| confirm_store_env_key | boolean | — | Set true ONLY after the user has explicitly confirmed storing the API key found in this machine's environment variables in their SeldonFrame workspace. |
| 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 ~611
Atomic workspace creation from pre-extracted business facts. Equivalent to create_workspace_v2 but single-call (no block-by-block iteration). Used as the follow-up after `create_workspace_from_url` for cases where the operator wants the workspace produced in one shot rather than block-iterated. 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'] }). MANDATORY FOLLOW-UP: same as create_workspace_v2 — after this returns `status: 'ready'`, ask 'What email should I use for your account?' and call finalize_workspace({ workspace_id, email }).
| 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_from_url ~304
Entry point for URL-based workspace creation. Returns instructions Claude follows: WebFetch the URL, optionally WebFetch up to 2 priority sub-pages (e.g. /about, /services, /contact, /pricing), extract structured business facts, ask the operator for any required field that can't be determined, then call `create_full_workspace` with the result — ONE atomic call that builds the workspace + the production multi-page website (vertical-aware landing + per-service detail pages, the same engine as the SeldonFrame dashboard) + booking page + intake form + CRM + draft chatbot. THIS TOOL DOES NOT CREATE A WORKSPACE — it returns the playbook. The workspace is created by the follow-up `create_full_workspace` call. Do NOT use the block-iterated create_workspace_v2 flow for URL builds. When operator provides ANY of: 'http://', 'https://', a domain (.com/.io/.net/.co/.app/.dev/.us etc), or 'create workspace for <URL>' — call this tool. Do NOT manually WebFetch first; the instructions returned by this tool tell you exactly what to fetch and in what order. MANDATORY FOLLOW-UP: After create_full_workspace returns, ask the operator 'What email should I use for your account?' and call finalize_workspace({ workspace_id, email }).
| Name | Type | Req | Description |
|---|---|---|---|
| url | string | yes | Business website URL the operator provided, e.g. https://quigleyac.com |
No output schema declared.
No examples provided.
create_workspace_v2 ~394
Create a workspace from pre-extracted business facts. Used as the follow-up call after `create_workspace_from_url` returns extraction instructions, OR directly when the operator provides structured info (no URL). Flow: 1) call this tool with the business facts; 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.
| 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.
customize_landing ~337
Apply a natural-language instruction to the current R1 landing page for a workspace. The LLM rewrites only the parts of the payload touched by the instruction, preserving everything else. Each call creates an immutable version snapshot so the operator can undo any change. Edits go live immediately (no publish step). Examples: • customize_landing({ workspace_id: '...', instruction: 'Change the hero tagline to focus on 24/7 emergency service' }) • customize_landing({ workspace_id: '...', instruction: 'Replace the hero photo with https://example.com/photo.jpg' }) • customize_landing({ workspace_id: '...', instruction: 'Make the FAQ more local-flavored for Phoenix residents' }) • customize_landing({ workspace_id: '...', instruction: 'Add a question about financing options to the FAQ' }) Requires: the workspace must have an R1 landing page (auto-generated during workspace creation). Requires: an Anthropic API key configured for the workspace (BYOK via /settings/integrations or platform fallback). Returns: { ok: true, summary, version_id } on success. Returns: { ok: false, error: 'no_landing_exists' } if the workspace has no R1 landing yet.
| Name | Type | Req | Description |
|---|---|---|---|
| instruction | string | yes | Natural-language description of what to change. Be specific. Include image URLs verbatim if swapping a photo. Example: 'Change the hero tagline to: Fast. Local. Trusted.' or 'Replace the hero photo w… |
| workspace_id | string | yes | UUID of the workspace whose landing page to edit. |
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.
deploy_agent ~513
USE WHEN USER SAYS: 'deploy this agent', 'go live with my template', 'sell this agent — get it answering', 'launch the receptionist I built', 'turn my template into a real number', 'ship this to a client'. Deploys a self-built template (source.template_id) or an installed marketplace listing (source.listing_slug) into a REAL, answering agent for THIS workspace — the deploy-to-sell / earn moment, not just a build step. Idempotent: calling it again for the same source resumes the same deployment instead of creating a duplicate. RESUMABLE TWO-STEP FLOW — read the `status` field: • status='needs_connect' → NOT live yet. `requirements`/`missing` list what's unmet (calendar OAuth, another connector, a phone number, business info) and `wizardUrl` is a ONE-TIME human-only link (calendar OAuth + Twilio number can't be done by an agent). Relay it verbatim: 'Open this once to connect your calendar / phone number: <wizardUrl>' — then, once the human confirms they've done it, call deploy_agent again with the SAME source (and `phone` if the agent needs a number) to proceed. • status='live' → deployed and answering right now. Tell the operator the number (if any) is live and taking real calls/bookings — this is revenue-generating, not a sandbox. • status='disabled' → the deploy verb isn't enabled for this environment yet. PHONE: only required when the template needs a number and none is attached yet — pass phone={mode:'forward', number:'+1...'} to forward an existing line, or phone={mode:'provision', area_code:'512'} to buy a new Twilio number (requires the workspace's own Twilio creds — surfaced as a `telephony` requirement if missing). Exactly one of source.template_id / source.listing_slug is required — template_id for something you built with create_agent-style tools in THIS workspace, listing_slug for a marketplace agent you're installing to run for a client.
| Name | Type | Req | Description |
|---|---|---|---|
| phone | object | — | Only needed when deploy_agent (or an earlier call) reported a 'telephony' requirement and no number is attached yet. Pass ONE mode. |
| source | object | yes | Exactly one of template_id (a template this workspace built) or listing_slug (a published marketplace listing to install-and-deploy). |
| workspace_id | string | yes | Workspace id (bearer workspace). |
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 ~160
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. v1.59.2 — only public http(s) URLs are fetched: the MCP server rejects localhost / private-network / link-local targets (and any redirect that lands on one) before making the request. Use this for the operator's real, public-facing website only.
| Name | Type | Req | Description |
|---|---|---|---|
| url | string | yes | Absolute URL to fetch. Must be a public http(s) URL — localhost, LAN, and other private-network addresses are rejected. |
No output schema declared.
No examples provided.
finalize_workspace ~305
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' }). The summary is agency-voice: addresses the operator AS an agency delivering for their SMB client, not as the workspace owner. When relaying to the operator, preserve the 'your client' framing throughout — don't rewrite to 'your workspace'.
| 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.