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_resolve_addresses

Bulk version of compass_get_by_address: resolves many addresses in one call with the same rung walker and a per-row error contract.

compass_bulk_get

Fetch up to 200 listings by URL or listing_id_sha in one call. One row per target; per-target errors captured per-row.

compass_get_comparable_rentals

Nearby rental listings for a property, searched in the target's own city/state/ZIP.

compass_get_agent_listings

A Compass agent's active listings (closed deals via include_closed).

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.

✓

compass_healthcheck

Round-trips a no-op request through the bridge to confirm the WebSocket bridge, the extension and the signed-in compass.com tab are responsive.

compass_register_session

Register or refresh a logical session keyed by account identity (local; no network).

compass_set_active_session

Switch which registered session answers future requests (local).

compass_get_session_context

List the registered sessions and the active one (local).

Related MCP server: NDI-MCP-Server

Response size

The listing read tools take an optional view argument: "compact" (the default) or "full". Compact strips image and avatar URLs (including primary_photo_url / primary_thumbnail_url) and keeps every other field; view: "full" returns the payload with those URLs intact.

Tools that take view: compass_search_properties, compass_get_property, compass_bulk_get, compass_compare_properties, compass_get_price_history, compass_get_comparable_rentals, compass_get_agent_listings, compass_get_by_address.

Changed in 1.1.9: compass_get_property, compass_bulk_get, compass_compare_properties, compass_get_price_history and compass_get_comparable_rentals used to return every field, media URLs included. They now default to compact like the other read tools. If you relied on photo or avatar URLs from these tools, pass view: "full", or use compass_get_property_photos for the gallery.

compass_get_property_photos takes no view — its gallery URLs are the whole point of the tool, so it always returns them.

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, status: "ok", property } on success or { listing_id_sha, url, status, error_kind, retryable, error } on failure (status = error_kind) — one bad target never fails the whole call. retryable: true (a bridge timeout after one retry, an unreachable bridge_down, issue #73) is NOT a missing listing, so retry it (a cold bridge usually succeeds on the second call) rather than concluding Compass has no record; protocol / other are real misses. 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. The envelope also reports count / ok / errored. extracted_features is populated per row. The raw description is omitted by default — pass include_description: true to keep it.

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.
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.4/5.0
Behavior5/5

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

Annotations only declare readOnly/idempotent/openWorld; the description adds substantial behavior beyond them: per-row failure isolation ('one bad target never fails the whole call'), the `retryable` vs `protocol`/`other` distinction with issue #73 context, the overall deadline and `pending` fallback, envelope counts, and concurrent fan-out. This is exactly the operational context annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the core capability, then output shape, then failure/retry semantics, then deadline behavior. Dense but nearly every sentence carries distinct information; the parenthetical restatement of `status` = `error_kind` and the repeated explanation of `extracted_features` are mild 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?

With no output schema, the description fully carries the return contract: both success and error row shapes, `pending` rows, top-level `count`/`ok`/`errored`/`pending`, and the default omission of raw `description`. There is nothing material an agent needs for correct invocation and result handling that 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 description coverage is 100%, so the baseline is 3. The description restates `include_description` default false and the `url`/`listing_id_sha` target shape, and mentions `extracted_features` being always populated, but adds no syntax or format detail the schema does not already carry. The `view` parameter is left entirely to the 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?

States a specific verb and resource with scope ('Fetch up to 200 Compass listings in a single call') and separates itself from siblings by explicitly naming `compass_compare_properties` as the tool for side-by-side comparison. Also positions itself relative to `compass_get_property` by noting identical target shape. An agent can place it without opening a schema.

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

Usage Guidelines4/5

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

Clear routing guidance: use `compass_compare_properties` for a summary table, batch into multiple calls above 200 targets, and re-run only `pending` rows after a deadline. It also gives actionable retry policy for `retryable: true` cases. What it lacks is an explicit statement of when a single target should go to `compass_get_property` instead of this bulk call.

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

compass_calculate_affordabilityCalculate max affordable home priceA
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 loans, student loans, etc.), down payment, interest rate, and optional property-tax rate / insurance / HOA / loan term. Output: max home price, the binding constraint (front-end vs back-end), and the full PITI breakdown at that price. Same math across the realty MCP cohort (@chrischall/realty-core). No network — pure local math.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoa_monthlyNo
back_end_dtiNoBack-end DTI cap as decimal, default 0.36
down_paymentYes
front_end_dtiNoFront-end DTI cap as decimal, default 0.28
interest_rateYesAnnual %, e.g. 6.5
monthly_debtsNoSum of monthly debt payments (car, student loans, etc.)
monthly_incomeYes
loan_term_yearsNoDefault 30, max 50
insurance_annualNo
property_tax_rateNoAnnual % of home price, default 1.1

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so safety is covered. The description adds meaningful context beyond that: the output shape (max price, binding constraint, PITI breakdown) and the determinism note ('No network — pure local math').

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

