BudgetAtlas
Server Details
A read-only MCP server for stored travel prices in Southeast Asia. Query lodging and restaurant prices, compare covered cities and months, and check dataset coverage and freshness. Cost estimates state their assumptions and exclusions.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 9 tools
Most tools have clearly distinct targets: search_* tools retrieve raw observations per entity (lodging, restaurants, flights), while compare_* and summarize_* aggregate. The one soft boundary is between compare_city_costs (per-city lodging+meal comparison for a stay) and summarize_costs (city/country medians of the same underlying data), which an agent could plausibly confuse. Metadata tools (capabilities/freshness/coverage) are distinct enough from each other but all read as 'dataset introspection' at a glance.
Every tool follows a strict snake_case verb_noun pattern: compare_*, get_*, search_*, summarize_*. Verbs map predictably to intent (search = row-level retrieval, compare/summarize = aggregation, get = metadata), making the surface easy to scan.
Nine tools is well within the ideal 3-15 range and each earns its place: three search tools, two comparison tools, one summary tool, and three introspection tools. No tool looks redundant or bolted on.
Core domain (lodging, restaurants, flights, city cost comparison, plus coverage/freshness/capabilities) is covered with no obvious CRUD-style dead ends, since the server is read-only by design. Gaps are asymmetric rather than fatal: lodging gets a month-over-month comparator (compare_lodging_months) with no flight equivalent, there is no combined trip-budget rollup (flights + lodging + meals), and restaurants can only be found via a numeric price filter, so non-priced venues are unreachable.
Available Tools
9 toolscompare_city_costsCompare lodging + meals across citiesARead-onlyIdempotentInspect
Compare covered cities for a stay of N days, or for exact dates. Returns per-city lodging and meal components, a lodging + meals subtotal, the assumptions and formulas used, observed ranges, sample sizes, source coverage, freshness, and the categories that are explicitly NOT included. This is not a cost-of-living total.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of days/nights to price. Ignored in exact mode. | |
| rooms | No | ||
| cities | No | City IDs such as 'th-bangkok'. Call get_dataset_coverage for the covered list. | |
| people | No | ||
| checkin | No | Exact mode: use with checkout. | |
| checkout | No | ||
| countries | No | ISO 3166-1 alpha-2 country codes, e.g. ['TH','VN']. | |
| components | No | Which components the subtotal covers. Pass ['meals'] to get a complete meals-only answer for cities that have meal prices but no lodging price, instead of a null lodging+meals subtotal. The returned subtotal_label always names exactly what the figure contains. | |
| lodging_types | No | ||
| freshness_days | No | Only use observations collected within this many days. | |
| min_review_count | No | ||
| min_rating_fraction | No | ||
| meals_per_person_per_day | No | Caller's assumption. BudgetAtlas does not infer how often someone eats out. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| mode | Yes | |
| cities | Yes | |
| request | Yes | |
| currency | Yes | |
| suggestions | Yes | |
| no_data_reason | Yes | |
| unknown_cities | Yes | |
| ranked_by_subtotal | Yes | |
| excluded_categories | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/closed-world, and the description adds substantive context beyond them: assumptions and formulas are surfaced, plus sample sizes, source coverage, freshness, observed ranges, and explicitly excluded categories. That is unusually rich disclosure of what the response will and won't tell you.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense, front-loaded sentences; the mode statement comes first and the exclusion plus output inventory follow with no filler. Every clause carries information the agent would otherwise have to infer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 13 optional parameters, an output schema present, and only 54% schema description coverage, the description does well on output expectations and scope but leaves several input parameters unexplained. Slightly short of fully complete, but well beyond minimum viability.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 54% and the description only reinforces a couple of fields (days vs exact-date mode, and the components fallback semantics are already in the schema). Many parameters — rooms, people, min_review_count, min_rating_fraction, lodging_types — receive no added meaning from the description, so compensation for the coverage gap is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource ('Compare covered cities for a stay of N days, or for exact dates') with explicit scope negation ('This is not a cost-of-living total'). It distinguishes itself from a general cost-of-living style tool, though it never names compare_lodging_months or summarize_costs directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The two pricing modes (N days vs exact dates) tell the agent which inputs select which behavior, and the schema points to get_dataset_coverage for valid cities. But it gives no guidance on when to pick this over compare_lodging_months or summarize_costs, so usage is implied rather than delineated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_lodging_monthsCompare lodging prices across check-in monthsARead-onlyIdempotentInspect
Compare observed nightly lodging rates for one city across the check-in months that were collected, for a single stay length and occupancy. Returns each month's distribution, the like-for-like subset of properties present in every month, and a cheapest month stated only from that subset. Each month is one sampled check-in date, not a monthly average.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City ID, e.g. 'th-bangkok'. | |
| rooms | No | ||
| adults | No | ||
| months | No | Restrict to these months, e.g. ['2026-10','2026-11']. Omit to compare every collected month. | |
| nights | No | Stay length to compare across months. Only collected lengths return observations. | |
| freshness_days | No | Only use observations collected within this many days. |
Output Schema
| Name | Required | Description |
|---|---|---|
| gaps | Yes | |
| meta | Yes | |
| query | Yes | |
| method | Yes | |
| suggestions | Yes | |
| cheapest_month | Yes | |
| no_data_reason | Yes | |
| all_observations | Yes | |
| matched_properties | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, the description explains important behavioral traits: results are based on observed sampled check-in dates, not monthly averages; it returns each month's distribution, a like-for-like subset of properties present in every month, and a cheapest month derived only from that subset. These details materially affect interpretation of the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three focused sentences: purpose first, then return composition, then the key sampling caveat. Every sentence adds useful information and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter comparison tool with an output schema and read-only annotations, the description covers the main purpose, output composition, and the critical 'sampled check-in date, not monthly average' caveat. It leaves out explicit sibling routing and does not discuss freshness_days, but the structured schema and output schema carry much of the remaining detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with descriptions present for city, months, nights, and freshness_days. The description adds useful meaning around 'single stay length and occupancy' and clarifies that months are sampled check-in dates, but it does not compensate for the undocumented rooms/adults parameters or explain freshness_days.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: compare observed nightly lodging rates for one city across check-in months, with a single stay length and occupancy. That scope is clearly distinct from a generic lodging search or city-cost comparison, so an agent can identify the tool's role 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when this tool is appropriate: cross-month comparison of lodging rates using collected check-in months. However, it does not explicitly say when to use it instead of search_lodging, nor does it name any alternative or exclusion condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_capabilitiesWhat BudgetAtlas can and cannot answerARead-onlyIdempotentInspect
Free self-description for agents. Lists the question classes this dataset can answer, with a runnable example argument object per tool, and the questions it cannot answer, each naming the blocker (source not permitted, missing credential, out of scope, not collected) and the prerequisite that would lift it. Coverage figures are read from the database at call time. Call this before spending anything.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| billing | Yes | |
| answerable | Yes | |
| conventions | Yes | |
| no_data_reason | Yes | |
| not_answerable | Yes | |
| coverage_summary | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, closed-world), but the description adds context annotations cannot express: the call is free, coverage figures are read live from the database rather than cached, and failures are classified by blocker type with the prerequisite that would lift it. It also implies a cost asymmetry with the other tools, which shapes agent planning.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler, and the two most decision-relevant facts — it is free and it should be called first — sit at the start and end where they will be read. The middle sentence is long but every clause (examples, blockers, prerequisites) is a distinct piece of information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not describe return values, and it instead explains what those values mean (answerable classes, runnable examples, blocked classes with lifting prerequisites). The one gap is the boundary against get_dataset_coverage and get_data_freshness, which share the introspection role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the description correctly says nothing about arguments, so there is nothing to misinterpret. Baseline 4 applies for a 0-param schema; no value is added or lost.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb+resource: it lists the question classes the dataset can answer (with a runnable example argument per tool) and the questions it cannot, with named blockers. That is plainly a different kind of operation from every sibling (search_*, compare_*, summarize_costs), so an agent can classify it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Call this before spending anything" gives an explicit trigger condition plus the cost rationale ("free"), which is stronger than most tools manage. It does not differentiate itself from the neighbouring introspection tools get_dataset_coverage and get_data_freshness, which likely overlap in scope, so routing between those three is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_freshnessData freshnessARead-onlyIdempotentInspect
Report how old the data is, per city and for the dataset as a whole: the newest and oldest observation, its age in days against a staleness line you choose, a fresh/aging/stale/empty verdict that names the number behind it, and the last collection run with its status. Call this before quoting a price as current.
| Name | Required | Description | Default |
|---|---|---|---|
| cities | No | City IDs such as 'th-bangkok'. Call get_dataset_coverage for the covered list. | |
| category | No | Which observations to age. 'all' reports lodging and restaurants together and each on its own. | all |
| countries | No | ISO 3166-1 alpha-2 country codes, e.g. ['TH','VN']. | |
| stale_after_days | No | Age at which this caller considers an observation stale. Default 90, the same window the typical-price queries use. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| as_of | Yes | |
| notes | Yes | |
| cities | Yes | |
| dataset | Yes | |
| stalest_cities | Yes | |
| stale_after_days | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world, so the safety profile is covered. The description adds real behavioral detail beyond them: the four verdict buckets (fresh/aging/stale/empty), that a verdict reports the number behind it, and that the last collection run's status is included — useful context an agent would not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, followed by a compact enumeration of what is reported and a closing usage directive. The middle clause is dense and list-like but every element identifies a distinct returned attribute; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure needn't be spelled out, and the description still summarizes the salient outputs and verdict semantics. For a zero-required-parameter read tool, an agent has everything needed to decide to call it and how to interpret the staleness threshold.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description earns above baseline by framing stale_after_days as 'a staleness line you choose' and connecting it causally to the verdict categories, which the schema does not state as a relationship.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Report how old the data is') and enumerates the exact outputs: newest/oldest observation, age in days, a named verdict, and last collection run status. It is clearly distinguishable from siblings like get_dataset_coverage, which is referenced only for obtaining the city list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call this before quoting a price as current' gives a concrete trigger condition tied to the agent's task. It does not name an alternative tool or a when-not-to-use case, but for a freshness check the positive trigger is the operationally relevant guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dataset_coverageDataset coverageARead-onlyIdempotentInspect
Report what BudgetAtlas actually holds: covered cities, per-source counts, available lodging date/occupancy cohorts, numeric restaurant-price coverage, blocked collections, and known gaps. Call this before any broad comparison.
| Name | Required | Description | Default |
|---|---|---|---|
| cities | No | City IDs such as 'th-bangkok'. Call get_dataset_coverage for the covered list. | |
| source | No | ||
| category | No | ||
| countries | No | ISO 3166-1 alpha-2 country codes, e.g. ['TH','VN']. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| cities | Yes | |
| flights | Yes | |
| known_gaps | Yes | |
| collections | Yes | |
| lodging_cohorts | Yes | |
| excluded_categories | Yes | |
| related_categories_available | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is covered. The description adds value by disclosing that output includes 'blocked collections' and 'known gaps' — behavioral substance an agent would not otherwise know. Return shape is covered by the output schema, so no penalty there.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose, and the action directive is placed at the end where it is easily found. The enumerated list is dense but each item carries distinct meaning, so nothing is gratuitous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With strong annotations, an output schema, and zero required parameters, the description covers enough for correct invocation. The only gap is clarifying how the four optional filters scope the report, which the schema only partly addresses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, and the description implies filtering dimensions via 'per-source counts' and 'numeric restaurant-price coverage' (mapping loosely to source/category). However, the countries parameter and the relationship between the city/source/category filters and the report are not clarified beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ("Report what BudgetAtlas actually holds") and enumerates exactly what resource is covered: cities, per-source counts, lodging date/occupancy cohorts, restaurant-price coverage, blocked collections, gaps. This clearly marks it as a metadata/coverage tool, easily separable from siblings like compare_city_costs or search_lodging.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit sequencing directive, "Call this before any broad comparison," which tells the agent when to use it. It does not name the specific sibling (compare_city_costs, compare_lodging_months) or spell out when NOT to use it, keeping it just below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_flightsSearch Europe to Southeast Asia flight faresARead-onlyIdempotentInspect
Find observed round-trip fares from European hubs into Southeast Asian cities. Returns the observed fare distribution per route (minimum, quartiles, maximum), how many itineraries it was computed from, the fewest stops and shortest duration seen, and provenance. Fares are whole-trip totals for the whole party and are historical observations, not live availability. Rows marked provisional were read before the source's result list settled, so their minimum is biased high. Aggregates only: no itinerary-level fares or booking links are published.
| Name | Required | Description | Default |
|---|---|---|---|
| cabin | No | economy | |
| limit | No | ||
| adults | No | ||
| trip_type | No | round_trip | |
| origin_iata | No | European origin airport IATA code, e.g. 'CDG'. | |
| stay_nights | No | ||
| depart_month | No | Departure month, e.g. '2026-09'. Each month is represented by one sampled departure date. | |
| nonstop_only | No | Keep only routes with an observed nonstop itinerary. | |
| max_price_usd | No | Ceiling on the observed minimum fare for the route. | |
| destination_iata | No | Destination airport IATA code, e.g. 'BKK'. | |
| destination_city_id | No | Southeast Asian city ID, e.g. 'th-bangkok'. Resolves to that city's airport(s). | |
| include_provisional | No | Include readings taken before the source's result list settled (sample_count < 20 or status != 'ok'). They are always marked; set false to exclude them. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| query | Yes | |
| cohort | Yes | |
| results | Yes | |
| coverage | Yes | |
| truncated | Yes | |
| suggestions | Yes | |
| total_matches | Yes | |
| no_data_reason | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: states fares are whole-trip totals for the whole party, that data is historical rather than live, that `provisional` rows have a high-biased minimum, and that only aggregates are published. This is exactly the kind of caveat an agent must know before presenting numbers to a user.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return shape, then caveats — a logical order with no filler sentences. The sentence enumerating return fields is somewhat redundant given an output schema exists, which trims a point but not the practical value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers data provenance, aggregation level, and the provisional-data trap thoroughly, and the output schema handles return structure. The gap is the zero-required-parameter design: the description never says what happens when origin/destination/depart_month are omitted, nor how results are ordered or capped by `limit`.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 58%, so roughly half the 12 parameters are documented structurally. The description adds real meaning for party sizing ('whole-trip totals for the whole party') and for the provisional flag ('minimum is biased high'), but says nothing about cabin, trip_type, stay_nights, limit, or max_price_usd beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource with explicit bidirectional geography: 'Find observed round-trip fares from European hubs into Southeast Asian cities.' The scope constraint (Europe→SE Asia, fare aggregates only) plus the title cleanly separates it from the non-flight siblings (search_lodging, search_restaurants, compare_city_costs).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a strong exclusion — 'historical observations, not live availability' and 'no itinerary-level fares or booking links' — which tells the agent not to treat results as bookable prices. However, it never names an alternative source for live fares or explains when to prefer this over a sibling tool, so no explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_lodgingSearch lodging observationsARead-onlyIdempotentInspect
Search stored lodging price observations for a city, either for exact dates or for a stay length. Returns comparable prices with their original amount and currency, tax status, per-source ratings, evidence-backed amenity signals, provenance, and coverage. These are historical snapshots, not live availability.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City ID, e.g. 'th-bangkok'. | |
| limit | No | ||
| rooms | No | ||
| adults | No | ||
| nights | No | Typical mode: stay length without exact dates. | |
| checkin | No | Exact mode: use with checkout. | |
| sources | No | ||
| checkout | No | ||
| children | No | ||
| freshness_days | No | Only use observations collected within this many days. | |
| property_types | No | ||
| max_nightly_usd | No | ||
| min_review_count | No | ||
| required_signals | No | Evidence-backed amenity signals that must qualify. | |
| max_stay_total_usd | No | ||
| min_rating_fraction | No | Rating threshold as a 0-1 fraction of each source's own scale (0.8 = 8/10 or 4/5). |
Output Schema
| Name | Required | Description |
|---|---|---|
| gaps | Yes | |
| meta | Yes | |
| mode | Yes | |
| query | Yes | |
| results | Yes | |
| coverage | Yes | |
| truncated | Yes | |
| suggestions | Yes | |
| total_matches | Yes | |
| no_data_reason | Yes | |
| tax_comparability | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the low bar is met. The description adds meaningful context beyond that: 'historical snapshots, not live availability,' which is a genuine behavioral trait an agent must know (prices may be stale, not bookable). Return contents are also summarized.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action, then return shape, then the critical caveat. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be elaborated, but with 16 parameters and only 38% description coverage, the definition leaves a large filter surface under-explained. The mode guidance is present, but the many filter parameters lack any narrative meaning.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 38% schema description coverage the description should compensate, but it only addresses the date-vs-nights mode mapping. It says nothing about the 16 parameters' filters (sources, max_nightly_usd, required_signals, min_rating_fraction, freshness_days), leaving most of the surface documented only in the schema (or not at all).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Search) plus resource (stored lodging price observations) and scope (a city). It clearly distinguishes a raw price-search from aggregation siblings implicitly via 'observations,' but never names compare_lodging_months or compare_city_costs, leaving the agent to infer which sibling handles comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the two calling modes (exact dates via checkin/checkout vs stay length via nights), which is useful usage guidance. However, it gives no when-not-to-use or explicit routing to the many comparison siblings, so an agent still has to guess when search_lodging vs compare_lodging_months applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_restaurantsSearch restaurant price observationsARead-onlyIdempotentInspect
Find restaurant venues in a city by observed numeric price. Returns the item or range that qualified, its original amount and currency, the FX rate used, venue ratings by source, provenance, and coverage. Venues without a numeric observed price cannot pass a price filter and are reported as a coverage gap instead.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City ID, e.g. 'vn-hanoi'. | |
| limit | No | ||
| price_kinds | No | ||
| venue_types | No | ||
| max_price_usd | No | Ceiling on the observed price. A range qualifies only if its upper bound is under this. | |
| freshness_days | No | Only use observations collected within this many days. | |
| min_review_count | No | ||
| min_rating_fraction | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| query | Yes | |
| results | Yes | |
| coverage | Yes | |
| truncated | Yes | |
| suggestions | Yes | |
| total_matches | Yes | |
| no_data_reason | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, closed-world), yet the description still adds real value: FX conversion, provenance, per-source ratings, and the notable behavior that unobservable-price venues are reported as a coverage gap rather than silently dropped. That is a non-obvious behavioral trait worth the credit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the purpose, then return shape, then the edge case. Slightly over-invested in enumerating return fields that an output schema already documents, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return-value sentence is largely redundant, while the genuinely missing pieces — what the enum filters mean, how freshness_days defaults interact with coverage, and result limits — go unaddressed. Adequate, but the emphasis is misplaced for a 1-required/8-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 38%, so the description needs to compensate, and it largely does not: price_kinds, venue_types, min_review_count, min_rating_fraction, and limit get no explanation anywhere. Only the price ceiling concept is echoed ('by observed numeric price'), and the enum values themselves are undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find restaurant venues in a city by observed numeric price') plus the qualifying constraint, which cleanly separates it from search_lodging, search_flights, and the compare_* siblings. An agent can pick it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The price-filter framing implies when to use it, and the coverage-gap sentence hints at a limitation, but there is no explicit when-to-use/when-not guidance and no routing to alternatives such as summarize_costs or compare_city_costs. Usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
summarize_costsSummarize observed lodging and meal pricesARead-onlyIdempotentInspect
Summarize observed lodging nightly rates and restaurant meal prices for cities, and — when enough cities are covered — an unweighted median across the covered cities of a country. City distributions are always reported before any country figure, and a country figure never generalises to cities BudgetAtlas has not observed.
| Name | Required | Description | Default |
|---|---|---|---|
| rooms | No | ||
| adults | No | ||
| cities | No | City IDs such as 'th-bangkok'. Call get_dataset_coverage for the covered list. | |
| nights | No | Restrict lodging to this stay-length cohort. | |
| category | No | both | |
| countries | No | ISO 3166-1 alpha-2 country codes, e.g. ['TH','VN']. | |
| freshness_days | No | Only use observations collected within this many days. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| cities | Yes | |
| request | Yes | |
| currency | Yes | |
| countries | Yes | |
| suggestions | Yes | |
| no_data_reason | Yes | |
| unknown_cities | Yes | |
| excluded_categories | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, openWorldHint=false, idempotentHint), the description adds meaningful reporting behavior: city distributions are always shown before country figures, and a country median never generalizes to unobserved cities. It does not detail behavior when coverage is insufficient, but the key caveats are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and followed by the critical reporting-order caveat. Every clause contributes useful information without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only summary tool with an output schema and safety annotations, the description covers the key output behavior and country-level caveat well enough to call correctly. The main missing piece is routing guidance against similar comparison/search siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 57%, and the description only implicitly references the cities/countries parameters while adding nothing about rooms, adults, nights, category, or freshness_days. The schema still documents the most important parameters adequately, so this is minimally sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Summarize) and resources (lodging nightly rates, restaurant meal prices) plus the aggregation scope (cities, then country median). It is clear what the tool produces, but it does not explicitly distinguish itself from the sibling compare_city_costs tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but gives no explicit guidance on when to use it rather than a sibling such as compare_city_costs or search_lodging. There are no when-to-use, when-not-to-use, or prerequisite statements.
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.
9 tool updates
- First observed
compare_city_costs - First observed
compare_lodging_months - First observed
get_capabilities - First observed
get_data_freshness - First observed
get_dataset_coverage - First observed
search_flights - First observed
search_lodging - First observed
search_restaurants - First observed
summarize_costs
Related MCP Servers
- AlicenseNot gradedqualityCmaintenancePerplexity for social: ask what competitors are running across social and get answers grounded in real ad and creative data, not guesses.2Apache 2.0
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs113 npm54 PyPIMIT
- AlicenseAqualityCmaintenanceEnables 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.164 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.