Skip to main content
Glama

Server Details

MappaIQ is the first open marketplace for commercial real estate listings with an MCP connector, letting brokers and buyers search live CRE listings from Claude or ChatGPT. Brokers drop in a spreadsheet and get a live, shareable map with parcel data — free to start at mappaiq.com.

Ownership verified
Status
Healthy
Uptime
96.8% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-03-26
URL
ChatGPT
–
Claude
MappaIQ

TDQS

B3.4/5.0

Scored across 42 tools

Disambiguation4/5

Most tools target a distinct resource+action, and descriptions frequently resolve overlaps explicitly (e.g. add_zone 'use this instead of add_comp', bulk_set_custom_fields 'don't loop set_custom_field', move_map_to_folder 'to move a LAYER use move_layer'). The remaining confusion is concentrated in a few near-duplicate families: import_file vs bulk_add_comps (both ingest spreadsheets), and add_comp/bulk_add_comps/update_comp/bulk_update_comps, plus search_comps vs search_public_listings vs list_public_maps. An agent can pick correctly if it reads the descriptions, but the choice is not obvious from names alone.

Naming Consistency4/5

Almost everything is snake_case with a leading verb (add_comp, create_layer, get_layers, delete_comps, bulk_set_custom_fields), which is predictable. Minor deviations exist: verb_preposition forms (filter_by_date, navigate_to, move_map_to_folder) and singular/plural inconsistency between *_comp and *_comps / add_zone vs add_comp. Still highly readable overall.

Tool Count2/5

42 tools is well past a comfortable surface for an agent to choose from reliably, and part of the bulk comes from single/bulk pairs (set_custom_field vs bulk_set_custom_fields, add_comp vs bulk_add_comps vs import_file) that could be consolidated with a batch parameter. The domain is genuinely broad (maps, layers, folders, comps, listings, marketplace, sharing, exports), but the count still reads as heavy rather than well-scoped.

Completeness3/5

Core lifecycle is solid: maps/layers/comps/listings all have create, read, update, and delete or close paths, plus analysis, exports, and marketplace search. But there are notable gaps: no delete/rename for map folders, no delete_map, no way to withdraw or delete a listing (confirm_listings references 'withdrawn' listings that no tool sets), and get_shares only reads access while the referenced 'layer share flow' for granting sharing isn't exposed as a tool.

Available Tools

42 tools
add_compAdd pinBInspect

Add a new record (pin) to a layer at the given latitude/longitude. Coordinates are required; an address is stored as text and never geocoded.

NameRequiredDescriptionDefault
dateNoSale date
nameYesComp name
buyerNoBuyer name
notesNoAdditional notes
priceNoSale price in dollars
sellerNoSeller name
zoningNoZoning classification
acreageNoAcreage
addressNoProperty address, stored as text on the pin. It is not geocoded — the pin goes at latitude/longitude.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
layerIdYesLayer ID to add comp to
flyerUrlNoLink to a marketing flyer PDF/page for this property — shown as a 'View flyer' card on the pin. Set from a source column clearly holding flyer links; if unsure whether a column is flyers, ask the user first.
latitudeYesLatitude in decimal degrees (-90 to 90). Required — addresses are not geocoded.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
longitudeYesLongitude in decimal degrees (-180 to 180). Required — addresses are not geocoded.
externalIdNoOptional stable ID from your source data (e.g. a spreadsheet Record #). Lets later imports upsert this record instead of duplicating it.
customFieldsNoAny extra columns as a {fieldName: value} map — stored as real, filterable fields (e.g. {"Price per SF": "$18", "Tenant": "Acme"}). Use this for anything without a native slot above instead of cramming it into notes.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

B3.3/5.0
Behavior3/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description usefully adds the geocoding rule ('coordinates are required; an address ... is never geocoded'). Beyond that it says nothing about duplicates, upsert behavior, or the conversation_id handshake workflow, which the schema carries instead.

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

Conciseness5/5

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

Two tight sentences with the core operation and the key constraint (required coords, no geocoding) front-loaded. Nothing extraneous.

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

Completeness3/5

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

For an 18-parameter mutation tool with a nested object and no output schema, the description covers the essential operation but omits the conversation_id sequencing and the bulk-alternative context. Rich schema coverage compensates, keeping this adequate rather than complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 18 parameters, including the geocoding note and customFields. The description's coordinate/address statements largely duplicate schema content rather than adding new meaning, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Add a new record (pin)'), names the container ('to a layer'), and specifies the required coordinate inputs. It is clear enough to distinguish from update_comp, though it does not explicitly contrast with sibling add/bulk_add tools.

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

Usage Guidelines2/5

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

No when-to-use guidance is given: it does not say when to prefer this over bulk_add_comps (many pins) or update_comp (existing pins). The address/geocoding note is behavioral, not usage guidance.

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

add_listingAdd listingAInspect

Create one Listing in one call. The address is geocoded by the server; latitude/longitude are optional. It starts Active and confirmed today, with the caller as Listing broker. An incomplete listing still saves, and shows on the Marketplace if its map is public; the result lists the missing fields, so ask the Broker for them.

NameRequiredDescriptionDefault
cityNo
nameNoListing name. Default: the address.
notesNo
priceNoAsking price in dollars. null = Call for pricing.
stageNoListing stage. Closed is not a stage: use close_listing.
acreageNoLand size in acres.
addressYesStreet address or intersection, e.g. 'Stacy Rd & US-75'.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
layerIdNoLayer to add it to. Default: the account's first layer.
latitudeNoOptional. Latitude when known; else the address is geocoded.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
longitudeNoOptional. Longitude when known; else the address is geocoded.
offerTypeNo
assetClassNo
buildingSFNoBuilding size in square feet.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations only mark it as a non-read, non-destructive write, so the description carries the real burden and delivers: server-side geocoding, default stage Active, confirmed-today status, caller becomes Listing broker, and the notable fact that an incomplete listing still saves and can surface publicly. It stops short of stating permissions or whether creation is reversible.

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

Conciseness4/5

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

Three compact sentences, all front-loaded with the creation action and its key side effects. No wasted clauses, though the final sentence packs several distinct behaviors (partial save, Marketplace visibility, missing-field reporting) into one line.

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

Completeness4/5

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

For a 16-parameter non-destructive write with no output schema, the description covers the high-value unknowns: geocoding, defaults, confirmation state, broker assignment, and partial-save behavior. It omits permission requirements and doesn't need to explain return values given no output schema.

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

Parameters3/5

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

Schema description coverage is 75%, so most parameters are self-documented and the baseline is 3. The description adds useful semantics for lat/long (falls back to geocoding) and stage default, but does not illuminate the many enum or numeric fields beyond what the schema already states.

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

Purpose5/5

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

States a specific verb+resource ('Create one Listing in one call') and the phrase 'one Listing in one call' implicitly distinguishes it from bulk-style siblings in the comp family. An agent can identify this as the single-listing creation tool without opening the schema.

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

Usage Guidelines3/5

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

Gives implied usage context (geocoding is server-side, lat/long optional, starts Active/confirmed) but never names when to use this versus update_listing or close_listing, nor states prerequisites explicitly. The 'ask the Broker for them' hint frames a recovery workflow but not tool selection.

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

add_zoneDraw zoneAInspect

Draw a circular zone (a polygon area) on the map centered on the given latitude/longitude. Coordinates are required — place names are not looked up. Use this instead of add_comp when the user wants an area rather than a single pin.

NameRequiredDescriptionDefault
nameYesZone name shown on the map (e.g. 'Waxahachie', 'North Dallas target area')
notesNoOptional notes about the zone.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
layerIdNoLayer ID to add the zone to. If omitted, the user's first layer is used.
latitudeYesLatitude in decimal degrees (-90 to 90). Required — addresses are not geocoded.
zoneTypeNoZone label: 'Search Area', 'Target Zone', 'Market Boundary', 'Comp Zone', 'Exclusion Zone', or 'Custom'. Default 'Search Area'.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
longitudeYesLongitude in decimal degrees (-180 to 180). Required — addresses are not geocoded.
radiusMilesNoIf set, forces a circle of this radius in miles instead of the real boundary. Leave unset to use the place's actual outline. Default circle is 2 miles.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the write/safe profile is known. The description adds one useful behavioral constraint ("place names are not looked up"), but does not disclose what the call creates/returns or side effects. Adequate but thin on top of the annotations.

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

Conciseness5/5

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

Three tight sentences with no filler, and the core action plus its scoping constraint are front-loaded ahead of the sibling routing. Every sentence earns its place.

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

Completeness4/5

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

For a 10-parameter write tool the description covers purpose, the area-vs-pin decision, and the coordinate requirement, while annotations and a fully-documented schema carry the rest. The only minor gap is that with no output schema it does not indicate what the tool produces.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema documents all ten parameters in detail. The description only reinforces the required-coordinates constraint already stated in the latitude/longitude schema entries, adding little beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ("Draw a circular zone ... centered on the given latitude/longitude") and explicitly contrasts itself with the sibling add_comp. An agent can distinguish this from add_comp and add_listing without opening a schema.

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

Usage Guidelines5/5

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

Names the alternative explicitly and the selecting condition: "Use this instead of add_comp when the user wants an area rather than a single pin." The when-to-use and when-not-to-use cases are both covered.

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

analyze_compsAnalyze pinsA
Read-only
Inspect

Run statistical analysis on a set of comps — averages, median, min/max for price, acreage, and $/acre. Can analyze all comps or a filtered subset.

NameRequiredDescriptionDefault
compIdsNoAnalyze only these specific comp IDs
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
layerIdNoAnalyze only comps in this layer
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
withinGeometryNoAnalyze only comps within this GeoJSON geometry
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the useful detail of what the tool computes (the metric list), which stands in for the absent output schema, but says nothing about cost, limits, or how results are returned.

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

Conciseness5/5

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

Two tight sentences with zero filler, and the core purpose plus the metric list are front-loaded before the scoping note. Every clause earns its place.

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

Completeness4/5

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

For a read-only analysis tool with annotations covering safety and 100% schema coverage, the definition is nearly sufficient; listing the computed metrics compensates for the missing output schema. It stops short of describing result structure or pagination, which is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter (compIds, layerId, withinGeometry, context, llm_model, conversation_id) is already documented in the schema. The description only alludes to filtered subsets and adds no syntax or format detail beyond what the schema provides; baseline 3 applies.

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

Purpose4/5

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

The description states a specific verb and resource ('Run statistical analysis on a set of comps') and enumerates the computed metrics (averages, median, min/max for price, acreage, $/acre), which clearly separates it from retrieval siblings like search_comps or get_comp_detail. However, it never names an alternative tool or explicitly contrasts itself with them.

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

Usage Guidelines3/5

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

'Can analyze all comps or a filtered subset' implies the two operating modes and hints at the compIds/layerId/withinGeometry filters, so usage is inferable. But there is no explicit when-to-use guidance, no statement of when to prefer this over search_comps, and no prerequisites or exclusions.

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

bulk_add_compsAdd many pinsAInspect

Add many comps in one call instead of calling add_comp repeatedly — use this for CSV-style bulk imports (tens to thousands of rows). Pass an array of comp objects; each one accepts the same fields as add_comp, INCLUDING customFields (a {column: value} map for any extra spreadsheet columns) and externalId. Give each row an externalId (e.g. its source Record #) so an interrupted import can be safely re-sent — rows whose externalId already exists in the layer are updated in place, not duplicated. latitude+longitude OR address (geocoded automatically; a row whose address is not found fails with a reason). Rows are comps unless asListings is true — never mark rows as listings yourself; set asListings only when the Broker says these are their listings. Split datasets over 1000 rows into multiple calls. Returns per-row results mapping each input index/externalId to its comp id and status (inserted/updated/failed), and with asListings how many are on the Marketplace and which fields keep the rest off.

NameRequiredDescriptionDefault
compsYesUp to 1000 comps per call.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
layerIdNoDefault layer ID for comps that don't specify their own layerId.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
offerTypeNoWith asListings: the Offer type for every row. A row's own offerType wins.
asListingsNotrue only when the Broker said these rows are their listings: every row becomes a Listing (Active, confirmed today, the caller as Listing broker). Default false: rows are comps and are never inferred as listings.
assetClassNoWith asListings: the Asset class for every row. A row's own assetClass wins.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
upsertOnExternalIdNoDefault true. When a row's externalId already exists in the target layer, update it instead of inserting a duplicate. Set false to always insert.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false. The description adds substantial behavior: upsert semantics via externalId, that matching rows are 'updated in place, not duplicated', that missing addresses 'fail with a reason', automatic geocoding, the 1000-row limit, and Marketplace/field behavior under asListings. These are exactly the mutation traits annotations cannot convey.

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

Conciseness4/5

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

The purpose and the add_comp alternative are front-loaded, and each sentence carries operational content. It is a dense single block for a genuinely complex 9-parameter tool, so length is justified, though the long asListings/customFields clauses could be split for readability.

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

Completeness5/5

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

There is no output schema, and the description compensates by describing the return shape (per-row results mapping index/externalId to comp id and status: inserted/updated/failed). Combined with failure modes, limits, and upsert behavior, an agent has everything needed to call this correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3, but the description adds real value beyond the schema: it explains the externalId contract (e.g. 'its source Record #') as the idempotency key, the latitude+longitude OR address either/or rule, and the guidance that asListings should only be set on the Broker's instruction. It complements rather than merely repeats the schema.

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

Purpose5/5

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

States a specific verb+resource ('Add many comps') and immediately distinguishes itself from the sibling add_comp by framing itself as the alternative to calling it repeatedly. An agent can tell exactly what this does and when it supersedes add_comp.

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

Usage Guidelines5/5

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

Explicit when-to-use (CSV-style bulk imports, tens to thousands of rows), a named alternative (add_comp), a hard threshold ('split datasets over 1000 rows'), and a clear exclusion on asListings ('never mark rows as listings yourself; set asListings only when the Broker says these are their listings'). This is as complete as usage guidance gets.

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

bulk_set_custom_fieldsSet custom fields on many pinsA
Destructive
Inspect

Set custom fields on MANY records in one call — use this to tag or score an entire dataset after analysis, instead of calling set_custom_field once per record. Pass an array of updates, each targeting a record by its id (or by externalId, its source Record #) and giving a {fieldName: value} map of fields to write. Existing fields with the same name are overwritten; others are added. Returns how many records were updated.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
updatesYesOne entry per record to tag.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation risk is known. The description adds meaningful non-obvious behavior: existing same-named fields are overwritten while others are added, and it returns a count of updated records. It stops short of stating auth requirements or partial-failure behavior, so not a 5.

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

Conciseness4/5

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

Four sentences, front-loaded with purpose then mechanics; each sentence carries information. Slightly longer than strictly necessary since the array/targeting sentence partly echoes the schema, but there is no filler.

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

Completeness5/5

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

For a bulk mutation with 100% schema coverage and no output schema, the description covers when to use it, how to target records, overwrite semantics, and the return value. The analytics-only parameters (context, llm_model, conversation_id) are fully documented by the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents id, externalId and the {fieldName: value} map. The description restates the id-or-externalId targeting and field map without adding syntax or format detail beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource+scope ('Set custom fields on MANY records in one call') and names the single-record sibling it replaces (set_custom_field). An agent can distinguish this from every other sibling without opening a schema.

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

Usage Guidelines5/5

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

Explicitly says when to use it ('to tag or score an entire dataset after analysis') and names the alternative with the condition that selects it ('instead of calling set_custom_field once per record'). No inference required.

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

bulk_update_compsUpdate many pinsA
Destructive
Inspect

Update multiple comps at once — by layer name, record type filter, or both. Use when the user says things like 'change all pins in layer X to prospecting' or 'mark everything in Prospect Sites as a prospecting waypoint'.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
updatesYesFields to set on every matched comp
layerNameNoName of the layer to update (case-insensitive match). Leave blank to update across all layers.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
filterTypeNoOnly update comps that currently have this record type (e.g. 'listing'). Optional.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this mutates and can destroy data. The description adds the selection semantics (layer, record-type filter, or both), which is useful, but says nothing about blast radius, reversibility, or what happens to non-matched fields. Adequate against an annotation-backed baseline, but not rich.

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

Conciseness5/5

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

Two sentences, no waste, with the core capability front-loaded ahead of the usage examples. Every clause earns its place.

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

Completeness4/5

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

For a six-parameter tool with a nested updates object, no output schema, and 100% schema coverage, the description covers the essential selection model and intent triggers. It omits the conversational bookkeeping (context, llm_model, conversation_id), but those are fully specified in the schema, so the gap is minor.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all six parameters, including the updates object, layerName, filterType, and the analytics-only fields. The description only gestures at layerName and filterType, adding no syntax or format detail beyond the schema. Baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Update multiple comps at once') with the bulk scope made explicit, and lists the two selection mechanisms. It does not name the single-record sibling update_comp, so an agent must infer the batch-vs-single distinction, but the plural scope is unmistakable.

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

Usage Guidelines4/5

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

Provides concrete trigger phrasing ('change all pins in layer X to prospecting', 'mark everything in Prospect Sites as a prospecting waypoint') that maps user intent directly to this tool. It gives no explicit when-not guidance or named alternative (e.g. use update_comp for one record), so it stops short of full routing.

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

close_listingClose listing (becomes a comp)A
Destructive
Inspect

Record that a Listing sold or leased: the pin becomes a comp with the closing price and date; on a public map it stays public with that price. This cannot be undone. Without brokerApproved:true it only returns the question to ask the Broker.

NameRequiredDescriptionDefault
idYesListing id from find_listings.
dateNoClosing date (YYYY-MM-DD). Default: today.
priceNoClosing price in dollars, if known.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
brokerApprovedNotrue only after the Broker said yes to closing it in this conversation.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, so irreversibility is partly covered; the description reinforces 'This cannot be undone' and adds genuinely new behavior: the pin becomes a comp and stays public on a public map with the closing price. It stops short of describing the return payload or permission requirements beyond brokerApproved.

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

Conciseness4/5

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

Three short sentences with the core action front-loaded, followed by the irreversible side effect and the approval gate. Every sentence carries information, though the phrasing of the final clause is slightly awkward.

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

Completeness4/5

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

For a destructive mutation with no output schema, the description explains the state change and the approval precondition well. The analytics parameters (context, llm_model, conversation_id) are fully documented in the schema, so nothing critical is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds real semantics for brokerApproved by explaining the consequence of omitting it (returns a question rather than closing). It does not clarify date/price defaults beyond what the schema already states.

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

Purpose5/5

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

States a specific verb and resource (record that a Listing sold/leased) and names the concrete outcome (pin becomes a comp with closing price and date). This clearly distinguishes it from siblings like add_comp, update_comp, and update_listing.

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

Usage Guidelines4/5

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

Gives a concrete gating condition: 'Without brokerApproved:true it only returns the question to ask the Broker,' which tells the agent when the call will actually close versus when it will bounce back. It does not explicitly contrast against alternatives such as update_listing or add_comp, but the primary usage condition is clear.

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

confirm_listingsConfirm listings still activeB
Destructive
Inspect

Mark Listings as still on the market (Confirmed date = today). Withdrawn listings are skipped. Ask the Broker before you confirm more than one.

NameRequiredDescriptionDefault
idsYesListing ids, at most 200.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

B3.4/5.0
Behavior3/5

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

With destructiveHint=true already declared, the description usefully adds that withdrawn listings are skipped (partial-success behavior) and the timestamp semantics. It does not explain why the operation is destructive or what side effects/irreversibility the agent should expect, leaving a gap against the annotation's severity.

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

Conciseness4/5

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

Three tight sentences with the core action front-loaded and supporting caveats after. Nothing is wasted, though the 'Ask the Broker' sentence reads as policy rather than invocation guidance.

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

Completeness3/5

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

For a destructive-flagged single-action tool with no output schema and fully documented params, the description covers effect and skip behavior but omits return/confirmation feedback and the reason for the destructive flag. Adequate but with clear gaps.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents ids, context, llm_model, and conversation_id. The description adds no parameter syntax or format beyond the schema; the only related hint ('more than one') loosely maps to the ids array cap.

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

Purpose4/5

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

States a specific verb (Mark), resource (Listings), and observable effect (Confirmed date = today), so an agent knows exactly what state change occurs. It is broadly distinguishable from siblings like close_listing or update_listing, but does not name any alternative to sharpen the distinction.

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

Usage Guidelines3/5

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

Provides a real usage constraint – 'Ask the Broker before you confirm more than one' – and notes that withdrawn listings are skipped, which implies partial-success scoping. However, it gives no guidance on when to prefer this over sibling tools like update_listing.

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

create_layerCreate layerAInspect

Create a new empty layer inside a map. Use when the user asks to add or create a new layer. An account can have several maps; if you are connected across maps and the user has more than one, set mapName to say which map the layer goes in (list_maps / get_layers tell you which maps exist). To create a whole new map instead, use create_map first.

NameRequiredDescriptionDefault
nameYesName for the new layer
colorNoHex color for the layer (e.g. #2563eb). Pick a distinct color.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
mapNameNoWhich map to create the layer in (only needed when working across multiple maps). Omit when it's obvious or there's only one map.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false), and the description correctly presents a creation, not a destructive, operation. It adds genuine behavioral context beyond annotations: the created layer is empty, and mapName matters specifically when multiple maps are in play. It stops short of covering failure/auth/duplicate-name behavior, but the annotation coverage lowers the burden.

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

Conciseness5/5

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

Three tight sentences, each earning its place: the operation, the usage trigger, and the multi-map routing with the alternative tool. The primary purpose is front-loaded before any conditional guidance.

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

Completeness5/5

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

For a create tool with annotations covering the safety profile, 100% schema coverage, and no output schema, the description supplies everything an agent needs: purpose, trigger, sibling routing, and multi-map handling. Nothing required to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents every parameter and the baseline is 3. The description adds only a marginal workflow hint for mapName ('list_maps / get_layers tell you which maps exist') that largely restates the schema's own mapName guidance.

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

Purpose5/5

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

States a specific verb and resource ('Create a new empty layer inside a map') and immediately differentiates from the closest sibling by naming create_map for the whole-map case. An agent can distinguish this from create_map, move_layer, and rename_layer without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit trigger ('when the user asks to add or create a new layer'), names the alternative (use create_map first), and points to list_maps/get_layers as the way to resolve which map exists. Both the when-to-use and the when-to-use-something-else conditions are stated.

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

create_mapCreate mapAInspect

Create a brand-new, empty map (the top-level container that holds layers and pins). Use when the user wants a NEW map rather than a new layer inside an existing one — e.g. 'make a separate map for each broker', 'create a Grocers map'. After creating a map, add layers to it with create_layer (pass this map's name as mapName) and then add pins with add_comp/bulk_add_comps. Returns the new map's id and name.

NameRequiredDescriptionDefault
nameYesName for the new map (e.g. 'David Zoller', 'Grocers').
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, so safety is covered; the description adds that the result is empty and what the creation kicks off downstream. It also discloses return values ('the new map's id and name') absent an output schema. It does not say what happens on duplicate names or where the map lands (root vs. folder), so not a full 5.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the definition before the when-to-use clause, then the workflow. Nothing is repetitive and every sentence carries distinct information.

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

Completeness4/5

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

For a create tool with full schema coverage, the definition covers purpose, triggering condition, downstream sequence, and return values. The only uncovered corner is placement/duplication semantics relative to map folders, which is a minor omission rather than a blocking gap.

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

Parameters3/5

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

Schema description coverage is 100%, so 'name' and the analytics-only 'context'/'llm_model' params are already fully documented; baseline 3 applies. The description's one extra hint — that create_layer takes this map's name as mapName — concerns a sibling's parameter rather than explaining this tool's own inputs.

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

Purpose5/5

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

States a specific verb and resource ('Create a brand-new, empty map') and immediately defines what a map is ('the top-level container that holds layers and pins'), which separates it from create_layer and create_map_folder. An agent can distinguish it from every sibling without opening a schema.

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

Usage Guidelines5/5

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

Explicitly states when to use it versus the nearest alternative: 'Use when the user wants a NEW map rather than a new layer inside an existing one', reinforced with two concrete user utterances. It also sequences the follow-on tools (create_layer with this map's name as mapName, then add_comp/bulk_add_comps).

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

create_map_folderCreate map folderAInspect

Create a Library folder to organize MAPS (e.g. 'make a folder called Clients', 'create a DFW folder inside Texas'). This is different from nesting layers (use move_layer for that). Optionally nest it inside an existing folder with parentFolderName.

NameRequiredDescriptionDefault
nameYesName for the new folder.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
parentFolderNameNoExisting folder to create this one inside (case-insensitive). Omit to create at the Library root.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare this is a write op (readOnlyHint=false) that is not destructive. The description adds two useful behavioral facts: omitting parentFolderName creates at the Library root, and parent matching is case-insensitive. It says nothing about duplicate-name handling, failure when the parent does not exist, or idempotency, so it stays at a moderate level.

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

Conciseness5/5

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

Two sentences with zero filler, front-loading the core action before the disambiguation and the optional nesting parameter. The inline examples clarify intent without padding.

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

Completeness4/5

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

For a 5-parameter creation tool with full schema coverage and no output schema, the description covers purpose, the optional nesting behavior, and the primary disambiguation. It is slightly thin on failure/edge behavior if the named parent folder is absent, but otherwise sufficient to call the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so name, context, llm_model, conversation_id and parentFolderName are all already documented in the schema. The description only re-states the parentFolderName behavior (existing folder, case-insensitive, omit for root) rather than adding format or constraint detail beyond it; baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb+resource ('Create a Library folder to organize MAPS') and even gives natural-language examples of the user request it fulfills. It explicitly separates itself from the layer-nesting capability an agent might otherwise confuse it with.

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

Usage Guidelines4/5

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

Gives a clear when-to-use (organizing maps into folders) and an explicit when-not with a named alternative ('use move_layer for that'), which covers the main confusion vector. It does not point at related folder tools such as list_map_folders for verifying an existing parent or move_map_to_folder, so routing is good but not exhaustive.

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

delete_compsDelete pinsA
Destructive
Inspect

Permanently delete pins/records — specific ones by ID, every pin in a layer, or an entire layer. THIS DELETES IMMEDIATELY and cannot be undone, so confirm with the user first. Use compIds to delete specific pins. Use scope 'layer' with layerName (or layerId) to delete a whole layer AND all its pins (layer owner only). Use scope 'comps' with a layerName and no compIds to clear every pin in a layer but keep the layer. Only affects the caller's own data (and pins in layers shared to them with admin access). This is the tool to use when a user wants to clear out old/junk pins or empty a layer.

NameRequiredDescriptionDefault
scopeNo'comps' (default) deletes pins/records; 'layer' deletes an entire layer and every pin in it.
compIdsNoIDs of the specific pins/records to delete (scope 'comps'). Omit to target every pin in the named layer.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
layerIdNoLayer ID. Required for scope 'layer'; for scope 'comps' it limits the delete to that layer.
layerNameNoLayer name — resolves the layer when no layerId is given.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds substantial context beyond them: deletion is immediate and irreversible, requires user confirmation first, layer deletion removes the layer AND its pins, layer deletion is owner-only, and effects are scoped to the caller's own data plus admin-shared layers. These are real behavioral constraints not derivable from annotations.

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

Conciseness4/5

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

Front-loads the action and the immediate/irreversible warning, then walks through the modes in order. It runs a bit long, but for a multi-mode destructive tool every sentence (warning, confirmation, three modes, ownership scope) carries functional weight rather than padding.

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

Completeness5/5

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

For a destructive, no-output-schema tool, the description covers what an agent needs: the safety profile, the confirmation requirement, permission boundaries, and how to address each target. Nothing required to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents each parameter; baseline would be 3. The description adds genuine value by explaining the combination logic across parameters (scope + layerName without compIds clears pins but keeps the layer; layerId vs layerName resolution), which the individual field descriptions cover only in isolation.

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

Purpose5/5

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

States a specific verb (delete) and resource (pins/records), then enumerates the three deletion modes precisely. No sibling tool in the list performs deletion, and this description makes the destructive scope unmistakable. An agent can tell exactly what it does without opening the schema.

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

Usage Guidelines5/5

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

Explicitly maps each mode to triggering parameters ('Use compIds to delete specific pins', 'Use scope layer with layerName...', 'Use scope comps with a layerName and no compIds...'). It also states the intent condition ('when a user wants to clear out old/junk pins or empty a layer') and adds a confirmation prerequisite.

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

express_interestContact a Marketplace brokerAInspect

Send a lead to a Marketplace listing's broker (from search_public_listings) — use it when the user wants to inquire about or be contacted about a public listing. The broker is emailed the user's message and how to reach them back, attributed to MappaIQ. Always confirm the message with the user before sending. Counts as 1 against the Marketplace limit. If the broker has no email on file, nothing is sent and their phone is returned instead.

NameRequiredDescriptionDefault
idYesListing id from search_public_listings.
contactNoHow the broker should reach the user back: their name and an email or phone. Defaults to the connected account's email if omitted.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
messageYesWhat to tell the broker — the user's interest, timeline, budget, or question. Max 1500 characters.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false) by disclosing exactly what happens: the broker is emailed the user's message and contact info attributed to MappaIQ, it consumes 1 Marketplace credit, and if the broker has no email on file nothing is sent and a phone number is returned instead. That quota and fallback behavior is precisely the kind of context annotations cannot carry.

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

Conciseness5/5

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

Front-loads the core action and the usage trigger, then layers the behavioral caveats (attribution, confirmation requirement, credit cost, fallback) in descending priority. Every sentence carries distinct information with no filler.

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

Completeness5/5

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

A mutating, credit-consuming tool with 100% schema coverage and no output schema. The description supplies the side effects, the confirmation requirement, the quota impact, and the alternate return path, leaving no functional gap an agent would need to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters (including the verbose context, llm_model, and conversation_id guidance) are already documented in the input schema. The description adds only marginal parameter meaning by naming search_public_listings as the source of the id, which the schema also states. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource: 'Send a lead to a Marketplace listing's broker.' It also anchors the resource to its source ('from search_public_listings'), so an agent can distinguish this contact/broker action from the many listing and comp tools that share the namespace.

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

Usage Guidelines5/5

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

Gives an explicit triggering condition — 'use it when the user wants to inquire about or be contacted about a public listing' — plus a hard procedural prerequisite: 'Always confirm the message with the user before sending.' No alternative tool performs this action, so the absence of an alternatives clause is not a gap.

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

filter_by_dateFilter by dateA
Read-only
Inspect

Filter which pins are visible on the map by year, exactly like the map's date slider. Use whenever the user wants to show or hide pins by date — e.g. 'show only pins sold after 2020', 'hide anything before 2018', 'only listings from 2015 to 2019', 'just this year', or 'clear the date filter'. The 'mode' picks WHICH date to filter on. To remove the filter and show everything again, set clear: true.

NameRequiredDescriptionDefault
toNoLatest year to show, e.g. 2024. Defaults to the current year if omitted. For 'before 2018' use to: 2018.
fromNoEarliest year to show, e.g. 2020. Defaults to 2015 if omitted. For 'after 2020' use from: 2020.
modeNoWhich date to filter on: 'sold' = sale/transaction date, 'quoted' = quote/listing date, 'added' = when the pin was created. Default 'sold'.
clearNoSet true to remove the date filter and show all pins again.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real behavioral context: the filter governs which pins are visible on the map rather than mutating underlying data, and clear:true restores full visibility. It stops short of stating persistence (per-session vs saved) or interaction with other active filters.

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

Conciseness4/5

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

Purpose and the slider analogy are front-loaded, and the example list is functional rather than filler. It is slightly longer than strictly necessary, but each sentence maps to a real invocation pattern.

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

Completeness4/5

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

For a filtering tool with no output schema, the description covers intent, the date-range semantics, mode selection, and clearing. The remaining schema parameters (context, llm_model, conversation_id) are analytics plumbing documented in the schema itself and need no description-level explanation.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents from/to/mode/clear in detail, including the 'before 2018' style mappings. The description reinforces mode's role ('picks WHICH date to filter on') and clear's effect but adds little beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (filter) and resource (pins visible on the map) with a precise scope ('by year'). The 'exactly like the map's date slider' framing makes it immediately distinguishable from siblings like find_listings or search_comps.

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

Usage Guidelines5/5

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

Explicitly says when to use it ('whenever the user wants to show or hide pins by date') and backs it with five concrete utterance examples mapping to the from/to/clear parameters. It also names the removal case ('To remove the filter... set clear: true'), leaving nothing to inference.

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

find_listingsFind listingsA
Read-only
Inspect

Find this account's Listings from the Broker's own loose words (e.g. '1200 Main', 'the Frisco lot'). Call this first for any listing change. outcome 'one' = act on it; 'ambiguous' = ask the Broker which one, never guess; 'none' = no listing matches. compMatches are comps (closed sales), never listings: do not edit them as listings, offer to add a new listing instead.

NameRequiredDescriptionDefault
queryYesThe Broker's words for the listing: address, name, city or asset class.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true so the safety profile is known, but the description adds non-obvious behavior: the three outcome states and their required handling, plus the critical distinction that compMatches are closed sales, not listings. It stops short of stating that results may include multiple candidates via a separate field, but the outcome semantics are genuinely useful context 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.

Conciseness5/5

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

Every sentence carries a distinct instruction, and routing information is front-loaded before the outcome-handling details. No filler or repetition of the title.

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

Completeness5/5

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

With no output schema, the description compensates by fully specifying the outcome vocabulary and its required responses, which is exactly the return-value information an agent needs. Combined with the comps-vs-listings warning, nothing essential for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so query, context, llm_model, and conversation_id are already documented in the schema. The description only restates the 'loose words' nature of query, adding little beyond the schema's own 'address, name, city or asset class' description. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ('Find this account's Listings') and scopes the input domain ('from the Broker's own loose words'), which separates it from search_public_listings and get_public_listing. The example inputs make the intent concrete and unmistakable.

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

Usage Guidelines5/5

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

Explicitly routes usage ('Call this first for any listing change') and prescribes behavior per outcome ('one' = act, 'ambiguous' = ask, never guess, 'none' = no match). It also warns against editing comps as listings and directs to add_listing instead, covering both when-to-use and when-not-to.

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

flag_compFlag pinA
Destructive
Inspect

Tag a record for attention — outlier, data error, deal risk, high priority, needs follow-up, etc. This writes 'flagged: true' and a reason to the record so it can be queried later. Use freely when doing analysis: flag every outlier, flag every missing field, flag anything the user should review. Always pair with a clear reason.

NameRequiredDescriptionDefault
idYesThe record ID
reasonNoConcise reason — e.g. '2.3× above median $/acre', 'missing sale date', 'price below land cost'
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
flaggedYestrue to flag, false to clear
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A3.9/5.0
Behavior3/5

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

The description adds behavioral detail beyond annotations by explaining it writes 'flagged: true' and a reason that can be queried later, which is useful. However, with destructiveHint=true set, the 'Use freely' framing downplays that the operation mutates persisted record state (and can be used to clear it via flagged=false), so the risk profile is not addressed.

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

Conciseness4/5

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

Four short sentences, front-loaded with the verb and resource, and each clause adds something (tag examples, write behavior, usage guidance, reason pairing). Slightly repetitive in the middle ('flag every outlier, flag every missing field') but overall efficient.

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

Completeness4/5

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

For a mutation tool with no output schema, the description covers what it writes, why, and when to use it. The main omission is any mention of the destructive/mutating implications flagged by annotations, but the core invocation-relevant context is present.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already documents every parameter in detail, so the baseline is 3. The description's 'Always pair with a clear reason' reinforces the reason parameter but adds no syntax or format beyond what the schema provides.

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

Purpose5/5

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

States a concrete verb (tag/flag) plus the resource (a record) and enumerates the kinds of tags it applies, so the agent immediately knows this annotates records with a flagged status. It is distinguishable from set_custom_field and set_callout by being specifically a flag-with-reason action.

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

Usage Guidelines4/5

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

'Use freely when doing analysis: flag every outlier, flag every missing field, flag anything the user should review' gives an explicit, actionable usage context. It does not, however, name the sibling alternatives (e.g. set_custom_field/set_callout) or state when NOT to flag, so it stops short of full routing guidance.

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

generate_bovCreate BOV reportAInspect

Create a Broker Opinion of Value (BOV) comparable-sales PDF: a comp table, price and $/acre ranges, and your analyst commentary. Use when the user asks for a BOV, comp exhibit, or comp-set PDF. First pick the comp set (search_comps / analyze_comps), then write the commentary yourself: 2-3 professional sentences on the pricing range, $/acre range, notable trends, and zoning or asset-type observations — it goes straight into a client-facing document. Pass compIds (preferred) or a layerId. Max 100 records. The PDF appears as a download button in the chat.

NameRequiredDescriptionDefault
titleNoHeader subtitle, e.g. the layer name or subject property
compIdsNoThe comp IDs in the set
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
layerIdNoUse every comp in this layer instead of compIds
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
commentaryYes2-3 sentence analyst commentary paragraph, no headers or labels
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds real behavioral context beyond that — a 100-record cap, that the PDF surfaces as a download button in chat, and that the commentary lands in a client-facing document (implying a quality bar). It does not cover permissions or failure modes, so it stops short of a 5.

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

Conciseness4/5

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

Front-loads what the tool produces before the usage trigger and the parameter guidance, so an agent can decide early. It is somewhat dense with multiple clauses, but nearly every sentence carries actionable information rather than filler.

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

Completeness4/5

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

With 7 params, no output schema, and a mutation-adjacent generation task, the description supplies the missing pieces: the output form (chat download button), the input limit, and the sequencing dependency. The remaining params (title, context, llm_model, conversation_id) are well covered by the schema itself, so nothing critical is absent.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: the compIds-vs-layerId preference, the 100-record limit, and concrete content guidance for commentary (2-3 sentences covering pricing range, $/acre, trends, zoning/asset-type).

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

Purpose5/5

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

States a specific verb (create) and a concrete artifact (BOV comparable-sales PDF) and enumerates its contents: comp table, price and $/acre ranges, analyst commentary. This distinguishes it from siblings like analyze_comps (analysis only) and generate_file (generic file output).

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

Usage Guidelines5/5

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

Gives an explicit trigger ('user asks for a BOV, comp exhibit, or comp-set PDF') and an ordered prerequisite workflow: pick the comp set via search_comps / analyze_comps first, then write commentary. It also names the parameter alternative and its preference ('compIds (preferred) or a layerId').

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

generate_fileExport fileAInspect

Create a downloadable file for the user. Use when they ask for an export, report, or any file download. Supports: excel (xlsx — the default for any spreadsheet/tabular export), csv (only if the user explicitly asks for CSV), pdf (formatted document), txt (plain text), json. For tabular data prefer type:'excel' with headers+rows — it renders with a bold header row, matching every other export in the app. For reports use pdf with a content string. The file appears as a download button in the chat.

NameRequiredDescriptionDefault
rowsNoData rows for tabular files
typeYesFile format — use 'excel' by default for any spreadsheet export; only use 'csv' if the user explicitly asks for a CSV file
titleNoDocument title for PDF/Excel
contentNoRaw content for txt/json, or narrative body for pdf
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
headersNoColumn headers for tabular files (csv/excel)
filenameYesFilename without extension (e.g. 'comp-summary')
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, giving the safety profile. The description adds genuinely useful behavior beyond that: the file renders as a download button in chat and tabular excel gets a bold header row. It does not, however, cover what happens on failure or anything about the analytics-only params.

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

Conciseness4/5

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

Purpose and when-to-use are front-loaded, followed by format guidance; each sentence carries specific information. It is on the longer side but avoids filler, so only marginally less tight than ideal.

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

Completeness4/5

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

With 9 params at full schema coverage and no output schema, the description supplies the routing logic, format defaults, and return behavior an agent needs. It never explains the required analytics params (context, llm_model), but the schema covers those in detail.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents each parameter (including the excel-default note on `type`). The description adds cross-parameter guidance (pair type:'excel' with headers+rows; use pdf with a content string), which is a modest value-add but largely overlaps the enum description.

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

Purpose5/5

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

States a specific verb (create/downloadable file) and resource (file/export) and immediately scopes it to the export/download use case. The reader can distinguish it from siblings like import_file. The format enumeration further pins down the scope.

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

Usage Guidelines5/5

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

Explicitly says when to use it (user asks for export, report, or file download) and provides format-selection rules with a clear exclusion (CSV only if the user explicitly asks; excel is the default for tabular). Routing among formats is unambiguous.

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

get_comp_detailGet pin detailsC
Read-only
Inspect

Get full details for a specific comp by ID

NameRequiredDescriptionDefault
idYesThe comp ID
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered elsewhere. The description adds nothing beyond that — no indication of what 'full details' contains, no auth requirements, and no rate-limit or pagination behavior.

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

Conciseness4/5

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

A single tight sentence with the key noun phrase ('full details for a specific comp by ID') front-loaded and no wasted words. It is terse to the point of under-specification rather than bloated.

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

Completeness3/5

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

For a simple read-only getter whose annotations carry the safety profile and with no output schema, this is minimally adequate. It still fails to say what fields 'full details' returns, which is the main open question an agent would have.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3; the schema fully documents id, context, llm_model, and conversation_id. The description only echoes the id parameter ('by ID') and adds no meaning beyond the structured fields.

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

Purpose4/5

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

The description states a specific verb ('Get'), resource ('full details'), and scope ('for a specific comp by ID'), which cleanly separates it from search_comps (listing) and update_comp (mutation). It stops short of naming those siblings explicitly, so an agent must infer the boundary from the scope phrase alone.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no mention that an ID must first be obtained (e.g., from search_comps), and no statement of when this is preferable to analyze_comps or the bulk endpoints. Usage is only implied by the 'by ID' phrasing.

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

get_layersList layersA
Read-only
Inspect

Get all available layers with their names and comp counts. When the account has multiple maps, each layer also includes the map it belongs to — use that to disambiguate same-named layers and to target actions at the correct map. Per-layer pin-ID arrays are omitted by default (they make the response enormous on big accounts); pass includeCompIds:true only if you specifically need the raw ID lists — search_comps is the right tool for finding pins.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
includeCompIdsNoInclude each layer's full pin-ID array (large). Default false.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely useful behavioral context beyond that: pin-ID arrays are omitted by default and why (response size on big accounts), and the `map` field only appears on multi-map accounts. It stops short of noting pagination, but that is a minor gap given the read-only annotation.

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

Conciseness5/5

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

Three sentences, purpose front-loaded, then the map-disambiguation detail, then the includeCompIds caveat with its alternative. No filler; each sentence carries actionable content.

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

Completeness5/5

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

With no output schema, the description steps in to describe the return shape (names, comp counts, conditional `map`) and a deliberately omitted field. For a read-only list tool this covers everything an agent needs to call it correctly and interpret the result.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description adds real meaning: it explains the consequence of includeCompIds (enormous responses) and routes to search_comps, going beyond the schema's terse 'Include each layer's full pin-ID array (large)'. The context/llm_model/conversation_id analytics params are left to the schema, which documents them fully.

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

Purpose5/5

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

States a specific verb+resource (get all available layers) and enumerates what comes back (names and comp counts), plus the conditional `map` field. An agent can immediately tell this is a layer-listing tool and distinguish it from pin-finding siblings.

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

Usage Guidelines5/5

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

Explicitly tells the agent when to pass includeCompIds:true (only if raw ID lists are truly needed) and names the correct alternative for the adjacent task — 'search_comps is the right tool for finding pins'. Both the trigger and the alternative are stated, not inferred.

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

get_public_listingGet Marketplace listing contactA
Read-only
Inspect

Get one Marketplace listing by id (from search_public_listings) with its Listing broker's name, brokerage, phone and email. Counts as 5 searches against the account's Marketplace limit, so call it only for listings the user wants to contact about.

NameRequiredDescriptionDefault
idYesListing id from search_public_listings.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds a genuinely useful behavioral fact beyond the schema/annotations: the call 'Counts as 5 searches against the account's Marketplace limit,' a quota-cost disclosure that steers call frequency. It does not discuss auth or return format, but the safety profile is already annotated.

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

Conciseness5/5

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

Two sentences, zero waste: the first front-loads purpose and return contents, the second delivers the quota cost and the usage constraint. Every clause earns its place.

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

Completeness5/5

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

For a read-only detail tool with no output schema and full schema coverage, the description covers what it returns, where the id comes from, and the cost of calling it. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters (including the elaborate context and conversation_id guidance) are fully documented in the schema. The description only reinforces that id comes from search_public_listings, adding marginal meaning. Baseline 3 is appropriate when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb (Get), resource (one Marketplace listing by id), and precisely enumerates what it returns: the listing broker's name, brokerage, phone and email. It also names search_public_listings as the sibling that produces the id, so an agent can distinguish this detail-fetch from the search step.

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

Usage Guidelines5/5

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

Explicit routing and condition: the id comes from search_public_listings, and it should be called 'only for listings the user wants to contact about.' That is a clear when-to-use rule tied to a concrete user intent, leaving little to inference.

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

get_sharesList sharesA
Read-only
Inspect

Query sharing and access information. Use for questions like:

  • "What have I shared with Bob?" / "What can Bob see?"

  • "Who has access to the DFW Portfolio folder?"

  • "Under this folder I have 10 zones — tell me who each one is shared with"

  • "What layers does sarah@company.com have access to?"

  • "Who has admin access to anything?" Always use this tool when the user asks about sharing, access, permissions, or what someone can see. Provide either a person name/email OR a layer name (or both).

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
layerNameNoLayer or folder name. Returns everyone who has been given access to it.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
personQueryNoName or partial email of a person to look up. E.g. 'Bob', 'sarah', 'smith@company.com'. Returns all layers this person has been shared with.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
includeDescendantsNoWhen layerName is a folder, also report sharing for all child/grandchild layers inside it. Default true.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the constraint that either a person or a layer (or both) must be supplied, but says nothing about result shape, size limits, or how sharing entries are ordered/aggregated.

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

Conciseness4/5

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

Purpose is front-loaded in the first sentence, and the example bullets are concrete and each demonstrate a distinct query shape. The closing 'Always use this tool when...' sentence partly restates the bullet examples, adding mild redundancy.

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

Completeness4/5

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

For a read-only query with no output schema, the description covers purpose, when-to-use, and the person/layer input contract adequately. It leaves the shape of the returned access data unspecified, which is the one remaining gap an agent might care about.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are already documented, including the conversation_id protocol and includeDescendants default. The description's 'person name/email OR a layer name (or both)' adds a small amount of disambiguation about how personQuery and layerName combine, but nothing beyond what the schema implies.

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

Purpose5/5

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

States a specific verb and resource ('Query sharing and access information') and the five example questions pin down exactly what the tool returns. The sharing/access framing distinguishes it cleanly from sibling tools like get_layers or find_listings, none of which concern permissions.

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

Usage Guidelines4/5

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

Explicitly states the trigger conditions ('Always use this tool when the user asks about sharing, access, permissions, or what someone can see') and shows representative phrasings. It does not name a when-not case or an alternative tool for adjacent questions, which keeps it just short of a 5.

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

import_fileImport spreadsheetAInspect

Import an entire spreadsheet of pins in ONE call — the direct replacement for looping add_comp/bulk_add_comps row by row. Also imports map overlays from KML/KMZ/GeoJSON files (fileUrl ending in .kml/.kmz/.geojson): lines such as thoroughfare plans / MTPs, utility runs and polygons keep their real shape and draw in the layer color; MultiGeometry is merged, KML style junk is dropped, and road names like 'Friendship Rd (4/120)' get Lanes and ROW (ft) customFields. Give either fileUrl (a downloadable CSV/XLSX/KML/KMZ/GeoJSON link) or csvText (the raw CSV content pasted as a string). The server parses it, auto-detects the header row and columns (name, lat/lng, address parts, price, acreage, notes, record #), keeps every other column as filterable customFields, geocodes rows that only have addresses (rows whose address is not found are skipped with a reason), and upserts by externalId so a re-run updates instead of duplicating. Rows are comps; they become Listings only with asListings:true, which you set only when the Broker says these are their listings — never infer it from the columns. Start with dryRun:true to see the detected column mapping and a sample before writing anything. Up to 2000 rows per call.

NameRequiredDescriptionDefault
sheetNoXLSX only: sheet name to import. Default: first sheet.
dryRunNoIf true, parse and return the detected column mapping + 3 sample rows WITHOUT writing. Recommended first step.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
csvTextNoRaw CSV content as a string (paste the file contents). Provide this OR fileUrl.
fileUrlNoPublic downloadable URL of a .csv, .xlsx, .kml, .kmz or .geojson file. Provide this OR csvText.
layerIdNoTarget layer for every imported row. Provide this OR newLayerName.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
offerTypeNoWith asListings: the Offer type for every row. An "Offer type" column in the file wins.
asListingsNotrue only when the Broker said this file is their listings: every row becomes a Listing (Active, confirmed today, the caller as Listing broker). Default false: rows are comps and are never inferred as listings.
assetClassNoWith asListings: the Asset class for every row. An "Asset class" column in the file wins.
newLayerNameNoCreate a new layer with this name and import into it.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.4/5.0
Behavior3/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds real value beyond that with upsert-by-externalId semantics (re-runs update rather than duplicate), the 2000-row ceiling, and geocode-skip behavior for unmatched addresses. However, it says little about permissions/auth requirements or what happens on partial failure partway through a large write.

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

Conciseness4/5

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

Front-loaded with the core capability and the sibling replacement in the first sentence, with operational caveats following. It is dense and the KML style-junk/MultiGeometry/Lanes-and-ROW details run long for a single paragraph, but every clause conveys actionable behavior rather than filler.

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

Completeness5/5

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

For a 12-parameter write tool with no output schema, the description covers parsing, header auto-detection, customField retention, geocoding fallback, upsert keying, batch limits, and the dryRun preview. An agent has enough to call it correctly without opening the schema.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds decision-level meaning: the fileUrl-vs-csvText exclusivity, the dryRun-first workflow, and the strong caution that asListings must come from the Broker rather than column inference. It does not add much beyond the schema for context/llm_model/conversation_id, which the schema already documents thoroughly.

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

Purpose5/5

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

The opening sentence states a specific verb and resource ('Import an entire spreadsheet of pins in ONE call') and explicitly positions it against siblings ('the direct replacement for looping add_comp/bulk_add_comps row by row'). It also distinguishes the second mode (KML/KMZ/GeoJSON map overlay import) with concrete examples of what those files contain.

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

Usage Guidelines5/5

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

It gives explicit selection rules: supply either fileUrl or csvText, start with dryRun:true to preview before writing, and set asListings:true only when the Broker says the file is their listings and 'never infer it from the columns'. Alternatives and when-not conditions are both stated outright.

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

list_map_foldersList map foldersA
Read-only
Inspect

List the Library folders that organize the user's MAPS (not layers). Folders can nest inside each other. Returns each folder's name, id, parent folder, and how many maps it holds. Use before create_map_folder or move_map_to_folder to see what exists.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare a safe read (readOnlyHint=true, destructiveHint=false), so the description only needs additive context. It delivers that by disclosing the result shape (name, id, parent folder, map count) and the nesting behavior of folders, which the annotations cannot convey. Pagination/ordering behavior is the one omission.

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

Conciseness5/5

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

Three sentences, zero filler. The scope-and-exclusion statement is front-loaded, the return shape follows, and the workflow hint closes it. Every sentence earns its place.

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

Completeness5/5

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

No output schema exists, and the description compensates by enumerating the returned fields and the nesting structure. Combined with a 100%-documented schema and clear read-only annotations, an agent has everything needed to call this correctly.

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

Parameters3/5

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

Schema description coverage is 100% and the three parameters (context, llm_model, conversation_id) are fully documented telemetry/session fields, so the description correctly spends no words on them. Per the high-coverage baseline this is a 3 — nothing added, nothing missing.

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

Purpose5/5

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

States a specific verb (List) and resource (Library folders organizing MAPS), and explicitly excludes layers, which is the nearest confusing sibling. An agent can distinguish it from list_maps, get_layers, and list_public_maps without opening any schema.

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

Usage Guidelines4/5

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

Explicitly positions the tool in a workflow: 'Use before create_map_folder or move_map_to_folder to see what exists,' naming two concrete alternatives and the condition that makes this the right call. It does not state when NOT to use it, so it falls just short of full when/when-not coverage.

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

list_mapsList mapsA
Read-only
Inspect

List all of the user's maps (name + id). Use this to see what maps exist before creating layers/comps in a specific map, to verify a map was created, or when the user asks what maps they have. A map is the top-level container; layers live inside a map.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the return shape (name + id) and the map/layer hierarchy, but no pagination, ordering, or scoping details beyond that.

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

Conciseness5/5

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

Front-loaded with the purpose, then the usage triggers, then a clarifying definition of 'map'. Three tight sentences, none wasted.

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

Completeness4/5

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

For a simple read-only list tool with annotations covering safety and no output schema, the description says enough to call it correctly. Minor gap: it doesn't clarify relationship to list_map_folders or list_public_maps.

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

Parameters3/5

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

Schema coverage is 100%, and the three parameters are analytics bookkeeping fields (context, llm_model, conversation_id) fully documented in the schema. The description adds nothing about parameter usage, so the baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ('List all of the user's maps') and even specifies the returned fields ('name + id'). It also disambiguates the domain model ('A map is the top-level container; layers live inside a map'), which distinguishes it from layer-oriented siblings like get_layers.

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

Usage Guidelines4/5

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

Gives three concrete when-to-use triggers: before creating layers/comps, to verify creation, or when the user asks what maps they have. Clear context, but it never names competing alternatives such as list_public_maps or list_map_folders to route the agent away from them.

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

list_public_mapsList public mapsA
Read-only
Inspect

Browse the OPEN MARKETPLACE: every map any MappaIQ user has published as Public. This reaches beyond the connected account — brokers and owners across the industry publish their listing portfolios here, and any connected agent can read them. Returns each public map's name, owner (with their public profile URL), pin/layer counts, and a browser link to the map's public page (pageUrl). Optional keyword filters by map or owner name. Use search_public_listings to query the pins themselves.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
keywordNoFilter maps by map name or owner name (case-insensitive substring).
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuine context beyond that: the marketplace scope spans accounts, it enumerates returned fields (name, owner profile URL, pin/layer counts, pageUrl), and notes the optional keyword filter. No auth or rate-limit detail, but the added value is real.

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

Conciseness4/5

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

Front-loaded with the core purpose, followed by scope, return fields, and the routing hint — a sensible order. The 'brokers and owners across the industry publish their listing portfolios here' clause is somewhat promotional filler but the overall density is acceptable.

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

Completeness4/5

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

No output schema exists, so the description helpfully enumerates the return fields and provides a pageUrl link. Scope and the pin-level alternative are covered. The meta-parameters (context, llm_model, conversation_id) are self-documented in the schema, leaving only minor gaps.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents all four parameters including keyword, context, llm_model, and conversation_id. The description's mention of 'optional keyword filters by map or owner name' merely restates the schema, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Browse the OPEN MARKETPLACE: every map any MappaIQ user has published as Public') and immediately scopes it against the connected account, which distinguishes it from the sibling list_maps. An agent can tell what it returns and how it differs from other list tools.

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

Usage Guidelines4/5

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

Explicitly routes the pin-level query to the alternative ('Use search_public_listings to query the pins themselves') and implies the connected-account alternative via 'reaches beyond the connected account.' It gives clear context but never names list_maps explicitly or states when this tool should not be used.

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

move_layerMove layerA
Destructive
Inspect

Move a layer into another layer (making it a subfolder/child), or move it to the root level. PREFER exact ids (layerId/destinationId, from get_layers) — several layers often share a name across maps, and an ambiguous name is refused rather than guessed. Both layers must be in the same map. If moving multiple layers, call once per layer.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
layerIdNoExact id of the layer to move (from get_layers). Strongly preferred over layerName.
mapNameNoWhen matching by name across maps, limit matches to this map.
layerNameNoName of the layer to move (case-insensitive). Refused if ambiguous — use layerId instead.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
destinationIdNoExact id of the destination parent layer. Strongly preferred over destinationName.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
destinationNameNoName of the destination parent layer. Omit both destination fields to move the layer to root (top level).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so safety is covered. The description adds real behavioral context beyond them: ambiguous names are refused rather than guessed, both layers must be in the same map, and root is the implicit default when no destination is given. It does not disclose what the response looks like or any error/undo behavior, but the annotation bar is already met.

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

Conciseness5/5

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

Three tight sentences with the purpose front-loaded, followed by the id-preference rule and the same-map/batch constraints. No sentence is filler.

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

Completeness4/5

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

For an 8-parameter mutation tool with no output schema, the description covers the operation semantics, constraints, and invocation method well. It leaves out permission requirements and return/error behavior, which are minor given the destructive hint already flags mutation risk.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description still adds value by explaining the rationale behind the id-over-name preference (name collisions across maps) and the root-level default, which the schema states mechanically but does not justify.

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

Purpose5/5

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

States a specific verb (move) and resource (layer) and enumerates both destinations: into another layer as a child, or to the root. This cleanly distinguishes it from siblings like rename_layer and move_map_to_folder without the agent opening a schema.

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

Usage Guidelines4/5

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

Gives clear invocation guidance: prefer exact ids from get_layers, names are refused when ambiguous, both layers must share a map, and one call per layer for batch moves. It does not explicitly name tool alternatives (e.g. rename_layer for renaming), but the when-to-use context is strong and unambiguous.

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

move_map_to_folderMove map to folderA
Destructive
Inspect

Move a MAP into a Library folder, or back to the Library root. E.g. 'put the Grocers map in the Retail folder'. Use list_maps and list_map_folders to see names. To move a LAYER, use move_layer instead.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
mapNameYesName (or id) of the map to move, case-insensitive.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
folderNameNoDestination folder name (or id), case-insensitive. Omit to move the map to the Library root.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered structurally. The description adds useful routing context (root vs folder) but says nothing about what the move affects, whether the map leaves its prior folder, or failure behavior when the target folder doesn't exist.

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

Conciseness5/5

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

Three tight sentences with no filler: action and scope first, then the example, then the routing helpers and the sibling exclusion. Nothing is redundant or buried.

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

Completeness4/5

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

For a simple mutation with a fully documented schema and annotations covering the safety profile, the description covers action, destination, alternatives, and name resolution. Minor gaps remain around error cases (unknown map or folder) and whether the source folder is affected.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters are documented in the schema itself, including the context and conversation_id analytics fields. The description's only added semantics is the omit-folderName-to-reach-root rule, which the schema also states, so the baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb (move) and resource (MAP) plus the destination scope (Library folder or root), with a concrete example. It explicitly distinguishes itself from the sibling move_layer, so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

Names the alternative (move_layer) and the exact condition that selects it, and points to list_maps and list_map_folders to resolve names. The 'omit folderName to move to root' note tells the agent how to trigger the non-default case.

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

rename_layerRename layerA
Destructive
Inspect

Rename an existing layer. Use when the user says 'rename layer X to Y' or 'call this layer something else'.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
layerIdYesThe ID of the layer to rename
newNameYesThe new name for the layer
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation/destructive profile is covered structurally. The description adds no behavioral context beyond that—no permission requirements, no note on what a rename affects—so it neither contradicts nor enriches the annotations.

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

Conciseness4/5

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

Two short sentences with the core action front-loaded and no filler. The trigger-phrase sentence is slightly redundant with the first but still earns its place as routing help.

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

Completeness4/5

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

For a simple rename operation whose safety profile is carried by annotations and whose parameters are fully documented in the schema, the description is largely sufficient. A brief note on the destructive flag or required permissions would make it complete.

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

Parameters3/5

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

Schema description coverage is 100%, so layerId, newName, context, llm_model, and conversation_id are all documented in the schema itself. The description adds no parameter-level meaning beyond that, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb (rename) and resource (layer) that clearly separates it from the sibling rename_map and create_layer. It's clear and unambiguous, though it never explicitly names an alternative tool, so it stops short of full sibling differentiation.

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

Usage Guidelines4/5

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

Gives concrete trigger phrases ('rename layer X to Y', 'call this layer something else') that map directly to user intent, which is genuinely useful for routing. It does not, however, state when NOT to use it or point to the relevant alternatives (e.g. rename_map, move_layer).

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

rename_mapRename mapB
Destructive
Inspect

Rename an existing map. Give the current map name (or id) and the new name. Use list_maps to see current names.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
mapNameYesCurrent name of the map to rename (case-insensitive), or its id.
newNameYesThe new name for the map.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered structurally and none of the description contradicts it. But the description adds nothing behavioral beyond that: it does not say whether the rename is reversible, what happens if the new name collides with an existing map, or whether the old name is freed.

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

Conciseness4/5

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

Three short, front-loaded sentences with no filler; the action and its two inputs come first. The list_maps hint earns its place as a practical next step.

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

Completeness3/5

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

Covers the core inputs and a discovery path for a five-parameter mutation tool with no output schema. It leaves out failure/edge behavior for a destructive rename, which is the main remaining gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents all five parameters including context, llm_model, and conversation_id. The description only restates the mapName/newName semantics (name-or-id, case-insensitive is in the schema), so baseline 3 applies.

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

Purpose4/5

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

States a specific verb (rename) and resource (map), and clarifies that the target can be identified by current name or id. It does not differentiate itself from the sibling rename_layer, which an agent could plausibly confuse it with, 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.

Usage Guidelines3/5

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

Points the agent at list_maps to discover current names, which is useful routing guidance for the input. However, it gives no when-not conditions (e.g. vs rename_layer) and no prerequisites such as needing an existing map or handling name collisions.

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

report_listingReport Marketplace listingAInspect

Report a Marketplace listing (from search_public_listings) that is off the market, wrong, not this Broker's listing (for example another Account's copy of the user's own listing), or spam. Use it only when the user asks to report. One report per listing per account; counts as 1 search against the Marketplace limit. The listing's broker is told the reason, never who reported. Reports from 3 accounts hide the listing until MappaIQ reviews it.

NameRequiredDescriptionDefault
idYesListing id from search_public_listings.
noteNoOptional detail for MappaIQ's review, max 500 characters. Not sent to the listing's broker.
reasonYes
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false, but the description adds substantial behavioral context: one report per listing per account, a cost of 1 search against the Marketplace limit, broker notification of the reason but not the reporter's identity, and the consequence that 3 account reports hide the listing pending review. These are effects an agent could not derive from the schema or annotations.

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

Conciseness5/5

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

Four sentences, each front-loading the most decision-relevant information: what to report, when to use it, the rate/account constraints, and the downstream effects. 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.

Completeness5/5

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

For a mutation tool with no output schema and only minimal annotations, the description covers the critical behavioral envelope: preconditions, rate limits, privacy of the reporter, and the state change triggered by multiple reports. An agent has everything needed to call it correctly and safely.

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

Parameters4/5

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

Schema description coverage is 83%, so the schema already carries most parameter meaning. The description still adds value by explaining the reason categories in prose (off the market, wrong, not this Broker's listing, spam) and clarifying that only the reason, not the reporter, reaches the broker.

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

Purpose5/5

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

The description states a specific verb and resource (report a Marketplace listing) plus the precise scope of valid targets: off-market, wrong, not this Broker's listing, or spam. It names the sibling tool it depends on (search_public_listings) and is clearly distinguishable from read-oriented siblings like get_public_listing or search_public_listings.

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

Usage Guidelines4/5

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

It gives an explicit activation condition ('Use it only when the user asks to report') and enumerates the qualifying listing states. It does not name an alternative tool or exclusion path beyond that, so it is clear context without full when-not/alternative routing.

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

search_compsSearch pinsA
Read-only
Inspect

Search the connected account's own MappaIQ property data — its listings, sites, comps and quotes. PREFER THIS whenever the user asks to show, pull up, see, find, list or map their properties/listings/sites/comps (e.g. 'show me 5 biggest Weitzman sites', 'what's available in Lewisville'); results come back plotted on a live map preview in the chat, not just a list. Can filter by layer, price range, acreage range, date range, keyword in name/notes/address, custom field key/value, flagged status, or by a GeoJSON polygon geometry to find records inside an area. Returns the total 'count' plus one page of results (default 50, max 500). For a full audit/export of a large set, page through with offset: keep calling with offset += returned until nextOffset is null.

NameRequiredDescriptionDefault
limitNoMax records to return in this page. Default 50, max 500.
offsetNoSkip this many matching records (for paging through a large result set). Default 0.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
flaggedNoIf true, return only flagged records
keywordNoFree-text search across name, address, city, county, submarket, state, and notes. USE THIS for location questions — 'properties in Lewisville' → keyword:'Lewisville', 'what's in Texas' → keyword:'Texas' (matches TX too).
layerIdNoFilter by layer ID
maxPriceNoMaximum sale price
minPriceNoMinimum sale price
afterDateNoFilter comps after this date (ISO string)
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
assetClassNoFilter by asset class: Land, Retail, Multifamily, Office, Industrial, Hospitality, Healthcare, Mixed Use, Other
beforeDateNoFilter comps before this date (ISO string)
maxAcreageNoMaximum acreage
minAcreageNoMinimum acreage
withinZoneNoFilter to pins inside a SAVED ZONE on the map, by the zone's name (or comp id). Use this whenever the user says 'inside/within the zone …', 'in my search area', etc. — no GeoJSON needed; the zone's own polygon is used. Ambiguous names return candidates. Works with zones in layers shared with the user too.
externalIdsNoLook up records directly by their externalId (source Record #s from an import). Returns exactly the matching records — use this instead of paging through everything to build an ID map, e.g. before targeted updates or deletes.
customFieldKeyNoFilter by a custom field name (e.g. 'Due Diligence', 'Water Access', 'Status')
withinGeometryNoGeoJSON geometry to spatially filter comps inside this area
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
maxPricePerAcreNoMaximum price per acre
minPricePerAcreNoMinimum price per acre
customFieldValueNoFilter by custom field value (e.g. 'Complete', 'Yes', 'Under Contract'). Case-insensitive substring match.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered by structured data. The description does add real behavioral value — results are plotted on a live map preview, the return shape is total 'count' plus one page (default 50, max 500), and offset paging terminates when nextOffset is null. That is genuine context beyond the annotations, though it stays silent on things like auth scope, ordering of results, and rate limits.

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

Conciseness4/5

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

Well front-loaded: purpose first, then the PREFER-THIS routing, then filter capability, then return shape and pagination. It is long but nearly every sentence adds an operational fact; the filter list is the one segment that overlaps the schema and could be trimmed.

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

Completeness5/5

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

For a 22-parameter tool with a nested GeoJSON object and no output schema, the description still leaves nothing essential missing: it states what comes back (count + one page, default 50/max 500), how to paginate, and what filters exist. An agent can call it correctly on the first try.

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

Parameters3/5

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

Schema coverage is 100% and the parameter descriptions are already unusually rich (keyword guidance, withinZone trigger phrases, externalIds lookup rationale, conversation_id handling), so the schema carries the weight. The description's filter enumeration (layer, price, acreage, date, keyword, custom field, flagged, polygon) mirrors what the schema documents rather than adding syntax or format detail. Baseline 3 applies.

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

Purpose4/5

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

States a specific verb (search) and scoped resource ("the connected account's own MappaIQ property data — its listings, sites, comps and quotes"), which distinguishes it from the public-facing siblings. It stops short of naming an alternative tool explicitly, so an agent must infer the boundary from the "own/connected account" qualifier.

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

Usage Guidelines5/5

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

"PREFER THIS whenever the user asks to show, pull up, see, find, list or map their properties..." gives an explicit positive trigger with worked examples ('show me 5 biggest Weitzman sites'). It also covers the downstream case in the same breath: for full audit/export, page with offset until nextOffset is null — so both the default and the bulk path are routed.

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

search_placesSearch placesA
Read-only
Inspect

Search for businesses, points of interest, or places on the map. Use when the user asks to find or show places like 'show me barbershops in Dallas', 'find coffee shops near downtown', 'where are the hospitals in Fort Worth'. Returns a list of places that will appear on the map.

NameRequiredDescriptionDefault
latNoLatitude for proximity (if known)
lngNoLongitude for proximity (if known)
nearNoLocation to search near. Defaults to Dallas if not specified.
limitNoMax results 5-25. Default 10.
queryYesWhat to search for (e.g. 'barbershops', 'Walmart', 'hospitals', 'gas stations')
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely new behavioral context by noting that returned places will appear on the map, which is a visible side effect not captured in annotations.

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

Conciseness5/5

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

Two sentences: purpose first, then trigger conditions with inline examples. No filler, and the most decision-relevant information is front-loaded.

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

Completeness4/5

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

For an 8-parameter tool with full schema coverage and no output schema, the description covers the return value ('a list of places') and the map side effect. The analytics/context and conversation_id plumbing is fully explained in the schema, so little is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter including defaults (near defaults to Dallas, limit 5-25) is already documented. The description adds no syntax or format detail beyond the schema, which is the expected baseline when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb and resource ('Search for businesses, points of interest, or places on the map') and scopes it to map-displayed results. This distinguishes it from siblings like search_comps and search_public_listings, which target different resources.

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

Usage Guidelines4/5

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

Gives an explicit trigger ('Use when the user asks to find or show places') reinforced by three concrete example utterances. It does not name alternative sibling tools or state when not to use it, so it stops short of a 5.

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

search_public_listingsSearch Marketplace listingsA
Read-only
Inspect

Search pins ACROSS THE OPEN MARKETPLACE — the pins of every publicly published map on MappaIQ, not just this account. Use it for questions like 'what land is publicly listed under $2M around Rockwall' or 'show me every public retail listing'. Each hit is attributed to its map and owner (with the map's public page link); licensedBroker:true means MappaIQ checked the owner's TREC license, so say 'Licensed broker'. Filter by keyword (name/address/notes/city), assetClass, price and acreage ranges, or restrict to one public map with publicMapId (from list_public_maps). Returns EVERY pin on every public map, with every field as the owner stored it (name, address, price, size, notes, custom fields, etc.) plus the Listing broker's name and brokerage — because publishing a map makes the whole map public. Brokers label fields inconsistently, so the marketplace understands synonyms: size columns named SF / Sq Ft / Size / Available, price named Asking / List Price, land named Acres / Lot Size are all normalized into clean price / buildingSF / acreage / offerType / assetClass fields you can filter on (the broker's original columns are kept too). confirmedDaysAgo gives the age of a pin's Confirmed date, or null when it was never dated. One result per property: when several Accounts list the same property (a Co-listing), the most recently confirmed one's fields come first, offers says who offers what ("For sale (A) · For lease (B)") and listedBy gives each broker with the pin id for get_public_listing. No phone or email: get them with get_public_listing. 50 per page.

NameRequiredDescriptionDefault
limitNoPage size. Default and max 50.
offsetNoSkip this many matches (paging). Default 0.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
keywordNoFree-text match on name, address, notes, city, market fields.
maxSqftNoMaximum building size in square feet.
minSqftNoMinimum building size in square feet.
maxPriceNo
minPriceNo
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
assetClassNoLand, Retail, Multifamily, Office, Industrial, etc.
maxAcreageNo
minAcreageNo
publicMapIdNoRestrict to one public map (mapId from list_public_maps).
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnly/non-destructive, but the description adds substantial behavior: full-map exposure ('publishing a map makes the whole map public'), field normalization with broker synonym handling, confirmedDaysAgo semantics (null when undated), co-listing dedup rules, and the explicit absence of phone/email. This is well beyond what structured fields provide.

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

Conciseness4/5

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

The purpose and scope are front-loaded, and each clause carries substantive information (dedup, normalization, pagination). The sentences are long and dense, packing several distinct behaviors per sentence, so it reads as a wall of text rather than crisply structured guidance.

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

Completeness5/5

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

For a 14-parameter tool with no output schema, the description compensates thoroughly: it describes the return shape (all fields as stored, normalized fields, attribution, listedBy, offers), pagination (50/page), and the contact-data gap. Nothing an agent needs to call or interpret results correctly is missing.

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

Parameters4/5

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

With 71% schema coverage, the schema documents most params, but the description adds real meaning: keyword matches name/address/notes/city, publicMapId comes from list_public_maps, and the price/acreage/assetClass filters map onto normalized fields. It does not explain limit/offset or the analytics-only params, which the schema already covers.

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

Purpose5/5

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

The description states a specific verb and resource ('Search pins ACROSS THE OPEN MARKETPLACE') and immediately scopes it against siblings: 'the pins of every publicly published map on MappaIQ, not just this account.' An agent can distinguish it from search_comps, find_listings, and list_public_maps without opening any schema.

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

Usage Guidelines4/5

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

It gives concrete triggering examples ('what land is publicly listed under $2M around Rockwall') and routes to the right siblings for follow-ups: list_public_maps for publicMapId and get_public_listing for phone/email. It stops short of an explicit when-not-to-use statement (e.g. 'use find_listings for your own account's pins'), leaving that boundary implied.

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

set_calloutSet pin calloutA
Destructive
Inspect

Add, edit, move, or REMOVE a callout bubble on a pin — a small card floating on the map showing chosen field values (price, acreage, custom fields, …) with a leader line back to the dot. Snippet image exports include these bubbles, so they're how owners show VALUES in a shared picture. Target one pin by compId (preferred) or name — an ambiguous name returns candidates instead of guessing. 'fields' sets what's displayed, in order; omit it to keep the current fields (or smart defaults on a new callout). direction + distanceMiles place the bubble relative to the pin; omit both to leave its position alone. remove:true deletes the pin's callout.

NameRequiredDescriptionDefault
nameNoPin name, case-insensitive. Must resolve to exactly one Point pin.
compIdNoPin ID (preferred — unambiguous)
fieldsNoOrdered field keys/labels to display, e.g. ['price','acreage','pricePerAcre']. Custom field names work too. Only fields that have a value on the pin are shown.
removeNotrue = delete this pin's callout bubble
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
directionNoBubble position relative to the pin: top-right (default for new callouts), top-left, bottom-right, bottom-left, top, bottom, left, right
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
distanceMilesNoHow far from the pin, in miles (default 0.35). Owners can always fine-tune by dragging.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true; the description goes further by specifying exactly what 'remove:true' deletes (the pin's callout) and clarifying that omitted fields/position leave existing state untouched. It doesn't mention permissions or reversibility, but the mutation semantics are disclosed clearly.

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

Conciseness4/5

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

Front-loaded with the action and resource, then moves through targeting, fields, position, and removal. Dense but each clause carries operational information; the mid-sentence parenthetical about what a callout is is the only mild padding.

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

Completeness4/5

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

For a 9-parameter mutation tool with no output schema, the description covers the essential behaviors: targeting resolution, field ordering, position defaults, and deletion. Return/candidate format is only lightly touched, but nothing critical for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds real meaning beyond the schema: 'fields' is ordered and omit-to-keep behavior, direction+distanceMiles placement semantics, and compId-over-name preference — all go beyond the field-level docs.

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

Purpose5/5

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

States specific verbs (add/edit/move/remove) and a precise resource (a callout bubble on a pin), then defines what that resource is. No sibling tool overlaps this function, so an agent can identify it unambiguously.

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

Usage Guidelines4/5

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

Gives clear targeting guidance (compId preferred, ambiguous name returns candidates rather than guessing) and states the effect of omitting 'fields' and position parameters. It stops short of explicit when-not-to-use or routing to an alternative sibling, but the conditional behavior is well covered.

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

set_custom_fieldSet custom fieldA
Destructive
Inspect

Write any key/value back to a SINGLE record. To tag many records at once (e.g. after analyzing a whole dataset), use bulk_set_custom_fields instead — don't loop this one call per record. Creates or updates the field.

NameRequiredDescriptionDefault
idYesThe record ID
keyYesField name (e.g. 'Due Diligence', 'Score', 'Analyst Note', 'Risk Level')
valueYesField value to write
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation profile is known. The description adds genuine value by disclosing upsert semantics ('Creates or updates the field'), but it does not say what happens to an existing value on overwrite or whether the write is reversible, which matters for a destructive-flagged tool.

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

Conciseness5/5

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

Three short sentences, zero padding, and the scoping constraint is front-loaded before the routing advice. Each sentence carries a distinct piece of information (scope, alternative, upsert behavior).

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

Completeness4/5

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

The description covers purpose, scope and sibling routing, which is the core need for this 6-parameter tool, and the required analytics/continuity parameters (context, llm_model, conversation_id) are well documented in the schema. It stops short of describing overwrite behavior for a destructive-flagged write, which is the one remaining gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3; every parameter, including context, llm_model and conversation_id, is fully documented in the schema. The description adds no parameter-level detail (e.g. key naming or value format) beyond what the schema already provides.

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

Purpose5/5

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

States a specific verb plus resource and scope: writes a key/value to a SINGLE record, and explicitly notes it creates or updates the field. It names the bulk sibling by contrast, so an agent can distinguish it from bulk_set_custom_fields without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use-this vs when-to-use-the-alternative rule: single record here, bulk_set_custom_fields for tagging many records, with the concrete anti-pattern ('don't loop this one call per record') spelled out.

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

update_compUpdate pinC
Destructive
Inspect

Update properties of a single existing comp/waypoint

NameRequiredDescriptionDefault
idYesThe comp ID to update
dateNo
nameNo
typeNoRecord type: comp | listing | prospecting | client
buyerNo
notesNo
priceNo
sellerNo
zoningNo
acreageNo
addressNo
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
offerTypeNoOffer type of a listing
listingStageNoListing stage: active | under_contract | withdrawn. Closing is not a stage: a closed listing becomes type comp.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered. However, the description adds nothing behavioral beyond the annotations: it does not say whether this is a partial merge (only supplied fields changed) or a full replacement that clears omitted fields — a critical distinction for a 16-parameter destructive update. Given the annotations do the safety work, this is a modest gap, but the merge-vs-replace semantics are left entirely unstated.

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

Conciseness4/5

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

A single compact sentence with no padding, and the purpose is front-loaded. It is efficient, though its brevity is closer to under-specification than ideal conciseness for a tool of this complexity.

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

Completeness2/5

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

For a destructive 16-parameter mutation tool with 44% schema coverage and no output schema, the description is far too thin. It omits update semantics, the effect of omitted fields, and any signal about partial vs. whole-record updates, leaving the agent materially underinformed.

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

Parameters2/5

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

Schema description coverage is only 44%, so most of the 16 parameters (date, name, buyer, notes, price, seller, zoning, acreage, address) carry no documented meaning in either the schema or the description. The description adds zero parameter-level information, leaving a large compensating burden unmet.

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

Purpose4/5

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

States a specific verb+resource ('Update properties of a single existing comp/waypoint'), and the word 'single' implicitly contrasts with bulk_update_comps. The title 'Update pin' and the body's 'comp/waypoint' terminology are inconsistent, which slightly muddies the resource identity, but the core purpose is clear.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisites, and no routing to alternatives such as bulk_update_comps (for multiple records) or update_listing (for listings). The agent gets the purpose but must infer the selection conditions from sibling names alone.

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

update_listingUpdate listingA
Destructive
Inspect

Change one Listing (id from find_listings). Any edit also confirms the listing (Confirmed date = today). Closing is not a stage: for sold/leased use close_listing. Returns the listing's Marketplace status; tell the Broker in one line.

NameRequiredDescriptionDefault
idYesListing id from find_listings.
changesYesFields to change.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false and destructiveHint=true; the description adds the critical non-obvious side effect that 'Any edit also confirms the listing (Confirmed date = today).' It also mentions the return ('the listing's Marketplace status'). It could say more about what a mutation overwrites, but the side-effect disclosure is genuinely valuable 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.

Conciseness5/5

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

Three short sentences, front-loaded with the core action and id source, then the side effect, then routing. No wasted words; the 'tell the Broker in one line' instruction is terse and actionable.

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

Completeness4/5

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

Covers purpose, id provenance, side effect, sibling routing, and return value, which is ample for a requires-4-param nested mutation with no output schema. Only slight gap is not elaborating on merge-vs-replace semantics for the nested 'changes' object.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already details every field (stage enum, price null semantics, name default, etc.), so the description legitimately defers to it. The one derived constraint it reinforces (closing is not a stage) is already in the schema. Baseline 3 for high-coverage schema.

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

Purpose5/5

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

States a specific verb and resource ('Change one Listing') and anchors the id to its source tool ('id from find_listings'), immediately separating it from siblings like add_listing or close_listing. An agent can identify the operation without opening the schema.

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

Usage Guidelines4/5

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

Names the key exclusion explicitly: 'Closing is not a stage: for sold/leased use close_listing,' routing the agent away from a plausible wrong choice. It doesn't enumerate other adjacent options (confirm_listings, update_comp), so it's clear context rather than exhaustive when/when-not guidance.

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

Tool Schema Changelog

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

  1. 1 tool update
    • Changedimport_file1 field changed
      • changedInput schema / properties / fileUrl / description
        Previous value: -"Public downloadable URL of a .csv or .xlsx file. Provide this OR csvText."New value: +"Public downloadable URL of a .csv, .xlsx, .kml, .kmz or .geojson file. Provide this OR csvText."
  2. 42 tool updates
    • First observedadd_comp
    • First observedadd_listing
    • First observedadd_zone
    • First observedanalyze_comps
    • First observedbulk_add_comps
    • First observedbulk_set_custom_fields
    • First observedbulk_update_comps
    • First observedclose_listing
    • First observedconfirm_listings
    • First observedcreate_layer
    • First observedcreate_map
    • First observedcreate_map_folder
    • First observeddelete_comps
    • First observedexpress_interest
    • First observedfilter_by_date
    • First observedfind_listings
    • First observedflag_comp
    • First observedgenerate_bov
    • First observedgenerate_file
    • First observedget_comp_detail
    • First observedget_comp_links
    • First observedget_layers
    • First observedget_public_listing
    • First observedget_shares
    • First observedimport_file
    • First observedlist_map_folders
    • First observedlist_maps
    • First observedlist_public_maps
    • First observedmove_layer
    • First observedmove_map_to_folder
    • First observednavigate_to
    • First observedrename_layer
    • First observedrename_map
    • First observedreport_listing
    • First observedsearch_comps
    • First observedsearch_places
    • First observedsearch_public_listings
    • First observedset_callout
    • First observedset_custom_field
    • First observedset_logo
    • First observedupdate_comp
    • First observedupdate_listing

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Remote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.
    16
    23 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources