Skip to main content
Glama

Seemor Restaurant Intelligence

Get Recommendations

recommend
Read-only

Returns a complete, ranked restaurant recommendation for a dining occasion: the final answer, not a search. Each result already carries a grade (or preliminary_band), match_reasons, caveats (a caveat beginning "Misses" names something the room does not deliver, never a good thing about it; a strong_match row never carries one), honored_constraints (plain-language labels for the stated filters this specific row confirms, e.g. "Indian", "Takeaway", "In Magnolia"), and requirements (per stated requirement, one of confirmed / contradicted / unknown, with the plain-words evidence that produced it) weighed against the request. A result may also carry place_note ("Near Williamsburg", "In Hoboken"): where that room is, present ONLY when the room is outside the place asked for — a room in the place the diner asked for carries no place_note, so never read a missing place_note as "somewhere else", and when one IS present say so rather than implying the room is in the place asked for. When result_groups is present, results is already partitioned into ORDERED, LABELED groups (exact / exact_within_wider_radius / likely_match_unconfirmed / nearby_any / relaxed_amenity) — present them to the user top to bottom, in that order, using each group's own message verbatim; never re-order the groups or the rows within a group (present rows in the order given), and never offer them as a choice. Never claim a nearby_any or relaxed_amenity row satisfies a constraint it does not carry in honored_constraints, and never call a likely_match_unconfirmed row (or any row carrying a requirement with status "unknown") a confirmed or exact match — say plainly that it likely matches but could not be confirmed from Seemor's data, and name what could not be confirmed (unknown_requirements lists it at the response level). repeat_ask: true means this is the same answer already given for the identical ask; say so rather than presenting it as new. Call it ONCE per diner ask, with the full ask (cuisine, occasion, vibe, constraints) in query and the place in location. Pass the diner's request in the diner's own words: do not add emphasis, priorities or qualities the diner did not state (for example "prioritize a quiet atmosphere" when the diner only said "quiet"), because added emphasis turns a light preference into a hard requirement and changes the answer. Results are ranked and final: do not re-call with reworded variations or call lookup_restaurant on each result to double-check it; that adds latency, not a better answer. For follow-ups about one place, use lookup_restaurant or ask_about_restaurant. Accounts connected through an assistant have a small free number of recommend runs per day (only runs that return results count); if the result carries limit_reached, relay its message to the user as written and do not retry. If a result carries caveats, coverage_level 'basic', or a message noting a thin pool, relay it to the user instead of searching again. Requires a location: include one in your query (e.g. "in Soho"), or provide location, or latitude/longitude, or the tool refuses with location_required instead of guessing a city.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of recommendations to return (1-10, default 5).
queryYesNatural language dining request, e.g. 'quiet Italian restaurant for a date night in Covent Garden' or 'best sushi in Shibuya for a celebration'. Include the location in your query OR provide latitude/longitude.
latitudeNoLatitude of the place the diner is asking about (the search center). Alternative to location: use when you have the coordinates of that place. Do not send the diner's own device location unless the diner gave it. If both location and lat/lng are provided, location takes priority for disambiguation.
locationNoCity or area to bias the search toward, e.g. 'London', 'San Francisco', 'Rome'. Use this when the query doesn't include a location, or to disambiguate (e.g. 'Victoria' could be London or British Columbia — pass 'London' to clarify). Whenever the conversation shows which place the diner means, pass it with its city, state or country, so a name several places share needs no question. If omitted and the query contains a location, that location is used. This is the place the diner is asking about, named in words; do not fill it from the diner's own device location unless the diner gave it.
longitudeNoLongitude of the place the diner is asking about (the search center). Must be provided with latitude. Do not send the diner's own device location unless the diner gave it.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
statusNo
messageNo
resultsNo
next_stepNo
candidatesNo
place_noteNo
repeat_askNo
other_placesNo
location_usedNo
result_groupsNo
pool_disclosureNo
query_understoodNo
total_candidatesNo
unknown_requirementsNo
unverifiable_attributesNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / result_groups / items / properties / label / enum
      Previous value: -[
      -  "exact",
      -  "exact_within_wider_radius",
      -  "likely_match_unconfirmed",
      -  "nearby_any",
      -  "relaxed_amenity",
      -  "below_grade_floor"
      -]New value: +[
      +  "exact",
      +  "exact_within_wider_radius",
      +  "likely_match_unconfirmed",
      +  "nearby_any",
      +  "relaxed_amenity",
      +  "below_grade_floor",
      +  "menu_mention_only"
      +]
  2. Changed4 schema fields changed
    • changedInput schema / properties / latitude / description
      Previous value: -"Latitude of search center. Alternative to location — use when you have coordinates. If both location and lat/lng are provided, location takes priority for disambiguation."New value: +"Latitude of the place the diner is asking about (the search center). Alternative to location: use when you have the coordinates of that place. Do not send the diner's own device location unless the diner gave it. If both location and lat/lng are provided, location takes priority for disambiguation."
    • changedInput schema / properties / location / description
      Previous value: -"City or area to bias the search toward, e.g. 'London', 'San Francisco', 'Rome'. Use this when the query doesn't include a location, or to disambiguate (e.g. 'Victoria' could be London or British Columbia — pass 'London' to clarify). Whenever the conversation shows which place the diner means, pass it with its city, state or country, so a name several places share needs no question. If omitted and the query contains a location, that location is used."New value: +"City or area to bias the search toward, e.g. 'London', 'San Francisco', 'Rome'. Use this when the query doesn't include a location, or to disambiguate (e.g. 'Victoria' could be London or British Columbia — pass 'London' to clarify). Whenever the conversation shows which place the diner means, pass it with its city, state or country, so a name several places share needs no question. If omitted and the query contains a location, that location is used. This is the place the diner is asking about, named in words; do not fill it from the diner's own device location unless the diner gave it."
    • changedInput schema / properties / longitude / description
      Previous value: -"Longitude of search center. Must be provided with latitude."New value: +"Longitude of the place the diner is asking about (the search center). Must be provided with latitude. Do not send the diner's own device location unless the diner gave it."
    • changedInput schema / properties / query / description
      Previous value: -"Natural language dining request, e.g. 'quiet Italian restaurant for a date night in Covent Garden' or 'best sushi near me for a celebration'. Include the location in your query OR provide latitude/longitude."New value: +"Natural language dining request, e.g. 'quiet Italian restaurant for a date night in Covent Garden' or 'best sushi in Shibuya for a celebration'. Include the location in your query OR provide latitude/longitude."
  3. Changed2 schema fields changed
    • addedOutput schema / properties / other_places
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "city": {
      +        "type": "string"
      +      },
      +      "country": {
      +        "type": "string"
      +      },
      +      "label": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / place_note
      Added value: +{
      +  "type": "string"
      +}
  4. Changed2 schema fields changed
    • changedInput schema / properties / location / description
      Previous value: -"City or area to bias the search toward, e.g. 'London', 'San Francisco', 'Rome'. Use this when the query doesn't include a location, or to disambiguate (e.g. 'Victoria' could be London or British Columbia — pass 'London' to clarify). If omitted and the query contains a location, that location is used."New value: +"City or area to bias the search toward, e.g. 'London', 'San Francisco', 'Rome'. Use this when the query doesn't include a location, or to disambiguate (e.g. 'Victoria' could be London or British Columbia — pass 'London' to clarify). Whenever the conversation shows which place the diner means, pass it with its city, state or country, so a name several places share needs no question. If omitted and the query contains a location, that location is used."
    • addedOutput schema / properties / next_step
      Added value: +{
      +  "type": "string"
      +}
  5. Changed1 schema field changed
    • addedOutput schema / properties / results / items / properties / place_note
      Added value: +{
      +  "type": "string"
      +}
  6. Changed8 schema fields changed
    • addedOutput schema / properties / candidates
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "label": {
      +        "type": "string"
      +      },
      +      "lat": {
      +        "type": "number"
      +      },
      +      "lng": {
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / repeat_ask
      Added value: +{
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / result_groups
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "count": {
      +        "type": "number"
      +      },
      +      "entries": {
      +        "items": {
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "label": {
      +        "enum": [
      +          "exact",
      +          "exact_within_wider_radius",
      +          "likely_match_unconfirmed",
      +          "nearby_any",
      +          "relaxed_amenity",
      +          "below_grade_floor"
      +        ],
      +        "type": "string"
      +      },
      +      "message": {
      +        "type": "string"
      +      },
      +      "relaxation_steps": {
      +        "items": {
      +          "properties": {
      +            "applied": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "label": {
      +              "type": "string"
      +            },
      +            "original": {
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / grade_caveat
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / results / items / properties / honored_constraints
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / results / items / properties / requirements
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "evidence": {
      +        "type": "string"
      +      },
      +      "firmness": {
      +        "enum": [
      +          "identity",
      +          "timing",
      +          "amenity",
      +          "preference"
      +        ],
      +        "type": "string"
      +      },
      +      "phrase": {
      +        "type": "string"
      +      },
      +      "requirement": {
      +        "type": "string"
      +      },
      +      "source": {
      +        "enum": [
      +          "stated",
      +          "inferred"
      +        ],
      +        "type": "string"
      +      },
      +      "status": {
      +        "enum": [
      +          "confirmed",
      +          "contradicted",
      +          "unknown"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / status / enum
      Previous value: -[
      -  "ok",
      -  "error",
      -  "no_coverage",
      -  "location_required",
      -  "timeout",
      -  "cannot_verify"
      -]New value: +[
      +  "ok",
      +  "error",
      +  "no_coverage",
      +  "location_required",
      +  "timeout",
      +  "cannot_verify",
      +  "geo_conflict"
      +]
    • addedOutput schema / properties / unknown_requirements
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
  7. Changed3 schema fields changed
    • addedOutput schema / properties / pool_disclosure
      Added value: +{
      +  "properties": {
      +    "count": {
      +      "type": "number"
      +    },
      +    "message": {
      +      "type": "string"
      +    },
      +    "reason": {
      +      "enum": [
      +        "thin_pool",
      +        "cuisine_relaxed"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / status / enum
      Previous value: -[
      -  "ok",
      -  "error",
      -  "no_coverage",
      -  "location_required",
      -  "timeout"
      -]New value: +[
      +  "ok",
      +  "error",
      +  "no_coverage",
      +  "location_required",
      +  "timeout",
      +  "cannot_verify"
      +]
    • addedOutput schema / properties / unverifiable_attributes
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "key": {
      +        "type": "string"
      +      },
      +      "label": {
      +        "type": "string"
      +      },
      +      "source_phrase": {
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
  8. Changed1 schema field changed
    • changedOutput schema / properties / results / items / properties / coverage_level / enum
      Previous value: -[
      -  "full",
      -  "basic"
      -]New value: +[
      +  "full",
      +  "basic",
      +  "none"
      +]
  9. Changed4 schema fields changed
    • addedOutput schema / properties / results / items / properties / coverage_level
      Added value: +{
      +  "enum": [
      +    "full",
      +    "basic"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / results / items / properties / grade / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / results / items / properties / preliminary_band
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / status / enum
      Previous value: -[
      -  "ok",
      -  "error",
      -  "no_coverage",
      -  "location_required"
      -]New value: +[
      +  "ok",
      +  "error",
      +  "no_coverage",
      +  "location_required",
      +  "timeout"
      +]
  10. Changed1 schema field changed
    • addedOutput schema / properties / results / items / properties / caveats
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  11. Changed7 schema fields changed
    • addedOutput schema / properties / location_used
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / message
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / query_understood
      Added value: +{
      +  "type": "string"
      +}
    • removedOutput schema / properties / recommendations
      Removed value: -{
      -  "items": {
      -    "properties": {
      -      "grade": {
      -        "type": "string"
      -      },
      -      "match_reasons": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "name": {
      -        "type": "string"
      -      },
      -      "relevance": {
      -        "type": "string"
      -      },
      -      "seemor_id": {
      -        "type": "string"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
    • addedOutput schema / properties / results
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "distance_km": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "grade": {
      +        "type": "string"
      +      },
      +      "match_reasons": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "relevance": {
      +        "type": "string"
      +      },
      +      "seemor_id": {
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / status / enum
      Added value: +[
      +  "ok",
      +  "error",
      +  "no_coverage",
      +  "location_required"
      +]
    • addedOutput schema / properties / total_candidates
      Added value: +{
      +  "type": "number"
      +}
  12. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "recommendations": {
      +      "items": {
      +        "properties": {
      +          "grade": {
      +            "type": "string"
      +          },
      +          "match_reasons": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "relevance": {
      +            "type": "string"
      +          },
      +          "seemor_id": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "status": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  13. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover only the safety profile (readOnly, non-destructive, non-idempotent, closed-world), so the description carries the real behavioral burden and does so richly: per-day run limits, limit_reached and location_required handling, repeat_ask semantics, caveat/place_note/honored_constraints conventions, and group ordering rules. It adds substantial context far beyond the annotations, and does not contradict them (the non-idempotent hint is consistent with the repeat_ask note).

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

Conciseness3/5

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

The purpose is front-loaded, and most clauses carry genuine operational guidance, so it is not padding. However, it is one sprawling paragraph of roughly 450 words with heavy clause nesting, making it hard to scan and retrieve the rule you need at call time.

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?

An output schema exists, so return values needn't be explained, yet the description still gives enough about grades, groups, caveats, and constraint-confirmation states for an agent to both call and present results correctly. Nothing an agent needs 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, but the description adds meaning the schema does not: pass the diner's request in their own words without adding emphasis or priorities, and the location/query/lat-lng fallback precedence for the required location. That is real added guidance on how to fill query and location, lifting it above baseline.

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 (Returns), resource (ranked restaurant recommendation for a dining occasion), and explicitly frames it against the search siblings: 'the final answer, not a search.' An agent can immediately tell this apart from search_restaurants, find_restaurant, or lookup_restaurant.

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 when-to-use ('Call it ONCE per diner ask, with the full ask'), when-not ('do not re-call with reworded variations'), and named alternatives ('For follow-ups about one place, use lookup_restaurant or ask_about_restaurant'). It even forbids the tempting misuse of calling lookup_restaurant on each result. Nothing about routing 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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources