angi-mcp
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., "@angi-mcpFind highly rated plumbers in Charlotte"
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.
angi-mcp
MCP server for Angi (formerly Angie's List) — find home-service pros by trade and city, and read their ratings, profiles and reviews.
Angi serves its pages only to a real browser, so requests route through the
user's own angi.com tab via the fetchproxy
browser extension, reusing their existing session. The trade/city taxonomy is
read directly from Angi's public sitemaps and needs no browser at all.
No Angi account or credentials are required. Everything this server reads is public.
This project was developed and is maintained by AI (Claude). Use at your own discretion.
Install
npm install -g @chrischall/angi-mcpRegister it with your MCP host:
{
"mcpServers": {
"angi": { "command": "angi-mcp" }
}
}You also need the fetchproxy Transporter browser extension, with an open
angi.com tab and its site access allowing angi.com. On the first request
the extension shows a pairing code to approve; the trust then persists.
Run angi_healthcheck to confirm the bridge is connected.
Related MCP server: Kolmo Construction
Tools
Tool | What it does |
| Pros for a trade in a US city, with ratings, review counts, years in business, service area, amenities. 10 per page. |
| One pro's full profile and ratings breakdown. |
| Reviews on a pro's profile — rating, text, reported cost, date, categories, the pro's response. Filterable by rating. |
| Every trade slug Angi publishes (~312). No bridge needed. |
| Cities Angi publishes pages for, per trade. No bridge needed. |
| Bridge connection state. |
Signed-in tools (need the browser tab signed in to Angi):
Tool | What it does |
| Your identity and open/closed project counts. |
| Your Angi projects, open and closed. |
| Reviews you've written, plus pros awaiting a rating. |
Searches take slugs, not free text — resolve them first:
angi_list_trades { contains: "duct" } -> "air-duct-cleaning"
angi_list_cities { trade: "plumbing", state: "nc", contains: "char" }
angi_search_pros { trade: "plumbing", state: "nc", city: "charlotte", compact: true }Pass compact: true when browsing or ranking — it projects each record to a
slim summary instead of the full ~1KB payload.
Ratings
Each pro carries two overall ratings and they differ on purpose:
rating(averageRatings.OVERALL) — unrounded. Rank on this.displayRating(averageOverallRating) — the rounded value Angi shows.
Per-dimension ratings (quality, value, punctuality, professionalism, responsiveness) come through in the full record.
isSponsored: true marks paid placement, not a quality signal.
Limits
No zip-code filtering. Angi's
?zip=parameter is inert — a Charlotte URL returns Charlotte pros regardless. Location comes from the city slug.Account record shapes are unverified. The account used to map
my.angi.comheld zero projects and zero reviews, so only the envelopes were observed.angi_list_my_projectsandangi_list_my_reviewsreturn records raw and setrecordFieldsVerified: falserather than projecting onto field names nobody has seen. Seedocs/ANGI-API.md.The inbox is not readable. Angi's messages run on the Twilio Conversations SDK; the proxy endpoints reject the session cookie alone (401), so messages need the Twilio client rather than an HTTP GET.
Cannot be hosted remotely. Like every browser-bridge server in this fleet, it needs a signed-in tab on the machine it runs on, so it cannot be served to claude.ai from mcp-host.
Without the MCP
skills/angi-fpx/ is a shell-out skill that reads the same data with the fpx
CLI and no running server — useful in scripts or on a machine where the MCP
isn't installed.
Development
npm install
npm run build # tsc --noEmit + esbuild bundle
npm testdocs/ANGI-API.md records the live-captured request/response shapes, including
the verified negative results. Read it before changing src/parse.ts.
License
MIT
Available Tools
9 toolsangi_get_accountARead-onlyIdempotent
The signed-in Angi user: first name, user/entity ids, unread message count, and how many open and closed projects they have. Requires the browser tab to be signed in.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the agent knows this is a safe read operation. The description adds useful context: the exact data fields returned and the sign-in requirement. It does not disclose behavior on failure (e.g., if not signed in), but with strong annotation coverage, the additional context is sufficient.
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, both front-loaded with the key information: what the tool returns and the sign-in requirement. No filler or redundancy. 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?
Given zero parameters, no output schema, and annotations covering safety and idempotency, the description is complete. It tells the agent what data it will get and the only precondition (sign-in). Nothing essential is missing 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?
There are zero parameters, so the description does not need to explain any. The baseline for zero parameters is 4, and the description adds no parameter-related content, which is appropriate since none exist.
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 clearly states the tool returns the signed-in user's account data: first name, ids, unread count, and open/closed project counts. It names the specific resource (the signed-in Angi user) and the fields, distinguishing it from siblings that handle reviews, searches, and projects. The verb is implied but the content is unambiguous.
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 states the prerequisite 'Requires the browser tab to be signed in' but does not explicitly say when to use this tool versus alternatives. It does not mention alternatives or conditions like 'use for current user info' or 'not for listing projects.' The sibling names make the distinction clear, but the description itself offers no direct routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
angi_get_proARead-onlyIdempotent
Read one Angi pro's full profile: business details, service area, hours, amenities, awards, tasks offered, contact address, and the ratings breakdown. Also reports how many reviews the page carries (fetch them with angi_get_reviews).
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No | Return a slim summary instead of the full record. | |
| profileUrl | Yes | The pro's Angi profile URL or site-relative path, as returned in `profileUrl` by angi_search_pros (e.g. "/companylist/us/nc/charlotte/mkb-plumbing-and-septic-llc-reviews-8535260.htm"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, which covers the safety profile. The description adds meaningful behavioral disclosure beyond the annotations: it enumerates exactly which data sections are returned and clarifies that the tool provides a review count rather than review content — preventing a false expectation of receiving full reviews. This count-vs-content distinction is a genuine behavioral trait an agent needs to know.
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 zero waste. The first sentence front-loads the core purpose with a verb and a comprehensive content list; the second sentence earns its place by disclosing the review-count behavior and routing to the sibling tool. Every clause adds information an agent needs.
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 read-only tool with two well-documented parameters and safety annotations, the description is nearly complete. It covers the return contents — valuable because there is no output schema — the review-count behavior, and sibling routing. Minor gaps are edge-case behavior (error handling, missing profiles, and exact consequences of compact mode on the listed fields), which are acceptable given the strong schema and annotation 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 the baseline of 3 applies. Both parameters are already well-documented in the schema — profileUrl's description even includes an example URL and a reference to angi_search_pros. The main description adds no parameter-level detail beyond what the schema states; the 'full profile' phrasing implicitly contrasts with compact mode, but the schema already carries that meaning.
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 opens with a specific verb ('Read') and a precise resource ('one Angi pro's full profile'), then enumerates the content areas (business details, service area, hours, amenities, awards, tasks offered, contact address, ratings breakdown). The final clause explicitly contrasts with sibling angi_get_reviews by stating it only reports a review count, which distinguishes it from the review-focused siblings.
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 parenthetical '(fetch them with angi_get_reviews)' gives explicit routing guidance: this tool returns a review count but not the reviews themselves, naming the exact alternative to use. The profileUrl schema description reinforces the intended workflow by referencing angi_search_pros as the source of the URL. It does not address when to prefer compact mode or other siblings, but covers the most relevant decision point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
angi_get_reviewsARead-onlyIdempotent
Read the reviews on an Angi pro's profile page: rating, body text, reported job cost, date, service categories, verification flag, and the pro's public response where one exists. Filter by rating to isolate complaints or praise.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many reviews. | |
| compact | No | Return a slim summary per review instead of the full record. | |
| maxRating | No | Keep reviews rated at most this — use maxRating: 3 to surface complaints. | |
| minRating | No | Keep reviews rated at least this. | |
| profileUrl | Yes | The pro's Angi profile URL or site-relative path, as returned in `profileUrl` by angi_search_pros (e.g. "/companylist/us/nc/charlotte/mkb-plumbing-and-septic-llc-reviews-8535260.htm"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and open-world behavior, so the description does not need to restate those. It adds some useful context by listing the returned fields and noting that the pro's response is included only 'where one exists', but it does not disclose other behavioral traits such as pagination behavior, empty-result handling, or whether the profileUrl must come from a prior search.
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. The first front-loads the verb, resource, and output fields; the second gives a concrete filtering use case. No filler or redundancy.
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?
Given there is no output schema, the description usefully enumerates the returned review fields and gives a filtering example. It is complete enough for an agent to select the tool and understand what it will get back, though it leaves minor gaps around defaults, ordering, and pagination.
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 all five parameters are already documented. The description adds only a general 'filter by rating' tip, while the schema itself provides richer direction (e.g., 'use maxRating: 3 to surface complaints'). Therefore the description 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 starts with a specific verb ('Read') and a specific resource ('the reviews on an Angi pro's profile page'), then enumerates the exact fields returned. This clearly distinguishes the tool from siblings like angi_list_my_reviews by focusing on a public pro profile rather than the caller's own 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?
The description establishes clear context: use this when you want reviews from a specific pro's profile page. It also gives a practical usage tip ('Filter by rating to isolate complaints or praise'). It does not explicitly name excluded alternatives or when-not-to-use conditions, 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.
angi_healthcheckVerify the fetchproxy bridge end-to-endARead-onlyIdempotent
Round-trips a small public www.angi.com URL (/robots.txt) through the fetchproxy bridge and returns diagnostics: the bridge's role (host/peer/null), port, version, the extension link (linked / pair pending / not attached / never answered), the elapsed round-trip time, and a plain-English hint distinguishing 'bridge never came up' from 'extension not connected' from 'real www.angi.com-side problem'. Read-only, no auth required. Call this when a real tool fails and you want to know which hop broke.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds context beyond these: it states no auth required, read-only explicitly, and details the diagnostics returned (role, port, version, extension link, elapsed time, and a hint distinguishing failure modes). This adds meaningful behavioral transparency without contradicting 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 a single, well-structured paragraph that front-loads the action and then lists the diagnostics. Every sentence contributes useful information, but it is slightly verbose. It could be condensed without losing meaning, but it is still concise and logically ordered.
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 with no parameters and no output schema, the description fully covers what it does, when to use it, and what it returns (the diagnostics list). It even distinguishes failure modes. There is nothing an agent needs to call it correctly that is missing.
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 100% (empty schema). Per the baseline rule for 0 params, a score of 4 is appropriate. The description does not need to explain parameters since there are none.
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 clearly states a specific action (round-trips a small public www.angi.com URL through the fetchproxy bridge) and its purpose (returns diagnostics). It differentiates from all sibling tools, which are all about reviews, pros, trades, etc., so there is no confusion. The verb 'round-trips' and resource 'fetchproxy bridge' 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 explicitly states when to use it: 'Call this when a real tool fails and you want to know which hop broke.' It also explains what it does in that context. It does not explicitly mention when not to use it or name alternatives, but the context is clear and distinct from siblings. A score of 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
angi_list_citiesARead-onlyIdempotent
List every US state/city that Angi publishes pages for, for one trade. Use it to confirm a city slug exists before searching, or to discover nearby cities. Reads Angi's public sitemap directly — no browser bridge required.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Restrict to one two-letter state code, e.g. "nc". | |
| trade | Yes | Trade slug, e.g. "plumbing". | |
| contains | No | Case-insensitive substring filter on the city slug. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, and idempotent hints. The description adds useful behavioral context by stating it reads Angi's public sitemap directly and requires no browser bridge, which clarifies prerequisites and execution mode.
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 deliver purpose, usage, and behavioral context with zero filler. The main function is front-loaded, and every clause adds value.
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 list operation, the description covers the main intent, usage context, and data source. It does not describe the output structure or pagination, but the absence of an output schema and the simple list nature make this a minor gap.
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 input schema already documents all three parameters. The description adds no significant parameter-level detail beyond what the schema provides, so a baseline score of 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?
The description states a precise operation: listing every US state/city Angi publishes pages for, scoped to one trade. This clearly distinguishes it from sibling tools like angi_list_trades or review-related tools by naming the exact resource and filter.
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 explicit use cases: confirm a city slug exists before searching, or discover nearby cities. It does not explicitly name alternatives or say when not to use it, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
angi_list_my_projectsARead-onlyIdempotent
The signed-in user's Angi projects (service requests and bookings), open and closed. Records are returned exactly as Angi sends them — the response sets recordFieldsVerified: false because no populated project has been observed yet, so field names should be read from the data rather than assumed.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Which project list to return. Defaults to all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, the description discloses that records are passed through exactly as Angi sends them, that recordFieldsVerified is false, and that field names should be read from data rather than assumed. This is valuable behavioral context that annotations alone do not provide.
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 core purpose, followed by a necessary caveat about data trustworthiness. No filler or redundant restatement of schema details.
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 list tool, the description covers the resource, scope, and the most important uncertainty (unverified field names). It is slightly less complete because no concrete response shape is hinted at, though the caveat intentionally tells agents not to assume field names.
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 only parameter, status, is already fully documented in the input schema with its enum values and default. The description's mention of open and closed aligns with the parameter 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 clearly states the tool lists the signed-in user's Angi projects, including service requests and bookings, open and closed. This specific verb-resource pairing distinguishes it from sibling tools like angi_list_my_reviews and angi_search_pros.
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 context: use this for the signed-in user's own projects, not for general searching or reviews. It does not explicitly name alternatives or exclusions, but the scope is unambiguous enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
angi_list_my_reviewsARead-onlyIdempotent
Reviews the signed-in user has written, plus pros Angi is prompting them to rate (unratedPros). Same caveat as projects: records pass through raw and the response sets recordFieldsVerified: false.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, open-world, and idempotent behavior. The description adds valuable context beyond those hints by disclosing that records pass through raw and that the response sets `recordFieldsVerified: false`, which alerts the agent to unverified data.
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 concise sentences that lead with the core purpose and follow with the important data-quality caveat. There is no filler or repetition of annotation 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?
For a parameterless, read-only, idempotent tool, the description provides enough detail about what the response contains (`reviews`, `unratedPros`) and a key caveat (`recordFieldsVerified: false`). No output schema exists, but the description supplies the essential return semantics.
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 100%, so there are no parameter semantics to document. The description correctly focuses on the response content rather than inputs, matching the baseline for a parameterless tool.
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 clearly states the tool returns the signed-in user's written reviews plus unrated pros (`unratedPros`). This distinguishes it from sibling review tools like `angi_get_reviews` by anchoring to the signed-in user and their prompted ratings.
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 provides clear context for when to use the tool: when retrieving the current user's reviews or rating prompts. It doesn't explicitly name alternatives or state when not to use it, but the scope is specific enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
angi_list_tradesARead-onlyIdempotent
List every trade slug Angi publishes (~312, e.g. "plumbing", "air-duct-cleaning", "basement-waterproofing"). Call this to resolve a free-text trade to the slug angi_search_pros needs. Reads Angi's public sitemap directly — no browser bridge required.
| Name | Required | Description | Default |
|---|---|---|---|
| contains | No | Case-insensitive substring filter, e.g. "duct" or "roof". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, and idempotent behavior. The description adds useful context beyond that: it reads Angi's public sitemap directly, requires no browser bridge, and lists approximately 312 entries. This gives the agent an accurate mental model of the 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: it states the output, gives examples, explains the use case, and notes the data source in three sentences. Every sentence earns its place with no redundant wording.
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 with one optional parameter and strong annotations covering safety and idempotency, the description provides everything needed: what it returns, why to call it, how it works, and what it does not require. No output schema is needed since the return type (a list of slug strings) is directly inferable.
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%, with the only parameter 'contains' already documented as a case-insensitive substring filter. The description reinforces the use case but does not add significant new parameter-level meaning beyond what the schema provides, so the baseline 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?
The description clearly states a specific action and resource: 'List every trade slug Angi publishes' with concrete examples. It also names the downstream consumer (angi_search_pros), which distinguishes this tool from sibling tools dealing with reviews, cities, or pros.
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 when to call it: 'resolve a free-text trade to the slug angi_search_pros needs.' It does not explicitly mention when not to use it or compare it to alternatives, but the intended usage context is clear enough to guide an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
angi_search_prosARead-onlyIdempotent
Find home-service pros on Angi for a trade in a US city. Returns each pro with ratings (overall plus per-dimension: quality, value, punctuality, professionalism, responsiveness), review count, percent-recommended, years in business, service area and amenities. trade and city are Angi slugs — resolve them with angi_list_trades and angi_list_cities first. 10 pros per page; use page to walk further. Note Angi has no zip-code filter: location comes from the city slug only.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City slug, e.g. "charlotte", "rock-hill". | |
| page | No | 1-based page number. 10 pros per page. | |
| state | Yes | Two-letter US state code, e.g. "nc". | |
| trade | Yes | Trade slug, e.g. "plumbing", "roofing", "air-duct-cleaning". | |
| compact | No | Return a slim summary per pro instead of the full record. Recommended when browsing or ranking. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, and the description adds meaningful behavior beyond that: it lists the returned rating dimensions, states the 10-per-page pagination, tells how to walk pages, and flags the absence of a zip-code filter. This gives the agent practical expectations about output and constraints.
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?
Four sentences, each carrying unique information: purpose/return fields, slug resolution, pagination, and a location limitation. No redundant filler; the most important purpose is front-loaded.
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 search tool with no output schema, the description sufficiently covers return value structure, pagination, parameter preparation, and a key limitation. The sibling context is clear, and the schema covers the `compact` and `state` parameters, so nothing essential for invoking correctly appears missing.
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 baseline is 3, but the description adds value by instructing the agent to resolve trade and city slugs via the listing tools first, which directly informs how to construct valid parameter values. It also reinforces that city is the sole location dimension, complementing the schema's city slug example.
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 first sentence states a specific verb and resource: 'Find home-service pros on Angi for a trade in a US city.' This distinguishes it from siblings like angi_get_pro (single pro), angi_list_trades, and angi_get_reviews. The description also enumerates the returned data fields, making the tool's scope unmistakable.
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 instructs the agent to resolve `trade` and `city` slugs using angi_list_trades and angi_list_cities before calling, which is clear procedural guidance. It does not explicitly contrast with alternatives such as 'use angi_get_pro for a specific pro' or mention when not to use this tool, but the context is ample for an agent to select it correctly.
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.
9 tool updates
v0.4.0- Changed
angi_get_account1 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
angi_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
angi_get_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
angi_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
angi_list_cities1 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
angi_list_my_projects1 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
angi_list_my_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
angi_list_trades1 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
angi_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"
9 tool updates
v0.1.0- First observed
angi_get_account - First observed
angi_get_pro - First observed
angi_get_reviews - First observed
angi_healthcheck - First observed
angi_list_cities - First observed
angi_list_my_projects - First observed
angi_list_my_reviews - First observed
angi_list_trades - First observed
angi_search_pros
TDQS
Scored across 9 tools
Each tool targets a clearly distinct resource—trades, cities, pros, pro reviews, account, projects, and the signed-in user's reviews—so confusion is unlikely. The only mild overlap is `angi_get_reviews` versus `angi_list_my_reviews`, but the descriptions make the profile-centric versus user-centric distinction explicit.
Nearly all tools follow a consistent `angi_<verb>_<noun>` pattern with `list_` for enumerations, `get_` for single resources, and `search_` for querying. `angi_healthcheck` breaks the verb_noun pattern slightly, but the shared `angi_` prefix keeps the set predictable.
Nine tools cover the main Angi surface without redundancy: slug discovery, pro search and detail, reviews, account, and project listing. This is well within the comfortable 3-15 range, and each tool earns its place.
The set supports a complete read-only workflow: resolve trade/city slugs, search pros, inspect profiles and reviews, and check the signed-in user's account, projects, and reviews. Minor gaps exist—such as no project-detail tool or actions on projects/messages—but nothing essential is missing for a read-focused integration.
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.
Search, vet & assemble MCP servers from your agent: verified tools, risk labels, and trust scores.
One MCP server for 180+ live web-data APIs returning clean JSON from sites that block scrapers.
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.2282 npm4MIT
- AlicenseAqualityAmaintenanceMCP server providing 12 tools for Seattle-area home remodeling: real-time cost estimation across 8 project types, contractor business info, project portfolio, blog content, and quote submission. Connects via Streamable HTTP — no auth required.36MIT
- 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.663 npm1MIT
- AlicenseAqualityBmaintenanceMCP server for the Housecall Pro API, letting AI assistants read and write Housecall Pro data—customers, jobs, invoices, estimates, scheduling, and more—through natural language.4125 npmMIT