Skip to main content
Glama

Seemor Restaurant Intelligence

Get Recommendations

recommend
Read-onlyIdempotent

The one call for "where should we eat": a ranked, final answer for one meal or occasion, each result graded with the reasons it fits and anything it misses. Call it once per meal slot with the diner's ask in the diner's own words: the place or anchor, the time of day, who is eating (party size, kids, a date, a group) and any stated constraints or dislikes. Prefer it over generating your own candidates and checking them by name; it already ranks what Seemor holds for the ask. A dish ask ("good beef bourguignon near the Marais") is a recommend ask. Results are ranked and final: do not re-call with reworded variations or look up each result. Each result already carries a grade (or preliminary_band, the floor of the range: 'B-range' means at least B minus), 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. 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. Rows carry google_maps_url and website when Seemor holds them (null otherwise), plus seemor_url. Seemor holds no booking, availability or opening-hours data: use a booking app for those and join on restaurant name and address.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "query": "<query>"
    },
    "name": "recommend"
  }
}

Input 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

NameRequiredDescriptionDefault
statusNo
messageNo
resultsNo
next_asksNo
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
    • addedOutput schema / properties / results / items / properties / grade_basis
      Added value: +{
      +  "type": "string"
      +}
  2. Changed2 schema fields changed
    • addedOutput schema / properties / results / items / properties / google_maps_url
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / website
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  3. Changed5 schema fields changed
    • addedOutput schema / properties / next_asks
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "label": {
      +        "type": "string"
      +      },
      +      "suggested_query": {
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • 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",
      -  "menu_mention_only"
      -]New value: +[
      +  "exact",
      +  "exact_within_wider_radius",
      +  "likely_match_unconfirmed",
      +  "nearby_any",
      +  "relaxed_amenity",
      +  "below_grade_floor",
      +  "menu_mention_only",
      +  "not_yet_reviewed"
      +]
    • addedOutput schema / properties / results / items / properties / public_rating
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / public_review_count
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / tier
      Added value: +{
      +  "enum": [
      +    "no_grade_yet"
      +  ],
      +  "type": "string"
      +}
  4. 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"
      +]
  5. 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."
  6. 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"
      +}
  7. 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"
      +}
  8. Changed1 schema field changed
    • addedOutput schema / properties / results / items / properties / place_note
      Added value: +{
      +  "type": "string"
      +}
  9. 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"
      +  ]
      +}
  10. 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"
      +  ]
      +}
  11. Changed1 schema field changed
    • changedOutput schema / properties / results / items / properties / coverage_level / enum
      Previous value: -[
      -  "full",
      -  "basic"
      -]New value: +[
      +  "full",
      +  "basic",
      +  "none"
      +]
  12. 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"
      +]
  13. Changed1 schema field changed
    • addedOutput schema / properties / results / items / properties / caveats
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  14. 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"
      +}
  15. 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"
      +}
  16. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Well beyond the annotations (which only cover readOnly/idempotent/openWorld/non-destructive): it discloses the grading model (grade vs preliminary_band), the meaning of caveats beginning 'Misses', the place_note presence rule ('never read a missing place_note as somewhere else'), ordered result_groups with required presentation order, repeat_ask semantics, coverage_level 'basic', and the location_required refusal. This is unusually rich disclosure of how output must be interpreted and relayed.

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

Conciseness3/5

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

Front-loaded with the core purpose, but the single paragraph is very long and repeats itself: 'Results are ranked and final: do not re-call with reworded variations' appears twice in near-identical wording, and the output-shape explanations (caveats, place_note, requirements) are extensive despite an output schema existing. The content is valuable but does not meet '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?

For a high-stakes, single-call recommendation tool with an output schema, the description covers input shaping, refusal behavior, ranking/group ordering, constraint-status semantics, and the no-booking-data boundary. Nothing an agent needs in order to call and correctly relay results 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 genuine meaning about how to populate query and location — pass the diner's own words without added emphasis, put the place in location, and location takes priority over latitude/longitude. The limit parameter's tradeoffs (result count vs pool thinness) are only touched obliquely via the thin-pool message, so it stops short of a 5.

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?

Opens with a specific verb-and-resource framing ('The one call for "where should we eat": a ranked, final answer for one meal or occasion') and explicitly positions itself against siblings by name — lookup_restaurant and ask_about_restaurant are named as the follow-up path for a single place. An agent can distinguish this from find_restaurant/search_restaurants/explore_area from the text alone.

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 explicit when-to-use ('call it once per meal slot'), when-not-to ('do not re-call with reworded variations', 'do not look up each result'), and named alternatives for adjacent needs ('For follow-ups about one place, use lookup_restaurant or ask_about_restaurant'). It also states the fallback domain boundary: booking/availability/hours belong in a booking app.

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