Skip to main content
Glama
chrischall

onehome-mcp

by chrischall

onehome-mcp

CI npm license

MCP server for OneHome (CoreLogic) — search the listings your real-estate agent curated for you, fetch property details + photos, compare houses side-by-side, and run mortgage / affordability math from within Claude.

Sister project to zillow-mcp, redfin-mcp, compass-mcp, and homes-mcp. Same tool ergonomics — different upstream auth model.

This project was developed and is maintained by AI (Claude). Use at your own discretion.

What's different about OneHome

OneHome isn't a public listings site. Buyers usually reach it through a magic link an agent emails them — https://portal.onehome.com/...?token=eyJ.... That token query param IS the per-user bearer that the portal SPA hands to every GraphQL request.

So instead of routing every fetch through your signed-in browser tab (like the other realty MCPs), onehome-mcp talks directly to services.onehome.com/graphql from Node, with Authorization: Bearer <jwt> attached. We support three ways to source that bearer:

Mode

How to enable

Notes

env_token

ONEHOME_TOKEN=<jwt>

Paste the raw bearer from devtools Network panel. Most direct.

magic_link

ONEHOME_MAGIC_LINK=https://portal.onehome.com/...?token=...

Paste the full URL your agent sent — we extract the token param.

fetchproxy_capture

(no env) + ContextMint Bridge browser extension installed (Chrome: load the release's chrome zip unpacked; Safari isn't available yet — it will ship inside the ContextMint app, so use Chrome for now) + signed-in portal.onehome.com tab

We wait for your tab to fire any GraphQL request, snapshot the Authorization header, and reuse it.

ContextMint Bridge is the fetchproxy browser extension under its new name, from the same maintainer — fetchproxy's own README (fetchproxy#extension) points to it. Its source is public at nullnet-app/contextmint-bridge: build it yourself, or check a release zip against the .sha256 file published beside it (shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256).

Related MCP server: armls-spark-mcp-server

Tools

Tool

What it does

onehome_get_user

Smallest auth probe — returns your OneHome profile (name, email) and the groups your agent shared.

onehome_get_groups

List the OneHome "groups" your agent has shared with you (each one a market / curated listing bucket).

onehome_get_saved_search

Fetch an agent-curated saved search by id — name, filter criteria, polygon, and the OSK listing ids that compose the share.

onehome_get_saved_search_with_listings

The "show me my saved homes" flow in one round trip — saved search plus its inflated listings.

onehome_search_properties

Listings within a group; optionally scoped to a saved search.

onehome_search_suggestions

