thumbtack-mcp
An anonymous, read-only MCP server for searching and reading Thumbtack local service pros.
Search pros by trade/service and US ZIP, returning up to 10 with rating, review count, lifetime hires, mean response time, and profile URL.
Resolve loose service names to canonical Thumbtack slugs (e.g. "plumbing" → "plumbers").
Fetch a pro's profile: name, description, location, aggregate rating, credentials, and section inventory.
Fetch reviews from a pro's profile: stars, author, date, text, with optional limit.
Run arbitrary read-only GraphQL queries against Thumbtack's anonymous endpoint; mutations are refused.
Check health/reachability of the HTML page and GraphQL surfaces, reporting probe kind/status.
Use compact (default) or full view on read tools to control response detail.
Provides tools for searching local service pros and reading their profiles, ratings, reviews, and credentials on Thumbtack.
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., "@thumbtack-mcpfind plumbers in 94110"
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.
thumbtack-mcp
Unofficial Thumbtack MCP server — search local service pros, and read their profiles, ratings, reviews and credentials.
Read-only and anonymous. Thumbtack's consumer pages and its GraphQL endpoint answer without a login, so this server needs no account, no API key and no browser extension. It also cannot write: Thumbtack's write paths sit behind a reCAPTCHA-gated login that no server-side client can pass.
Thumbtack has no public consumer API. This server reads its server-rendered pages and anonymous GraphQL endpoint, and may break or violate their ToS. Developed and maintained by AI (Claude). Use at your own discretion.
Install
// .mcp.json
{ "mcpServers": { "thumbtack": { "command": "npx", "args": ["-y", "@chrischall/thumbtack-mcp"] } } }No configuration — there are no environment variables.
Related MCP server: valet-parking-directory
Tools
Tool | What it does |
| Search pros by trade + US ZIP. Returns up to 10 with rating, review count, lifetime hires, mean response time, profile URL. |
| Canonicalise a loose service name ( |
| A pro's profile: name, description, location, aggregate rating, credentials, section inventory. |
| Reviews on a pro's profile — stars, author, date, text. |
| Escape hatch for arbitrary read-only GraphQL. Mutations refused. |
| Probes the page and GraphQL surfaces separately and reports the response shape still matches; each probe names a |
Every read tool takes view: "compact" | "full", and compact is the
default. On thumbtack_search_pros that is a hand-written field projection;
on thumbtack_get_pro, thumbtack_get_pro_reviews and thumbtack_graphql it
strips image URLs, which needs no knowledge of the payload's shape. Pass
view: "full" for the untouched upstream records — they are large and mostly
tracking metadata, which is why the slim shape is what you get without asking.
thumbtack_resolve_service and thumbtack_healthcheck take no view: both
already answer with a handful of scalar fields, and a rung that cannot change
anything is worse than no parameter.
Shell-only alternative
skills/thumbtack/ is a self-contained skill covering the same surface with
plain curl + jq — no server process. Use it for one-shot lookups and
scripts.
How it works
Three verified surfaces, all pinned in docs/THUMBTACK-API.md:
Search pages — results embedded in
__NEXT_DATA__.Profile pages —
window.__APOLLO_STATE__(a bare JS assignment, so it needs balanced-brace extraction) plus schema.org JSON-LD.GraphQL (
app.thumbtack.com/graphql) — accepts ad-hoc anonymous queries; introspection is disabled.
Two things that bite anyone reading these pages:
JSON-LD
@typeis the trade-specific subtype, notLocalBusiness— a plumber's node is"@type":"Plumber". Match by shape, not by type name.GraphQL returns HTTP 200 with an
errors[]body. Status alone is never sufficient.
Not covered
Your own Thumbtack account (projects, messages, quotes) — the login is reCAPTCHA-gated, so there is no server-side password login.
The Partner Platform API (
developers.thumbtack.com) — real and documented, but gated behind partner credentials ("Request Access"). It is a seller surface, not a consumer one.
Development
npm install
npm run build
npm test # unit + server-boot smoke tests
npm run test:coverageCoverage is enforced at 100%.
License
MIT
Available Tools
6 toolsthumbtack_get_proARead-only
Read a Thumbtack pro's profile: name, description, location, aggregate rating, plus credentials (background check, licences) and the section inventory. Takes a profile URL from thumbtack_search_pros.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full https://www.thumbtack.com/... pro profile URL. | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; "full" returns Thumbtack's whole records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered; the description adds the useful behavioral context that this is a single-record read keyed off a URL obtained elsewhere and previews the payload (credentials, section inventory). It says nothing about rate limits, auth, or pagination, which keeps it below a 5.
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 tight sentences, front-loaded with what is returned and closing with the input provenance. No filler, every clause carries information.
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 preview the return, and it names the main field groups (identity, rating, credentials, section inventory) so an agent knows what to expect. It is not exhaustive, but it is sufficient for correct invocation.
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% and the 'view' enum is fully documented in the schema itself, so the schema carries the parameter burden. The description only adds provenance for 'url' and does not explain the compact/full tradeoff beyond what the schema already states.
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?
Specific verb ('Read') plus resource ('Thumbtack pro's profile') with an enumerated field preview (name, description, location, rating, credentials, section inventory). It is clearly distinguishable from siblings like thumbtack_search_pros and thumbtack_get_pro_reviews.
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?
Explicitly states where the required input comes from ('Takes a profile URL from thumbtack_search_pros'), which establishes the call chain and when this tool is the right next step. It gives no negative guidance (e.g. when to prefer reviews or search instead), so it falls short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thumbtack_get_pro_reviewsARead-only
Read the reviews embedded on a Thumbtack pro's profile page (star rating, author, date, text). Takes a profile URL from thumbtack_search_pros.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full https://www.thumbtack.com/... pro profile URL. | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; "full" returns Thumbtack's whole records. | |
| limit | No | Cap the number of reviews returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe-read, live-web nature is covered. The description adds that reviews are "embedded on a pro's profile page," implying scraped content, but says nothing about pagination behavior, result caps, or failure modes when a profile has no reviews.
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 tight sentences, with the core action and scope front-loaded and the input dependency placed second. No filler or restated title text.
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 carries the return-value burden and does list the review fields returned, which is adequate. It omits any note on ordering, pagination, or how the limit interacts with the response, leaving a small gap for a scraping tool.
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 the schema already fully documents url, view, and limit; the baseline of 3 applies. The description only reinforces the origin of the url parameter and adds no detail on the compact/full projection or the limit cap beyond what the schema states.
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?
States a specific verb (read) and resource (reviews on a pro's profile page) and even enumerates the returned fields (star rating, author, date, text). It is clearly distinguishable from the sibling thumbtack_get_pro, which returns the profile itself rather than its reviews.
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?
It gives a clear entry condition by naming where the required url comes from ("Takes a profile URL from thumbtack_search_pros"), effectively routing the agent through the search tool first. It does not state when not to use it or name alternatives for review retrieval, so it falls 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.
thumbtack_graphqlARead-only
Escape hatch: issue an arbitrary read-only query against Thumbtack's anonymous GraphQL endpoint. Introspection is disabled upstream, so field names must come from a page's Apollo state. Mutations are refused.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; "full" returns Thumbtack's whole records. | |
| query | Yes | A GraphQL query document. Must not contain a mutation or subscription. | |
| variables | No | Variables for the query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, it discloses decisive behavioral constraints: introspection is disabled upstream, field names must be sourced from a page's Apollo state, and mutations are refused. These are exactly the facts an agent needs to avoid failing calls, and they are not encoded in any structured field.
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?
Three tight sentences, front-loaded with the identifying phrase 'Escape hatch,' and every clause carries distinct information (scope, introspection limitation, mutation refusal). 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 raw-query tool with no output schema (return shape is defined by the caller's query), the description covers the critical constraints but says nothing about error behavior, variable handling, or pagination. Adequate to call correctly, with minor gaps.
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 the 'view' enum is well documented in-schema (compact vs full projection behavior). The description adds no parameter-level detail of its own, so the baseline of 3 applies – the heavy lifting is done by 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?
States a specific verb and resource ('issue an arbitrary read-only query against Thumbtack's anonymous GraphQL endpoint') and frames itself as an 'escape hatch,' which immediately distinguishes it from the purpose-built siblings like thumbtack_search_pros. An agent can tell what it does and where it sits relative to the others without opening the 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 word 'escape hatch' plus 'read-only' gives clear context for when this is appropriate (arbitrary queries the purpose-built tools don't cover). It does not, however, explicitly name an alternative tool or a fallback rule such as 'prefer thumbtack_search_pros for normal searches,' so it stops just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thumbtack_healthcheckARead-only
Check that Thumbtack's anonymous surface is reachable and still has the response shape this server expects. Reports the server version, the HTML page probe and the GraphQL probe separately, each with a kind (ok, edge_blocked, http, transport, timeout, rate_limited, shape_changed, unknown).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the rest and does well: it discloses that the HTML page probe and GraphQL probe are reported separately and enumerates the possible `kind` outcomes (edge_blocked, rate_limited, shape_changed, etc.). It stops short of explaining what each failure mode means or how to react, which keeps it from a 5.
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, front-loaded with the purpose, then the reporting detail. The enum list is long but each value is load-bearing for interpreting output. 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?
With no output schema, the description must convey the return shape, and it does name the reported fields (server version, HTML probe, GraphQL probe, `kind`). It leaves the exact response envelope and the meaning of each `kind` unspecified, which is a modest gap for a low-complexity zero-param tool.
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 takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the description correctly makes no parameter claims.
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?
States a specific verb (Check) and resource (Thumbtack's anonymous surface reachability + response shape), and further specifies what it reports. It is unmistakably a diagnostic tool and cannot be confused with the sibling search/resolve/pro/graphql 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 diagnostic nature implies when it would be called (to verify connectivity/shape before or after other calls), but the description never explicitly states when to prefer it or that it is the right first step when other tools fail. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thumbtack_resolve_serviceARead-only
Resolve a loose service name to the canonical Thumbtack slug by asking Thumbtack (it canonicalises via redirect, e.g. "plumbing" -> "plumbers"). Use before assuming a slug is right.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | ZIP used to drive the lookup; does not affect the resolved slug. | 10001 |
| service | Yes | Trade or service name to canonicalise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description goes further by disclosing the mechanism — Thumbtack is queried and canonicalisation happens via redirect — which explains why loose or imprecise names work. It does not mention failure behavior for unresolvable names or any rate limits.
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 the purpose and example front-loaded and the usage cue trailing. No filler, no restatement of the title or name.
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 resolver with no output schema, the description conveys the return value implicitly (a canonical slug) and the mechanism. It leaves open what happens when a name cannot be resolved, but the essential contract for calling the tool correctly is present.
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 parameters are already documented, including the note that zip does not affect the resolved slug. The description adds only the qualifier "loose" for the service input, which is marginal value over the schema. Baseline 3 is appropriate.
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?
States a specific verb (resolve) and resource (service name → canonical Thumbtack slug) and makes the transformation concrete with a worked example ("plumbing" -> "plumbers"). This is clearly distinct from the sibling tools, which fetch pros, reviews, or raw GraphQL rather than canonicalising a slug.
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?
"Use before assuming a slug is right" gives a clear triggering condition for the tool. It does not name a specific alternative tool or describe when-not to use it, so it falls short of a full when/when-not routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thumbtack_search_prosARead-only
Search Thumbtack for local service pros by trade and US ZIP code. Returns up to 10 ranked pros with rating, review count, lifetime hires, mean response time and profile URL. Anonymous — no account needed.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | Yes | 5-digit US ZIP code to search near. | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; "full" returns Thumbtack's whole records. | |
| limit | No | Cap the number of pros returned (upstream page size is 10). | |
| service | Yes | Trade or service, e.g. "house cleaning", "plumbing", "electrician". Loose names are canonicalised by Thumbtack. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description goes beyond them by disclosing the result cap (up to 10 ranked pros), the ranked nature of results, the specific data fields returned, and that the call is anonymous with no account required. It omits rate limits and any note on what happens with an invalid ZIP or zero results.
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?
Three short sentences, front-loaded with the action and scope, followed by return contents and the auth-free property. Every sentence carries distinct information and nothing is repeated from the schema.
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 usefully enumerates the returned fields (rating, review count, lifetime hires, mean response time, profile URL) and the result cap, which the agent otherwise could not know. It is nearly complete; only error/empty-result behavior and any pagination caveat are unaddressed.
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 the schema already explains service, zip, limit, and the compact/full view enum in detail. The description only echoes the trade and ZIP-code dimensions and adds nothing about view or limit, so the baseline 3 applies.
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?
States a specific verb (Search) plus the resource (local service pros) and its two scoping dimensions (trade and US ZIP code). This clearly separates it from siblings like thumbtack_get_pro, thumbtack_get_pro_reviews, and thumbtack_resolve_service, which operate on a single already-identified pro or on name resolution.
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 the entry-point search use case, but never states when to use this versus thumbtack_resolve_service (which appears to be the canonicalisation step for loose trade names) or when to follow up with thumbtack_get_pro. No exclusions, prerequisites, or alternatives are given, so usage must be inferred from the sibling names.
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.
6 tool updates
v0.1.5- Changed
thumbtack_get_pro1 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
thumbtack_get_pro_reviews1 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
thumbtack_graphql1 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
thumbtack_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
thumbtack_resolve_service1 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
thumbtack_search_pros1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
4 tool updates
v0.1.2- Changed
thumbtack_get_pro1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; \"full\" returns Thumbtack's whole records.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
thumbtack_get_pro_reviews1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; \"full\" returns Thumbtack's whole records.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
thumbtack_graphql1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; \"full\" returns Thumbtack's whole records.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
thumbtack_search_pros2 fields changed- removed
Input schema / properties / compactRemoved value: -{ - "default": false, - "description": "Set true for slim summaries (name, rating, reviews, hires, response time, url). Default false returns the full upstream records, which are large and mostly tracking metadata.", - "type": "boolean" -} - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; \"full\" returns Thumbtack's whole records.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
6 tool updates
v0.1.0- First observed
thumbtack_get_pro - First observed
thumbtack_get_pro_reviews - First observed
thumbtack_graphql - First observed
thumbtack_healthcheck - First observed
thumbtack_resolve_service - First observed
thumbtack_search_pros
TDQS
Scored across 6 tools
Each tool targets a distinct step in the browse flow: slug resolution, search, profile read, reviews read, plus a healthcheck. The only soft overlap is thumbtack_graphql, which is a generic escape hatch that could duplicate other tools' work, but it is clearly labeled as a raw query fallback so misselection risk is low.
Consistent snake_case with a uniform thumbtack_ prefix throughout. resolve/search/get follow a clear verb_noun pattern; graphql and healthcheck omit a verb, but their conventional naming is readable and predictable rather than chaotic.
Six tools is a tight, well-scoped set for an anonymous read-only browsing server, and every tool earns its place (resolve, search, profile, reviews, raw fallback, healthcheck). No redundant or filler tools.
The discovery lifecycle is well covered: resolve a service, search pros, read a profile, read its reviews, plus an escape hatch for anything missed. Minor gaps like listing categories or paging results exist, but the GraphQL tool lets agents work around them.
Maintenance
Related MCP Connectors
ProxyLink MCP server for finding and booking home service professionals
Search 33,000+ MCP servers by job, see safety grades and reviews, and call them from one endpoint.
MCP server for Muovi, Argentina's trust-first local services marketplace: find pros, draft tasks.
Federated commerce search across independent WooCommerce merchants. Keyless, read-only MCP server.
Related MCP Servers
- AlicenseBqualityCmaintenanceMCP server for searching marketplaces (TCGPlayer, Reverb, Thumbtack), verifying professional licenses (contractor, nurse), and looking up PSA card grading data. Returns real-time pricing, listings, and verification results.22127 npm5MIT
- AlicenseNot gradedqualityCmaintenancePublic read-only MCP server backed by GetValetParking.com directory of 789 US valet parking operators across 31,186 cities. Discover valet operators by coordinates or city slug, filter by 9 service types, and fetch full operator profiles. No auth required.MIT
- AlicenseAqualityDmaintenanceUnofficial, read-only MCP server for Fandango showtimes and seat availability, reverse-engineered from observed web traffic.61MIT
- AlicenseAqualityDmaintenanceMCP server for Muovi, Argentina's local services marketplace. Enables discovery of verified service professionals, browsing services and cities, reading reviews, and generating deep-links for task creation.638 npm1MIT