Conciseness4/5

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

Front-loaded with the verb and rule, then inputs, then outputs. Mostly earns its place, though the 'Same math across the realty MCP cohort (@chrischall/realty-core)' line is promotional filler rather than actionable 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?

No output schema exists, but the description explicitly enumerates the return values (max price, binding constraint, PITI breakdown), compensating adequately. With 10 params at 60% coverage it is complete enough to call 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 coverage is 60% and the description lists the inputs (income, debts, down payment, rate, optional tax/insurance/HOA/term), but it adds no syntax or format detail beyond what the schema already documents. The mid-level coverage justifies the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Solve for the maximum home price') and the method (28/36 DTI rule), which cleanly distinguishes it from the sibling compass_calculate_mortgage. An agent can tell what it does without opening the schema.

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

Usage Guidelines3/5

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

Usage context is implied by the description ('what you can afford'), but it never explicitly says when to choose this over compass_calculate_mortgage or what preconditions exist. It is inferable but not stated.

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 payment (local)A
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 — fully deterministic, safe to use for scenario comparison without burning a fetch. 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, max 50
insurance_annualNo
property_tax_rateNoAnnual % of home price
property_tax_annualNo
down_payment_percentNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false; the description adds genuinely new behavior by stating there is no network call, that it is fully deterministic, and that PMI applies automatically only when LTV > 80% and pmi_rate is supplied. It does not cover error behavior for invalid inputs, but that is a minor gap given the annotation coverage.

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

Conciseness4/5

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

Front-loaded with purpose and return value before parameter rules; four sentences with no filler. Slightly dense in the parameter-rule sentence, but every clause carries information an agent needs.

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 usefully enumerates the PITI return components and total interest, and the annotations cover the safety profile, so an agent has enough to call it correctly. Missing coverage of two parameters and no stated behavior on conflicting down-payment inputs keeps it from being fully 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 only 40% schema description coverage across 10 parameters, the description does real work: it states the down_payment/down_payment_percent mutual exclusivity and 20% default, the property_tax_annual vs property_tax_rate alternatives, and the LTV condition for PMI. It leaves hoa_monthly and insurance_annual unmentioned, so the compensation is strong but not complete.

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?

States a specific verb+resource ('Local-only mortgage payment calculator') with a clear scope, and the 'local-only' qualifier implicitly separates it from the network-backed sibling tools. It stops short of explicitly naming compass_calculate_affordability, the nearest sibling, so the boundary between the two calculators must be inferred.

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

Usage Guidelines3/5

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

Usage context is implied rather than stated: 'safe to use for scenario comparison without burning a fetch' suggests when it is preferable to a network tool, but there is no explicit when-to-use vs when-not rule, nor any pointer to the affordability sibling. The rest of the guidance is parameter mechanics rather than tool selection.

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; a failed row carries status = error_kind (timeout / bridge_down / protocol / other), retryable and error, and the envelope reports count / ok / errored. 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
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.
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/5.0
Behavior5/5

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

Goes far beyond the readOnly/openWorld/idempotent annotations: per-row error capture that prevents one bad target from failing the whole call, specific error_kinds (timeout/bridge_down/protocol/other) with retryable and error fields, concurrency, an overall deadline with a pending status, envelope counts (count/ok/errored/pending), and default suppression of description and summary. This is exactly the kind of failure-mode and resource-bounding detail an agent needs before invoking.

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

Conciseness4/5

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

Front-loads the core action, then proceeds through per-target input, failure semantics, and defaults in a logical order. It is dense and every sentence carries information, though the single long sentence covering error kinds and envelope keys requires close reading.

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 comparison tool with no output schema, the description fully arms the agent: input forms, redirect path, per-row success/failure contract, retry strategy for pending rows, and the opt-in flags determining response shape. Nothing material is absent.

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 already 100%, so the schema documents url, listing_id_sha, view, the toggles, and the min/max bounds. The description reinforces the default-off behavior of description/summary and the sha-only redirect path, but adds no syntax or constraints the schema lacks. Baseline 3 given full schema coverage.

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 title and the opening sentence both state a specific verb and resource: fetch 2+ Compass properties and align their facts side-by-side. That distinguishes it from compass_get_property (single fetch) and from compass_bulk_get, which is mentioned later in the schema yet only as an aside. Purpose is clear, though it doesn't sharpen the boundary against compass_bulk_get within the description front-end.

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 explains how to drive each target (url vs sha) and how to handle pending rows, but says nothing about when to pick this tool over compass_get_property or compass_bulk_get. The only comparison guidance is buried in the schema for targets, not the description. Usage is implied by behavior rather than stated.

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).
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 rental candidates to return. Default 20.
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).

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and open-world, so the bar is lower. The description adds real behavioral value beyond them: how the locality is derived (lifts city/state/zip from homedetails), the empty-result contract ("rentals: [] with the target locality preserved"), and repeated-call safety. 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.

Conciseness4/5

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

Front-loads the purpose, then adds derivation, return shape, and edge-case behavior in a compact block. Dense but every sentence carries information; only the return-field enumeration is mildly redundant.

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

Completeness4/5

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

No output schema exists, so the description must carry return-value burden and does: it enumerates returned fields (address, monthly price, beds/baths, sqft, URL) and handles the empty case. Only the exact response envelope shape (keys besides rentals) is left implicit.

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 schema already documents url, view, limit, and listing_id_sha in detail. The description adds only a light note that locality is derived from the target and mentions price_formatted (a return field, not a param), so baseline 3 applies.

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?

States a specific verb and resource ("Surface nearby rental listings for a Compass property") and even names the business purpose (STR viability). It is clearly distinct from siblings like compass_get_property or compass_compare_properties by resource, but it never explicitly names an alternative, so differentiation is inferred rather than stated.

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

Usage Guidelines3/5

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

Gives a use case ("evaluating STR viability in vacation markets") which implies when it's relevant, but offers no when-not guidance and does not name any sibling to use instead. Usage context is present but incomplete.

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

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, openWorld, but the description goes further: it discloses the three returned arrays, the normalized cross-MCP schema with a fixed type enum, the 302-redirect behavior of sha-only calls, and the data-duplication caveat versus compass_get_property. This is exactly the extra behavioral context annotations cannot carry.

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?

Dense but front-loaded: purpose and event taxonomy first, then return shape, then parameter routing, then the usage caveat. Every sentence carries distinct information — no filler, no restatement of the title.

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 describe return values, and it does so thoroughly (events, history, events_normalized with the shared field set and enum). Combined with the parameter routing and the read-only note, an agent has everything needed to call it correctly.

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

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 real meaning beyond the schema — the 'url is preferred, no resolver round-trip needed' tradeoff and the fact that listing_id_sha alone triggers /listing/<sha>/view with a redirect. The view param's compact/full semantics are left to the schema, keeping it from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Full listing history for a Compass property') and enumerates the event types it returns. It explicitly distinguishes itself from compass_get_property, telling the agent this is the merged + normalized timeline rather than the inline arrays, so the tool is unmistakable among siblings.

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 an explicit when-to-use rule ('call this tool only when you want the merged + normalized timeline') and names the alternative (compass_get_property returns the same events[]/history[] inline). It also clarifies the url-vs-sha calling condition, leaving nothing to inference.

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).
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.
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.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld, and the description adds substantial context beyond them: the /listing/<sha>/view 302-redirect behavior, that `description` is omitted by default, that `extracted_features` is always populated, and that sha URLs go stale on relist while `_pid` is stable. The 'Read-only; safe to call repeatedly' line is mildly redundant with annotations but the rest is genuinely additive.

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?

