onehome-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@onehome-mcpwhat homes did my agent save for me?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
onehome-mcp
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 |
|
| Paste the raw bearer from devtools Network panel. Most direct. |
|
| Paste the full URL your agent sent — we extract the |
| (no env) + fetchproxy extension installed + signed-in | We wait for your tab to fire any GraphQL request, snapshot the Authorization header, and reuse it. |
Related MCP server: armls-spark-mcp-server
Tools
Tool | What it does |
| Smallest auth probe — returns your OneHome profile (name, email) and the groups your agent shared. |
| List the OneHome "groups" your agent has shared with you (each one a market / curated listing bucket). |
| Fetch an agent-curated saved search by id — name, filter criteria, polygon, and the OSK listing ids that compose the share. |
| The "show me my saved homes" flow in one round trip — saved search plus its inflated listings. |
| Listings within a group; optionally scoped to a saved search. |
| Free-text suggestion search (address, MLS #) across all feeds. |
| Resolve a single free-text street address to a listing's portal URL + id. |
| Bulk-resolve up to 100 structured addresses to portal URLs + listing ids; concurrent, per-row error capture. |
| Full property record by listing id or portal URL. |
| Fetch up to N listings in one call — one structured row per id, per-row error capture. |
| Full media gallery — Thumbnail / Medium / Large variants + room descriptions. |
| 2-8 listings side-by-side. Per-row error capture; calls are concurrent. |
| Local-Logic primary + high schools near a lat/lng. |
| Local-Logic walk / transit / bike / car friendliness scores. |
| Power-user escape hatch — send a raw GraphQL document with variables. |
| Local PITI calculator. Same math as the other realty MCPs. |
| Local 28/36 DTI solver — max home price you can afford. |
| Add another authenticated session at runtime (magic link / JWT / email-token) for buyers holding shares across multiple agents. |
| Force a specific registered session to be the active one (overrides MLS-suffix routing). |
| List every registered session — auth mode, token expiry, and the group / saved-search / agent scope each bootstrapped. |
| End-to-end auth + GraphQL smoke check with token-expiry diagnostics. |
Install
The simplest path is the published Claude plugin (.mcpb install). For local dev:
git clone https://github.com/chrischall/onehome-mcp
cd onehome-mcp
npm install
npm run buildThen 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.jsTests 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 toolsonehome_bulk_getBulk-fetch OneHome listings by idARead-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, property } on success or { listing_id, error } on failure — 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 bridge timeouts are retried once per row before being captured as an error. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | ||
| listing_ids | Yes | Listing OSK ids to fetch. 1..200. For higher counts, batch into multiple calls. | |
| saved_search_id | No | ||
| include_description | No | Include the raw `description` (PublicRemarks) on each row. Defaults to `false`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds significant behavioral details beyond annotations: concurrent fan-out with cap of 6, retry policy for timeouts, per-row error handling, default omission of `description`, and default `group_id` from session. No contradictions with readOnlyHint/idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with main purpose, each sentence adds value. Slightly verbose in detailing concurrency and retry, but all information is relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Explains return format (rows with success/error), concurrency limits, and default behavior. No output schema, but description provides sufficient detail. Missing specifics on `saved_search_id` and `group_id` fallback, but overall complete for core functionality.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds context for `listing_ids` (batch size constraint reiterated), explains `include_description` default and effect, and `group_id` default behavior. Schema coverage is 50% but description compensates for some gaps. `saved_search_id` lacks extra clarification.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes specific verb+resource (fetch listings by id), distinguishes from sibling `onehome_compare_properties` by clarifying it returns rows per id instead of a side-by-side summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly contrasts with `onehome_compare_properties` for side-by-side needs, and advises batching for more than 200 ids. No explicit exclusion of other alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onehome_calculate_affordabilityCalculate maximum home price you can affordARead-onlyIdempotent
Solve for the maximum home price you can afford under the standard 28/36 DTI rule. Inputs: monthly income, recurring monthly debts (car/student loans), down payment, interest rate, optional property-tax rate / insurance / HOA / loan term. Output: max home price, binding constraint (front-end vs back-end), and the PITI breakdown at that price. Same math as zillow-mcp / redfin-mcp / compass-mcp / homes-mcp. No network — pure local math.
| Name | Required | Description | Default |
|---|---|---|---|
| hoa_monthly | No | ||
| back_end_dti | No | ||
| down_payment | Yes | ||
| front_end_dti | No | ||
| interest_rate | Yes | ||
| monthly_debts | No | ||
| monthly_income | Yes | ||
| loan_term_years | No | ||
| insurance_annual | No | ||
| property_tax_rate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=true, idempotentHint=true, openWorldHint=false. The description reinforces this by stating 'No network — pure local math,' and discloses the DTI rule. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (four sentences) and front-loaded with the purpose. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers inputs and outputs adequately for a straightforward calculator. It mentions the output includes 'max home price, binding constraint, and PITI breakdown.' However, it does not specify default DTI values or behavior for optional parameters, which would enhance completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It lists inputs like 'monthly income, recurring monthly debts, down payment, interest rate, optional property-tax rate / insurance / HOA / loan term' but does not detail each parameter's meaning or defaults (e.g., front_end_dti, back_end_dti). The 28/36 rule implies defaults, but explicit mapping would improve clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Solve for the maximum home price you can afford under the standard 28/36 DTI rule.' It lists inputs and outputs, and distinguishes from siblings like onehome_calculate_mortgage by specifying the DTI rule and local math.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states 'No network — pure local math,' clarifying it's a local calculation. It also notes 'Same math as zillow-mcp / redfin-mcp / compass-mcp / homes-mcp,' providing context for when to use. However, it does not explicitly exclude alternatives or provide 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_calculate_mortgageCalculate mortgage PITIARead-onlyIdempotent
Local-only mortgage payment calculator. Returns a full PITI breakdown (principal + interest, property tax, insurance, HOA, PMI) and total interest over the life of the loan. No network call. Provide either down_payment OR down_payment_percent; defaults to 20%. Property tax can be given as property_tax_annual or property_tax_rate (% of home price). PMI applies automatically when LTV > 80% and pmi_rate is provided.
| Name | Required | Description | Default |
|---|---|---|---|
| pmi_rate | No | Annual %, applied when LTV > 80% | |
| home_price | Yes | ||
| hoa_monthly | No | ||
| down_payment | No | ||
| interest_rate | Yes | Annual %, e.g. 6.5 | |
| loan_term_years | No | Default 30 | |
| insurance_annual | No | ||
| property_tax_rate | No | Annual % of home price | |
| property_tax_annual | No | ||
| down_payment_percent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint and idempotentHint true, confirming no side effects. The description adds beyond these by stating it is local-only (no network call) and explaining PMI auto-application when LTV > 80% if pmi_rate is provided. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph of three sentences. The first sentence establishes the overall purpose, and the remaining sentences provide key parameter semantics. Every sentence adds value, with no extraneous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, 2 required, and no output schema, the description covers the main functionality, defaults, and parameter relationships. It misses mentioning that loan_term_years defaults to 30 (though schema states that) and could detail the exact output fields, but the core information is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, so the description must compensate. It does so effectively: explains mutual exclusivity of down_payment and down_payment_percent with default 20%, property tax alternatives, and PMI condition. This adds critical meaning beyond the schema's minimal descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool is a local-only mortgage payment calculator returning a full PITI breakdown and total interest. The verb 'calculate' and resource 'mortgage PITI' are specific. None of the sibling tools perform this exact function, so it is well-distinguished.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: it is local-only (no network call), and specifies that down_payment or down_payment_percent must be provided (with default 20%), and property tax can be given as annual or rate. It implicitly advises when to use this tool (for mortgage calculations) and clarifies parameter alternatives, though it does not explicitly state when not to use.
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-sideARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact 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. | |
| targets | Yes | ||
| group_id | No | ||
| include_summary | No | Include 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_description | No | Include the raw `description` (PublicRemarks) on each row. Defaults to `false`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint/openWorldHint/idempotentHint annotations: it discloses concurrency, per-row error containment, default omission of description and summary, the redundant ~30% summary weight, and the compact/full view caveat. This is rich, honest behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient: every sentence adds operational value, with the core purpose first and important defaults and caveats clearly laid out. No filler or repetition of structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description thoroughly covers response rows, errors, defaults, and view behavior, but it does not explain saved_search_id or group_id at all, and there is no output schema to compensate. This leaves gaps an agent must resolve by guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful semantics for include_description, include_summary, view, and the preferred target identifier (listing_id vs url). However, it omits saved_search_id and group_id, both of which appear in the schema without their own descriptions, so coverage is incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch 2 or more OneHome listings and align their facts side-by-side.' This clearly distinguishes the tool from single-listing fetchers like onehome_get_property and search tools like onehome_search_properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys a clear use case — comparing multiple OneHome listings — and explains target selection via listing_id or url. However, it does not explicitly state when to prefer this tool over siblings such as onehome_bulk_get or onehome_get_property, nor does it give exclusions.
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 addressARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | ZIP code, e.g. "28746" | |
| city | No | e.g. "Lake Lure" | |
| view | No | 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. | |
| state | No | Two-letter state abbreviation, e.g. "NC" | |
| address | Yes | Street address line, e.g. "126 Sleeping Bear Ln". | |
| group_id | No | Optional OneHome group id to scope the suggestion search. Defaults to the magic-link session context when present. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses the two-rung lookup algorithm (ListingSuggestionsSearch then search-fallback), the bounded groupId pool, the matched_via output values, and the no-throw 'no listing found' behavior. This gives the agent an unusually complete picture of how the call behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads purpose and then compactly covers algorithm, return shape, error behavior, and safety. Every clause adds operational information; there is no filler or redundant restating of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully specifies the return object including url, listing_id, address, resolved, and matched_via, plus the failure response. Combined with 100% parameter coverage and read-only/idempotent annotations, the agent has everything needed to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, and the schema already explains zip, city, state, address, view, and group_id well. The tool description adds meaning beyond the schema by clarifying that group_id bounds both the suggestion search and the fallback page-walk, which the schema only attributes to the suggestion search.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence clearly names the verb 'Resolve', the resource 'a OneHome listing', and the outputs 'canonical portal URL and id', so there is no tautology. It distinguishes this from search/property tools by focusing on free-text street address resolution, but it does not explicitly differentiate itself from the sibling onehome_resolve_addresses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: resolving a free-text street address with optional city/state/zip to a listing URL and id in one call. It does not explicitly state when not to use it or name alternatives such as onehome_resolve_addresses or onehome_search_suggestions, so exclusion guidance is missing.
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 groupsARead-onlyIdempotent
List the OneHome groups your agent has shared with you. 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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, openWorldHint, idempotentHint), the description adds specific behavioral details: it returns GraphQL list for full agents and synthesizes a one-entry list for magic-link sessions using checkToken context. This is rich transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. The first sentence states the primary purpose, the second explains variants. It is front-loaded and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and no output schema, the description fully covers the behavior for both user types. It is complete for a simple listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters and 100% schema coverage, the baseline is 4. The description does not add parameter-specific information but explains different behaviors, which is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists OneHome groups the agent has shared. It uses a specific verb 'list' and resource 'groups', and distinguishes between full agent/registered users and magic-link consumer-share sessions, providing precise context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context on when the tool behaves differently based on user type (full agent vs magic-link), which implicitly guides usage. However, it does not explicitly state when not to use this tool or mention alternatives among siblings.
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 listingARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| group_id | No | ||
| listing_id | No | ||
| saved_search_id | No | ||
| include_description | No | Include the raw `description` (PublicRemarks) in the response. Defaults to `false` — `extracted_features` is always populated and usually sufficient. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds significant behavioral context beyond annotations: defaults for group_id and include_description, extracted_features processing, lot_size handling (null for condos), raw description omission. Annotations (readOnlyHint, idempotentHint, openWorldHint) are consistent and complemented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single dense paragraph that packs a lot of info. Could be more structured (bullets) but every sentence adds value; front-loaded with purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Highly complete: no output schema, but description details return fields comprehensively. Covers all 5 parameters, defaults, edge cases (lot_size null for condos), and behavioral notes. Agent can invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only 20% schema coverage, but description explains all 5 parameters: url/listing_id as identifier options, group_id session default, include_description default false with rationale, saved_search_id implied. Adds meaning far beyond bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it fetches full details for a single OneHome listing by id or portal URL, listing many specific fields returned. It is distinguished from siblings like onehome_get_by_address and onehome_search_properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on when to use (fetch details by id/URL) and defaults (group_id to session, include_description false). Lacks explicit when-not-to-use and alternative sibling references, but the purpose is clear enough.
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 listingARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| group_id | No | ||
| listing_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds value by detailing the response structure and that it returns one entry per image, but does not introduce additional behavioral traits beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences. The first sentence states purpose and output, the second gives parameter guidance. No wasted words, front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the return values adequately, but omits the group_id parameter entirely. Given no output schema and moderate tool complexity, the description is adequate but has a clear gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries full burden. It explains that listing_id is an ID and url is a portal URL, but fails to mention group_id, leaving one of three parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches the full media gallery for a OneHome listing, specifying the return format with CDN URLs, dimensions, and description. It distinguishes from sibling tools (e.g., onehome_get_property) by focusing solely on photos.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises to pass either listing_id or a portal URL, providing clear context on when to use the tool. However, it does not explicitly state when not to use it or mention any prerequisites, though no alternatives exist among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onehome_get_saved_searchFetch a OneHome saved search by idARead-onlyIdempotent
Fetch the agent-curated saved search by its id (UUID). Returns the search's name, filter criteria (filters[]), polygon, listing count, and the full list of OSK listing ids that compose the consumer share (listing_ids). Pass include_listing_ids: false to suppress the listing-id array if you only need the metadata. This is the canonical consumer-readable endpoint; the by-groupId variant is agent-only. saved_search_id defaults to the MCP's session context when omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| saved_search_id | No | ||
| include_listing_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, openWorldHint, and idempotentHint. The description adds value by detailing the returned fields (name, filters, polygon, listing count, listing_ids), the effect of the 'include_listing_ids' parameter, and the session-context default for saved_search_id. This goes 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with 3-4 sentences, all relevant and front-loaded. There is no redundant information; every sentence adds value: main action, return fields, parameter usage, and endpoint context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description sufficiently lists the returned fields. It covers both optional parameters and their effects. It could be more complete by mentioning error behavior or the exact shape of nested objects like 'filters' and 'polygon', but for a simple read tool this is quite comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully explains both parameters: 'include_listing_ids' (suppress listing-id array to get only metadata) and 'saved_search_id' (defaults to MCP's session context). This is excellent compensation for the lack of schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly uses the verb 'Fetch' and specifies the resource as 'agent-curated saved search by its id'. It distinguishes from the sibling 'onehome_get_saved_search_with_listings' by noting that this is the 'canonical consumer-readable endpoint' and the by-groupId variant is agent-only, though it could be more explicit about the difference between these tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides guidance on when to use this tool (consumer-readable) vs. the agent-only variant (by-groupId). It also explains the optional parameter 'include_listing_ids' and the default behavior for 'saved_search_id'. It would benefit from explicitly stating when not to use this tool or when to use the sibling.
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 callARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | ||
| page_num | No | ||
| page_size | No | ||
| sort_field | No | GraphQL dotted-path, e.g. property.MajorChangeTimestamp or property.ListPrice | |
| sort_order | No | ||
| saved_search_id | No | ||
| include_dislikes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses internal operations (two internal calls), default values (group_id, saved_search_id from session context, sort default), and limitations (no PublicRemarks). 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise at ~150 words, front-loaded with the key purpose. Each sentence provides essential information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, behavior, return structure, and limitations. Lacks details on pagination behavior or error handling, but overall adequate given the tools complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning for group_id, saved_search_id (defaults), and sort_field (default). But other parameters like page_num, page_size, sort_order, include_dislikes are not described beyond the schema. Schema coverage is low (14%), so more detail would be better.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool combines fetching a saved search and inflating listings into one call. It distinguishes from sibling tools like onehome_get_saved_search and onehome_search_properties by explicitly mentioning the two-call sequence it replaces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use this tool instead of the two-call alternative. Also warns that PublicRemarks are missing and advises using onehome_get_property for full descriptions.
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/lngARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | ||
| lng | Yes | ||
| language | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnly, openWorld, idempotent), the description adds behavioral context: it discloses that the endpoint may return an error field if the session lacks access and mentions it is sometimes agent-only. This is useful for the agent to handle auth responses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, covering key aspects in a few sentences without unnecessary detail. It front-loads the purpose and then adds behavioral notes. It is well-structured and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately explains the return structure (separate lists with name, attributes, proximity) and error handling. It covers the essential information an agent needs to invoke and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description should clarify each parameter. It mentions lat/lng source but does not explain the optional 'language' parameter or provide additional meaning beyond the schema for any parameter. The focus is more on output than inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches Local-Logic school data for a coordinate, distinguishing it from siblings by specifying the data source and structure (separate primary and high-school lists with attributes and proximity).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context by noting that lat/lng usually come from `onehome_get_property`, guiding the agent on how to obtain the required parameters. It does not explicitly list when not to use or alternatives, but the guidance is adequate for selection.
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 sessionARead-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 prefers the session whose mls_id matches the listing's ~MLS suffix. 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[].
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark as readOnly and idempotent. Description adds behavioral detail: returns active_session_id and per-listing routing preference, explaining how it affects tool behavior. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, well-structured, front-loaded with main purpose. Every sentence adds relevant information. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so description must cover return values. It lists fields and explains active session and routing. For a read-only inspection tool, it is complete enough, though could briefly mention no side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, schema coverage 100%. Description adds value by explaining the meaning of returned fields and how they influence other tools, compensating for absence of param guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns one entry per registered session with specific fields (session_id, auth_mode, etc.). The verb 'Returns' and resource 'session' are explicit, distinguishing it from sibling tools like onehome_set_active_session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides guidance on when to use: to see what default values tools will use by defaulting from active session context. Does not explicitly exclude alternatives but implies utility for understanding session context.
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 profileARead-onlyIdempotent
Returns the OneHome user profile + the consumer-share groups attached. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnly/idempotent annotations by disclosing the GraphQL endpoint behavior, the access-denied case for user { }, and exactly what data is used in the fallback. This gives the agent an accurate model of how the tool behaves under different authentication states, with no contradiction to 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. It front-loads the primary return value, then explains the two authentication paths and fallback details without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only profile retrieval tool with one optional parameter and no output schema, the description is complete enough: it names the returned data, covers the main behavioral edge case, and the parameter semantics are fully handled by the input schema. The agent has sufficient information to invoke and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the view parameter is thoroughly documented in the schema itself, including the compact/full distinction and the rationale for no field projection. However, the tool description itself adds no additional parameter meaning beyond what the schema already provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: it returns the OneHome user profile plus attached consumer-share groups. It is specific about the resource and the action, but it does not explicitly differentiate itself from sibling tools such as onehome_get_groups or onehome_get_session_context, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context by distinguishing the two session paths: full agent/registered users query the GraphQL user endpoint, while magic-link consumer-share sessions fall back to checkToken data. It does not explicitly name alternatives or state when not to use this tool, but the context is strong and actionable.
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/lngBRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | ||
| lng | Yes | ||
| language | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, open-world, and idempotent. The description adds value by explaining the output format (value/text pairs) and error handling (returns error field with HTTP details on rejection), which goes 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences are concise and front-loaded. First sentence defines the tool's function and lists outputs; second covers output format and error handling. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no output schema, the description covers the output format and error case well. However, it omits details on coordinate system expected for lat/lng and does not explain the optional 'language' parameter. Minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% with no parameter descriptions. The description implies lat/lng form a coordinate but does not explain the 'language' parameter. It adds minimal meaning beyond the schema, failing to compensate for the lack of param documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it retrieves 'Local-Logic location scores' for a coordinate and enumerates the types of scores (pedestrian, car, etc.). The verb 'get' is specific to a resource, but does not explicitly differentiate from siblings like onehome_get_schools, though the resource is distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. Does not mention prerequisites, coordinate system restrictions, or cases where another tool would be more appropriate.
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.comARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact 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. | |
| query | Yes | ||
| variables | No | ||
| operation_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining that the default view is 'compact', which strips image/avatar URLs, and that passing view:'full' returns the envelope byte-for-byte. It also discloses the exact response envelope: { data, errors, status, url }.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the core purpose, then adds important caveats and examples. Some phrasing is wordy, but each sentence contributes useful operational context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description appropriately explains the response envelope, the compact/full behavior, common operation names, parameter passing, and sibling alternatives. An agent has enough context to invoke this escape-hatch tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, so the description compensates by explaining that query is the full document body, operation_name must match the document, and variables should be passed as JSON. It doesn't exhaustively document query syntax, but it gives enough actionable direction for a raw GraphQL tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's job: send a raw GraphQL document with variables to services.onehome.com and get the full response envelope. It also frames itself as a 'power-user escape hatch' and names common operations, which distinguishes it from the higher-level sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly identifies when to use the tool: when raw GraphQL access is needed. It also gives a concrete when-not by pointing out that LocalLogic schools/walk-score are REST endpoints and directs the agent to onehome_get_schools and onehome_get_walk_score instead.
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 reachabilityARead-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?".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description explains query selection logic, return values (auth mode, token expiry, elapsed time, error detail), and that it's a round-trip. Annotations already indicate readOnly, idempotent, openWorld; description adds concrete behavioral context without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences covering action, session-specific behavior, return values, and usage recommendation. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully describes the healthcheck behavior, return fields, and purpose. No output schema needed given the description covers key outputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist in schema; description doesn't need to add parameter info. Baseline 4 for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool performs a round-trip authenticated query to verify auth and GraphQL reachability, with specific query selection based on session type. Distinguishes itself from sibling data-retrieval tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to run this first when a tool fails to isolate auth issues from API misbehavior, providing clear when-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_resolve_addressesBulk-resolve street addresses to OneHome URLs + listing_idsARead-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}. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | OneHome group id to scope every row. Defaults to magic-link session context. | |
| addresses | Yes | Up to 100 address inputs. For higher counts, batch into multiple calls. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the description doesn't need to repeat those. However, it adds valuable behavioral details: the exact resolving algorithm (2-rung ladder), concurrency cap, per-row error handling, and output order preservation. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise despite being detailed. It front-loads the core purpose in the first sentence, then provides necessary details in subsequent sentences. Every sentence adds value, though slight tightening could improve readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description comprehensively explains the return format (preserved order, resolved/error rows, fields like url, listing_id, matched_via). It also covers error handling, concurrency, and the algorithmic equivalence to the single tool. This fully equips the agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning beyond the schema: it explains the default for group_id (magic-link session context), limits addresses maxItems/shape, and communicates the row-level output structure. This enhances understanding beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool bulk-resolves up to 100 structured addresses to OneHome canonical portal URLs and listing OSK IDs. It distinguishes itself from the sibling tool 'onehome_get_by_address' by explicitly noting they walk the same ladder but this is the bulk variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit guidance on when to use this tool versus the single-address alternative, mentions concurrency cap (6 in-flight), error isolation per row, and the default group_id behavior. This helps the agent choose correctly between sibling tools.
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 shareARead-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_idand nosaved_search_id: try the rawlistings(groupId, browseParameter)endpoint. If that returns 0 (the access-restricted shape consumer-shares hit) AND the session context has asavedSearchId, the tool transparently falls back to the saved-search path. If there's no fallback target it raises a clear error rather than silently returning empty.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | ||
| page_num | No | ||
| page_size | No | ||
| sort_field | No | GraphQL dotted-path, e.g. property.MajorChangeTimestamp or property.ListPrice | |
| sort_order | No | ||
| saved_search_id | No | ||
| include_dislikes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the two endpoint resolution modes, the automatic fallback when group_id returns 0 and a savedSearchId exists, and the default sort order. Notes that listings lack PublicRemarks, explaining why there's no description field. None of this contradicts the readOnlyHint, openWorldHint, and idempotentHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical but well-structured with clear sections for each mode. Every sentence adds value, explaining fallback, defaults, and limitations. Could be slightly tighter but is appropriate for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Considering the tool has 7 parameters, no output schema, and complex fallback logic, the description covers the key behavioral aspects. It explains the listing projection and missing description field. However, it could mention pagination behavior more explicitly and clarify that page_num/page_size are optional.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low (14%), but the description compensates by explaining the purpose and defaults for key parameters like saved_search_id, group_id, include_dislikes, and sort. It does not detail page_num or page_size, but these are standard pagination params. The description adds meaningful context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it fetches listings inside a OneHome consumer-share, with two distinct modes: using saved_search_id for agent-curated collections or group_id with fallback. This distinguishes it from sibling tools like onehome_get_property and onehome_get_saved_search_with_listings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use saved_search_id vs group_id, including the caveat that saved_search_id is the only mode for non-agent consumer accounts. Also explains default behavior from session context and the fallback mechanism. Directs users to onehome_get_property for full description when needed.
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 feedsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| group_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds value by revealing the endpoint behavior (bypassing groups, hitting global endpoint) and listing returned fields (id, address parts, beds/baths, price, thumbnail). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured paragraph of four sentences. It front-loads the core action, then adds context, return info, and optional parameter guidance. Every sentence contributes meaningful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 parameters, no output schema), the description covers purpose, usage, return shape, and parameter hints. It could mention result limits or pagination, but overall it provides sufficient context for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries full burden. It explains the 'query' parameter accepts addresses, MLS numbers, or partial queries, and 'group_id' scopes to a market. While query format specifics are omitted, the description provides meaningful usage context beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it performs a 'cross-feed suggestion search by address, MLS number, or partial query,' and distinguishes itself from siblings by noting it bypasses group/saved-search structures and hits a global endpoint. The verb 'search' combined with specific resource details makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly marks it as 'useful for' address lookups or MLS number searches, and mentions scoping via optional group_id. However, it does not explicitly state when not to use it or name alternative tools for different use cases, leaving some ambiguity for an AI agent.
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 activeADestructiveIdempotent
Force a specific registered session to be the active one. Useful when MLS-suffix routing picks the wrong session (e.g. 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 that doesn't carry a ~MLS-suffixed listing id.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session id from a previous `onehome_set_auth` response, or one of the ids listed by `onehome_get_session_context`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true (mutation) and idempotentHint=true. The description adds context by explaining the consequential effect on subsequent requests. It does not contradict annotations and adequately describes the behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, tightly written with no extraneous information. It is front-loaded with the core purpose and sequentially provides usage context, parameter guidance, and consequence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description fully covers what the tool does, when to use it, where to get the parameter, and the effect on subsequent behavior. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (one parameter with a description). The description adds value by explaining the parameter's source (previous calls to onehome_set_auth or onehome_get_session_context) and its purpose, slightly exceeding the schema's description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Force a specific registered session to be the active one.' It specifies the verb 'force' and the resource 'registered session,' and distinguishes it from sibling tools by focusing on session management, while siblings are largely data retrieval tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Useful when MLS-suffix routing picks the wrong session.' It provides concrete scenarios and references parent tools for obtaining the session_id. It also clarifies the effect on subsequent requests without a ~MLS suffix.
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 runtimeADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | Magic-link URL (https://portal.onehome.com/...?token=eyJ...), JWT bearer (3 dot-separated segments), or raw email-token (single base64 segment). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses registration of a new transport, marking active, and that previous sessions stay. Explains routing using MLS suffixes. Annotations indicate destructiveHint=true, which aligns with state modification. Description adds security notes about magic links in chat history, beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive and well-structured, with clear sections. It front-loads the purpose and input shapes. Slightly long but every sentence adds value; could be tightened slightly but not excessively verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully covers input types, detection, session management, routing, response contents (session_id, active_session_id, auth mode, etc.), and security. No output schema, but response structure is described. Completes the agent's understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single 'input' parameter with schema description. The description greatly expands on valid input formats (URL with token, JWT, email-token) and the detection logic. Provides examples and explains how each is processed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it registers an additional authenticated session using various credential types. It differentiates from sibling tools like onehome_set_active_session by explaining session management and routing with MLS suffixes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use: when a buyer holds shares across multiple agents/MLSes. Details input shape detection (URL, JWT, email-token) and mentions alternatives for session switching by name. Provides clear context on usage.
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. Dates show when Glama detected each change.
4 tool updates
v0.15.1- Changed
onehome_compare_properties1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact 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" +}
- Changed
onehome_get_by_address1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact 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" +}
- Changed
onehome_get_user1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact 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" +}
- Changed
onehome_graphql1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact 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" +}
21 tool updates
v0.13.1- First observed
onehome_bulk_get - First observed
onehome_calculate_affordability - First observed
onehome_calculate_mortgage - First observed
onehome_compare_properties - First observed
onehome_get_by_address - First observed
onehome_get_groups - First observed
onehome_get_property - First observed
onehome_get_property_photos - First observed
onehome_get_saved_search - First observed
onehome_get_saved_search_with_listings - First observed
onehome_get_schools - First observed
onehome_get_session_context - First observed
onehome_get_user - First observed
onehome_get_walk_score - First observed
onehome_graphql - First observed
onehome_healthcheck - First observed
onehome_resolve_addresses - First observed
onehome_search_properties - First observed
onehome_search_suggestions - First observed
onehome_set_active_session - First observed
onehome_set_auth
TDQS
Each tool has a clearly distinct purpose. Address resolution is split into single and batch tools with explicit documentation differentiating them. Property search vs. suggestions, financial calculators, and other tools are all unambiguously separate.
Most tools follow a consistent 'onehome_verb_noun' pattern (e.g., get_property, search_properties), but a few deviate like 'onehome_healthcheck' (noun-verb compound) and 'onehome_graphql' (noun only). Overall pattern is clear and readable.
21 tools is slightly above the typical ideal of 3-15, but each tool serves a distinct need in the real estate domain. The count is justified by the comprehensive feature set and does not feel bloated.
The tool surface covers the full lifecycle of real estate property exploration: address resolution, search, details, photos, comparisons, schools, walk scores, mortgage calculations, and user/group management. No obvious dead ends or missing core operations.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Redfin listings, sale-comps, and neighborhood market data via natural-language queries.
Search real-estate deals, rank top areas, run rental/BRRRR/flip analysis, pull sold comps.
AI-native real estate discovery with structured property search and market intelligence.
- mcpOAuthcom.skipshit
People and property search for Claude and ChatGPT. Phones, emails, addresses, relatives, properties.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceProvides real-time access to Zillow real estate data, enabling property search, details, Zestimates, market trends, and mortgage calculations via natural language.1148MIT
- FlicenseNot gradedqualityDmaintenanceEnables Claude to query ARMLS Spark/FlexMLS real estate data including active listings, comparable sales, market statistics, and open houses via MCP tools.-
- FlicenseAqualityDmaintenanceProvides Claude with access to NYC public property data including property details, sales history, comparable sales, tax benefits, and rent stabilization analysis using natural language.7-
- AlicenseAqualityAmaintenanceEnables 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.215923MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/chrischall/onehome-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server