angi-mcp
angi-mcp lets you find Angi home-service pros, read their profiles and reviews, and access your own Angi account data through a browser-bridge MCP server.
Search pros by trade slug, state, and city slug with ratings, review counts, years in business, service area, and amenities; paginated at 10 per page.
Fetch a single pro's full profile and ratings breakdown.
Fetch reviews for a pro, filterable by rating, including text, reported cost, date, categories, and the pro's response.
List all Angi trade slugs (~312) and cities per trade directly from public sitemaps without the browser bridge.
Resolve free-text trades and cities to the required slugs before searching.
Run a healthcheck to diagnose the ContextMint Bridge connection.
If signed in to Angi, get your account info, list your projects (open/closed), and list reviews you've written plus pros awaiting your rating.
Choose
view: "compact"(default) orview: "full"for search, pro, and review responses.Note limits: no zip-code filtering, account record shapes unverified, and it cannot be hosted remotely; it requires a signed-in
angi.comtab via the ContextMint Bridge extension.
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 ContextMint Bridge
browser extension (fetchproxy protocol), 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 ContextMint Bridge browser extension, with an open
angi.com tab and its site access allowing angi.com. Install it from the
ContextMint Bridge releases:
unzip the Chrome build and load it via chrome://extensions → Load
unpacked. Safari isn't available yet (it will ship inside the ContextMint app,
which has no public download), so use Chrome for now. On the first request the
extension shows a pairing code to approve; the trust then persists.
ContextMint Bridge is the fetchproxy browser extension under its new name, from
the same maintainer — fetchproxy's own README
(https://github.com/chrischall/fetchproxy#extension) points to it. Its source is
public at https://github.com/nullnet-app/contextmint-bridge: build it yourself,
or check a release zip against the .sha256 file published beside it
(shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256).
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 name, email 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" }angi_search_pros, angi_get_pro and angi_get_reviews answer in the slim
view: "compact" projection by default; pass view: "full" for Angi's whole
~1KB records. (The old compact boolean still works as a deprecated alias and
will be removed in a later release.)
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, email address, 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 cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), so the bar is lower, and the description adds a genuinely useful behavioral constraint the annotations do not convey: authentication depends on the browser tab being signed in. It does not say what happens when the tab is not signed in (error vs. empty result), which is the one remaining behavioral gap.
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, front-loaded with the most useful information (what is returned) and ending with the operational precondition. The first clause is a noun fragment rather than a sentence, and the field enumeration is slightly list-like, but nothing is padded or redundant.
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 burden of describing the return payload, and it does so by enumerating first name, email, user/entity ids, unread message count, and open/closed project counts. Combined with the stated auth prerequisite, an agent has enough to call and interpret the result; only error behavior and response shape details are 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 takes zero parameters, which is the baseline-4 case; there is nothing for the description to disambiguate. It instead spends its words on return content, which is appropriate for a parameterless call.
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 names a concrete resource (the signed-in Angi user) and enumerates exactly which fields it yields, so an agent immediately knows this retrieves the current account profile. It lacks an explicit verb ("retrieves/returns") and never differentiates itself by name from siblings like angi_list_my_projects, but no sibling covers account identity, so the purpose is nonetheless 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?
Usage is implied by the field list plus the prerequisite "Requires the browser tab to be signed in," which tells the agent the calling context. There is no explicit when-to-use statement, no exclusion, and no pointer to an alternative for cases where the tab is not authenticated, so guidance is adequate but thin.
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 |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns a slim projection of each record (falling back to the full record if the projection does not fit the payload); "full" returns Angi's whole records. | |
| compact | No | Deprecated: use `view` instead (compact: true = view "compact", false = view "full"). Ignored when `view` is set. | |
| 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, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds value beyond them by disclosing the return surface (ratings breakdown, contact address, a review count that is not the reviews themselves) and by flagging that reviews must be retrieved separately — useful behavior for a tool with no output schema.
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 earning their place: the first front-loads the resource and its contents, the second handles sibling routing and the review-count caveat. No redundancy or 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 single-record read with no output schema, the description compensates by enumerating the returned profile sections and noting the separate review-count/review-fetch distinction. Combined with annotations covering safety and a fully documented schema, an agent has everything needed to call it 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?
Schema description coverage is 100%, and the schema itself explains profileUrl's expected format, the view enum, and the deprecated compact flag. The description adds no parameter-level detail, so the baseline 3 applies; the schema carries the full burden and does so adequately.
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 (one Angi pro's full profile) and enumerates exactly what the profile contains: business details, service area, hours, amenities, awards, tasks offered, contact address, and ratings breakdown. The final sentence explicitly contrasts it with the sibling angi_get_reviews, so an agent can distinguish it from search/list tools without opening a 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 tells the agent what to do when reviews are needed: 'fetch them with angi_get_reviews', routing the complementary task to the correct sibling. It does not state exclusions (e.g., when to prefer angi_search_pros), but the usage context for a single-record lookup is clear.
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 |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns a slim projection of each record (falling back to the full record if the projection does not fit the payload); "full" returns Angi's whole records. | |
| limit | No | Return at most this many reviews. | |
| compact | No | Deprecated: use `view` instead (compact: true = view "compact", false = view "full"). Ignored when `view` is set. | |
| 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 the safety profile (readOnly, idempotent, openWorld). Description adds value by disclosing what the records actually contain, including the pro's public response, but omits pagination behavior and whether reviews are capped or ordered.
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: first front-loads the return contents, second gives the filtering affordance. No waste.
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?
No output schema and no annotation gap, but the description does not cover pagination, result ordering, or how the rating filter interacts with limit. For a review-listing tool with a max of 9007199254740991 on limit, ordering/paging context is a real miss.
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 all six parameters including rating bounds and the view enum are documented in the schema. Description mentions rating filtering but adds no format or semantics 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+resource with explicit field enumeration (rating, body text, job cost, date, categories, verification flag, response), clearly distinguishing this read-the-reviews tool from angi_search_pros and angi_get_pro 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?
Gives one actionable usage note — filter by rating to isolate complaints or praise — which is also echoed in the schema. But it never states when to use this versus angi_get_pro or angi_list_my_reviews, its nearest siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
angi_healthcheckVerify the ContextMint Bridge connection end-to-endARead-onlyIdempotent
Round-trips a small public www.angi.com URL (/robots.txt) through ContextMint Bridge (your signed-in browser tab) 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 'this browser can't serve a capability' 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 cover readOnlyHint, openWorldHint, and idempotentHint, but the description adds substantial value: it discloses the exact return fields (bridge role, port, version, extension link states, elapsed time) and the plain-English hint categories that distinguish failure modes. It also states 'Read-only, no auth required,' reinforcing the safety profile with concrete behavioral detail.
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?
Front-loaded with what the tool does, followed by return details and usage guidance, so the agent hits the important content first. It is dense and slightly long, but every clause carries diagnostic information rather than 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 fully carries the burden of explaining return values and failure-mode interpretation, which it does in detail. An agent has everything needed to call this correctly and interpret the diagnostics.
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, which is the baseline for a 4; there are no arguments whose semantics need explaining. The description correctly signals the parameterless nature by describing an implicit fixed target URL (/robots.txt).
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 (round-trips a small public URL) and resource (ContextMint Bridge connection) and enumerates the diagnostics returned. This is clearly distinguishable from all sibling tools, which fetch account/pro/review/trade data rather than verifying connectivity.
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 says when to use it: 'Call this when a real tool fails and you want to know which hop broke.' This routes the agent correctly relative to the data-fetching siblings. It doesn't name a specific alternative tool or an explicit when-not-to-use, so it falls just 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_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. | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns a slim projection of each record (falling back to the full record if the projection does not fit the payload); "full" returns Angi's whole records. | |
| state | Yes | Two-letter US state code, e.g. "nc". | |
| trade | Yes | Trade slug, e.g. "plumbing", "roofing", "air-duct-cleaning". | |
| compact | No | Deprecated: use `view` instead (compact: true = view "compact", false = view "full"). Ignored when `view` is set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld), and the description layers on genuinely non-obvious behavior: the exact fields returned (per-dimension rating breakdown, review count, percent-recommended, years in business, service area, amenities), page size, and the location limitation. That is real added context rather than restatement.
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, front-loaded with purpose, then return shape, then prerequisites, then the pagination/location caveats. Dense and largely waste-free; the per-dimension rating enumeration is the only passage that runs slightly long against its 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?
With no output schema, the description takes on the burden of describing returns and does so thoroughly, including the compact/full distinction's effect on payload shape. Prerequisites, pagination, and the missing-filter caveat round out everything an agent needs to invoke it 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?
Schema coverage is 100%, so baseline is 3, but the description adds meaning the schema does not: `trade`/`city` must be Angi slugs resolved via sibling tools, and location derives only from the city slug. It says nothing about `page` semantics beyond page size or about the `view`/`compact` switch, which the schema carries alone.
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?
Opens with a specific verb+resource+scope: "Find home-service pros on Angi for a trade in a US city." An agent can immediately separate this from angi_get_pro (single pro) and the list_* helpers, which are named as prerequisites.
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 the prerequisite (resolve `trade` and `city` via angi_list_trades / angi_list_cities first) and gives pagination guidance ("10 pros per page; use `page` to walk further"), plus the constraint that no zip-code filter exists. It never spells out when-not to use this versus angi_get_pro, so 4 rather than 5.
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.
3 tool updates
v1.0.8- Changed
angi_get_pro2 fields changed- changed
Input schema / properties / compact / descriptionPrevious value: -"Return a slim summary instead of the full record."New value: +"Deprecated: use `view` instead (compact: true = view \"compact\", false = view \"full\"). Ignored when `view` is set." - 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 a slim projection of each record (falling back to the full record if the projection does not fit the payload); \"full\" returns Angi's whole records.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
angi_get_reviews2 fields changed- changed
Input schema / properties / compact / descriptionPrevious value: -"Return a slim summary per review instead of the full record."New value: +"Deprecated: use `view` instead (compact: true = view \"compact\", false = view \"full\"). Ignored when `view` is set." - 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 a slim projection of each record (falling back to the full record if the projection does not fit the payload); \"full\" returns Angi's whole records.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
angi_search_pros2 fields changed- changed
Input schema / properties / compact / descriptionPrevious value: -"Return a slim summary per pro instead of the full record. Recommended when browsing or ranking."New value: +"Deprecated: use `view` instead (compact: true = view \"compact\", false = view \"full\"). Ignored when `view` is set." - 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 a slim projection of each record (falling back to the full record if the projection does not fit the payload); \"full\" returns Angi's whole records.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
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 distinct resource+action: list_trades/list_cities resolve slugs, search_pros finds pros, get_pro/get_reviews read one pro, list_my_reviews/list_my_projects read the signed-in user's data, get_account reads identity, and healthcheck diagnoses hops. The potentially confusable pair (list_my_reviews vs get_reviews) is clearly separated by 'signed-in user's own reviews' vs 'reviews on a pro's page'. No two tools appear to do the same thing.
Uniform angi_ prefix with consistent snake_case verb_noun structure (list_, get_, search_) throughout. The one-word healthcheck is a trivial deviation and still fits the prefix pattern.
Nine tools is well-scoped for a read-oriented Angi browsing server, with each tool earning its place (slug resolvers, search/get pairs, user data, diagnostics). No redundant or filler tools.
Covers the core read surface (search pros, pro detail, reviews, trades, cities, account, projects) but has notable gaps: no way to read the messages whose unread count is reported, and no create/submit operation for service requests or projects despite listing them. Read-only design is coherent, but the lifecycle is incomplete.
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.
Search, vet & assemble MCP servers from your agent: verified tools, risk labels, and trust scores.
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.2266 npm5MIT
- 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.650 npm1MIT
- AlicenseAqualityAmaintenanceMCP 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.494 npmMIT