Setell
OfficialProvides integration with Gmail for ingesting inbound email and sending quotes, invoices, and follow-ups through the Gmail inbox.
Provides integration with QuickBooks for syncing invoices and financial data, enabling quote-to-cash workflow synchronization.
@setell/mcp
Drive your Setell quote-to-cash workflow from any MCP-aware agent — Claude Code, Claude.ai, ChatGPT, or any client that speaks the Model Context Protocol.
Setell is a vertical agent for small-business quote-to-cash (machine shops, contractors, HVAC, service businesses). It ingests inbound email, drafts AI quotes, applies structured revisions, sends invoices, and syncs to QuickBooks. Setell exposes the same agent across three peer surfaces: a web app, the Gmail inbox, and any MCP-aware agent. @setell/mcp is the third surface — it lets you ask "what's stale?", "show me the Cooper job", or "draft a follow-up" from whatever agent you live in, without leaving it. Built for operators who run their business from Claude Code, and for bookkeepers and fractional CFOs who drive Setell on behalf of an operator.
Status: v0 — stdio transport, read-mostly surface. Pro-tier feature. See
docs/BET-3-SETELL-MCP-V0.mdin the main repo for the full design.
Requires
A Setell account. The Free tier covers read-only exploration; the Pro tier is required to use the agent channel end-to-end (the boot health probe fails closed with an upgrade link if your plan doesn't qualify).
Node.js 18 or newer.
An MCP-aware client. Tested with Claude Code, Claude desktop, and the Claude.ai Custom Connector flow.
Related MCP server: InvoiceExpress MCP
Install
The server is published to npm as @setell/mcp. Most clients run it via npx so you don't have to install anything globally.
If you do want a global install:
npm install -g @setell/mcpConfigure
You need a Setell extension key. Mint one in your Setell account at Settings → Extension Key (go.setell.ai/settings). The page shows the raw key exactly once — copy it into your MCP client config below. The key is per-user, revocable from the same page, and resolves directly to your Setell tenant. The same key powers the Chrome extension.
Claude Code
claude mcp add setell --command "npx -y @setell/mcp" --env SETELL_EXTENSION_KEY=setell_ext_...Or edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) / %APPDATA%\Claude\claude_desktop_config.json (Windows) directly:
{
"mcpServers": {
"setell": {
"command": "npx",
"args": ["-y", "@setell/mcp"],
"env": {
"SETELL_EXTENSION_KEY": "setell_ext_..."
}
}
}
}Restart Claude Code (or the desktop app). The Setell tools, resources, and prompts will appear in the server-status panel.
Remote endpoint (no local install)
Setell also hosts the same 25-tool surface as a remote MCP server — no Node, no npx, nothing local:
{
"mcpServers": {
"setell": {
"url": "https://go.setell.ai/api/mcp",
"headers": {
"Authorization": "Bearer setell_ext_..."
}
}
}
}Any client that supports remote MCP servers with custom headers (Claude Code, Claude Desktop, API integrations) can use it today. Auth, plan gating, and tenant scoping are identical to the stdio path — same key, same backend.
Claude.ai (Custom Connector)
Claude.ai's web Custom Connector flow requires OAuth on the remote server — that's the next phase for the hosted endpoint above. Until then, claude.ai users can run the stdio server via the desktop app config.
ChatGPT desktop and other MCP clients
Any client that supports stdio MCP servers can use the npx -y @setell/mcp invocation above. Set SETELL_EXTENSION_KEY in the client's per-server environment.
Environment variables
Variable | Required | Default | Notes |
| Yes | — | Per-user bearer key minted at go.setell.ai/settings. |
| No |
| Override for staging / local dev. No trailing slash. |
How auth works
The MCP server reads SETELL_EXTENSION_KEY at boot, calls /api/mcp/v1/health once to verify the key, plan, and integrations, and then attaches the key to every backend request as Authorization: Bearer <key>. The Setell backend re-resolves the key on every request — the MCP process never holds tenant data and never opens a database connection.
If the key is missing, malformed, revoked, or your plan doesn't qualify, the MCP server exits with a clear error message before any tool registers. The error surfaces in your MCP client's server-status panel rather than as a hung connection.
See docs/BET-3-SETELL-MCP-V0.md §4 for the full auth model.
What's in it
The v0 surface is intentionally tight — a small, discoverable set that we expand as we watch how external agents actually use it.
Tools (model-invoked)
Annotated with readOnlyHint and destructiveHint per the MCP spec. 25 tools: 16 read-only and 9 mutating. Of the mutators, two are marked destructive — setell_send_quote (irreversible outbound email) and setell_save_customer_memory (persists a memory row). The rest (setell_set_autonomy, setell_update_shop_profile, setell_compose_quote, setell_schedule_send, setell_cancel_scheduled_send, setell_generate_quote_tiers, setell_select_quote_tier) are non-destructive configuration/draft actions.
Read-only (16)
Tool | Title | What it does |
| Setell connection health | Verify the connection. Returns the connected userId (opaque), the effective plan tier, and whether Gmail / QuickBooks are connected. |
| Find Setell jobs | Filter jobs by status, customer email, recency. Returns a paginated list with id, customerName, status, last quote version, total, updatedAt. |
| Get a Setell quote | Fetch a single quote by id. Returns line items, total, status, and key timestamps (sentAt, viewedAt, acceptedAt). |
| Find Setell customers | Search customers by email (exact) or name (partial). Returns id, jobCount, lifetimeValue, lastJobAt. |
| Setell morning brief | Today's snapshot: new inbound jobs in the last 24h, quotes awaiting review, stale sent quotes (>3d), top 3 hot prospects, revenue this week. |
| Setell pricing signal | Get Setell's pricing-analyst verdict on a quote BEFORE you send it. Returns |
| Setell parts-list proposal | Derive a full parts-list proposal for a job from the operator's OWN history: similar past jobs mined for co-occurring parts, adapted to this job, each part priced from the operator's history with a provenance receipt and evidence support ( |
| Setell autonomy modes | Read the operator's per-action-class autonomy modes. For each class (currently: |
| Setell shop profile | 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 customer pricing baseline | Read the operator's learned pricing baseline (median / min / max / sampleSize / lastSignedAt) for a specific customer, broken out per job-type. Sampled over SIGNED quotes only — reflects the operator's actual pricing for this relationship. |
| Setell learning-loop coverage | Aggregate moat metrics: total SIGNED quotes, distinct customers with learned baselines, jobType-narrowed baseline count, operator-wide baseline (sampleSize + lastSignedAt), and a one-word |
| Setell pricing report card | How RIGHT has Setell's pricing memory been? Joins every draft-time price prediction to its real outcome: |
| Setell customer memory list | List every CustomerMemory row stored for a specific customer — pricing patterns, preferences, communication style — with the full record shape (memory id, type, content, source job, source tag, confidence, timestamps). Audit what's known before writing via |
| List Setell quote tiers | List the good/better/best option groups generated for a job (most recent first) — each tier's label, summary, line items, total, and |
| Setell realized job margin | What the operator ACTUALLY made on a job. Revenue from recorded payments (fallback: the decided quote total); per-line cost from price-book provenance, a high-trust price-book match, or labor hours × loaded labor rate. |
| Setell margin summary | 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 target margin, and how many jobs could not be costed. OPERATOR-ONLY data. |
Mutating (9)
Tool | Title | What it does |
| Set Setell autonomy mode | Mutator (idempotent). Change the operator's mode for one action class. WATCH allowed for all plans; TRUST and AUTO require Business or Pro. Confirm with the operator before flipping a mode on their behalf — this changes how Boxx behaves on future sends. |
| Update Setell shop profile | Mutator (idempotent). PARTIAL patch of the shop profile — only the fields you pass change, but each provided list REPLACES that whole field, so read |
| Compose a Setell quote email | Mutator (idempotent-ish). Drafts the quote email body (AI-generated in the operator's brand voice) AND mints a single-use confirmation token bound to this quote version + recipient. Returns the preview shape (quote, email, portalUrl, customer, confirmationToken, confirmationExpiresAt). Token TTL: 15 minutes. Plan-gated. |
| Send a Setell quote | Mutator (destructive — IRREVERSIBLE). Sends the doorbell email via DKIM-delegated Resend (or SETELL_DEFAULT fallback). Requires a valid |
| Schedule a Setell quote send | Mutator (idempotent). Stamps |
| Cancel a scheduled Setell send | Mutator (idempotent). Clears a pending scheduled send on the latest quote of a job. Returns the previous schedule time (or null if none was pending). |
| Setell save customer memory | Mutator (destructive — persists a row). Persist a single operator-confirmed pattern about a customer mid-conversation. Three types: PRICING (rates, discount patterns), PREFERENCE (quote structure / special requirements), COMMUNICATION (tone, timing, expected info). Read back into Boxx and the agent surface the next time this customer is in scope. |
| Generate Setell quote tiers | Mutator. Generate good/better/best options around a job's current quote (proven close-rate lifter): GOOD is a leaner lower-priced option, BETTER mirrors the existing baseline verbatim (recommended), BEST is an expanded premium option. Stores the options as a group — does NOT change the active quote; call |
| Select a Setell quote tier | Mutator. Make a chosen 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 |
Resources (user-attached via @-mention)
URI | Returns | MIME |
| Current connection + plan + integration snapshot. Read this first to verify the MCP server is healthy. |
|
| Full job state: customer, every quote version (summaries), recent emails, customer-memory snapshot. Pivot to |
|
| Current per-action-class autonomy modes (WATCH / TRUST / AUTO). Read this when reasoning about how Boxx will behave on the next send. |
|
| Vertical-moat metrics + maturity tier (cold-start / warming / mature / deep). Use when sizing up how much weight to give pricing-analyst verdicts. |
|
| Per-customer learned pricing baseline rows (one per jobType plus customer-wide). Sampled over SIGNED quotes — reflects the operator's actual pricing for this relationship. |
|
| Every CustomerMemory row stored for a specific customer — pricing patterns, preferences, communication style, each with source tag, confidence, and timestamps. Read before writing via |
|
Prompts (slash commands)
Slash command | Arguments | What it expands into |
| none | New inbound jobs from the last 24h: customer ask, proposed price band, NEW-vs-needs-clarification recommendation, prioritized by inferred importance. |
|
| Sent quotes whose last touch is older than |
| none | Trailing 7-day revenue summary: signed, paid, in-pipeline, week-over-week deltas, the largest open opportunity, anomalies flagged. |
|
| Resolves a customer by name, attaches their full history, then answers your next question with that context loaded. |
|
| Drafts a follow-up email in your brand voice for the given job. Does not send — sending requires a separate, deliberate action. |
|
| Runs |
| none | One-paragraph narrative of the operator's Setell vertical-moat depth (maturity tier, customer breadth, sample-size, next milestone). Pulls from |
|
| Orchestrates the full compose → pricing-check → confirm → send flow. Stops for operator confirmation before the irreversible send. Uses the same safety stack as the in-app |
Example queries
Once installed and running, ask your agent any of:
"Show me my stale jobs from the last two weeks and rank them by how likely they are to close."
"Draft a follow-up for the Cooper roof-replacement job in my voice — don't send it yet."
"Pull up
@setell://jobs/clx8h3p9a000and tell me what changed between version 1 and version 2.""Use
/setell-triage-inboxto walk me through this morning's new requests, and flag anything that looks like a repeat customer.""What's my revenue this week vs. last week? Use
/setell-weekly-revenue.""Before I send this quote for $1,800 on job
clx8h3p9a000, callsetell_get_pricing_signaland tell me what my pricing-analyst says.""What does Setell know about how I price kitchen jobs for Cooper? Use
setell_get_customer_baseline.""Flip my
send_quoteautonomy to Trust so Boxx auto-proceeds on routine WARN pushback. Usesetell_set_autonomy.""Compose a quote for job
clx8h3p9a000withsetell_compose_quote, show me the preview, then send it withsetell_send_quoteafter I confirm.""Schedule the Cooper quote to go out tomorrow at 9am Pacific — use
setell_schedule_send.""Actually cancel the schedule on that one, let me look at it again —
setell_cancel_scheduled_send.""How much pricing brain does Setell have built up for me? Use
setell_get_learning_coverageand summarize."
What's NOT in v0
No OAuth on the remote endpoint yet (bearer keys only) — claude.ai/ChatGPT web connectors land with the OAuth phase.
The remote endpoint is tools-only; resources and prompts are stdio-only for now.
Troubleshooting
"Setell-MCP requires the SETELL_EXTENSION_KEY environment variable." — The key isn't reaching the spawned process. In Claude Code, check that your claude_desktop_config.json has the key under the env block (not just exported in your shell — the spawned npx process doesn't inherit your shell env).
"Setell rejected the extension key." — The key is revoked, malformed, or belongs to a different environment. Mint a fresh one at go.setell.ai/settings.
"Setell-MCP requires the Pro plan." — Upgrade at go.setell.ai/settings/billing.
Tools list is empty. — The boot health probe failed before tools registered. Check your MCP client's server-status panel for the stderr message; the server logs every fatal error there.
Links
Setell: go.setell.ai
Source: github.com/andrewmjacob/snowboxx (in
packages/mcp-server/)Model Context Protocol: modelcontextprotocol.io
License
MIT — see LICENSE.
This server cannot be installed
Maintenance
Latest Blog Posts
- 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