Free-text suggestion search (address, MLS #) across all feeds.

onehome_get_by_address

Resolve a single free-text street address to a listing's portal URL + id.

onehome_resolve_addresses

Bulk-resolve up to 100 structured addresses to portal URLs + listing ids; concurrent, per-row error capture.

onehome_get_property

Full property record by listing id or portal URL.

onehome_bulk_get

Fetch up to N listings in one call — one structured row per id, per-row error capture.

onehome_get_property_photos

Full media gallery — Thumbnail / Medium / Large variants + room descriptions.

onehome_compare_properties

2-8 listings side-by-side. Per-row error capture; calls are concurrent.

onehome_get_schools

Local-Logic primary + high schools near a lat/lng.

onehome_get_walk_score

Local-Logic walk / transit / bike / car friendliness scores.

onehome_graphql

Power-user escape hatch — send a raw read-only GraphQL document (queries only; mutations and subscriptions are refused) with variables.

onehome_calculate_mortgage

Local PITI calculator. Same math as the other realty MCPs.

onehome_calculate_affordability

Local 28/36 DTI solver — max home price you can afford.

onehome_set_auth

Add another authenticated session at runtime (magic link / JWT / email-token) for buyers holding shares across multiple agents.

onehome_set_active_session

Force a specific registered session to be the active one (overrides MLS-suffix routing).

onehome_get_session_context

List every registered session — auth mode, token expiry, and the group / saved-search / agent scope each bootstrapped.

onehome_healthcheck

End-to-end auth + GraphQL smoke check with token-expiry diagnostics.

Install

The simplest path is the published Claude plugin (.mcpb install). Its settings take an optional OneHome magic link or bearer token (both stored as sensitive values); leave both blank to use browser-bridge capture instead. For local dev:

git clone https://github.com/chrischall/onehome-mcp
cd onehome-mcp
npm install
npm run build

Then point your MCP host at node /abs/path/to/onehome-mcp/dist/bundle.js with one of:

// claude_desktop_config.json
{
  "mcpServers": {
    "onehome-mcp": {
      "command": "node",
      "args": ["/abs/path/to/onehome-mcp/dist/bundle.js"],
      "env": {
        "ONEHOME_MAGIC_LINK": "https://portal.onehome.com/en-US/properties/map?token=eyJ..."
      }
    }
  }
}

Development

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

Tests use a FakeTransport (in tests/helpers.ts) that registers per-operationName handlers — there's no live network in the test suite. The tests/index.test.ts smoke check loads the same tool registrations src/index.ts uses against an in-memory MCP client/server pair, so "I wrote the tool file but forgot to wire it up" mistakes fail loudly.

License

MIT.

Available Tools

21 tools
onehome_bulk_getBulk-fetch OneHome listings by idA
Read-onlyIdempotent

Fetch up to 200 OneHome listings in a single call. Returns one structured row per input id (no side-by-side summary table — use onehome_compare_properties for that). Each row is either { listing_id, status: "ok", property } on success or { listing_id, status, error_kind, retryable, error } on failure (status = error_kind: timeout / bridge_down / pending are retryable, protocol / other are real misses) — one bad id never fails the whole call. Calls fan out concurrently against ListingById, capped at 6 in flight to avoid swamping the bridge; transient timeouts are retried once per row before being captured as an error. The whole call is bounded by an overall deadline: any row still unsettled comes back status: "pending" with a top-level pending count — re-run just those ids. The envelope reports count / ok / errored. extracted_features is populated per row automatically. The raw description (PublicRemarks) is omitted by default — pass include_description: true to keep it. group_id defaults to the magic-link session context.

ParametersJSON Schema
NameRequiredDescriptionDefault
group_idNo
listing_idsYesListing OSK ids to fetch. 1..200. For higher counts, batch into multiple calls.
saved_search_idNo
include_descriptionNoInclude the raw `description` (PublicRemarks) on each row. Defaults to `false`.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well past the annotations (readOnly/idempotent/openWorld) by disclosing the concurrency cap of 6 in flight, per-row retry-once on transient timeouts, the overall deadline and pending-row behavior, partial-failure isolation, the error_kind taxonomy with retryable vs real-miss classification, and the envelope counts. This is unusually rich behavioral context for an agent.

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 its limit, and every sentence carries load (return shape, failure semantics, concurrency, deadline, envelope, feature extraction, description flag, group_id default). It is a dense single block rather than organized sections, which slightly hurts scanability.

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: per-row success and failure shapes, the envelope counts, pending-count semantics, and the fact that extracted_features is auto-populated. Nothing an agent needs to invoke or interpret results 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 50%, and the description compensates for group_id (defaults to magic-link session context) and reinforces listing_ids batching and include_description's default. However saved_search_id is unexplained in both the schema and the description, leaving one of four parameters semantically opaque.

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 with scope ('Fetch up to 200 OneHome listings in a single call') and explicitly disambiguates from the sibling onehome_compare_properties. An agent can tell it apart from onehome_get_property (single) and onehome_search_properties (query-based) 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?

Gives explicit routing ('use onehome_compare_properties for that'), a batching rule for >200 ids, and operational guidance to re-run only the ids returned as pending. It does not name the single-id alternative (onehome_get_property) for the 1-id case, so the when-not is slightly incomplete.

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

onehome_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.8/5.0
Behavior4/5

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

Annotations already cover safety (readOnlyHint, idempotentHint, openWorldHint=false), so the bar is lower. The description adds real value by disclosing 'No network — pure local math' (no auth/network dependency) and naming the exact return shape (max price, binding constraint, PITI breakdown), which matters since there is no output schema.

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

Conciseness4/5

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

Four sentences, front-loaded with the core purpose and then input/output inventory. Dense but every sentence carries information; the cohort note (@chrischall/realty-core) is arguably the weakest line but still signals consistency expectations.

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 10 params, no output schema, and only partial schema descriptions, the description does the necessary work: it names the return fields and the DTI mechanism. An agent could invoke this correctly without further context, though the sibling boundary remains slightly under-specified.

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 60% and the description compensates well, enumerating the key inputs (monthly income, recurring debts, down payment, interest rate) and flagging the optional group (property-tax rate, insurance, HOA, loan term). It also ties the 28/36 rule to the front_end_dti/back_end_dti params, adding meaning beyond the raw 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?

States a precise verb and resource: 'Solve for the maximum home price you can afford under the standard 28/36 DTI rule.' This clearly distinguishes it from the plain mortgage-payment sibling, though it never names onehome_calculate_mortgage explicitly to sharpen the boundary.

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

Usage Guidelines3/5

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

Usage is implied by the affordability framing and the confidence-scoping note ('standard 28/36 DTI rule'), but there is no explicit when-to-use / when-not guidance and no mention of the obvious alternative (onehome_calculate_mortgage) for payment-only questions. The reader must infer the split.

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

onehome_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

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=false, and idempotentHint=true, so the safety profile is largely covered. The description adds genuinely useful behavior beyond that: 'fully deterministic,' no network call, the automatic PMI trigger when LTV > 80%, and the 20% down-payment default. It still does not describe the response shape or rounding, but it carries good weight.

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

Conciseness4/5

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

Four sentences, each earning its place, with purpose and return contents front-loaded ahead of the parameter rules. Slightly dense but no filler or repetition.

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?

There is no output schema, so the description correctly takes on the burden of describing return values (PITI breakdown and lifetime interest). For a 10-parameter deterministic calculator with annotations covering safety, this is nearly complete, missing only minor details like currency or rounding conventions.

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 params, the description compensates well by resolving the mutually-exclusive pairs (down_payment OR down_payment_percent, property_tax_annual OR property_tax_rate) and the conditional PMI rule. It leaves hoa_monthly, insurance_annual, and loan_term_years unexplained, though those are self-evident from their names.

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 states a specific verb and resource ('mortgage payment calculator') and enumerates the returned components (PITI: principal + interest, property tax, insurance, HOA, PMI, plus total interest). It does not explicitly differentiate itself from the sibling onehome_calculate_affordability, but the 'local-only payment calculator' framing is distinct enough that an agent can distinguish the two.

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 gives clear context for when to reach for this tool: 'safe to use for scenario comparison without burning a fetch,' which implicitly routes the agent here instead of a network-backed sibling. It does not, however, name the alternative (e.g. calculate_affordability) or state when-not to use it.

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

onehome_compare_propertiesCompare OneHome listings side-by-sideA
Read-onlyIdempotent

Fetch 2 or more OneHome listings and align their facts side-by-side. Each target may supply listing_id (preferred) or url (a portal URL). Returns the full per-property record (with extracted_features populated) per row. Per-target errors are captured per-row — one bad target will not fail the whole call. Calls are concurrent. The raw description is omitted from each row by default (include_description: true to keep it). The redundant summary table is also opt-in via include_summary: true — by default only rows[] 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 OneHome's payload untouched. No field projection: this server has no verified record of which OneHome fields matter, and inventing one would risk dropping a field a caller needs.
targetsYes
group_idNo
include_summaryNoInclude the pivoted `summary` table (one row per compared field, one column per listing). Defaults to `false` because `rows[].property.*` already carries everything — the summary is roughly 30% of the response weight and only useful for human-readable rendering.
include_descriptionNoInclude the raw `description` (PublicRemarks) on each row. Defaults to `false`.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds valuable behavioral details: concurrency, per-target error isolation ('one bad target will not fail the whole call'), default omission of description and summary, and the existence of opt-in flags. These are not in the annotations and meaningfully shape agent expectations.

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 dense but efficient, front-loading the core purpose and then adding behavioral and parameter nuances. It avoids fluff and each sentence earns its place, though it is longer than strictly necessary.

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

Completeness4/5

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

Given no output schema, the description does a solid job describing return shape (per-property record with extracted_features, rows vs summary) and error handling. Missing details include group_id semantics and the exact effect of the view parameter beyond schema, but the overall picture is comprehensive for a tool of this complexity.

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 60%, so the description compensates. It explains that listing_id is preferred over url, clarifies include_description and include_summary defaults, and notes that rows[] carries every fact. However, group_id and view are not explained in the description (view has schema coverage, but group_id is bare), leaving a minor gap.

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 clear, specific verb+resource: 'Fetch 2 or more OneHome listings and align their facts side-by-side.' This distinguishes it from single-listing tools like onehome_get_property and search tools, leaving no ambiguity about its function.

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

Usage Guidelines3/5

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

The description provides clear context on input types (listing_id preferred, url fallback) and behavior (concurrent, per-target errors), but does not explicitly state when to choose this over siblings (e.g., 'use get_property for a single listing') or when not to use it. The purpose is implied but not contrasted with alternatives.

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

onehome_get_by_addressResolve a OneHome listing by street addressA
Read-onlyIdempotent

Resolve a free-text street address (with optional city/state/zip) to a OneHome listing's canonical portal URL and id in one call. Walks a 2-rung ladder: (1) ListingSuggestionsSearch against the magic-link saved-search scope; (2) when that misses, search-fallback — page-walks the broader saved-search (or raw listings(groupId)) pool bounded by the same groupId and fuzzy-matches input address tokens. Returns { url, listing_id, address, resolved, matched_via } where matched_via: "suggestions" | "search_fallback" reports which rung produced the hit. When no listing matches, returns { resolved: false, error: "no listing found" } rather than throwing. 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 OneHome's payload untouched. No field projection: this server has no verified record of which OneHome 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".
group_idNoOptional OneHome group id to scope the suggestion search. Defaults to the magic-link session context when present.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, and the description reinforces these ('Read-only; safe to call repeatedly'). It adds significant behavioral detail beyond annotations: the two-rung ladder (suggestions then search-fallback), the output structure including 'matched_via', the non-throwing error behavior, and the bounded search pool by groupId. This goes well beyond the structured fields.

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

Conciseness4/5

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

The description is dense but well-organized, front-loading the core purpose and then logically detailing the mechanism, output, error case, and safety. It is longer than necessary but every sentence adds information—no fluff or redundancy. The structure aids comprehension, so it earns a 4 rather than a 5 due to slight length.

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

Completeness4/5

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

Given the lack of an output schema, the description fully specifies the return shape ({url, listing_id, address, resolved, matched_via}) and the error case. It also explains the fallback algorithm and scoping. The input parameters are well-documented in the schema, and the description clarifies behavioral nuances like the 'view' enum. No critical information for correct invocation is missing, though rate limits or auth requirements are not mentioned (annotations do not cover them either).

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 each parameter (address, zip, city, state, group_id, view) already has a clear description. The description adds context about how group_id scopes the suggestion search and the fallback pool, and clarifies the 'view' parameter's impact on response shape. This adds some semantic value beyond the schema, but the schema already carries the primary meanings, so a baseline of 3 is appropriate.

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 clearly states the tool resolves a free-text street address to a OneHome listing's canonical portal URL and id, with a specific verb ('Resolve') and resource ('OneHome listing'). It describes the output and the two-step mechanism, making the purpose unambiguous. However, it does not explicitly contrast with the similar sibling 'onehome_resolve_addresses', which might handle bulk or different scenarios, so differentiation is only implicit.

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

Usage Guidelines3/5

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

The description implies usage for a single address resolution and explains the fallback ladder, but it does not explicitly state when to prefer this tool over alternatives like 'onehome_resolve_addresses' or when not to use it. The context of being a one-call single-address resolver is present but without explicit exclusions or alternative guidance.

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

onehome_get_groupsList my OneHome agent groupsA
Read-onlyIdempotent

List the OneHome groups your agent has shared with you. Share member e-mails and the agent's e-mail/phones are omitted unless include_contacts: true. For full agent / registered users, returns the GraphQL user.groups list. For magic-link consumer-share sessions (a single shared group), synthesizes a one-entry list from the checkToken session context.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_contactsNoInclude contact details: the share's member e-mail addresses and the agent's e-mail, phone and office phone. Default false — the agent's name, office and team are always returned.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, so the safety profile is covered. The description adds real behavioral context: contacts are withheld by default, and the return shape differs by session type (GraphQL user.groups vs a synthesized one-entry list from checkToken). This is useful disclosure beyond the annotations.

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

Conciseness4/5

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

Three tight sentences, front-loaded with the core purpose before the contact-omission rule and the two return modes. No filler, though the density of GraphQL/checkToken terms slightly burdens the opening read.

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?

There is no output schema, so the description carries the return-value burden and does reasonably well by naming the two return shapes (user.groups vs one-entry synthesized list). It stops short of describing field-level contents or ordering, but for a single-optional-param read tool it is largely complete.

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 include_contacts fully, including the always-returned fields. The description restates the same omission behavior ('omitted unless include_contacts: true') without adding format or default nuance, so 3 is the correct baseline.

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?

Specific verb+resource ('List the OneHome groups your agent has shared with you'), stating both the operation and its scope. It doesn't need to differentiate from siblings since none of the other tools list groups, but it also makes no attempt to position itself against them.

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 the two session contexts (full agent vs magic-link consumer-share) in which the tool behaves differently, which implicitly tells the agent when it applies. However, there is no explicit 'use this when / use X instead' guidance, nor any prerequisite or exclusions.

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

onehome_get_propertyFetch full details for a OneHome listingA
Read-onlyIdempotent

Fetch full details for a single OneHome listing by id or portal URL. Returns address, list / close / previous price, $/sqft, beds/baths/sqft, lot size (raw lot_size {area, units} plus the derived lot_size_acres — null, never 0, for condos / lotless listings), year built, lat/lng, status, HOA fee, annual tax, virtual-tour URL, the primary photo, and an extracted_features block (lake_front, hot_tub, basement, furnished, dock, community) keyword-parsed from the description. The raw description (PublicRemarks) is omitted by default — pass include_description: true to keep it; in most cases the extracted features cover what callers need. OneHome scopes every listing to a group/market — group_id defaults to the magic-link session context; pass it explicitly only if you need to query a different group.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
group_idNo
listing_idNo
saved_search_idNo
include_descriptionNoInclude the raw `description` (PublicRemarks) in the response. Defaults to `false` — `extracted_features` is always populated and usually sufficient.

TDQS

A4.4/5.0
Behavior5/5

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

Even with readOnlyHint, openWorldHint, and idempotentHint annotations, the description adds meaningful behavioral detail: the raw description is omitted by default and requires include_description; extracted_features is keyword-parsed from the description; lot_size_acres is derived and null for condos/lotless listings; and group_id defaults to magic-link session context. These are non-obvious behaviors an agent needs to know before calling.

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, returned fields, default behavior, and scoping semantics are all packed in without padding. Important caveats are front-loaded after the core purpose, and the parameter-specific guidance is clearly separated from the return-value enumeration.

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 compensates well by enumerating the main returned fields and clarifying key behaviors like description omission and lot_size conversion. The main completeness gap is the unexplained saved_search_id parameter and the lack of explicit guidance on which selector parameter(s) should be provided when none are required by the schema.

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 only 20%, so the description carries most of the parameter burden. It explains url/portal URL, group_id defaults, and include_description behavior well. However, it does not explicitly explain listing_id or saved_search_id, and 'by id' is ambiguous about which parameter is the primary id. This leaves meaningful gaps for two of five parameters.

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 'Fetch full details for a single OneHome listing by id or portal URL,' which names a specific verb, resource, and selection method. It also distinguishes itself from sibling tools like onehome_search_properties, onehome_get_property_photos, and onehome_bulk_get by emphasizing 'single listing' and 'full details.' The extensive field listing reinforces exactly what 'full details' means.

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

Usage Guidelines4/5

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

The description gives clear usage context: use by id or portal URL, pass include_description only when raw text is needed, and pass group_id explicitly only when querying a different group from the magic-link session. It does not explicitly name sibling tools as alternatives or state when not to use this tool, so it stops short of full when/when-not guidance.

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

onehome_get_property_photosFull photo gallery for a OneHome listingA
Read-onlyIdempotent

Fetch the full media gallery for a OneHome listing. Returns one entry per image with Thumbnail / Medium / Large CDN URLs, dimensions, the listing-room description (LongDescription), and display order. Pass either listing_id or a portal URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
group_idNo
listing_idNo

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is clear. The description adds behavior beyond annotations by specifying the per-image structure (CDN URLs, dimensions, LongDescription, display order) and that it returns one entry per image.

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

Conciseness5/5

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

Two sentences, no filler; the purpose is front-loaded and the return format and input alternatives are stated efficiently. Every sentence earns its place.

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

Completeness2/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 0% parameter coverage, the description leaves a significant gap around group_id and does not discuss behavior when multiple identifiers are passed or any error/empty cases. It gives useful return fields but is not complete enough for an agent to call correctly in all situations.

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

Parameters2/5

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

With 0% schema coverage the description must explain the parameters, but it only mentions passing 'listing_id or a portal URL' and ignores the group_id parameter entirely. It also does not clarify how the three parameters relate or what group_id is for.

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 full media gallery for a OneHome listing') and clearly distinguishes this tool from siblings like onehome_get_property by focusing on the photo gallery. The return details reinforce the gallery scope.

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 says what the tool does but provides no guidance on when to choose it over sibling tools or when not to use it. The only usage hint is which identifier to pass, not the tool-selection context.

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

onehome_get_saved_search_with_listingsFetch a saved search and inflate its listings in one callA
Read-onlyIdempotent

Combo tool: the "show me my saved homes" flow in a single round trip. Internally runs GetSavedSearchBySearchId to fetch the saved search (name, filters, polygon, listingIds) and then GetSavedListings to inflate those listingIds into full property records — the same two-call sequence as calling onehome_get_saved_search followed by onehome_search_properties(saved_search_id=...), but exposed as one tool so the magic-link-to-listings consumer flow is a single MCP call. Returns { saved_search, listings, count, page_info }. Both saved_search_id and group_id default to the magic-link session context. Sort defaults to property.MajorChangeTimestamp DESC (Newest). Listings are returned via the GraphQL listing-card projection (buildGetSavedListings), which does NOT include PublicRemarks — so there is no raw description to opt back into here. Use onehome_get_property(listing_id) per row when you need the full description for a specific listing.

ParametersJSON Schema
NameRequiredDescriptionDefault
group_idNo
page_numNo
page_sizeNo
sort_fieldNoGraphQL dotted-path, e.g. property.MajorChangeTimestamp or property.ListPrice
sort_orderNo
saved_search_idNo
include_dislikesNo

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnly, openWorld, and idempotent hints, and the description adds substantial behavior beyond that: it runs two internal operations, returns a specific shape ({ saved_search, listings, count, page_info }), inherits defaults from magic-link session context, defaults sorting to Newest, and warns that PublicRemarks is absent from the listing-card projection. 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?

The description is long but dense, with the core purpose front-loaded and each sentence adding distinct value. Some phrasing is implementation-heavy (GraphQL projection, buildGetSavedListings), but this is useful context for an MCP agent. Slightly verbose, yet not wasteful.

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

Completeness4/5

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

Given a complex combo tool with no output schema and low parameter coverage, the description covers the essential call path: purpose, return shape, defaulting behavior, sort default, and the key data limitation. The main gap is lack of guidance on pagination parameters and include_dislikes, but the core invocation is well specified.

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

Parameters3/5

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

The schema covers only 14% of parameters with descriptions, so the description must compensate. It does clarify saved_search_id/group_id defaults and sort_field/sort_order behavior, but page_num, page_size, and include_dislikes remain semantically unexplained. Partial compensation but not complete.

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

Purpose5/5

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

The description states a specific composite verb-object pair: it fetches a saved search and inflates its listings in a single trip. It clearly distinguishes itself from siblings by naming the exact two-call sequence it replaces (onehome_get_saved_search followed by onehome_search_properties), so an agent can tell it apart 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 Guidelines5/5

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

It explicitly identifies the intended consumer flow ('magic-link-to-listings'), contrasts itself with the two-call alternative, and gives a concrete when-not-to-use rule: call onehome_get_property(listing_id) per row when the full listing description is needed. This is actionable usage guidance, not just a statement of function.

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

onehome_get_schoolsLocal-Logic primary + high schools near a lat/lngA
Read-onlyIdempotent

Fetch the Local-Logic school data for a coordinate — separate primary and high-school lists, each entry with name, attributes (types/grades/programs/levels), and proximity (walking distance + straight-line distance). Returns an error field with HTTP details if the consumer session does not have access (the schools endpoint is sometimes agent-only). lat/lng usually come from onehome_get_property (latitude / longitude).

ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lngYes
languageNo

TDQS

A3.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds critical behavioral context: an error field with HTTP details when access is denied, the endpoint being sometimes agent-only, and the response structure. This goes beyond what annotations provide and is highly transparent.

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 three sentences, front-loaded with the core purpose, and includes essential context (error handling, source of lat/lng). It is efficient without unnecessary detail.

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

Completeness3/5

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

With no output schema, the description adequately describes the return structure (lists, attributes, proximity) and error behavior. However, it omits explanation of the optional 'language' parameter and leaves 'attributes' vague. For a tool with 3 parameters and no output schema, this is moderately complete but not fully.

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

Parameters2/5

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

Schema coverage is 0%, so the description must compensate. It explains lat/lng as coordinates and mentions they usually come from onehome_get_property, but does not describe units, ranges, or the optional 'language' parameter at all. This leaves significant gaps in parameter understanding.

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

Purpose5/5

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

The description clearly states the verb 'Fetch' and the resource 'Local-Logic school data for a coordinate', and specifies the output structure (separate primary and high-school lists with name, attributes, and proximity). It differentiates from siblings by noting the lat/lng source from onehome_get_property, establishing a distinct workflow.

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

Usage Guidelines3/5

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

The description provides context on typical input (lat/lng from onehome_get_property) but does not explicitly state when to use this tool over alternatives like onehome_get_walk_score or search tools. It implies usage but lacks clear when-to-use and when-not-to-use guidance.

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

onehome_get_session_contextInspect every registered OneHome sessionA
Read-onlyIdempotent

Returns one entry per registered session — its session_id, auth_mode, token expiry, and session scope (group_id / saved_search_id / agent_id / contact_id / mls_id) the MCP bootstrapped from each checkToken exchange. active_session_id flags which session answers by default; per-listing routing uses the active session when its mls_id matches the listing's ~MLS suffix, else the one session that matches (several matches error — pick one with onehome_set_active_session). Tools default unspecified group_id / saved_search_id arguments from the active session's context, so this is the easiest way to see what they'll default to. Single-session use (the common case) returns a one-entry sessions[].

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations provide readOnlyHint and idempotentHint, so the description doesn't need to re-state that. It adds value by explaining the semantics of active_session_id and the defaulting behavior of other tools, plus the error behavior for multiple matches. This goes beyond the structured annotations, though it could mention that it doesn't mutate state explicitly, but the annotations already cover that.

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 a single dense paragraph that packs a lot of information, but it remains concise and relevant. It front-loads the purpose, then explains routing and default behavior. While it is longer than strictly necessary, every sentence contributes to understanding the tool's behavior.

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 parameters and no output schema, the description thoroughly explains what the output will contain (session_id, auth_mode, token expiry, session scope, active_session_id), how the output is to be interpreted (routing and defaults), and the common use case. Nothing essential is missing for an agent to invoke it correctly.

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

Parameters4/5

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

The schema has zero parameters, and the description clearly states that no input is required. Since there are no parameters to document, the description appropriately focuses on the output semantics, which meets the baseline for a parameterless tool.

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

Purpose5/5

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

The description clearly states that the tool returns one entry per registered session with a specific set of fields, and it differentiates from siblings by explaining its role in session inspection and default resolution. The verb 'returns' and resource 'registered session' are specific and unambiguous.

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 explicitly says when to use it (to see defaults and session context, especially for single-session use) and when not to use it (when there are several matches, it errors and directs to use onehome_set_active_session). It also explains the routing behavior and the common case, providing clear usage guidance.

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

onehome_get_userGet the signed-in OneHome user profileA
Read-onlyIdempotent

Returns the OneHome user profile + the consumer-share groups attached. Share member e-mails and the agent's e-mail/phones are omitted unless include_contacts: true. For full agent / registered users, queries the GraphQL user endpoint. For magic-link consumer-share sessions (where user { } is access-denied), falls back to the data captured during the checkToken exchange — email, contact id, group/savedSearch ids, and the agent who shared with you.

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 OneHome's payload untouched. No field projection: this server has no verified record of which OneHome fields matter, and inventing one would risk dropping a field a caller needs.
include_contactsNoInclude contact details: the share's member e-mail addresses and the agent's e-mail, phone and office phone. Default false — the agent's name, office and team are always returned.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/idempotent, so the safety profile is covered. The description adds genuinely useful behavioral detail: contacts are omitted by default, and for magic-link sessions the response is assembled from checkToken data rather than a live query, which explains degraded-field behavior an agent would otherwise find confusing.

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?

Three sentences, front-loaded with the return shape and the contact-omission rule before the implementation paths. Dense but every sentence carries information; 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?

No output schema exists, and the description compensates by naming the returned data (profile, groups, email, contact id, group/savedSearch ids, sharing agent) and the fallback path. For a zero-required-parameter read tool, nothing an agent needs to call and interpret it 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%, so both parameters are already fully documented, including the view enum and the include_contacts default. The description restates include_contacts behavior (redundant with schema) but adds no new syntax or format meaning beyond it. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource: returns the OneHome user profile plus attached consumer-share groups. It clearly distinguishes itself from siblings like onehome_get_groups and onehome_get_session_context by centering on the signed-in user's profile.

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?

Explains the two execution paths and when each fires: the GraphQL `user` endpoint for full agent/registered users, versus the checkToken fallback for magic-link consumer-share sessions where `user { }` is access-denied. This tells the agent what to expect by session type, though it does not name sibling alternatives explicitly.

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

onehome_get_walk_scoreLocal-Logic location scores near a lat/lngA
Read-onlyIdempotent

Local-Logic location scores for a coordinate — pedestrian / car / cycling / transit friendliness, plus proximity summaries for groceries, restaurants, parks, primary + high schools. Each score is a { value, text } pair (value 0-5, text a one-line description). Returns an error field with HTTP details if the upstream rejected the request.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lngYes
languageNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover read-only and idempotent behavior. The description adds useful context about the error field (HTTP details when upstream rejects) and the score value/text structure, which goes beyond what annotations declare.

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

Conciseness5/5

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

Two sentences, no filler, with the core purpose front-loaded and return details following. Every sentence adds value and the structure is clean.

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

Completeness4/5

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

Given there is no output schema, the description explains the score pair format and error field, which covers the main return expectations. It does not mention language defaults or the overall response envelope, but for a read-only getter with annotations, it is nearly complete.

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

Parameters1/5

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

Schema description coverage is 0%, so the description must compensate, but it does not. It never explains what `lat`, `lng`, or `language` mean or how they affect the result. It only says 'for a coordinate,' which vaguely implies lat/lng but leaves language entirely undefined. For a tool with zero schema help, this is a critical gap.

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

Purpose5/5

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

The description states a specific resource ('Local-Logic location scores') and the exact kind of data returned (pedestrian/car/cycling/transit friendliness plus proximity summaries). It clearly distinguishes itself from sibling tools like get_property or get_schools, which focus on other data types.

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 makes it obvious this is for location scores near a coordinate, providing clear context for when to call it. However, it does not explicitly mention alternatives or situations where it should not be used, so it lacks the exclusion guidance that would earn a 5.

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

onehome_graphqlSend a raw GraphQL document to services.onehome.comA
Read-only

Power-user escape hatch — send a raw GraphQL document with variables. Returns the whole { data, errors, status, url } envelope, unprojected, so you can read upstream schema errors directly. Note the default: view is compact, which strips image/avatar URLs out of data (every envelope key and every non-media field is kept). Pass view: 'full' when you need the envelope byte for byte — worth doing if you are here because a payload is not what you expected, so a missing field is never this server's doing. Operation names live in the portal bundle; common ones include GetOneHomeUser, GetListings, GetPins, ListingById, MediaListingById, GetSavedSearches, ListingSuggestionsSearch. (LocalLogic schools/walk-score are REST endpoints, not GraphQL operations — use onehome_get_schools / onehome_get_walk_score.) Pass query (the full document body), an operation_name matching the document, and any variables as JSON. Read-only: documents containing a mutation or subscription operation — or that cannot be parsed as a read-only query document — are refused.

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 OneHome's payload untouched. No field projection: this server has no verified record of which OneHome fields matter, and inventing one would risk dropping a field a caller needs.
queryYes
variablesNo
operation_nameYes

TDQS

A4.8/5.0
Behavior5/5

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

Adds substantial context beyond annotations: it discloses the default `view: compact` strips image/avatar URLs, that the return is the raw `{ data, errors, status, url }` envelope unprojected, and that mutations/subscriptions are refused. None of that is in the annotations, which only cover read-only/idempotency hints.

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?

Dense but front-loaded: the escape-hatch framing comes first, then the view default warning, then the operation list and parameter guidance. It is long but every sentence carries information an agent needs; slightly verbose with the operation-name enumeration.

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

Completeness5/5

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

Despite no output schema and low schema coverage, the description covers return shape, default behavior, refusal semantics, sibling alternatives, and the parameter contract. Almost nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is only 25%, so the description compensates by explaining `view` semantics (compact vs full and what compact strips), and that `query`, `operation_name`, and `variables` are an interlocked set. It also warns operation_name must match the document. This goes well beyond the sparse schema descriptions.

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

Purpose5/5

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

States a specific verb and resource ('send a raw GraphQL document to services.onehome.com') and frames itself as a 'power-user escape hatch'. Clearly distinguishable from siblings like onehome_search_properties, which are typed operations.

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 use it ('pass view: full when you need the envelope byte for byte' and 'worth doing if you are here because a payload is not what you expected'), and routes users away for LocalLogic endpoints to onehome_get_schools / onehome_get_walk_score. Covers both when-to-use and alternatives.

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

onehome_healthcheckVerify OneHome auth + GraphQL reachabilityA
Read-onlyIdempotent

Round-trip a minimal authenticated query through the configured transport. Picks GetSavedSearchBySearchId for magic-link consumer-shares (works for them) or GetOneHomeUser for agent/registered sessions. Returns the auth mode, token expiry, fetchproxy bridge role (when applicable), elapsed time, and any error detail. Run this first when a tool fails — it isolates "is auth wired up?" from "is the API itself misbehaving?".

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations declare readOnlyHint, openWorldHint, and idempotentHint, already indicating safety and non-mutating behavior. The description adds value by disclosing that it returns auth mode, token expiry, bridge role, elapsed time, and error detail, which is beyond the annotations. It also hints at the mechanism (round-trip) and its diagnostic role, covering key behavioral aspects without contradicting annotations.

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

Conciseness5/5

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

The description is a compact paragraph that front-loads the core action, then explains the query selection logic, output information, and usage guidance. Every sentence adds value, with no fluff or redundancy, and it reads naturally as a cohesive, informative unit.

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 the tool has no parameters and no output schema, the description fully covers what an agent needs: what it does, which queries it uses, what it returns, and when to use it. There are no gaps in operational knowledge for an agent to call it correctly, as it is a parameterless action.

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 no parameters, and with 0 parameters, the description naturally cannot add parameter-specific detail. The baseline for zero parameters is 4, and the description does explain the operational context (which queries are used, what it returns), which compensates for the lack of parameters. Since schema coverage is 100% and there are no params, the description's contextual detail earns a 4.

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

Purpose5/5

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

The description clearly states the tool's purpose: to round-trip a minimal authenticated query through the transport, verifying auth and GraphQL reachability. It specifies the exact queries used and the distinction between consumer-share vs agent sessions, which distinguishes it from sibling tools that fetch specific data.

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

Usage Guidelines5/5

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

It explicitly instructs to run this tool first when another tool fails, and explains that it isolates the question of whether auth is wired up from actual API misbehavior. This provides clear when-to-use guidance and contextual reasoning, though it doesn't mention alternatives directly, it's clear this is a diagnostic step.

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

onehome_resolve_addressesBulk-resolve street addresses to OneHome URLs + listing_idsA
Read-onlyIdempotent

Resolve up to 100 structured addresses to OneHome canonical portal URLs + listing OSK ids in one call. Each input is a {address, city?, state?, zip?} object. Output preserves input order; one row per input, either {resolved: true, url, listing_id, address} or {resolved: false, error, query}; a row that failed (rather than genuinely missed) also carries status = error_kind and retryable — timeout / bridge_down / pending mean retry it, not "no listing". The whole call is bounded by an overall deadline; unsettled rows come back status: "pending" with a top-level pending count. Walks the exact same 2-rung ladder as onehome_get_by_address via the shared helper (rung 1: ListingSuggestionsSearch against the magic-link saved-search scope; rung 2: search-fallback page-walking the broader saved-search / raw-listings pool bounded by groupId) — bulk and single cannot diverge. Each row surfaces matched_via: "suggestions" | "search_fallback" so callers see which rung produced the hit. Concurrent fan-out capped at 6 in flight to avoid swamping the upstream. Per-row errors captured — one bad address never fails the whole batch. group_id defaults to the magic-link session context. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
group_idNoOneHome group id to scope every row. Defaults to magic-link session context.
addressesYesUp to 100 address inputs. For higher counts, batch into multiple calls.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnly/openWorld/idempotent). Discloses the deadline-bounded behavior, the `pending` status semantics (retry, not 'no listing'), error_kind values, the 2-rung resolution ladder, matched_via surfaced per row, and concurrency capped at 6 in-flight. This is exactly the kind of behavioral detail annotations cannot express.

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

