Skip to main content
Glama
chrischall

compass-mcp

by chrischall

compass-mcp

CI npm license

Compass real-estate access as an MCP server for Claude — search listings, fetch property details, photo galleries, price history, and run affordability/mortgage math, all via natural language.

⚠️ Compass does not publish a public consumer API. This server scrapes the same server-rendered HTML compass.com itself ships to your browser, routed through your own signed-in browser tab via the ContextMint Bridge extension. Every request acts on behalf of your existing session — your cookies, your TLS, your JS context — exactly as if you'd clicked it in the browser yourself. Treat this as informal use of Compass's website. Use at your own discretion.

Tools

Tool

Purpose

Auth-scoped

compass_search_properties

Search listings by location, price band, beds, home type. Slugifies free-text into Compass's URL routing and extracts the SSR listings array.

compass_get_property

Full record for a property by URL or listing_id_sha. Address, neighborhood, beds/baths, sqft, lot, price + $/sqft, monthly charges, MLS status, amenities, schools, parcel number.

compass_get_property_photos

Full photo gallery — every image in listing.media[] with original + thumbnail URLs and pixel dimensions. Floorplans/other media gated behind include_all_categories.

compass_get_price_history

Full listing-history events (Listed / Sold / Pending / Price Change / Delisted) with date, price, status, and MLS attribution. Returns both this-listing and prior-listing aggregates.

compass_compare_properties

Side-by-side comparison of up to 25 properties with an opt-in aligned summary table. Per-target errors captured per-row. Concurrent fetches.

compass_calculate_affordability

Local affordability calculator — max purchase price from income + DTI + rates. No network.

compass_get_by_address

Resolve a free-text street address to the canonical Compass URL, listing_id_sha, and pid in one call. Returns { resolved: false, error: "no listing found" } rather than throwing when there is no match.

compass_calculate_mortgage

Local PITI calculator — principal+interest, taxes, insurance, HOA, PMI. No network.

compass_get_saved_homes

Not yet supported — Compass renders /overview/favorites via auth-scoped GraphQL we have not yet identified. Throws a clear "not yet wire" error.

✓

compass_get_saved_searches

Not yet supported — same constraint as saved homes.

✓

Related MCP server: NDI-MCP-Server

Acknowledgement of Terms

By using this MCP server, you acknowledge and agree to the following:

1. This server accesses your own Compass session. Every request is dispatched through your own browser tab via the ContextMint Bridge extension — your cookies, your TLS, your session. It does not — and cannot — access anyone else's account.

2. Compass's Terms of Use govern your use of this server, just as they govern your direct use of compass.com. The clauses most relevant here:

You may not automatedly crawl or query the Services for any purpose or by any means (including, without limitation, screen and database scraping, spiders, robots, crawlers and any other automated activity with the purpose of obtaining information from the Services) unless you have received prior express written permission from the applicable Compass Company.

And: "You agree to keep your password confidential, not use others' accounts, nor permit others to use your account."

You are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server. Compass's terms prohibit automated crawling without written permission, and IDX listing data is licensed for personal, non-commercial use only.

3. Personal, non-commercial use only. This project is not affiliated with, endorsed by, sponsored by, or in partnership with Compass, Inc. It is a personal automation tool that reads the same server-rendered HTML compass.com itself ships to your browser. Do not use it to bulk-extract listings, redistribute IDX data, train AI models, populate a competing real-estate product, or for any commercial purpose.

4. Stability is not guaranteed. This server reads private inline-script state (global.uc.sharedReactAppProps, window.__INITIAL_DATA__.props.listingRelation.listing) and SSR URL conventions (/homes-for-sale/<slug>/, /homedetails/<slug>/<id>_lid/) that Compass may change without notice. It may break. It may stop working. That's by design — the surface is not theirs to maintain on our behalf.

5. You accept full responsibility for any consequences of using this server in connection with your Compass access — rate limiting, account suspension, IP blocks, AWS WAF challenges, or any enforcement action Compass takes. If Compass objects to your use, stop using this server.

This section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Compass's actual ToU.

Install

Option A — npx (after first publish)

Add to .mcp.json:

{
  "mcpServers": {
    "compass": {
      "command": "npx",
      "args": ["-y", "compass-mcp"]
    }
  }
}

Option B — from source

git clone https://github.com/chrischall/compass-mcp
cd compass-mcp
npm install
npm run build
{
  "mcpServers": {
    "compass": {
      "command": "node",
      "args": ["/path/to/compass-mcp/dist/bundle.js"]
    }
  }
}

One-time browser setup

compass-mcp talks to your browser through the ContextMint Bridge extension, which is shared across every fetchproxy-based MCP (zillow-mcp, opentable-mcp, resy-mcp, …). Install it once from the ContextMint Bridge releases:

  • Chrome: download the Chrome zip, unzip it, then chrome://extensions → toggle Developer mode → Load unpacked → pick the unzipped folder.

  • Safari: the bridge ships inside the ContextMint app; you enable it in Safari's settings. The ContextMint app has no public download yet, so there is no Safari install link to give — use Chrome for now.

Where it comes from. ContextMint Bridge is the fetchproxy browser extension under its new name, from the same maintainer — fetchproxy's own README (Extension) points to it. Its source is public at nullnet-app/contextmint-bridge: build it yourself (its README covers npm run build), or check a release zip against the .sha256 file published beside it:

shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256

Open compass.com and sign in. That's all the auth this server needs.

How it works

┌────────────────┐  stdio   ┌──────────────────┐   WS   ┌──────────────────┐    fetch()    ┌─────────────┐
│ MCP client     │◀────────▶│  dist/bundle.js  │◀──────▶│  ContextMint     │◀────────────▶│ compass.com  │
│ (Claude, etc.) │          │  (Compass MCP)    │ :37149 │  Bridge          │   (real TLS, │ (your tab)  │
└────────────────┘          └──────────────────┘        │  (separate)      │   cookies)    └─────────────┘

The MCP server runs in Node, but every HTTP call to compass.com is dispatched into your live browser tab through the ContextMint Bridge extension. Each request rides your existing session — TLS fingerprint, cookies, and JS execution context all match the page that's already on screen. No headless browser stand-in, no separate identity, no third-party proxy: just your real browser, acting on its own behalf, with the MCP server picking what to ask for.

Compass's pages are SSR React with no public JSON API — every tool extracts data from inline-script globals (global.uc.sharedReactAppProps on search pages, window.__INITIAL_DATA__.props.listingRelation.listing on homedetails). The client wraps that into the tool surface so callers never have to parse HTML themselves.