Long but front-loaded and sectioned (core sentence, DESCRIPTION HANDLING, URL FORMS), so an agent can stop reading once it has what it needs. The _lid/_pid discussion is valuable but slightly verbose, and the read-only line duplicates annotations.

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 correctly carries the return-value burden by enumerating the returned fields (address, neighborhood, beds/baths, sqft, lot_size_acres derivation, price, MLS status, extracted_features, canonical URL). Nothing an agent needs to call it correctly appears 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%, so the baseline is 3, but the description adds real meaning: it explains the fetch-path difference between supplying `listing_id_sha` alone versus `url`, the redirect that follows, and the default behavior of `include_description`. This goes beyond the schema's field-level prose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Fetch a property's full Compass record') and immediately scopes it against siblings by tying it to a compass_search_properties result and describing it as the full single-record fetch. An agent can distinguish it from compass_search_properties (list), compass_get_property_photos (photos), and compass_compare_properties (comparison) without opening schemas.

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

Usage Guidelines4/5

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

Explicitly says to pass `url` or `listing_id_sha` alone, and the URL FORMS section explains which URL shape to use for reading vs long-lived references. It references where `url` comes from (compass_search_properties). What's missing is explicit guidance on when NOT to use this vs compass_get_by_address or compass_bulk_get, but the context is otherwise clear.

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 (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).
include_all_categoriesNoInclude non-photo media (floorplans, etc.). Default false.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld, but the description adds real value beyond them: the return shape, per-entry CDN/thumbnail/dimension content, the category-0 default, and the redirect behavior. It slightly repeats the safety profile ('read-only; safe to call repeatedly'), which the annotations already carry.

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 in the first clause, followed by return format, input routing, and category behavior. Dense but every sentence earns its place; it is slightly packed rather than wasteful.

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 compensates by specifying the returned object `{ listing_id_sha, count, photos }` and what each photo entry contains. An agent has enough to call and interpret the result correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by clarifying that url and listing_id_sha are alternatives and detailing what the sha-only path fetches. It also reinforces the default-off behavior of include_all_categories.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: the full photo gallery for a Compass listing, resolving to listing.media[]. It is clearly distinguishable from compass_get_property (general property data) and compass_get_price_history by naming the concrete artifact returned.

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?

Gives clear operational guidance: pass either `url` or `listing_id_sha` alone, and explains the sha-only redirect path. It covers when to use which input, but does not explicitly contrast the tool against siblings like compass_get_property for agents deciding which to call.

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

List every registered account label plus the current active_session_id. When none are registered, sessions is empty and active_session_id is null. The registry is a label only: it does not change which Compass account requests use. Every compass tool call goes through whichever browser tab the ContextMint Bridge extension is signed into; to read a different account, sign that tab into it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered. The description goes well beyond that, disclosing the empty/null return state and the non-obvious semantics that the registry does not change request routing, which an agent could not infer from 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?

Three sentences, each carrying distinct information: the return shape, the empty/null edge case, and the crucial routing caveat. The core purpose is front-loaded and no sentence is redundant.

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?

No output schema exists, so the description must carry return-value meaning, and it does by naming sessions and active_session_id plus their empty/null behavior. Combined with annotations covering the read-only idempotent profile, nothing needed to invoke 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.

Parameters4/5

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

The tool takes zero parameters, so the schema has nothing to document and the description correctly spends no words on inputs. Baseline 4 applies for a no-parameter tool; there is no parameter ambiguity to resolve.

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 gives a specific verb (list) and two concrete resources (registered account labels and active_session_id), so an agent knows exactly what is returned. It does not explicitly name sibling tools like compass_register_session or compass_set_active_session to sharpen the boundary, but the scope is unambiguous on its own.

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 conveys the operative context: that the session registry is a label only and does not affect which account Compass requests use, and that switching accounts requires signing the browser tab in. That is real usage guidance, though it never states a direct 'use this when...' rule or names an alternative tool.

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

compass_healthcheckVerify the ContextMint Bridge connection end-to-endA
Read-onlyIdempotent

Round-trips a small public www.compass.com URL (/robots.txt) through ContextMint Bridge (your signed-in browser tab) and returns diagnostics: the bridge's role (host/peer/null), port, version, the extension link (linked / pair pending / not attached / never answered), the elapsed round-trip time, and a plain-English hint distinguishing 'bridge never came up' from 'extension not connected' from 'this browser can't serve a capability' from 'real www.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?