Conciseness3/5

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

Front-loaded with the core purpose and limits, but the middle is dense and repetitive: the pending/retry contract is stated twice, the ladder description is verbose, and the final 'Read-only; safe to call repeatedly' partly repeats the readOnly/idempotent annotations. Information-rich but not tight.

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 2-param bulk tool with no output schema, the description covers input shape, ordering, per-row success/failure schema, error taxonomy, deadline behavior, and resolution provenance. Missing only explicit rate-limit figures or size guidance beyond 'up to 100' and pagination across calls, which is minor.

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 already documents every parameter, so baseline is 3. The description adds meaning beyond the schema by explaining input ordering is preserved, that group_id defaults to the magic-link session context, and the per-row error contract — context the schema alone does not carry.

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

Purpose5/5

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

Specific verb (resolve), resource (structured addresses), scope (up to 100), and output (OneHome URLs + listing OSK ids). Explicitly distinguishes from the single-row sibling `onehome_get_by_address` by noting both walk the same 2-rung ladder via a shared helper, so an agent can tell why bulk vs single exists.

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

Usage Guidelines4/5

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

States clearly when to use bulk (batch address resolution, up to 100) and ties it explicitly to the single-address sibling, but never states when NOT to use it (e.g., when a single address is needed, or when group_id must be overridden). No exclusions or prerequisite guidance.

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