Commands

npm test               # vitest, mocked transport, no network
npm run test:watch
npm run test:coverage
npm run build          # tsc --noEmit + esbuild bundle → dist/bundle.js
npm run dev            # node dist/bundle.js (after build)

License

MIT

Available Tools

18 tools
compass_bulk_getBulk-fetch Compass listings by url or listing_id_shaA
Read-onlyIdempotent

Fetch up to 200 Compass listings in a single call. Returns one structured row per input target (no side-by-side summary table — use compass_compare_properties for that). Each row is either { listing_id_sha, url, property } on success or { listing_id_sha, url, error } on failure — one bad target never fails the whole call. When the failure was a bridge timeout (after one retry) or an unreachable bridge (issue #73), the row also carries { status: "timeout" | "bridge_down", retryable: true } — that is NOT a missing listing, so retry it (a cold bridge usually succeeds on the second call) rather than concluding Compass has no record. Targets accept the same url / listing_id_sha shape as compass_get_property. Calls fan out concurrently. The whole call is bounded by an overall deadline: a slow or hung row never wedges it — any row still unsettled when the deadline is reached comes back as { status: "pending", retryable: true, error } alongside a top-level pending count, so re-run just those targets. extracted_features is populated per row. The raw description is omitted by default — pass include_description: true to keep it.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetsYesUp to 200 targets to fetch. For higher counts, batch into multiple calls.
include_descriptionNoInclude the raw `description` on each row. Defaults to `false` — `extracted_features` is always populated.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, and the description adds substantial behavior beyond that: per-row error isolation ('one bad target never fails the whole call'), timeout/bridge_down semantics with retryable flags, concurrent fan-out, an overall deadline that converts unsettled rows to pending, and the always-populated extracted_features. No contradictions with the annotations.

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?

Purpose is front-loaded and every sentence earns its place — nothing is filler. However, the bridge-timeout sentence is overloaded with status literals, retry advice, and an internal 'issue #73' reference, and 'retryable: true' appears twice. Dense and purposeful but slightly over-packed.

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 must document return values and does so thoroughly: exact row shapes for success, error, timeout/bridge_down, and pending states, a top-level pending count, concurrency, deadline behavior, and per-row field defaults. Combined with fully documented parameters and sibling differentiation, nothing an agent needs to invoke and interpret this complex bulk tool is 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?

Schema coverage is 100% and the schema descriptions are already rich (maxItems 200, batching advice, include_description default). The description adds value above that baseline by stating targets accept the 'same url / listing_id_sha shape as compass_get_property,' which lets an agent transfer parameter knowledge across tools, and by reinforcing the include_description default. Genuine added value, though the schema does most of the heavy lifting.

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: 'Fetch up to 200 Compass listings in a single call.' It further differentiates from siblings by saying 'no side-by-side summary table — use compass_compare_properties for that' and cross-references compass_get_property as the shape-compatible single-fetch variant. An agent can tell exactly what this tool is for without reading the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-not guidance by routing the comparison-summary use case to compass_compare_properties. It also gives actionable retry policy: rows with status 'timeout'/'bridge_down' should be retried 'rather than concluding Compass has no record,' and pending rows should be 're-run just those targets' — clear when-to-call and when-to-retry guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_calculate_affordabilityCalculate maximum home price you can affordA
Read-onlyIdempotent

Solve for the maximum home price you can afford under the standard 28/36 DTI rule. Inputs: monthly income, recurring monthly debts (car/student loans), down payment, interest rate, optional property-tax rate / insurance / HOA / loan term. Output: max home price, binding constraint (front-end vs back-end), and the PITI breakdown at that price. Identical math to zillow-mcp and redfin-mcp. No network — pure local math.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoa_monthlyNo
back_end_dtiNo
down_paymentYes
front_end_dtiNo
interest_rateYes
monthly_debtsNo
monthly_incomeYes
loan_term_yearsNo
insurance_annualNo
property_tax_rateNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only and idempotent, and the description adds helpful behavioral context: it performs no network access, duplicates zillow/redfin math, and returns a price, constraint, and PITI breakdown. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight, information-dense sentences with the core purpose front-loaded. Every sentence adds value—inputs, outputs, equivalence to external tools, and network behavior—with no filler.

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 calculation tool with no output schema, the description covers inputs, algorithm rule, return values, and execution constraints. Minor gaps are the units/formats for interest_rate and property_tax_rate, but the standard-rule framing makes the calculation behavior sufficiently complete.

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?

With 0% schema description coverage, the description compensates by translating most parameters into plain language: monthly income, recurring debts, down payment, interest rate, and optional tax/insurance/HOA/term. It omits explicit mention of the front_end_dti and back_end_dti override parameters, but these are fairly self-explanatory from the 28/36 context.

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 specific operation—'Solve for the maximum home price you can afford under the standard 28/36 DTI rule'—with a clear resource and output. It is clear enough to distinguish from most siblings, though it does not explicitly contrast with the sibling compass_calculate_mortgage.

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?

The description implies when to use it: when an affordability figure is needed and when pure local math is preferred ('No network — pure local math'). However, it never names an internal alternative or says when not to use it, leaving the choice vs. compass_calculate_mortgage to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_calculate_mortgageCalculate mortgage PITIA
Read-onlyIdempotent

Local-only mortgage payment calculator. Returns a full PITI breakdown (principal + interest, property tax, insurance, HOA, PMI) and total interest over the life of the loan. No network call. Provide either down_payment OR down_payment_percent; defaults to 20%. Property tax can be given as property_tax_annual or property_tax_rate (% of home price). PMI applies automatically when LTV > 80% and pmi_rate is provided.

ParametersJSON Schema
NameRequiredDescriptionDefault
pmi_rateNoAnnual %, applied when LTV > 80%
home_priceYes
hoa_monthlyNo
down_paymentNo
interest_rateYesAnnual %, e.g. 6.5
loan_term_yearsNoDefault 30
insurance_annualNo
property_tax_rateNoAnnual % of home price
property_tax_annualNo
down_payment_percentNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the tool is local-only and makes no network call, and that PMI is applied automatically when LTV > 80% and pmi_rate is provided. This adds meaningful behavioral context without contradicting the readOnlyHint or idempotentHint annotations.

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 three focused sentences with no filler. It front-loads the purpose, then efficiently explains the key parameter combinations and defaults that an agent needs to invoke the tool correctly.

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 appropriately explains both the return value (full PITI breakdown plus total interest) and the important input constraints. Minor details like the loan term default and exact handling when both down payment options are supplied are left to the schema and defaults, but overall the description is sufficient for reliable invocation.

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 only 40%, but the description compensates by explaining key relationships: down_payment and down_payment_percent are alternatives with a 20% default, property tax can be expressed annually or as a rate, and PMI behavior depends on LTV and pmi_rate. It does not describe every parameter, but the most decision-relevant semantics are covered.

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 specific verb and resource: a 'mortgage payment calculator' that returns a full PITI breakdown and total interest. It is clearly differentiated from sibling tools like compass_calculate_affordability and search tools by its local-only, calculation-focused purpose.

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 a clear context for when to use the tool: when a PITI breakdown and total interest are needed. It also provides concrete input-selection guidance (either down_payment or down_payment_percent, property tax alternatives, automatic PMI). It does not explicitly name alternatives or exclusions, but the intended use is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_compare_propertiesCompare Compass properties side-by-sideA
Read-onlyIdempotent

Fetch 2 or more Compass properties and align their facts side-by-side. Each target may supply url (a full Compass homedetails URL or path) or listing_id_sha alone — sha-only targets fetch /listing//view, which redirects to the homedetails page. Returns the full per-property record per row (with extracted_features populated). Per-target errors are captured per-row — one bad target will not fail the whole call. Calls are concurrent, and the whole call is bounded by an overall deadline: any row still unsettled when it is reached comes back as { status: "pending", retryable: true, error } with a top-level pending count — re-run just those targets. The raw description is omitted from each row by default — pass include_description: true to keep it. The redundant summary table is also opt-in via include_summary: true — by default only results[] is returned, which already carries every fact.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetsYesArray of 2–25 properties to compare. (Cap raised from 8 to 25 in #53; for unbounded structured fetch without the summary table, use `compass_bulk_get`.)
include_summaryNoInclude the pivoted `summary` table (one row per compared field, one column per listing). Defaults to `false` — `results[].property.*` already carries every fact and the summary was roughly 30% of response weight. Useful only for human-readable rendering.
include_descriptionNoInclude the raw `description` (Compass marketing copy) on each row. Defaults to `false` — `extracted_features` is always populated.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the readOnlyHint and idempotentHint annotations by disclosing concurrency, an overall deadline, per-target error isolation, the pending row shape with retryable flag, and the sha-only redirect behavior. It does not contradict any annotation.

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 dense but every sentence carries new information: response shape, error semantics, defaults, opt-in flags, and retry behavior. The purpose is front-loaded and there is no filler or repetition of annotation fields.

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?

There is no output schema, so the description must carry return-value semantics. It does: full per-property records, extracted_features, per-row error capture, pending row shape, top-level pending count, and default omissions. Combined with deadline and retry guidance, the agent has everything needed to invoke and interpret the call.

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 schema already covers all three parameters at 100%, so the baseline is 3. The description adds meaningful extra nuance: sha-only targets fetch /listing/<sha>/view and redirect, and the boolean parameters affect response contents and weight. That is value beyond the schema, though not every parameter needed additional clarification.

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 opening sentence states a specific verb and resource: 'Fetch 2 or more Compass properties and align their facts side-by-side.' The '2 or more' minimum distinguishes it from single-property tools like compass_get_property, and the schema note about compass_bulk_get further disambiguates it from the unbounded sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear when-to-use guidance: side-by-side comparison of 2–25 properties. It also explains how to handle partial failures ('re-run just those targets'), and the targets schema explicitly routes unbounded structured fetch to compass_bulk_get, providing an explicit alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_get_agent_listingsGet a Compass agent's listingsA
Read-onlyIdempotent

Fetch the listings represented by a Compass agent from their profile page (/agents//). Pass either slug (e.g. "paige-mcguirk") or profile_url (a full https://www.compass.com/agents// URL — both forms are accepted). Returns { agent: {name, slug}, active_listings: [...] }, where each active listing carries the SAME normalized fields as compass_get_property (address, beds/baths, sqft, lot size, price + price-per-sqft, MLS status, the canonical Compass URL + stable pid, extracted_features, etc.).

CLOSED DEALS: the agent's sold/closed deals are opt-in — pass include_closed: true to add a closed_deals array (same normalized shape). Omitted by default to keep the payload lean.

CHAINING: the agent slug is surfaced on each property's listing_agent.profile_slug in compass_get_property results (compass_search_properties results don't carry the listing agent), so you can go property → agent → their other listings. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoCompass agent profile slug — the `<slug>` in /agents/<slug>/ (e.g. "paige-mcguirk"). One of `slug` or `profile_url` is required.
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Compass's payload untouched. No field projection: this server has no verified record of which Compass fields matter, and inventing one would risk dropping a field a caller needs.
profile_urlNoFull Compass agent profile URL (e.g. https://www.compass.com/agents/paige-mcguirk/) or an /agents/<slug>/ path. Accepted as an alternative to `slug`.
include_closedNoInclude the agent's closed/sold deals as a `closed_deals` array. Defaults to `false` to keep the response lean.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint, openWorldHint, and idempotentHint annotations, the description discloses meaningful behavioral details: closed_deals is omitted by default to keep the payload lean, compact view strips image/avatar URLs, full returns Compass's payload untouched, and there is deliberately no field projection because the server has no verified record of which fields matter. This is rich, honest behavioral context and does not contradict any annotation.

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 long but every section earns its place: core fetch, returned shape, closed-deals behavior, view behavior, and chaining guidance are all clearly labeled. The key information is front-loaded, and the internal headings make it easy to scan without losing density.

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 responsibility of explaining the response shape, and it does so concretely: { agent: {name, slug}, active_listings: [...] }, normalized fields, closed_deals, and the listing_agent.profile_slug chaining path. Nothing an agent needs to call or interpret this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description goes further by explaining the relationship between slug and profile_url, the exact response effect of compact vs full view, and the normalized shape of closed_deals. It also clarifies that one of slug or profile_url is required, adding meaning beyond the raw schema.

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 opens with a specific verb and resource: "Fetch the listings represented by a Compass agent from their profile page (/agents/<slug>/)." It clearly distinguishes itself from siblings by naming compass_get_property and compass_search_properties and explaining how the agent slug appears in each, so an agent can tell exactly what this tool is for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives actionable usage guidance: pass either slug or profile_url, both are accepted, and the closed-deals payload is opt-in via include_closed. The CHAINING section explicitly explains when to use this tool relative to compass_get_property and compass_search_properties, including the note that compass_search_properties results don't carry the listing agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_get_by_addressResolve a Compass listing by street addressA
Read-onlyIdempotent

Resolve a free-text street address to a Compass listing's canonical URL and identifiers in one call. Walks three rungs: first the structured typeahead POST /api/v3/omnisuggest/autocomplete (the primary rung — Compass's address-suggest API, which routes around the AWS WAF that 403s the SSR free-text path, issues #78/#79), then /homes-for-sale/?q=<address> (the free-text rung) and — when those return no verified match — a slug-based search at /homes-for-sale/<city-state-or-zip>/ (the search-fallback rung, issue #71). Each candidate is verified against the query (case + street-type abbreviation normalization, then whole-token equality, issue #45) before being accepted. Returns { url, listing_id_sha, pid, address, resolved, matched_via } where matched_via is "typeahead", "freetext", or "search_fallback" so callers can see which rung found the match. When no rung matches, returns { resolved: false, error: "no listing matched" } rather than leaking a wrong URL. When the lookup was blocked by a sign-in / AWS WAF challenge instead, it returns { resolved: false, status: "auth_required", error, hint } — NOT a miss: sign in to compass.com in the browser and retry. The url is the stable _pid/ form when Compass provides a navigationPageLink (preferred for trackers/bookmarks — sha URLs go stale on relisting), falling back to the _lid/ form otherwise. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
zipNoZIP code, e.g. "28746"
cityNoe.g. "Lake Lure"
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Compass's payload untouched. No field projection: this server has no verified record of which Compass fields matter, and inventing one would risk dropping a field a caller needs.
stateNoTwo-letter state abbreviation, e.g. "NC"
addressYesStreet address line, e.g. "126 Sleeping Bear Ln".

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHInt annotations, the description discloses the WAF 403 workaround, all three resolution rungs, the candidate verification rule, the stable _pid/ versus fallback _lid/ URL behavior, and the distinct auth_required error shape. This gives an agent unusually complete knowledge of the tool's runtime behavior.

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?

The description is long but front-loaded with the central purpose and then logically organized by fallback rung, verification, return values, and error cases. It is slightly redundant with the annotations at the end and includes internal issue IDs that are informative but not essential, so it is not perfectly concise.

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?

Since there is no output schema, the description correctly enumerates the return object, the possible matched_via values, the no-match error shape, and the auth_required error case with retry guidance. Combined with the fully documented input schema and annotations, an agent has everything needed to invoke and interpret this tool 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%, so the address/city/state/zip/view parameters are already well documented in the input schema. The description adds free-text semantics for the address and clarifies output fields, but does not add per-parameter meaning beyond what the schema already provides.

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 first sentence is specific: it resolves a free-text street address into a Compass listing's canonical URL and identifiers, which clearly distinguishes it from a generic search or retrieval tool. It stops short of a 5 because it does not explicitly name or differentiate against the sibling compass_resolve_addresses tool.

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 clearly states the intended use case: resolve one free-text street address in a single call, including which fallback strategies will be tried. It does not explicitly list when not to use it or point to batch alternatives like compass_resolve_addresses, so it lacks full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_get_comparable_rentalsList nearby rental listings for a Compass propertyA
Read-onlyIdempotent

Surface nearby rental listings for a Compass property — useful for evaluating STR (short-term-rental) viability in vacation markets. Lifts the target's city/state/zip from the homedetails page, then searches Compass's type-rental/ filter in the same locality and returns each rental's address, monthly price (in price_formatted), beds/baths, sqft, and the Compass URL. Honest-by-default: when no rentals come back, rentals: [] with the target locality preserved so the caller can decide to widen. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoCompass homedetails URL or path of the target property (preferred).
limitNoMax rental candidates to return. Default 20.
listing_id_shaNoCompass listing identifier. Sufficient on its own — the slug is resolved internally.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and idempotentHint annotations, the description adds real behavioral detail: it lifts city/state/zip from the homedetails page, searches the type-rental filter in the same locality, describes returned fields, and explains the empty-result contract with rentals: [] and preserved locality. The 'Read-only; safe to call repeatedly' statement is consistent with the annotations.

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?

Three dense, purposeful sentences: use case first, then mechanism and output, then empty-result behavior and safety. Every sentence earns its place and there is no filler or repetition of schema content.

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?

Given no output schema and three optional parameters, the description covers the core invocation path, output fields, and empty-result behavior well. It is missing an explicit statement that at least one of url or listing_id_sha should be supplied, and it does not address error cases, which prevents a perfect score.

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 the baseline is 3, but the description adds meaning by explaining how the url parameter is processed (locality lifted from the homedetails page) and how the locality search is scoped. This complements the schema's per-parameter descriptions with useful behavioral context.

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 specific verb and resource: 'Surface nearby rental listings for a Compass property' and immediately adds the STR-viability use case. This clearly differentiates it from siblings like compass_compare_properties or compass_search_properties, which serve other comparison or search needs.

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?

It provides a clear context for when to use the tool: evaluating short-term-rental viability in vacation markets for a target Compass property. It does not explicitly name exclusions or alternative sibling tools for general property search, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_get_price_historyGet Compass listing-history eventsA
Read-onlyIdempotent

Full listing history for a Compass property — Listed / Sold / Pending / Price Change / Delisted events with date, price, and MLS attribution. Returns three arrays: events covers this listing's events, history aggregates events from prior listings of the same property, and events_normalized merges both into a shared cross-MCP schema ({date, type, price?, price_change_pct?, source_mls?} with a fixed type enum: Listed | PriceChange | Pending | Contingent | Sold | Withdrawn | Relisted | Delisted). Pass either url (the full Compass homedetails URL or path) or listing_id_sha alone — sha-only calls fetch /listing//view, which redirects to the homedetails page. Note: most of this data is already returned inline on compass_get_property (the events[] / history[] arrays live on the same listing record); call this tool only when you want the merged + normalized timeline. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoCompass homedetails URL or path (preferred — no resolver round-trip needed).
listing_id_shaNoCompass listing identifier. Sufficient on its own — the tool resolves the address slug internally via site search before fetching.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly, openWorld, and idempotent, but the description adds genuinely useful behavioral context: the three-array return shape, the normalized schema, the redirect behavior for sha-only calls, and a statement that it's safe to call repeatedly. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense but every sentence earns its place: purpose and output structure first, parameter guidance second, sibling differentiation and safety last. There is no fluff or repeated tautology.

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?

Despite having no output schema, the description fully specifies what the tool returns (three arrays), how they relate, the merged schema shape, parameter behavior, and when to choose it over a sibling. Nothing needed for correct invocation is left ambiguous.

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% and both parameters are already well documented. The description adds value by explaining the relationship between the two parameters ('Pass either... alone'), why url is preferred, and the internal redirect behavior, going beyond the schema's wording.

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 uses a specific verb-resource combination ('Full listing history for a Compass property') and enumerates the event types and arrays returned. It also explicitly contrasts itself with compass_get_property, making the tool's unique purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly names the alternative tool (compass_get_property), explains that most data is already available there, and gives the precise condition for using this tool instead ('when you want the merged + normalized timeline'). It also clarifies which parameter to pass and the behavior of sha-only calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_get_propertyGet Compass property detailsA
Read-onlyIdempotent

Fetch a property's full Compass record. Pass either url (a full Compass homedetails URL or path from a compass_search_properties result) or listing_id_sha alone — when only the sha is supplied, the tool fetches /listing//view, which redirects to the canonical /homedetails//_lid/ page. Returns address, neighborhood, beds/baths, sqft, lot size (lot_size_sqft plus the derived lot_size_acres = round(sqft / 43560, 2), null — never 0 — for condos / missing lots), price + price-per-sqft, monthly charges, MLS status, amenities, schools, parcel number, and the canonical Compass URL. Also returns extracted_features (lake_front, hot_tub, basement, furnished, dock, community) keyword-parsed from the description.

DESCRIPTION HANDLING: The raw description (Compass marketing copy) is omitted by default — pass include_description: true to keep it. extracted_features is always populated and usually sufficient.

URL FORMS: Compass exposes two URL shapes for a listing. _lid/ (content-addressed by listing_id_sha) — what this tool fetches and what url returns — is the form to use for reading the current listing record. _pid/ (opaque short ID, in property_url and the surfaced pid field) is stable across re-listings and is the right choice for any long-lived reference (trackers, sheets, bookmarks); sha-based URLs go stale when a property is delisted and relisted. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoCompass homedetails URL or path (e.g. /homedetails/162-04-12th-Rd-Queens-NY-11357/2109718971930079225_lid/). One of `url` or `listing_id_sha` is required; pass `url` when you have it (no resolver fetch needed).
listing_id_shaNoCompass listing identifier (the SHA inside `<sha>_lid`). Sufficient on its own — the tool fetches /listing/<sha>/view, which 302-redirects to the slugged homedetails page (no extra lookup; the fetch follows the redirect).
include_descriptionNoInclude the raw `description` (Compass marketing copy) in the response. Defaults to `false` — `extracted_features` is always populated and usually covers the common needs.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and idempotentHint annotations, the description reveals important behavior: /listing/<sha>/view redirects to the canonical homedetails URL, lot_size_acres is derived and null (never 0) for condos, extracted_features is keyword-parsed from the description, the raw description is omitted by default, and sha-based URLs go stale across re-listings. This is substantial behavioral disclosure that helps an agent predict side effects and output quirks.

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 long but every paragraph earns its place: it covers inputs, output content, derived fields, default behavior, and URL-form stability. The content is structured into clear sections, and the most important usage facts are front-loaded in the first sentence. No filler or repetition is present.

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?

Given there is no output schema, the description does a strong job of listing the returned fields and their semantics. It also covers parameter combinations, redirect behavior, defaults, and the stable vs. stale URL distinction. An agent has enough information to select, invoke, and interpret the result of this tool without guessing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already describes all three parameters, the main description adds critical semantics beyond the schema: url and listing_id_sha are alternatives with one required despite schema having no required fields, the sha-only path triggers a redirect, include_description controls raw marketing copy while extracted_features is always populated, and the derived lot_size_acres field is explained. This goes far above the schema descriptions.

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 opens with a specific verb and resource: 'Fetch a property's full Compass record.' It clearly enumerates the accepted inputs (url or listing_id_sha) and the return fields, and it distinguishes itself by tying its url input to compass_search_properties results. This gives an agent unambiguous clarity about what the tool does.

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 strong usage context: pass url when you have it, listing_id_sha is sufficient alone, include_description defaults to false, and the tool is read-only and safe to call repeatedly. It also explains the crucial _lid/ vs _pid/ distinction and advises which URL form is appropriate for current reading versus long-lived references. However, it does not explicitly compare this tool to alternatives like compass_get_by_address or compass_bulk_get, so the tool-selection guidance is not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_get_property_photosGet Compass property photo galleryA
Read-onlyIdempotent

The full photo gallery for a Compass listing — every image in listing.media[]. Each entry returns the original CDN URL plus a thumbnail URL and pixel dimensions. Pass either url (the full Compass homedetails URL or path) or listing_id_sha alone — sha-only calls fetch /listing//view, which redirects to the homedetails page. By default only photos (category 0) are returned; set include_all_categories: true to also include floorplans and other media. Returns { listing_id_sha, count, photos }. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoCompass homedetails URL or path (preferred — no resolver round-trip needed).
listing_id_shaNoCompass listing identifier. Sufficient on its own — the tool resolves the address slug internally via site search before fetching.
include_all_categoriesNoInclude non-photo media (floorplans, etc.). Default false.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavioral context beyond the readOnlyHint/idempotentHint annotations: sha-only calls fetch a view that redirects, default category filtering is 0, and non-photo media can be included via a flag. It also confirms the return shape and that the tool is safe to repeat, matching the annotations without contradiction.

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?

Every sentence earns its place: purpose first, then result contents, then parameter alternatives, then default/filter behavior, then return shape. The description is compact yet information-dense with no 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 read-only tool with no output schema, the description is complete: it covers the returned object shape, image URL fields, parameter alternatives and defaults, and the redirect behavior. Nothing needed to call the tool correctly is 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 schema already covers all three parameters with descriptions, so the baseline is 3. The description adds extra value by explaining the relationship between `url` and `listing_id_sha`, the internal redirect behavior for sha-only calls, and the meaning of category 0 in the default filter.

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 specific verb and resource: 'The full photo gallery for a Compass listing — every image in listing.media[]'. This clearly differentiates from sibling tools like compass_get_property or compass_search_properties, which serve broader property/search purposes.

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?

The description provides clear invocation details, such as passing either `url` or `listing_id_sha` and the `include_all_categories` option. However, it does not explicitly state when to choose this tool over siblings like compass_get_property or when not to use it, so usage guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_get_saved_homesGet my saved (favorited) Compass homesA
Read-onlyIdempotent

Not yet supported — Compass renders /overview/favorites via an auth-scoped GraphQL we have not yet identified. Throws a clear error explaining the limitation.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, and the description adds crucial runtime behavior: the tool throws a clear error explaining the limitation and identifies the root cause (auth-scoped GraphQL endpoint not identified). This helps an agent recover without wasting effort.

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 short sentences front-load the unsupported status and include only the necessary technical context and error behavior. There is no filler or redundancy.

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 stub with no parameters and no output schema, the description fully communicates what an agent needs to know: expect no data, expect a clear error, and understand why. Nothing essential is 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 has zero parameters and an empty schema, so the description carries no parameter burden. The baseline of 4 applies because there is nothing further to document.

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 immediately states 'Not yet supported' and names the specific underlying resource (/overview/favorites), making the intended function (retrieving saved favorites) and its stub status unmistakable. This distinguishes it from working siblings by clearly communicating that it will not return data.

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 an explicit when-not-to-use signal: it is not yet supported and throws an error. It does not mention alternatives, but for a deliberately unsupported stub, the exclusion is clear and unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_get_saved_searchesGet my saved Compass searchesA
Read-onlyIdempotent

Not yet supported — Compass renders saved searches via an auth-scoped GraphQL we have not yet identified. Throws a clear error explaining the limitation.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations already disclose readOnly, openWorld, and idempotent behavior, the description adds crucial runtime behavior: the tool is not implemented and will throw a clear error explaining the limitation. It also explains why (auth-scoped GraphQL not identified), giving the agent useful context beyond the structured annotations.

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 entire description is one compact sentence plus an explanatory clause. It front-loads the most important fact ('Not yet supported') and provides the necessary detail in two short segments, with no filler.

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 stub tool with no parameters and no output schema, the description covers the essential facts: it is unsupported, why, and what happens if called. A slight gap is the absence of any pointer to an alternative, but given the low complexity and informative annotations, this is adequate.

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, so the baseline of 4 applies. There is no parameter semantics to document, and the description does not need to add anything beyond the empty schema.

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 and title make clear the tool concerns the agent's saved Compass searches, and the first phrase 'Not yet supported' immediately conveys the tool's current status. It does not explicitly state the action verb 'get', but the resource is unambiguous and distinct from siblings such as compass_get_saved_homes, so an agent can understand what this tool is about.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no direct guidance on when to call this tool or which sibling to use instead; it only states that the tool is not yet supported and will throw an error. An agent is left to infer that the call should be avoided, but no alternative tool or condition is offered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_get_session_contextList all registered Compass sessionsA
Read-onlyIdempotent

Return the full set of registered sessions plus the current active_session_id. When no sessions are registered, sessions is empty and active_session_id is null.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already indicate readOnlyHint and idempotentHint, and the description adds meaningful behavioral detail: sessions is empty and active_session_id is null when no sessions exist. This goes beyond the schema and annotations by documenting the degenerate case.

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. The primary behavior is stated first, and the edge case is added without unnecessary detail. Every sentence contributes useful information.

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 zero-parameter, read-only getter, the description covers the key return values and the empty-state behavior. It does not specify the full shape of each session object, but that level of detail is not critical for selecting and invoking this tool 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?

There are zero parameters, so there is nothing for the description to clarify beyond what the empty input schema already conveys. The baseline of 4 applies because no parameters exist.

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 uses a specific verb ('Return') with a specific resource: the full set of registered sessions plus the current active_session_id. It clearly distinguishes this read-only listing operation from sibling tools like compass_set_active_session or compass_register_session.

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?

The description implies the tool is for reading session state, and the empty/null edge case gives context about what to expect. However, it does not explicitly state when to choose this tool over alternatives such as compass_set_active_session or compass_register_session.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_healthcheckVerify the fetchproxy bridge end-to-endA
Read-onlyIdempotent

Round-trips a small public www.compass.com URL (/robots.txt) through the fetchproxy bridge and returns diagnostics: the bridge's role (host/peer/null), port, version, the extension link (linked / pair pending / not attached / never answered), the elapsed round-trip time, and a plain-English hint distinguishing 'bridge never came up' from 'extension not connected' from 'real www.compass.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.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description explains exactly what happens (a round-trip through the bridge), what will be returned (role, port, version, extension link state, elapsed time, plain-English hint), and the auth requirements ('Read-only, no auth required'). It adds meaningful behavioral context without contradicting the annotations.

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 dense but every clause earns its place: the action, the fixed target, the diagnostic fields, the output interpretation, and the usage cue. It is front-loaded with the core behavior and the usage guidance is separated cleanly at the end.

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?

This is a zero-parameter, no-output-schema tool, and the description fully covers what the agent needs: what it does, what it returns, how to interpret the hint, when to call it, and its safety profile. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, and the description explains that the tool uses a fixed public URL and needs no user input. This adds clarity beyond the empty schema and makes the no-parameter design explicit.

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 names a specific verb ('Round-trips'), a specific resource (www.compass.com/robots.txt through the fetchproxy bridge), and the exact diagnostic outputs. It clearly differentiates this healthcheck from the data-retrieval and session-management siblings, so an agent can distinguish it at a glance.

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 an explicit trigger condition: 'Call this when a real tool fails and you want to know which hop broke.' It does not enumerate alternative tools or explicit when-not-to-use cases, but the purpose is specific enough that the intended usage is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_register_sessionRegister a signed-in Compass sessionA
Idempotent

Register (or refresh) an authenticated Compass session keyed by signed-in account identity. Re-registering the same account_identity updates the existing session rather than creating a duplicate. Returns the session_id to use when routing per-tool calls. The first registered session becomes the default active_session_id. Pass mark_active: true to make the newly-registered session active in the same call.

ParametersJSON Schema
NameRequiredDescriptionDefault
mark_activeNoWhen true, immediately make the newly-registered session the active one.
auth_expires_atNoOptional ISO timestamp at which the session expires.
account_identityYesCaller-supplied identifier for the signed-in account (typically the saved-account email).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (idempotentHint=true), the description discloses important behavior: re-registering the same account_identity updates rather than duplicates, the first registered session becomes the default active_session_id, and the call returns session_id for routing. These are non-obvious and valuable for correct invocation.

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 concise, front-loaded with the core purpose, and every sentence adds necessary information about refresh behavior, return value, default active behavior, or mark_active usage. No filler or redundancy.

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 simple tool with no output schema, the description provides the essential contract: return value, idempotent refresh behavior, default active session semantics, and how to mark active. Required parameter context is covered by the schema, and the description fills behavioral gaps.

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 description coverage is 100%, so the baseline is 3. The description adds meaningful semantics for account_identity (keyed identity, refresh behavior) and mark_active (can set active in the same call), enriching the schema's raw definitions.

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?

Description states a specific action ('Register (or refresh)') on a specific resource ('authenticated Compass session keyed by signed-in account identity') and clarifies the keying mechanism. It clearly differentiates from siblings like compass_set_active_session by describing session creation/update semantics and the mark_active option.

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?

Provides clear context for when to call: to register or refresh a session keyed by identity, with re-registration updating the existing session. It also explains when to pass mark_active: true, but does not explicitly name alternatives like compass_set_active_session or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_resolve_addressesBulk-resolve Compass listings by street addressA
Read-onlyIdempotent

Resolve up to 100 street addresses to Compass listing URLs in a single call. Returns one row per input, either { resolved: true, url, listing_id_sha, pid, address, matched_via }, { resolved: false, error, query } for a genuine no-match, or — when the bridge timed out / was unreachable (issue #85) — { resolved: false, status: "timeout" | "bridge_down", retryable: true, error, query }. A status row is NOT a miss: the lookup never completed, so retry it (a cold bridge usually succeeds on the second call) rather than concluding Compass has no listing. A row with status: "auth_required" (plus error and hint) means the browser session was signed out or stuck on an AWS WAF challenge: sign in to compass.com, then retry. Each row walks the same three rungs as compass_get_by_address — first the structured typeahead POST /api/v3/omnisuggest/autocomplete (the primary rung that routes around the AWS WAF, issues #78/#79), then /homes-for-sale/?q=<address> (freetext), then /homes-for-sale/<locality-slug>/ (search_fallback, issue #71) — and verifies candidates against the same whole-token address-match policy (#45). The matched_via field on each resolved row indicates which rung found it. Compass's search degrades into far-away top hits when the local market has no match, and bulk amplifies the corruption surface, so a miss returns resolved: false with no URL rather than leaking the wrong property. Calls fan out concurrently server-side, and the whole call is bounded by an overall deadline: any row still unsettled when it is reached comes back as { resolved: false, status: "pending", retryable: true, error, query } with a top-level pending count — that is NOT a miss, so re-run just those addresses. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressesYesUp to 100 address inputs. For higher counts, batch into multiple calls.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though readOnlyHint and idempotentHint already cover safety, the description adds substantial non-obvious behavior: retryable statuses that are NOT misses, auth_required recovery, the three-rung WAF-routing fallback, the deliberate decision to return no URL rather than leak a wrong property, server-side fan-out, and the pending deadline. This is far beyond what annotations 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?

The description is long, but proportionally so: it documents multiple return modes, retry semantics, and a fallback algorithm with no output schema available. It front-loads the core purpose and then methodically adds one behavior per sentence; every sentence earns its place and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema and multiple non-obvious failure modes, the description is exceptionally complete. It covers exact row shapes for resolved, no-match, timeout, bridge_down, auth_required, and pending cases; explains when to retry; and states read-only/idempotent behavior consistent with the annotations. Nothing needed to call or interpret the tool correctly is missing.

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% and the only parameter, the addresses array, is already documented with min/max item counts and an example address line. The description adds that each input produces one row and that row's query echoes the input, but it does not need to compensate for schema gaps, so the baseline 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 opens with a specific verb and resource: "Resolve up to 100 street addresses to Compass listing URLs in a single call." This immediately distinguishes it from the singular compass_get_by_address and other siblings, and the rest of the description elaborates on output modes rather than obscuring the core purpose.

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 strong usage context: it is the bulk variant, it references compass_get_by_address for the same lookup rungs, and it gives explicit retry guidance for timeout, bridge_down, pending, and auth_required rows. However, it does not explicitly say "use compass_get_by_address for single addresses" or otherwise state when-not to use this tool, so it stops just short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_search_propertiesSearch Compass listingsA
Read-onlyIdempotent

Search Compass listings by location (city, ZIP, neighborhood) and optional filters. Resolves free-text via slugification into Compass's URL routing, then fetches the SSR search-results page and extracts the embedded listings array. Compass server-renders ~41 listings into that page (its num), and total_items reports the full market count. PAGINATION (issue #87): Compass no longer paginates the SSR search via any URL — /page-N/, ?page=N, and ?start=N all canonicalize back to page 1 and return the identical listings, so only the first SSR page (~41 listings) is reachable through this primitive. offset is honored WITHIN that page, and next_offset is emitted only when more listings remain within it — it is never a false cursor that re-fetches page 1. TO REACH BEYOND THE FIRST PAGE, narrow with price_min / price_max / beds_min/beds_max to bucket the result set into <~41-listing bands (price-banding), then search each band. Returns each matching listing's address, price, beds/baths, sqft, lat/lng, the Compass homedetails URL (_lid/ form, content-addressed by listing_id_sha), and the stable _pid/ URL via property_url and the surfaced pid field. The per-listing primary_photo_url / primary_thumbnail_url are omitted in the default compact view (they are Compass CDN URLs a model cannot see); pass view: "full" to get them, or compass_get_property_photos for the whole gallery. USE pid/_pid/ FOR LONG-LIVED REFERENCES (trackers, sheets, bookmarks) — sha-based _lid/ URLs change when a property is delisted and relisted. Use the sha-based URL to fetch the current listing record. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Compass's payload untouched. No field projection: this server has no verified record of which Compass fields matter, and inventing one would risk dropping a field a caller needs.
limitNoMax listings to return (default 40). Only the first SSR page (~41 listings) is reachable (#87), so a limit above that is capped by the page; use price/beds banding to reach more.
offsetNoZero-based offset into the reachable first SSR page. Honored only within that page (#87); use the `next_offset` value from a previous response to continue within it. An offset at or beyond the page returns no results — narrow with price/beds bands to reach more. Default 0.
beds_maxNo
beds_minNo
locationYesFree-text location: city, ZIP, neighborhood (e.g. "Brooklyn, NY", "94110", "Park Slope")
home_typeNoRestrict to a single property type.
price_maxNo
price_minNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, it discloses the ~41-listing SSR page ceiling, #87 pagination canonicalization, offset/next_offset semantics, stable pid vs sha-based URL behavior, and photo URL omission in compact view. This is deep behavioral context an agent needs to avoid false cursor loops and stale references.

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 long but every sentence earns its place: purpose is front-loaded, then critical caveats are grouped into PAGINATION, banding, return-field, and URL-stability sections. There is no filler or repetition beyond a harmless closing read-only note.

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?

Given no output schema and a complex search with pagination and URL nuances, the description enumerates the returned fields (address, price, beds/baths, sqft, lat/lng, _lid/ and _pid/ URLs, pid) and explains the total_items/num context. An agent has enough to call it correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 56% schema coverage, the description compensates by explaining view modes ('compact' strips image URLs), limit/offset caveats tied to #87, and the price/beds banding strategy for params that have bare schema entries. It adds actionable meaning beyond what the schema alone 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 opening sentence delivers a specific verb and resource: 'Search Compass listings by location (city, ZIP, neighborhood) and optional filters.' It goes on to describe the retrieval mechanism and return payload, so an agent can distinguish this search primitive from single-property siblings like compass_get_property or compass_get_by_address.

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 strong operational guidance: narrow with price/beds bands to reach beyond the first SSR page, use next_offset to continue within a page, and pass view:'full' or switch to compass_get_property_photos for images. It stops short of explicitly ruling out when not to use search in favor of property-detail tools, though the names and returned URL guidance make the distinction mostly clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compass_set_active_sessionSet the active Compass sessionA
Idempotent

Switch which registered session subsequent tool calls route through by default. Pass a session_id previously returned by compass_register_session. Tools that accept an explicit session_id parameter override this default per-call.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession id to make active.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate idempotency and that this is not read-only; the description adds meaningful side-effect context: it changes the default session for subsequent tool calls. It also clarifies the relationship with per-call session_id overrides, going beyond the structured fields.

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, each earning its place: the first states the core behavior, the second adds necessary provenance and override semantics. No filler or repetition of schema details.

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-parameter, idempotent state-setter with no output schema, the description provides everything needed to invoke it correctly. It covers what the tool does, where the session_id comes from, and how it interacts with explicit session_id parameters elsewhere.

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 the baseline is 3. The description adds value by specifying that the session_id must have been previously returned by compass_register_session and that it affects default routing, which is not captured in the schema's simple 'Session id to make active' text.

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?

Description uses a specific verb ('Switch') and names the exact resource ('active Compass session'), clarifying that it changes default routing for subsequent calls. It also distinguishes itself from registering a session by requiring a session already returned by compass_register_session.

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?

States the precondition clearly: the session_id must come from compass_register_session. It also explains when the default can be bypassed (tools accepting explicit session_id override it), giving useful routing context, though it does not explicitly name sibling alternatives.

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. 18 tool updatesv1.0.0
    • Changedcompass_bulk_get1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_calculate_affordability1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_calculate_mortgage1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_compare_properties1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_get_agent_listings1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_get_by_address1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_get_comparable_rentals1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_get_price_history1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_get_property1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_get_property_photos1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_get_saved_homes1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_get_saved_searches1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_get_session_context1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_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"
    • Changedcompass_register_session1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_resolve_addresses1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_search_properties1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompass_set_active_session1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 3 tool updatesv0.14.0
    • Changedcompass_get_agent_listings1 field changed
      • 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 strips image/avatar URLs from the response; \"full\" returns Compass's payload untouched. No field projection: this server has no verified record of which Compass fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedcompass_get_by_address1 field changed
      • 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 strips image/avatar URLs from the response; \"full\" returns Compass's payload untouched. No field projection: this server has no verified record of which Compass fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedcompass_search_properties1 field changed
      • 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 strips image/avatar URLs from the response; \"full\" returns Compass's payload untouched. No field projection: this server has no verified record of which Compass fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
  3. 18 tool updatesv0.12.1
    • First observedcompass_bulk_get
    • First observedcompass_calculate_affordability
    • First observedcompass_calculate_mortgage
    • First observedcompass_compare_properties
    • First observedcompass_get_agent_listings
    • First observedcompass_get_by_address
    • First observedcompass_get_comparable_rentals
    • First observedcompass_get_price_history
    • First observedcompass_get_property
    • First observedcompass_get_property_photos
    • First observedcompass_get_saved_homes
    • First observedcompass_get_saved_searches
    • First observedcompass_get_session_context
    • First observedcompass_healthcheck
    • First observedcompass_register_session
    • First observedcompass_resolve_addresses
    • First observedcompass_search_properties
    • First observedcompass_set_active_session

TDQS

A4.3/5.0

Scored across 18 tools

Disambiguation5/5

Each tool has a distinct purpose: address resolution, search, property fetch, bulk fetch, comparison, price history, photos, rentals, agent listings, mortgage calculators, and session management. Even similar tools like get_by_address vs resolve_addresses are clearly differentiated by single vs bulk, and compare_properties vs bulk_get by side-by-side vs row output. No ambiguity.

Naming Consistency5/5

All tools follow the 'compass_' prefix with a verb_noun pattern (get_property, search_properties, calculate_mortgage, register_session, etc.). Even 'healthcheck' is a single action noun but consistent in style. The naming is uniform and predictable.

Tool Count4/5

18 tools is slightly above the typical 3-15 range, but each tool serves a clear purpose within the real estate domain—search, fetch, compare, bulk, calculators, session management, etc. The count feels justified for a comprehensive MCP server, though it is on the heavier side.

Completeness4/5

The tool surface covers core listing operations (search, get, bulk, compare), price history, photos, rentals, agent listings, and financial calculators. Minor gaps exist: saved homes and saved searches are explicitly unsupported (throw errors), and there is no open-house or neighborhood info tool. These are not critical to the primary listing lookup purpose, so the gap is minor.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    The RealVest MCP (Model Context Protocol) server enables AI assistants like Claude to use all 31 of our professional calculators and access our educational resources directly in your conversations. From basic affordability to advanced portfolio analysis, Monte Carlo simulations, and tax optimization
    9 npm
    7
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Built an MCP server that connects Claude Desktop, Cursor, or any MCP client to Northeast Deal Intel's CRE database. 8 tools: • search_deals — filter 14K+ active listings by state, type, score, cap rate • search_comps — 100K+ closed transactions for comp benchmarking • score_deal — submit any property for AI scoring against real comp data • find_1031_candidates — exchange-ready deal filter (price
    8
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for NYC real estate due diligence. Lets Claude query 22+ NYC public-record databases — DOB/HPD/ECB violations, ACRIS deeds, DOF sales, 311 complaints, FDNY incidents, NYPD complaints, marshal evictions, PLUTO, rent stabilization — in plain English.
    18
    7
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A production-grade MCP server enabling Claude to perform comprehensive NJ real estate workflows including property search, valuation, neighborhood intelligence, investment analysis, and agent tools via 20 tools and 15+ data sources.
    -