Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
Read Housecall Pro estimates from the customer link your contractor sent you.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
HOUSECALLPRO_LINK, HOUSECALLPRO_LINKS, HOUSECALLPRO_LINK_LABELValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"housecallpro": {
"command": "npx",
"args": [
"-y",
"@chrischall/housecallpro-mcp"
],
"env": {
"HOUSECALLPRO_LINK": "your-value",
"HOUSECALLPRO_LINKS": "your-value",
"HOUSECALLPRO_LINK_LABEL": "your-value"
}
}
}
}Run this in your terminal
claude mcp add housecallpro --env HOUSECALLPRO_LINK=your-value --env HOUSECALLPRO_LINKS=your-value --env HOUSECALLPRO_LINK_LABEL=your-value -- npx -y @chrischall/housecallpro-mcpFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"housecallpro": {
"command": "npx",
"args": [
"-y",
"@chrischall/housecallpro-mcp"
],
"env": {
"HOUSECALLPRO_LINK": "your-value",
"HOUSECALLPRO_LINKS": "your-value",
"HOUSECALLPRO_LINK_LABEL": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"housecallpro": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@chrischall/housecallpro-mcp"
],
"env": {
"HOUSECALLPRO_LINK": "your-value",
"HOUSECALLPRO_LINKS": "your-value",
"HOUSECALLPRO_LINK_LABEL": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
HOUSECALLPRO_LINK_LABEL envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 9, 2026
The registry name was verified with the GitHub account chrischall, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: HOUSECALLPRO_LINK, HOUSECALLPRO_LINKS
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (1.3.0) reached the registry 4 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js on your computer.
In the same category: Spec Driven Development, Remote Desktop Commander, Bestax
Servers in the same category from other makers, sorted by stars.
Reading a card:↓ Downloads per weeki★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Props, examples, CSS variables and Agent Skills for bestax-bulma React components (Bulma v1)
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
A Model Context Protocol server that connects Claude to the customer side of Housecall Pro — the estimate or invoice link a contractor (HVAC, plumbing, electrical, cleaning) emails or texts you.
[!WARNING]
AI-developed project. This codebase was built and is actively maintained
by Claude Code. No human has audited the
implementation. Review all code and tool permissions before use.
Housecall Pro has two surfaces, and they share nothing:
| Public API | Customer portal (this repo) | |
|---|---|---|
| Host | api.housecallpro.com | app.housecallpro.com |
| Serves | the business running on Housecall Pro | that business's customers |
| Auth | an API key from the pro's account | the link your contractor sent you |
| Docs | docs.housecallpro.com | docs/HOUSECALLPRO-API.md |
If you *run* a business on Housecall Pro, you want the public API instead. This server is for being someone's customer.
npx -y @chrischall/housecallpro-mcp
Configure it with the link your contractor sent you:
HOUSECALLPRO_LINK='https://pro.housecallpro.com/mobile_estimate/XXXXXXXXXX'
Estimate and invoice links both work, short or long form — pro.housecallpro.com/mobile_estimate/… and /mobile_invoice/…, or client.housecallpro.com/estimates/… and /invoices/…. For several documents:
HOUSECALLPRO_LINKS='[{"label":"tankless","url":"…"},{"label":"hvac","url":"…"}]'
Then every tool takes an optional link selector; with one configured you never need it.
[!IMPORTANT]
Your link is a bearer credential. Anyone holding it can read the document
and, for an estimate, decline it. It is read from the environment, never logged, and never
returned in a tool result —
housecallpro_list_linksreports labels only.
Declining asks you first. A client that can show a confirmation prompt (Claude Code) shows one. On a client that cannot (claude.ai, Claude Desktop) the first call declines nothing and returns a preview plus a confirmToken; only a repeat call with that token acts, and only if the estimate still matches what was previewed.
| variable | default | |
|---|---|---|
MCP_CONFIRM_MODE | ask-user | What a write does on a client that cannot show a confirmation prompt (claude.ai, Claude Desktop). ask-user: two steps — the first call does nothing and returns a preview plus a token, and the model must get your approval in chat before calling again with it. auto: the same two steps, but the model may use the token after reviewing the preview itself. refuse: writes are refused on such clients. A client that can show prompts (Claude Code) always gets the real prompt, unless MCP_CONFIRM_ELICITATION=off. An unrecognised value is treated as refuse. |
MCP_CONFIRM_ELICITATION | on | off never shows a confirmation prompt, so every client gets the MCP_CONFIRM_MODE behaviour. Set it for a client that says it can show prompts but never does (the write hangs — opencode 2.0.x). Any other value is treated as on, with a warning on stderr. |
MCP_CONFIRM_TTL_SECONDS | 600 | How long a token stays valid. |
MCP_CONFIRM_SECRET | random per process | Signing key; set it only if tokens must survive a server restart. |
| Tool | |
|---|---|
housecallpro_get_estimate | Line items, totals, tax, company, approval state |
housecallpro_get_invoice | Amount, subtotal, tax, balance due, payability |
housecallpro_get_company | The contractor: phone, email, website, arrival window |
housecallpro_list_links | Configured links, labels only |
housecallpro_decline_estimate | Decline options — asks you to confirm first |
housecallpro_approve_estimate | Always refuses; explains why |
housecallpro_healthcheck | Reachability + whether a link still resolves |
view)housecallpro_get_estimate and housecallpro_get_invoice take view: 'compact' | 'raw', defaulting to `compact` — the fleet vocabulary from @chrischall/mcp-utils.
| rung | what you get |
|---|---|
compact *(default)* | the summary: line items, totals, tax, company, approval state — with money as both *_cents and *_usd |
raw | the upstream document verbatim (~4.8 KB for an estimate), {object, data} wrappers and display flags included |
There is deliberately no `full` rung. full means "every field this server understands, nothing dropped", and the fields this server understands are exactly the ones the summary names — so it would be compact under a second name, and everything past it is the upstream document, which is raw. A schema should never advertise a value that silently aliases another.
If the upstream shape drifts far enough that the projection loses its footing, the whole document is returned (with a warning on stderr) rather than an empty summary: an empty summary is indistinguishable from an estimate with nothing on it.
They use different token shapes — 129 characters for an estimate, 32 for an invoice — and different endpoints. The client checks the shape and refuses a token pointed at the wrong tool before spending a request, rather than passing along an unexplained 404.
An invoice carries no line items and no tax field: a paid invoice renders as a summary in the portal and the API returns exactly that, so tax_usd is derived as total - subtotal. is_paid comes from the balance, not the status string.
The upstream API returns integer cents — the estimate the portal renders as $346.39 arrives as total_amount: 34639. Reporting that raw overstates every figure 100×, so each money field is emitted as both *_cents (verbatim) and *_usd (derived). tax.rate is a fraction (0.0825 = 8.25%) and is never scaled.
That pairing is what the projection is *for*, so it exists on compact only. view: 'raw' is the upstream document, and its money is integer cents with no dollar sibling — total_amount: 34639 is $346.39. The view parameter's own description says so at the call site.
housecallpro_approve_estimate always refuses, and that is deliberate.
Approval posts a response_token — a reCAPTCHA v3 token minted in-page for the action estimates_customer_approvals. No server-side client can produce one, and neither can a browser-bridge transport: the bridge issues fetch calls, it does not execute page JS. Declining carries no such token, which is why decline works and approve does not.
Rather than post a request that would be rejected — or worse, might *not* be, binding you to a quoted price — the tool refuses and tells you to approve in a browser.
Declining asks you to confirm first (see Confirmations): it reads the estimate, refuses ids that are not its options or are already decided, and shows exactly what would be sent before anything is posted. After a real decline it re-reads the estimate and reports the option's actual status, because a 2xx is not proof a write landed.
skills/housecallpro does the same reads from a shell with plain curl and jq, for scripts or machines where the server isn't installed. No browser bridge is involved there either.
Unlike much of this fleet, app.housecallpro.com is not bot-walled — a bare curl gets a 200. So this server talks to it directly over HTTPS, has no @fetchproxy/server dependency, needs no extension or signed-in tab, and hosts cleanly as a remote connector — with no secret to configure, since the link travels as a tool argument rather than an environment variable.
npm install
npm run build npm test
MIT