onehome_search_propertiesSearch listings inside a OneHome group / saved shareA
Read-onlyIdempotent

Fetch listings inside a OneHome consumer-share. Two modes:

  • With saved_search_id: fetch the agent-curated collection (the standard 'Homes at ' view). The MCP first resolves the saved search's listingIds and then inflates them via listingsBySavedSearchId — this is the only mode that works for non-agent consumer accounts.

  • With just group_id and no saved_search_id: try the raw listings(groupId, browseParameter) endpoint. If page 0 comes back empty with no reported results (the access-restricted shape consumer-shares hit) AND the session context has a savedSearchId for that same group, the tool falls back to the saved-search path and marks the response fell_back_to_saved_search: true. If there's no fallback target it raises a clear error rather than silently returning empty. An empty later page (paging past the end) is returned as an empty page, never swapped for the saved-search collection.

Both args default from the MCP's bootstrapped session context (the magic-link checkToken response) when neither is passed explicitly. Sort is MajorChangeTimestamp DESC ('Newest') unless overridden. include_dislikes: false by default — flip it on to include listings you've thumbs-downed in OneHome.

Listings here are returned via the GraphQL listing-card projection, which does NOT include PublicRemarks — so there is no description field on search results and no include_description flag to opt into one. Each listing carries the structured extracted_features object instead. Use onehome_get_property(listing_id) per row when you need the full description for a specific listing.