Annotations cover readOnly/idempotent/openWorld, but the description adds real behavioral value: no auth required, no side effects, the enumerated return fields (role, port, version, link state, elapsed time), and a plain-English hint that distinguishes four distinct failure modes. Since there is no output schema, this disclosure carries the full diagnostic semantics.

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?

One dense paragraph, front-loaded with the core action and followed by returns, then the trigger condition. No filler sentences, though the enumerated diagnostic list makes it longer than strictly necessary.

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 parameters and no output schema, the description fully compensates by describing what gets returned and how to interpret the failure signal. An agent has everything needed to call it and read the result 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?

The tool takes zero parameters, so there is nothing to disambiguate and the baseline is 4. The description correctly implies no input is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete action (round-trips a public /robots.txt URL through ContextMint Bridge) plus the output (diagnostics). It is unmistakably distinct from the compass_* data siblings, which fetch property/session data rather than probing the bridge itself.

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?

Explicitly says when to call it: 'when a real tool fails and you want to know which hop broke.' That single condition both triggers use and rules out normal operation, so an agent knows this is a diagnostic fallback rather than a routine call.

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

Record (or refresh) which Compass account the signed-in session belongs to, keyed by account_identity. Re-registering the same identity updates the existing entry. Returns a session_id; pass mark_active: true to mark it as the current account in the same call. The registry is a label only: it does not change which Compass account requests use. Every compass tool call goes through whichever browser tab the ContextMint Bridge extension is signed into; to read a different account, sign that tab into it.

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.1/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that re-registering the same identity updates rather than duplicates, that a session_id is returned, that mark_active alters the current account in the same call, and — most valuable — that the registry does not change which account requests actually use and that account switching happens via the signed-in browser tab. That last point is non-obvious behavioral context an agent could not derive from readOnlyHint=false / idempotentHint=true.

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

Conciseness4/5

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

Front-loaded with the core action and key, and every sentence carries information (idempotent refresh, return value, activation flag, label-only caveat, tab-based account switching). It is on the longer side at five sentences, but none is padding.

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 correctly supplies the return value (session_id), and with three simple parameters and default false on mark_active, nothing needed to invoke correctly is missing. The label-only caveat closes the most likely source of agent error.

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 account_identity, auth_expires_at and mark_active are already documented in the schema; baseline is 3. The description restates mark_active's effect and the keying role of account_identity but adds no new format or edge-case detail beyond what the schema 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?

States a specific verb and resource ('Record (or refresh) which Compass account the signed-in session belongs to, keyed by account_identity') and clarifies the write semantics of re-registration. It does not explicitly name or differentiate itself from the close sibling compass_set_active_session, even though mark_active overlaps with that tool's job, so it stops just short of 5.

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?

Gives clear context for use: register or refresh the identity, and optionally fold in activation via mark_active: true rather than making a separate call. It also sets a crucial expectation ('the registry is a label only: it does not change which Compass account requests use'), which steers the agent away from misuse. It still never names compass_set_active_session or compass_get_session_context as alternatives, so there is no explicit routing.

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

Mark a previously registered session_id as the current account label, for your own bookkeeping across a conversation. The registry is a label only: it does not change which Compass account requests use. Every compass tool call goes through whichever browser tab the ContextMint Bridge extension is signed into; to read a different account, sign that tab into it.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession id to make active.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already say readOnlyHint=false and idempotentHint=true, but the description adds the critical behavioral fact that this state change is cosmetic: the registry is a label only and does not alter which Compass account requests use, since all calls route through the extension-signed browser tab. That is exactly the kind of context an agent cannot infer from annotations and prevents a serious misuse.

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 sentences, no filler. The action is front-loaded, the scope caveat follows immediately, and the routing explanation closes the loop. Every sentence carries distinct information.

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

Completeness5/5

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

For a one-parameter, non-destructive state tool with no output schema, the description supplies everything needed: the action, the prerequisite, the fact that the effect is bookkeeping-only, and how account switching actually works. Nothing material 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 describes session_id as 'Session id to make active', so the baseline is 3. The description goes further by establishing that the id must reference a 'previously registered' session, which constrains valid values in a way the schema does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Mark a previously registered session_id as the current account label') and immediately disambiguates the scope of that action from what an agent might wrongly assume (it does not change account routing). The reader can distinguish it from compass_register_session and compass_get_session_context without opening any schema.

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

