Housecall Pro MCP
Connect to the customer side of Housecall Pro to read and act on estimates/invoices a contractor sent you.
housecallpro_get_estimate– Read an estimate: line items, totals, tax, company, approval state;compactview returns money in cents and dollars,rawreturns upstream document.housecallpro_get_invoice– Read an invoice: amount, subtotal, tax, balance due, payability, derivedis_paid; no line items.housecallpro_get_company– Look up contractor details (phone, email, website, address, arrival window) using anorganization_id.housecallpro_list_links– List configured customer links (labels and kinds only, never tokens).housecallpro_decline_estimate– Decline one or more estimate options, with user confirmation (or two-step token fallback on non-prompting clients).housecallpro_approve_estimate– Always refuses; explains that approval requires a reCAPTCHA token only a browser can mint.housecallpro_healthcheck– Verify server can reach Housecall Pro and a configured link still resolves.Configuration – Use a single link via
HOUSECALLPRO_LINKor multiple viaHOUSECALLPRO_LINKS; every tool accepts an optionallinkselector.Safety – Money returned as cents+dollars, confirmation modes (ask-user/auto/refuse), bearer tokens never logged or returned.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Housecall Pro MCPWhat's on my estimate from Queen City?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Housecall Pro MCP
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.
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.
This is the customer side, not the business side
Housecall Pro has two surfaces, and they share nothing:
Public API | Customer portal (this repo) | |
Host |
|
|
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 |
If you run a business on Housecall Pro, you want the public API instead. This server is for being someone's customer.
Related MCP server: Jobber MCP Connector
What you can do
"What did Queen City quote me for the tankless flush?"
"What's on that estimate, line by line?"
"How much of that $346 is tax?"
"Am I still on the hook to respond to this?"
"Decline option 2."
Install
npx -y @chrischall/housecallpro-mcpConfigure 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.
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_links reports labels only.
Confirmations
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 | |
|
| What a write does on a client that cannot show a confirmation prompt (claude.ai, Claude Desktop). |
|
| How long a token stays valid. |
| random per process | Signing key; set it only if tokens must survive a server restart. |
Tools
Tool | |
| Line items, totals, tax, company, approval state |
| Amount, subtotal, tax, balance due, payability |
| The contractor: phone, email, website, arrival window |
| Configured links, labels only |
| Decline options — asks you to confirm first |
| Always refuses; explains why |
| Reachability + whether a link still resolves |
Response shape (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 |
| the summary: line items, totals, tax, company, approval state — with money as both |
| the upstream document verbatim (~4.8 KB for an estimate), |
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.
Estimates and invoices are different documents
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.
Money is returned twice
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.
Why you can't approve an estimate
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.
Without the MCP
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.
No browser bridge
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.
What isn't here
Payments and cards. Deliberately out of scope.
The account-level portal. Housecall Pro has an OTP/magic-link customer portal that spans every document from one contractor, which is a strictly better surface than per-document links. Standing it up needs a human to receive a one-time code, so it is the obvious next increment rather than part of this first cut.
Development
npm install
npm run build
npm testLicense
MIT
Available Tools
7 toolshousecallpro_approve_estimateARead-only
Approving an estimate is NOT automatable and this tool always refuses. Housecall Pro gates approval behind a reCAPTCHA token only the real page can mint. Use this to get the explanation and the link to approve in a browser.
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | The Housecall Pro link your contractor sent you — paste it directly (pro.housecallpro.com/mobile_estimate/… or /mobile_invoice/…, or a client.housecallpro.com/estimates/… or /invoices/… URL), or the retrieval token from the end of it. Alternatively the label of a link configured in HOUSECALLPRO_LINKS. Omit only when exactly one link is configured. | |
| option_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnlyHint annotation by disclosing that the tool always refuses, explains why (reCAPTCHA), and what it provides (explanation and link). This is a behavioral trait that is not obvious from annotations alone and is essential for the agent to set correct expectations. No contradiction with the readOnlyHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the most critical fact (not automatable, always refuses). It is concise with zero fluff. Every sentence earns its place: the first states the refusal, the second tells the agent what to use it for.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool whose sole purpose is to refuse and redirect to a browser, the description covers what the agent needs to know: the outcome (refusal), the reason (reCAPTCHA), and the output (explanation and link). No output schema exists, so the description implicitly covers what is returned. The description is complete for an agent to decide whether and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% (only the 'link' parameter has a description; 'option_ids' is undocumented). The description does not mention parameters at all, so it fails to compensate for the gap. For the 'link' parameter, the schema description is detailed, but the description adds no value beyond that. The 'option_ids' parameter remains unexplained, and the description provides no clues about its purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a very specific behavior: the tool always refuses approval, provides an explanation, and returns a link for browser use. This clearly distinguishes it from siblings like housecallpro_decline_estimate or housecallpro_get_estimate, which perform different actions. The verb 'refuses' and the resource 'estimate' are explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent to use this tool to get the explanation and link for browser approval, implying it is not for actual approval. It does not explicitly state when not to use it or mention alternatives, but the context (non-automatable, always refuses) makes the intended usage clear. A small gap: it doesn't say 'use housecallpro_get_estimate for reading estimates' or similar, but the purpose is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
housecallpro_decline_estimateADestructive
Decline one or more options on an estimate. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call posts nothing and returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). Declining tells the contractor you are not proceeding; it cannot be undone from here.
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | The Housecall Pro link your contractor sent you — paste it directly (pro.housecallpro.com/mobile_estimate/… or /mobile_invoice/…, or a client.housecallpro.com/estimates/… or /invoices/… URL), or the retrieval token from the end of it. Alternatively the label of a link configured in HOUSECALLPRO_LINKS. Omit only when exactly one link is configured. | |
| option_ids | Yes | Estimate option ids to decline, from `options[].id` (e.g. `est_…`). | |
| confirmToken | No | ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include destructiveHint=true, but the description goes further by stating 'it cannot be undone from here' and explaining the confirmation mechanism in detail: a native confirmation prompt when supported, otherwise a two-step flow where the first call posts nothing and returns a preview and confirmToken. This transparently discloses the side effects and the fallback behavior. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is composed of three well-focused sentences: the operation, the confirmation flow, and the irreversible consequence. It is front-loaded with the purpose and every sentence earns its place, including the important cross-reference to MCP_CONFIRM_MODE for the fallback path.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with a two-step confirmation fallback, the description covers both execution paths and explains what the first call returns (preview and confirmToken). It does not explicitly state what the final call returns or describe the success response, but given the protocol reference and the detail in the schema, it is sufficiently complete for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters with full descriptions at 100% coverage, including the nuanced confirmToken usage. The description adds no additional parameter-level semantics, so the baseline score of 3 is appropriate; it does not need to compensate for schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact operation ('Decline one or more options on an estimate') and clarifies the semantic outcome ('Declining tells the contractor you are not proceeding'). This clearly differentiates it from the sibling housecallpro_approve_estimate, which performs the opposite action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys when the tool is appropriate: when the user wants to decline an estimate option and does not intend to proceed. It also warns that the action cannot be undone, which is critical usage guidance. It does not explicitly name alternatives or exclusion conditions, but the purpose and consequence make the intended use obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
housecallpro_get_companyARead-only
Look up the contractor behind an estimate: phone, email, website, address and default arrival window. Takes the organization_id from an estimate.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | Yes | Organization UUID, from an estimate's `organization_id` field. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so no read-only disclosure is needed. The description adds useful context with the returned fields and input source, but does not go into behavior such as missing-company handling, errors, or response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no redundant wording. The action and key return fields are front-loaded, and the input instruction is a single clear follow-up.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, read-only lookup, the description is complete: it specifies the input origin, the output fields, and the purpose. No output schema or nested-object complexity means there is little additional context an agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and already states the organization_id is an Organization UUID from an estimate. The description's 'Takes the organization_id from an estimate' essentially repeats that, so it adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Look up') and a concrete resource (the contractor/company behind an estimate), and names the exact data returned. It is clearly differentiated from sibling tools like housecallpro_get_estimate because it targets the company rather than the estimate itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes the triggering context: use it when you have an estimate and need contractor details, taking organization_id from that estimate. It does not explicitly state when not to use it or compare with alternatives, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
housecallpro_get_estimateARead-only
Read an estimate a Housecall Pro contractor sent you: line items, totals, tax, the company behind it, and whether it is still awaiting your approval. The default compact view returns money both as integer cents (*_cents, verbatim from the API) and as dollars (*_usd); view: "raw" returns the upstream document, whose money is cents only.
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | The Housecall Pro link your contractor sent you — paste it directly (pro.housecallpro.com/mobile_estimate/… or /mobile_invoice/…, or a client.housecallpro.com/estimates/… or /invoices/… URL), or the retrieval token from the end of it. Alternatively the label of a link configured in HOUSECALLPRO_LINKS. Omit only when exactly one link is configured. | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "raw" returns the upstream payload unprojected. "compact" is the summary: line items, totals, tax, company and approval state, with every money field as both `*_cents` and `*_usd`. "raw" is the upstream document (~4.8 KB, mostly display flags and `{object, data}` wrappers) — its money is integer CENTS with no dollar sibling, so `total_amount: 34639` means $346.39. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true, so the safety profile is covered. The description adds valuable behavioral detail: the compact view returns both cents and dollars, the raw view returns upstream document with cents only, and it notes the raw size (~4.8 KB). This goes beyond the annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, with the primary purpose and content front-loaded in the first sentence and the view options compactly explained in the second. No wasted words or redundant phrases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey the return shape. It does so thoroughly for both compact and raw views, including the money format difference. Minor omissions like error handling or not-found behavior are acceptable given the read-only nature and schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both link and view are already well documented. The description reiterates the view behavior (compact vs raw) and money representation, but does not add new meaning beyond the schema. Per guidelines, baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and resource ('an estimate') and enumerates the contained data (line items, totals, tax, company, approval state). It clearly distinguishes from sibling tools like get_invoice (invoices) and approve/decline (actions) by focusing on read-only retrieval of estimates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage ('Read an estimate a contractor sent you') but does not explicitly contrast with alternatives like approve_estimate or decline_estimate, nor state when not to use it. The parameter guidance about omitting link when exactly one is configured is present, but tool-level usage guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
housecallpro_get_invoiceARead-only
Read an invoice a Housecall Pro contractor sent you: amount, subtotal, tax, what is still owed, and whether it can be paid online. The default compact view returns money both as integer cents (*_cents) and dollars (*_usd). Note this document carries no line items — the portal shows a summary only.
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | The Housecall Pro link your contractor sent you — paste it directly (pro.housecallpro.com/mobile_estimate/… or /mobile_invoice/…, or a client.housecallpro.com/estimates/… or /invoices/… URL), or the retrieval token from the end of it. Alternatively the label of a link configured in HOUSECALLPRO_LINKS. Omit only when exactly one link is configured. | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "raw" returns the upstream payload unprojected. "compact" is the summary: totals, balance due, payability and the company, with every money field as both `*_cents` and `*_usd`, plus the `tax_cents`/`tax_usd` and `is_paid` this server derives. "raw" is the upstream document — it carries neither, and its money is integer CENTS with no dollar sibling. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that the document has no line items and that the portal shows a summary only. It also explains the compact/raw view difference, which is useful behavioral context for a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose first, then key output conventions, then an important caveat. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with two well-documented parameters, the description plus schema cover input, output shape, and caveats. The lack of an output schema is compensated by the description's clear statement of what the tool returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the link and view parameters are already fully described in the input schema. The description reinforces the view behavior and defaults but adds little semantic value beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Read an invoice a Housecall Pro contractor sent you' and enumerates the returned data (amount, subtotal, tax, amount still owed, payability). The resource is unambiguous against sibling tools like get_estimate because it explicitly targets invoices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: use it when you need the summary of an invoice sent by a Housecall Pro contractor. It does not explicitly discuss exclusions or alternatives, but the distinction from estimate-focused siblings is evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
housecallpro_healthcheckARead-only
Check that this server can reach Housecall Pro and that a configured customer link still resolves. Run this first when a tool fails.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint and openWorldHint, so the bar is lower. The description adds useful behavioral context by explaining that the tool performs a live connectivity check against an external service and validates a customer link, without suggesting destructive side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence states the core purpose, and the second provides actionable usage guidance. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter healthcheck tool, the description covers what it checks and when to run it. It does not describe the return format, but the tool's simplicity and the absence of required inputs keep this gap minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters and schema description coverage is 100%, so there is nothing for the description to clarify. The baseline of 4 applies because no parameter ambiguity exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it checks server reachability to Housecall Pro and whether a configured customer link resolves. This clearly distinguishes the healthcheck from sibling data-fetching and mutation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Run this first when a tool fails,' giving clear when-to-use guidance in a diagnostic workflow. It does not name alternatives or state when not to use it, but the context is strong enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
housecallpro_list_linksARead-only
List the Housecall Pro customer links this server is configured with. Labels and document kinds only — retrieval tokens are credentials and are never returned.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses a critical boundary: 'retrieval tokens are credentials and are never returned.' It also clarifies that only 'labels and document kinds' are exposed, giving the agent a concrete expectation of what the response will and will not contain. This materially reduces the risk of misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence front-loads the core purpose and scope; the second sentence adds a valuable security-relevant constraint. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only list tool with no output schema, the description fully equips the agent: it states what is listed, what the output consists of, and what will never be returned. No missing information is needed to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is effectively complete, so there is nothing to document. The description's focus on output scope rather than inputs is appropriate for a parameterless tool, meeting the baseline for this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a specific resource ('Housecall Pro customer links'), and a precise scope ('this server is configured with'). It is clearly distinct from sibling tools, which target estimates, invoices, company info, or health checks, so an agent can differentiate it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the usage context clear: call this tool when you need to see which Housecall Pro customer links are configured. It does not explicitly name an alternative or state when not to use it, but none of the siblings perform link listing, so the guidance is sufficient for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.1.0- Changed
housecallpro_decline_estimate2 fields changed- removed
Input schema / properties / confirmRemoved value: -{ - "description": "Must be true to proceed. Without this, the tool returns a preview.", - "type": "boolean" -} - added
Input schema / properties / confirmTokenAdded value: +{ + "description": "ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 \"confirmation-required\" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.", + "type": "string" +}
7 tool updates
v0.4.0- Changed
housecallpro_approve_estimate1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
housecallpro_decline_estimate1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
housecallpro_get_company1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
housecallpro_get_estimate1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
housecallpro_get_invoice1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
housecallpro_healthcheck1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
housecallpro_list_links1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
2 tool updates
v0.3.0- Changed
housecallpro_get_estimate2 fields changed- removed
Input schema / properties / rawRemoved value: -{ - "description": "Return the full upstream document instead of the summary. Much larger, and mostly display flags.", - "type": "boolean" -} - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"raw\" returns the upstream payload unprojected. \"compact\" is the summary: line items, totals, tax, company and approval state, with every money field as both `*_cents` and `*_usd`. \"raw\" is the upstream document (~4.8 KB, mostly display flags and `{object, data}` wrappers) — its money is integer CENTS with no dollar sibling, so `total_amount: 34639` means $346.39.", + "enum": [ + "compact", + "raw" + ], + "type": "string" +}
- Changed
housecallpro_get_invoice2 fields changed- removed
Input schema / properties / rawRemoved value: -{ - "description": "Return the full upstream document instead of the summary.", - "type": "boolean" -} - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"raw\" returns the upstream payload unprojected. \"compact\" is the summary: totals, balance due, payability and the company, with every money field as both `*_cents` and `*_usd`, plus the `tax_cents`/`tax_usd` and `is_paid` this server derives. \"raw\" is the upstream document — it carries neither, and its money is integer CENTS with no dollar sibling.", + "enum": [ + "compact", + "raw" + ], + "type": "string" +}
7 tool updates
v0.2.0- First observed
housecallpro_approve_estimate - First observed
housecallpro_decline_estimate - First observed
housecallpro_get_company - First observed
housecallpro_get_estimate - First observed
housecallpro_get_invoice - First observed
housecallpro_healthcheck - First observed
housecallpro_list_links
TDQS
Scored across 7 tools
Each tool targets a distinct resource or action: company lookup, estimate/invoice retrieval, estimate decline/approve, health check, and link listing. The only minor overlap is get_estimate including company info, but that's complementary rather than confusing.
All tools follow the consistent pattern housecallpro_ + verb_noun (e.g., get_estimate, decline_estimate, list_links). Verbs are lowercase and snake_case throughout, making the naming predictable and scannable.
With 7 tools, the server is well-scoped for its purpose—reading and acting on estimates/invoices plus administrative utilities. Each tool earns its place, and the count sits comfortably in the ideal 3-15 range.
The core lifecycle is covered: retrieve documents, decline an estimate, and access company details. The main gap is the lack of a tool to list all estimates/invoices (only get by ID), and payment is not addressed, but these are minor given the server's customer-facing scope.
Maintenance
Related MCP Connectors
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
Your iBuildPro workspace in Claude: jobs, customers, money, calendar. Sign in with your login.
Connect Claude or Cursor to books, invoices, bills, payroll, and sealed closes.
Connect Claude to Fathom meeting recordings, transcripts, and summaries
Related MCP Servers
- FlicenseCqualityDmaintenanceConnects Claude to ServiceTitan via API, providing 60 tools across CRM, Jobs, Accounting, and more for business management.601-
- FlicenseAqualityFmaintenanceConnects Claude to Jobber to manage clients, jobs, invoices, quotes, and scheduling through natural language.10-
- FlicenseBqualityBmaintenanceConnects Claude to your JobNimbus account via API, enabling management of contacts, jobs, notes, and other CRM entities through natural language.19-
- AlicenseBqualityBmaintenanceConnects AI assistants to Housecall Pro to look up and manage customers, jobs, invoices, and more through natural language. Operates in read-only mode by default with optional write capabilities.301MIT