ParametersJSON Schema
NameRequiredDescriptionDefault
group_idNo
page_numNo
page_sizeNo
sort_fieldNoGraphQL dotted-path, e.g. property.MajorChangeTimestamp or property.ListPrice
sort_orderNo
saved_search_idNo
include_dislikesNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, openWorld), and the description adds substantial behavior beyond them: the empty-page fallback trigger, the `fell_back_to_saved_search` marker, the deliberate error instead of silent empty, the rule that paging past the end is never swapped, defaults bootstrapped from session context, default sort, and default include_dislikes.

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 mode selection before the fallback mechanics, and every sentence carries operative detail (fallback, error shape, projection limits). It is dense and long, but the length is buying real behavioral information rather than restating the name.

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, and the description compensates by describing the GraphQL listing-card projection, the absence of PublicRemarks/description, the presence of extracted_features, and the pointer to onehome_get_property for full text. An agent has everything needed to call and interpret results.

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

Parameters4/5

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

Schema coverage is only 14% with 7 params, so the description must compensate and largely does: it explains session-context defaults for group_id/saved_search_id, the include_dislikes default and semantics, the sort default and override, and empty-page behavior tied to page_num. It does not explicitly bound page_size or fully characterize sort_order, leaving minor gaps.

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 ('Fetch listings inside a OneHome consumer-share') and immediately distinguishes the two operating modes by argument shape. An agent can tell this apart from onehome_get_saved_search_with_listings and onehome_get_property 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 Guidelines5/5

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