Usage Guidelines4/5

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

It names the use case ('your own bookkeeping across a conversation') and a prerequisite ('previously registered'), and gives a when-not: to actually read another account, sign that browser tab in instead. It stops short of explicitly naming register_session as the required precursor tool by name, so not quite a 5.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv1.1.10
    • Changedcompass_bulk_get1 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_compare_properties2 fields changed
      • changedInput schema / properties / targets / items / properties / listing_id_sha / description
        Previous value: -"Compass listing identifier. Sufficient on its own — the tool resolves the address slug internally via site search before fetching the homedetails page."New value: +"Compass 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)."
      • 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_comparable_rentals2 fields changed
      • changedInput schema / properties / listing_id_sha / description
        Previous value: -"Compass listing identifier. Sufficient on its own — the slug is resolved internally."New value: +"Compass 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)."
      • 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_price_history2 fields changed
      • changedInput schema / properties / listing_id_sha / description
        Previous value: -"Compass listing identifier. Sufficient on its own — the tool resolves the address slug internally via site search before fetching."New value: +"Compass 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)."
      • 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_property1 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_property_photos1 field changed
      • changedInput schema / properties / listing_id_sha / description
        Previous value: -"Compass listing identifier. Sufficient on its own — the tool resolves the address slug internally via site search before fetching."New value: +"Compass 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)."
  2. 2 tool updatesv1.1.6
    • Changedcompass_calculate_affordability11 fields changed
      • addedInput schema / properties / back_end_dti / description
        Added value: +"Back-end DTI cap as decimal, default 0.36"
      • addedInput schema / properties / back_end_dti / exclusiveMinimum
        Added value: +0
      • removedInput schema / properties / back_end_dti / minimum
        Removed value: -0
      • addedInput schema / properties / front_end_dti / description
        Added value: +"Front-end DTI cap as decimal, default 0.28"
      • addedInput schema / properties / front_end_dti / exclusiveMinimum
        Added value: +0
      • removedInput schema / properties / front_end_dti / minimum
        Removed value: -0
      • addedInput schema / properties / interest_rate / description
        Added value: +"Annual %, e.g. 6.5"
      • addedInput schema / properties / loan_term_years / description
        Added value: +"Default 30, max 50"
      • changedInput schema / properties / loan_term_years / maximum
        Previous value: -9007199254740991New value: +50
      • addedInput schema / properties / monthly_debts / description
        Added value: +"Sum of monthly debt payments (car, student loans, etc.)"
      • addedInput schema / properties / property_tax_rate / description
        Added value: +"Annual % of home price, default 1.1"
    • Changedcompass_calculate_mortgage2 fields changed
      • changedInput schema / properties / loan_term_years / description
        Previous value: -"Default 30"New value: +"Default 30, max 50"
      • changedInput schema / properties / loan_term_years / maximum
        Previous value: -9007199254740991New value: +50
  3. 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"
  4. 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"
        +}
  5. 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.1/5.0

Scored across 18 tools

Disambiguation4/5

Most tools are clearly distinct (single vs. bulk variants, compare vs. bulk_get, mortgage vs. affordability), and descriptions explicitly explain boundaries. The only soft overlap is between compass_register_session and compass_set_active_session, plus the two 'saved' stubs, but descriptions disambiguate well.

Naming Consistency4/5

Nearly all tools follow compass_verb_noun (get_property, search_properties, compare_properties, resolve_addresses), which is predictable. Minor deviations like compass_bulk_get (adjective-verb) and compass_healthcheck (single noun) slightly break the pattern but remain readable.

Tool Count4/5

18 tools is on the heavier side but each maps to a real capability (search, fetch, bulk, compare, photos, history, agent, rentals, financial calcs, sessions, diagnostics). The two always-erroring 'saved' stubs are the main dead weight, keeping this below a perfect score.

Completeness4/5

Strong coverage of a read-only real-estate research domain: discovery (search, address resolution, agent listings), retrieval (get/bulk/compare/photos/history), analysis (mortgage, affordability), and ops (healthcheck, sessions). The only notable gap is the two non-functional saved-homes/saved-searches tools, which are honest but unusable.

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
    15 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.
    -