Setell
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SETELL_API_URL | No | Override for staging / local dev. No trailing slash. | https://go.setell.ai |
| SETELL_EXTENSION_KEY | Yes | Per-user bearer key minted at go.setell.ai/settings |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| setell_get_healthA | Check the Setell connection status. Returns the connected userId (opaque), the effective plan tier, and whether Gmail and QuickBooks are connected. Call this first if any other Setell tool fails — it isolates auth/plan problems from data-shape problems. |
| setell_find_jobsA | List Setell jobs filtered by status, customer email, or recency. Use this to find jobs by criteria; use the setell://jobs/{id} resource when you already know a specific job id. Returns up to 50 rows per call with the most-recently-updated jobs first. |
| setell_get_quoteA | Fetch a single Setell quote by id. Returns line items, total, version number, status, customer info, and key timestamps (sentAt, viewedAt, acceptedAt). Use this once you know the quote id — get one from setell_find_jobs or the setell://jobs/{id} resource. Read-only. |
| setell_find_customerA | Search Setell customers by email (exact) or name (partial). Returns each match with jobCount, lifetimeValue (sum of accepted quote totals), and lastJobAt. At least one of email or name is required. Read-only. |
| setell_get_morning_briefA | Today's Setell snapshot: new inbound jobs in the last 24h, quotes awaiting review, quotes sent without response for >3 days, top 3 hot prospects (recent viewers who haven't accepted), and revenue from deals won this week. Synthesize against this — the data is raw counts, not prose. Read-only. |
| setell_get_pricing_signalA | Get Setell's pricing-analyst verdict on a quote BEFORE you send it. Setell compares the quote's total against the operator's own history (per-customer, per-job-type, similar past jobs) and falls back to an industry benchmark when no operator data exists. Returns: |
| setell_propose_parts_listA | Derive a full parts-list proposal for a job from the operator's OWN history: similar past jobs are mined for co-occurring parts, adapted to this job, and each part returns priced from the operator's history with a provenance receipt and evidence support ( |
| setell_get_autonomyA | Show the operator's per-action-class autonomy modes. For each action class (currently: send_quote), returns the mode: WATCH (Boxx pauses on WARN+FLAG pricing verdicts), TRUST (auto-proceed on WARN with a surfaced note, ask on FLAG), or AUTO (auto-proceed on WARN silently, ask on FLAG). FLAG always asks regardless of mode — load-bearing safety floor. Also returns |
| setell_set_autonomyA | Set the operator's autonomy mode for one action class. WATCH pauses on every WARN/FLAG pricing-analyst verdict (maximum HITL); TRUST auto-proceeds on WARN with a surfaced note and asks on FLAG; AUTO auto-proceeds on WARN silently. FLAG always asks regardless of mode. Atomic correctness guards (preview-then-confirm tokens, single-use sends) stay in force in every mode. Confirm with the operator before flipping a mode on their behalf — this changes how Boxx behaves on future sends. |
| setell_get_shop_profileA | Read the operator's shop profile — the capability sheet quotes are judged against: machines (name × count, envelope notes), finishing processes (in-house vs outsourced), materials commonly run, and a free-form how-we-run note. Returns an empty sheet when the operator hasn't filled it in — offer setell_update_shop_profile when that's blocking a better estimate. Read-only. |
| setell_update_shop_profileA | PARTIAL patch of the operator's shop profile — only the fields you pass change; each provided list REPLACES that whole field, so read setell_get_shop_profile first and send the complete updated list (to add a machine: existing machines plus the new one). This steers how Setell judges complexity / cycle-time / finish fit on every future draft — confirm with the operator before writing. |
| setell_get_customer_baselineA | Read the operator's learned pricing baseline for a specific customer. Returns one row per jobType scope (e.g. |
| setell_compose_quoteA | Draft the quote email body (AI-generated in the operator's brand voice) AND mint a single-use confirmation token bound to this quote version + recipient. Returns: |
| setell_send_quoteA | IRREVERSIBLY sends the doorbell email to the customer (V2 outbound via DKIM-delegated Resend or SETELL_DEFAULT). Requires a valid confirmationToken returned by |
| setell_schedule_sendA | Schedule the latest quote on a job to be sent automatically at a future time. The send fires via the canonical pipeline at the next 5-minute cron tick at-or-after scheduledSendAt. Bounds: 1 minute to 30 days in the future. IMPORTANT: the scheduled send is NOT re-checked by the pricing-analyst (the operator has already approved). If pricing certainty matters, call setell_get_pricing_signal first and surface the verdict before scheduling. Use setell_cancel_scheduled_send to cancel a pending schedule before it fires. |
| setell_cancel_scheduled_sendA | Clear a pending scheduled send on the latest quote of a job. Returns the previous schedule time (or null if none was pending). No-op if no schedule is pending. The cron will skip the quote on its next tick regardless — the atomic claim requires scheduledSendAt to match what the cron read, which a cancel invalidates. |
| setell_get_learning_coverageA | How deep is the operator's vertical-moat data? Returns aggregate counts: total SIGNED quotes contributing, distinct customers with learned baselines, jobType-narrowed baseline count, the operator-wide baseline (sampleSize + lastSignedAt) if present, and a one-word |
| setell_get_pricing_calibrationA | How RIGHT has Setell's pricing memory been? Joins every draft-time price prediction to its real outcome: |
| setell_save_customer_memoryA | Persist a single learned pattern about a customer mid-conversation. Use after the operator confirms a fact about how a specific customer works that should inform future quotes/emails (e.g. "Acme only responds to Wednesday emails", "Cooper always asks for net-60"). Three types: PRICING (rates, discount patterns), PREFERENCE (quote structure / special requirements), COMMUNICATION (tone, timing, what info they expect). The memory is read back into Boxx and the agent surface the next time this customer is in scope. Mutator — creates a CustomerMemory row. |
| setell_get_customer_memoryA | List every CustomerMemory row Setell has stored for a specific customer — pricing patterns, preferences, communication style. Returns the full record shape (memory id, type, content, source job if any, source tag, confidence, timestamps). Useful for "what do I know about this customer?" / auditing what should be overwritten before calling setell_save_customer_memory. Read-only. |
| setell_generate_quote_tiersA | Generate good/better/best options around a job's current quote (proven close-rate lifter): GOOD is a leaner lower-priced option, BETTER is the existing baseline (recommended, mirrored verbatim), BEST is an expanded premium option. Stores the options as a group and does NOT change the active quote — call setell_select_quote_tier once the operator or customer picks one. Plan-gated (counts against the operator's AI quota). |
| setell_select_quote_tierA | Make a chosen good/better/best tier the job's active quote. GOOD/BEST create a new quote version from that tier's line items via the deterministic revision engine; BETTER is a no-op (it already IS the baseline). A 409 with code stale means the quote changed since the options were generated — regenerate first. After selecting, compose/send operate on the chosen tier. |
| setell_get_quote_tiersA | List the good/better/best option groups generated for a job (most recent first) — each tier's label, summary, line items, total, and whether the base quote is still current (baseIsCurrent: false means select will conflict; regenerate instead). Read-only. |
| setell_get_job_marginA | What the operator ACTUALLY made on a job (realized margin). Revenue from recorded payments (fallback: the decided quote total); per-line cost from the operator's price-book provenance, a high-trust price-book match, or labor hours × their loaded labor rate. marginPct is WITHHELD (null) when too little line value has a sourced cost — present the breakdown's UNKNOWN lines honestly instead of inventing a number. OPERATOR-ONLY data: never share cost or margin with a customer. Read-only. |
| setell_get_margin_summaryA | Realized margin across the operator's recent WON jobs: revenue-weighted overall margin (honestly-costed jobs only), per-jobType averages (worst first), the 3 worst jobs, the count below their target margin, and how many jobs could not be costed. Use for 'how are my margins?' or monthly profitability check-ins. OPERATOR-ONLY data. Read-only. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| setell-triage-inbox | Surface every new job from the last 24 hours, summarize the ask, propose a price band from pricing history, and recommend NEW vs needs-clarification. Prioritized by inferred customer importance. |
| setell-stale-jobs | List sent quotes that haven't moved in N days. For each, attach the customer's history and propose a follow-up that matches the customer's preferred cadence. Does NOT send — proposing only. |
| setell-weekly-revenue | Produce a one-paragraph trailing-7-day revenue summary: signed, paid, in-pipeline, week-over-week deltas, the largest open opportunity. Flag anomalies. |
| setell-customer-history | Resolve a customer by name + attach their full Setell context (profile, past jobs, customer memory) so the next question lands with all of it loaded. |
| setell-draft-followup | Draft a follow-up email for a specific job in the operator's voice. Returns the draft only — does NOT send. The send is a separate deliberate action via setell_send_quote_followup. |
| setell-pricing-check | Run Setell's pricing-analyst on a job before sending. Surfaces the verdict (PASS / WARN / FLAG), the analyst's reasoning, any recommended counter-amount, and which comparable layer fired (customer-learned / operator-wide / similar-jobs / industry benchmark). Does NOT send — the operator picks the next action. |
| setell-moat-coverage | Summarize how deep the operator's customer-data learning loop is. Returns a one-paragraph narrative covering maturity tier, customer breadth, sample-size depth, and the next-tier threshold. Use when answering 'how much does Setell know about my pricing?' or when sizing up whether to trust analyst pushback on a new account. |
| setell-send-quote | Orchestrate the full compose → pricing-check → confirm → send flow on a job. Drafts the email, narrates the preview, runs the pricing-analyst, and only sends after explicit operator confirmation in the same conversation. The send is IRREVERSIBLE; this prompt ensures the operator sees everything before the doorbell email goes out. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| health | Current Setell connection state: effective plan, integration status (Gmail, QuickBooks), and the connected user identifier. Read this if the agent needs to know what Setell can do right now. |
| autonomy | Current per-action-class autonomy modes (WATCH / TRUST / AUTO) for the operator. WATCH = pause on every pricing pushback; TRUST = auto-proceed on WARN with a note, ask on FLAG; AUTO = auto-proceed on WARN silently. FLAG always asks regardless of mode. Read this when you need to reason about how Boxx will behave on the next send. |
| learning-coverage | Vertical-moat metrics: total SIGNED quotes, distinct customers with learned baselines, jobType-narrowed baseline count, the operator-wide baseline if present, and a one-word maturityTier (cold-start / warming / mature / deep) summarizing the operator's data depth. Use when sizing up how much weight to give pricing-analyst verdicts on a new account. |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Setell-AI/setell-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server