Explicitly says when each mode applies (saved_search_id vs group_id alone), which mode works for non-agent consumer accounts, and routes the agent to onehome_get_property(listing_id) per row when a full description is needed. Exclusions and fallback conditions are spelled out.

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

onehome_search_suggestionsFree-text suggestion search across MLS feedsA
Read-onlyIdempotent

Cross-feed suggestion search by address, MLS number, or partial query. Bypasses the group/saved-search structure and hits the global suggestion endpoint — useful for "find an address" or "look up by MLS number". Returns id, address parts, beds/baths, list price, thumbnail per match. Inflate any result with onehome_get_property. Optional group_id scopes suggestions to one OneHome market.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
group_idNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds valuable behavioral context: it lists exact return fields (id, address parts, beds/baths, list price, thumbnail), explains the global endpoint behavior that bypasses groups, and clarifies the effect of the optional group_id scope. This goes beyond the annotations without contradicting them.

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

Conciseness5/5

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

The description is compact, with the primary purpose front-loaded in the first sentence, followed by the use case, return fields, follow-up hint, and parameter explanation. Every sentence contributes distinct information with no filler or repetition.

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

Completeness5/5

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

For a simple two-parameter search tool with no output schema, the description covers the purpose, the expected return format, the scoping behavior, and the recommended follow-up. No essential detail is missing for an agent to invoke it correctly.

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 schema description coverage at 0%, the description carries full responsibility for parameter meaning. It explains query as 'address, MLS number, or partial query' and group_id as scoping to 'one OneHome market'. Both parameters receive clear, non-redundant explanations that exceed what the bare schema provides.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Cross-feed suggestion search' and then enumerates the accepted search keys (address, MLS number, partial query). It explicitly states it bypasses the group/saved-search structure and hits a global endpoint, which distinguishes it from sibling search tools like onehome_search_properties or onehome_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 concrete use cases ('find an address', 'look up by MLS number') and explains that it bypasses group/saved-search structure, implying when it is preferable to structured search. It also advises a follow-up action (inflate with onehome_get_property). However, it does not explicitly name alternative search tools or state when not to use it, so it stops short of a full when/when-not guide.

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

