Skip to main content
Glama
chrischall

angi-mcp

by chrischall

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-mcp

Register 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

angi_search_pros

Pros for a trade in a US city, with ratings, review counts, years in business, service area, amenities. 10 per page.

angi_get_pro

One pro's full profile and ratings breakdown.

angi_get_reviews

Reviews on a pro's profile — rating, text, reported cost, date, categories, the pro's response. Filterable by rating.

angi_list_trades

Every trade slug Angi publishes (~312). No bridge needed.

angi_list_cities

Cities Angi publishes pages for, per trade. No bridge needed.

angi_healthcheck

Bridge connection state.

Signed-in tools (need the browser tab signed in to Angi):

Tool

What it does

angi_get_account

Your name, email and open/closed project counts.

angi_list_my_projects

Your Angi projects, open and closed.

angi_list_my_reviews

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.com held zero projects and zero reviews, so only the envelopes were observed. angi_list_my_projects and angi_list_my_reviews return records raw and set recordFieldsVerified: false rather than projecting onto field names nobody has seen. See docs/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 test

docs/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 tools
angi_get_accountA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_proA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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.
compactNoDeprecated: use `view` instead (compact: true = view "compact", false = view "full"). Ignored when `view` is set.
profileUrlYesThe 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

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_reviewsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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.
limitNoReturn at most this many reviews.
compactNoDeprecated: use `view` instead (compact: true = view "compact", false = view "full"). Ignored when `view` is set.
maxRatingNoKeep reviews rated at most this — use maxRating: 3 to surface complaints.
minRatingNoKeep reviews rated at least this.
profileUrlYesThe 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

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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-endA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_citiesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoRestrict to one two-letter state code, e.g. "nc".
tradeYesTrade slug, e.g. "plumbing".
containsNoCase-insensitive substring filter on the city slug.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_projectsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoWhich project list to return. Defaults to all.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_reviewsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_tradesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
containsNoCase-insensitive substring filter, e.g. "duct" or "roof".

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_prosA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityYesCity slug, e.g. "charlotte", "rock-hill".
pageNo1-based page number. 10 pros per page.
viewNoResponse 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.
stateYesTwo-letter US state code, e.g. "nc".
tradeYesTrade slug, e.g. "plumbing", "roofing", "air-duct-cleaning".
compactNoDeprecated: use `view` instead (compact: true = view "compact", false = view "full"). Ignored when `view` is set.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 3 tool updatesv1.0.8
    • Changedangi_get_pro2 fields changed
      • changedInput schema / properties / compact / description
        Previous 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."
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedangi_get_reviews2 fields changed
      • changedInput schema / properties / compact / description
        Previous 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."
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedangi_search_pros2 fields changed
      • changedInput schema / properties / compact / description
        Previous 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."
      • addedInput schema / properties / view
        Added 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"
        +}
  2. 9 tool updatesv0.4.0
    • Changedangi_get_account1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedangi_get_pro1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedangi_get_reviews1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedangi_healthcheck1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedangi_list_cities1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedangi_list_my_projects1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedangi_list_my_reviews1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedangi_list_trades1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedangi_search_pros1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  3. 9 tool updatesv0.1.0
    • First observedangi_get_account
    • First observedangi_get_pro
    • First observedangi_get_reviews
    • First observedangi_healthcheck
    • First observedangi_list_cities
    • First observedangi_list_my_projects
    • First observedangi_list_my_reviews
    • First observedangi_list_trades
    • First observedangi_search_pros

TDQS

A4.2/5.0

Scored across 9 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    MCP 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.
    22
    66 npm
    5
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP 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.
    36
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP 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.
    6
    50 npm
    1
    MIT