onehome_set_active_sessionSwitch which registered OneHome session is activeA
Idempotent

Force a specific registered session to be the active one. Useful when MLS-suffix routing picks the wrong session (e.g. two shares in the same MLS, a free-text search across multiple MLSes, or a listing without a ~MLS suffix). Pass a session_id previously returned by onehome_set_auth or surfaced in onehome_get_session_context. The active session answers any request without a ~MLS-suffixed listing id AND any ~MLS request whose MLS matches its own; a ~MLS id matching several other sessions errors until you pick one here.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession id from a previous `onehome_set_auth` response, or one of the ids listed by `onehome_get_session_context`.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover safety/idempotency (readOnly false, idempotent, non-destructive). The description adds the routing semantics that no structured field carries: which requests the active session answers and the error case when a ~MLS id matches multiple sessions. It stops short of saying whether the switch persists across calls or what it returns.

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 action, then rationale, then sourcing, then routing rules. Dense but each sentence earns its place; the long final sentence is a bit packed but justifies its length by explaining routing precedence and the ambiguity error.

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 single-parameter switching tool with no output schema, the description covers when to use, input sourcing, and routing consequences. It leaves minor gaps (persistence and return value) but is otherwise 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 100%, so the session_id parameter is already documented. The description reinforces the two legitimate sources (set_auth response, get_session_context), but adds no format or syntax detail beyond the schema. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb (Force/set active) and resource (registered session), and precisely distinguishes from siblings: it is the tool that overrides MLS-suffix routing, while set_auth registers and get_session_context lists.

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 gives the trigger condition (MLS-suffix routing picks the wrong session) with three concrete examples, and states where the session_id comes from. The agent knows exactly when to reach for this over other session tools.

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

onehome_set_authRegister an additional OneHome session at runtimeA
Destructive

Provide a magic-link URL, a raw JWT bearer, or an email-token to ADD another authenticated session to the MCP — useful when a buyer holds shares across multiple agents/MLSes (one magic link per share). The MCP detects the input shape (URL → extract ?token=; 3-segment JWT → use directly; otherwise → treat as email-token and exchange via /api/authentication/checkToken), registers a new direct-bearer transport, and marks it active. Previously-registered sessions stay registered — switch back with onehome_set_active_session(session_id), or let MLS-suffix routing (~CANOPY, ~HCAOR, …) pick automatically per listing. The response includes the assigned session_id, the new active_session_id, the auth_mode/status, the session_context the checkToken response yielded, and a bearer_fingerprint of the resolved JWT (first 8 + … + last 4 chars) — never the full bearer. SECURITY: the input itself sits in your chat history; treat magic links as short-lived credentials.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputYesMagic-link URL (https://portal.onehome.com/...?token=eyJ...), JWT bearer (3 dot-separated segments), or raw email-token (single base64 segment).

TDQS

A5/5.0
Behavior5/5

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

The description adds substantial behavioral detail beyond the annotations: input-shape detection rules, registration of a new direct-bearer transport, activation behavior, preservation of previous sessions, response fields, fingerprint format, and a security warning about chat-history exposure. It clearly sets expectations for side effects.

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 appropriately so for a security-sensitive, multi-format auth tool. It is front-loaded with the core action, then uses compact, technical structure and a distinct SECURITY section. No sentence is filler.

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

Completeness5/5

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

With no output schema, the description's enumeration of response contents is essential and sufficient. It covers input formats, processing behavior, session lifecycle, routing alternatives, response details, and security caveats, making it complete for an agent to invoke the tool correctly.

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

Parameters5/5

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

The schema already describes the three accepted input forms, but the description goes further by specifying exactly how each form is resolved: URL extracts ?token=, 3-segment JWT is used directly, and otherwise it is exchanged via /api/authentication/checkToken. This materially improves correct invocation.

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

Purpose5/5

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

The description clearly states the tool's purpose: adding another authenticated OneHome session at runtime via magic-link URL, JWT, or email-token. It differentiates itself from onehome_set_active_session, which switches among already-registered sessions, so an agent can distinguish them immediately.

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

Usage Guidelines5/5

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

It provides an explicit use case (buyer spans multiple agents/MLSes) and names the alternative behavior: switching back via onehome_set_active_session or relying on MLS-suffix routing. This gives an agent clear when-to-use and when-to-prefer-another-tool guidance.

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. 2 tool updatesv1.1.9
    • Changedonehome_get_groups1 field changed
      • addedInput schema / properties / include_contacts
        Added value: +{
        +  "description": "Include contact details: the share's member e-mail addresses and the agent's e-mail, phone and office phone. Default false — the agent's name, office and team are always returned.",
        +  "type": "boolean"
        +}
    • Changedonehome_get_user1 field changed
      • addedInput schema / properties / include_contacts
        Added value: +{
        +  "description": "Include contact details: the share's member e-mail addresses and the agent's e-mail, phone and office phone. Default false — the agent's name, office and team are always returned.",
        +  "type": "boolean"
        +}
  2. 2 tool updatesv1.1.5
    • Changedonehome_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"
    • Changedonehome_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. 21 tool updatesv1.0.0
    • Changedonehome_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"
    • Changedonehome_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"
    • Changedonehome_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"
    • Changedonehome_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"
    • Changedonehome_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"
    • Changedonehome_get_groups1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedonehome_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"
    • Changedonehome_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"
    • Changedonehome_get_saved_search1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedonehome_get_saved_search_with_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"
    • Changedonehome_get_schools1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedonehome_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"
    • Changedonehome_get_user1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedonehome_get_walk_score1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedonehome_graphql1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedonehome_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"
    • Changedonehome_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"
    • Changedonehome_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"
    • Changedonehome_search_suggestions1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedonehome_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"
    • Changedonehome_set_auth1 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. 4 tool updatesv0.15.1
    • Changedonehome_compare_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 OneHome's payload untouched. No field projection: this server has no verified record of which OneHome fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedonehome_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 OneHome's payload untouched. No field projection: this server has no verified record of which OneHome fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedonehome_get_user1 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 OneHome's payload untouched. No field projection: this server has no verified record of which OneHome fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedonehome_graphql1 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 OneHome's payload untouched. No field projection: this server has no verified record of which OneHome fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
  5. 21 tool updatesv0.13.1
    • First observedonehome_bulk_get
    • First observedonehome_calculate_affordability
    • First observedonehome_calculate_mortgage
    • First observedonehome_compare_properties
    • First observedonehome_get_by_address
    • First observedonehome_get_groups
    • First observedonehome_get_property
    • First observedonehome_get_property_photos
    • First observedonehome_get_saved_search
    • First observedonehome_get_saved_search_with_listings
    • First observedonehome_get_schools
    • First observedonehome_get_session_context
    • First observedonehome_get_user
    • First observedonehome_get_walk_score
    • First observedonehome_graphql
    • First observedonehome_healthcheck
    • First observedonehome_resolve_addresses
    • First observedonehome_search_properties
    • First observedonehome_search_suggestions
    • First observedonehome_set_active_session
    • First observedonehome_set_auth

TDQS

A3.9/5.0

Scored across 21 tools

Disambiguation3/5

Several tool clusters overlap: onehome_search_suggestions, onehome_get_by_address, and onehome_resolve_addresses all perform address/MLS lookup, while onehome_get_property, onehome_bulk_get, and onehome_compare_properties all fetch listing records, and onehome_get_saved_search duplicates onehome_get_saved_search_with_listings. The very detailed descriptions and cross-references (single vs bulk vs compare, cross-feed vs scoped) help, but boundaries are not crisp enough for instant selection.

Naming Consistency4/5

Nearly every tool follows a predictable onehome_verb_noun snake_case pattern (onehome_search_properties, onehome_get_property, onehome_set_active_session). Minor deviations exist where the verb trails (onehome_bulk_get) or is absent (onehome_graphql, onehome_healthcheck), but overall the convention is consistent and readable.

Tool Count3/5

At 21 tools the set is on the heavy side, with several tools that exist mainly as convenience combos or aliases of others (get_saved_search_with_listings, bulk_get, resolve_addresses vs get_by_address). Each is justifiable for the broad domain (search, fetch, sessions, location data, calculators), but the surface feels somewhat over-expanded for a consumer-share viewer.

Completeness4/5

Coverage is strong across the property-surfacing domain: search, single/bulk/compare fetches, photos, schools, walk score, mortgage/affordability math, session/auth management, a healthcheck, and a raw GraphQL escape hatch. The main gap is write-side interaction (liking/disliking or saving listings, saving searches), which is only partially alluded to via include_dislikes.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    Provides real-time access to Zillow real estate data, enabling property search, details, Zestimates, market trends, and mortgage calculations via natural language.
    9 npm
    55
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables Claude to query ARMLS Spark/FlexMLS real estate data including active listings, comparable sales, market statistics, and open houses via MCP tools.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables natural language access to Redfin real estate data, including property search, details, photos, market reports, price history, climate risk, and saved homes/searches, by routing requests through your own signed-in browser session.
    22
    913 npm
    3
    MIT