Serveur MCP

Kviria

com.kviria/kviria
Cartes et localisation Public et accessible MCP 2025-11-25

Ce que fait ce MCP

Resolves a user's location reference to a verified place or address and coordinate using contextual evidence.

kviria
Kviria
Kviria narrows a user's spoken reference down to exactly one place or address and returns its verified coordinate with an evidence trail. Call it with the user's raw message and their current anchor {lat, lng}. Phrase your reply from the returned facts ONLY: state names, distances, and categories exactly as returned; never invent distances, crosswalks, landmarks, opening hours, or any sensory detail. For a 'confirm' decision, ask the user "is it {name} ({distanceM} m)?" and pass their bare yes/no back as the next transcript, echoing the candidates array verbatim. For 'candidates', list them with their distances and ask which one; on the user's next message echo the SAME candidates array back so the engine binds the pick mechanically. Preserve the pendingConfirm marker on the candidate it came with. The target is the final outcome: present its coordinate, never paraphrase the place name. If the user rejects (no), present the returned candidates or ask for more detail. Do not call with invented anchors; the anchor is the user's real position. Kviria is in beta: current coverage is the contiguous United States (approximately lat 24.4 to 49.5, lng -125.0 to -66.8). Queries outside the covered area return an honest notFound with an out_of_coverage evidence entry, and that turn is free. Tell the user the area is outside current coverage instead of retrying.
Schéma d’entrée
{'type': 'object', 'oneOf': [{'required': ['transcript']}, {'required': ['intent']}], 'required': ['anchor'], 'properties': {'anchor': {'type': 'object', 'required': ['lat', 'lng'], 'properties': {'lat': {'type': 'number', 'description': 'WGS 84 latitude'}, 'lng': {'type': 'number', 'description': 'WGS 84 longitude'}}, 'description': "The user's current position - Kviria resolves relative to this point."}, 'intent': {'type': 'object', 'oneOf': [{'type': 'object', 'required': ['action', 'target'], 'properties': {'action': {'const': 'find'}, 'target': {'$ref': '#/definitions/find_target'}}}, {'type': 'object', 'properties': {'action': {'const': 'search'}, 'categoryAny': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Exact labels the user WANTS (e.g. ["mexican_restaurant"])'}, 'categoryNot': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Exact labels the user rejects (e.g. ["cafe"])'}}}, {'type': 'object', 'required': ['action', 'of'], 'properties': {'of': {'$ref': '#/definitions/target_anchor'}, 'side': {'enum': ['left', 'right']}, 'action': {'const': 'neighbors'}}}, {'type': 'object', 'required': ['action', 'of'], 'properties': {'of': {'$ref': '#/definitions/target_anchor'}, 'action': {'const': 'near'}, 'categoryAny': {'type': 'array', 'items': {'type': 'string'}}, 'categoryNot': {'type': 'array', 'items': {'type': 'string'}}}}, {'type': 'object', 'required': ['action', 'of'], 'properties': {'of': {'$ref': '#/definitions/target_anchor'}, 'action': {'const': 'across'}, 'categoryAny': {'type': 'array', 'items': {'type': 'string'}}}}, {'type': 'object', 'required': ['action', 'street', 'n'], 'properties': {'n': {'type': 'integer', 'minimum': 1}, 'action': {'const': 'along'}, 'street': {'type': 'string'}}}, {'type': 'object', 'required': ['action', 'number'], 'properties': {'action': {'const': 'at_address'}, 'number': {'type': 'string'}, 'street': {'type': 'string'}}}, {'type': 'object', 'required': ['action', 'street'], 'properties': {'action': {'const': 'street_zoom'}, 'street': {'type': 'string'}}}, {'type': 'object', 'required': ['action', 'street'], 'properties': {'action': {'const': 'street_end'}, 'street': {'type': 'string', 'description': 'The street whose end places the user wants.'}, 'categoryAny': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional kind filter for the end places ("is there any market at the end of this street?").'}, 'categoryNot': {'type': 'array', 'items': {'type': 'string'}}}}, {'type': 'object', 'required': ['action', 'value'], 'properties': {'value': {'enum': ['yes', 'no']}, 'action': {'const': 'confirm'}}}, {'type': 'object', 'required': ['action', 'index'], 'properties': {'index': {'type': 'integer', 'minimum': 1}, 'action': {'const': 'select'}}}], 'description': "The structured meaning of the user's words. Send exactly one of transcript or intent. Category filters take EXACT labels from the area's real categories (provided in every response). Unfiltered `across` returns the place on the opposite side with its own category; add categoryAny to ask for a specific kind. Full mapping rules: https://kviria.com/skill.md"}, 'rangeM': {'type': 'integer', 'default': 100, 'maximum': 1000, 'minimum': 50, 'description': 'Search radius around the anchor in meters (clamped to 50-1000).'}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'required': ['gers'], 'properties': {'gers': {'type': 'string', 'maxLength': 128, 'minLength': 1}, 'name': {'type': ['string', 'null'], 'maxLength': 512}, 'category': {'type': ['string', 'null'], 'maxLength': 256}, 'location': {'type': 'object', 'required': ['lat', 'lng'], 'properties': {'lat': {'type': 'number'}, 'lng': {'type': 'number'}}}, 'distanceM': {'type': 'number', 'minimum': 0}, 'pendingConfirm': {'type': 'boolean', 'description': 'Marks the confirm-gate target; echo it back exactly as received.'}}}, 'maxItems': 50, 'description': 'The pending candidates from the previous response, echoed VERBATIM (including the pendingConfirm marker) so clarification answers and confirm yes/no bind mechanically.'}, 'references': {'type': 'array', 'items': {'type': 'object', 'required': ['gers'], 'properties': {'lat': {'type': 'number', 'description': 'Reference latitude as returned by Kviria.'}, 'lng': {'type': 'number', 'description': 'Reference longitude as returned by Kviria.'}, 'gers': {'type': 'string', 'maxLength': 128, 'minLength': 1}, 'name': {'type': ['string', 'null'], 'maxLength': 512}}}, 'maxItems': 5, 'description': 'Previously resolved places, most recent first, so "it" and "that cafe" resolve on later turns. Optional. Echo any lat/lng Kviria returned so distances stay real.'}, 'transcript': {'type': 'string', 'maxLength': 1000, 'minLength': 2, 'description': "The user's raw message (voice transcript or text), as spoken, typos and all. Do not normalize or paraphrase it. Mutually exclusive with `intent`."}, 'confirmation': {'enum': ['on', 'off'], 'type': 'string', 'default': 'on', 'description': '"on" (default): a single survivor emits a confirm decision, and the coordinate is released only after the user verifies it. "off": agents without a human in the loop get direct resolution.'}}, 'definitions': {'find_target': {'type': 'object', 'oneOf': [{'type': 'object', 'required': ['ref'], 'properties': {'ref': {'type': 'string', 'minLength': 1}}}, {'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'minLength': 1}}}, {'type': 'object', 'required': ['index'], 'properties': {'index': {'type': 'integer', 'minimum': 1}}}], 'description': 'An entity lookup: ref (gers from a previous response), name (exactly as returned), or index (1-based into echoed candidates). Raw coordinates belong to the spatial actions.'}, 'target_anchor': {'type': 'object', 'oneOf': [{'type': 'object', 'required': ['ref'], 'properties': {'ref': {'type': 'string', 'minLength': 1}}}, {'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'minLength': 1}}}, {'type': 'object', 'required': ['at'], 'properties': {'at': {'type': 'object', 'required': ['lat', 'lng'], 'properties': {'lat': {'type': 'number'}, 'lng': {'type': 'number'}}}}}, {'type': 'object', 'required': ['index'], 'properties': {'index': {'type': 'integer', 'minimum': 1}}}], 'description': 'The anchor to act on: ref (gers from a previous response), name (exactly as returned), index (1-based into echoed candidates), or at (raw coordinates). Never a free description.'}}}
Schéma de sortie
{'type': 'object', 'required': ['decision'], 'properties': {'target': {'$ref': '#/definitions/target', 'description': 'The resolved or pending target (on resolved, confirm, address).'}, 'category': {'type': 'string', 'description': 'The absent category on notFound decisions.'}, 'decision': {'enum': ['resolved', 'confirm', 'candidates', 'notFound', 'clarify'], 'type': 'string', 'description': 'The decision for this turn. An exact address resolves as "resolved" with the door facts riding target.address; several door clusters for one number come back as "candidates".'}, 'evidence': {'type': 'array', 'items': {'type': 'object', 'required': ['test', 'result', 'reasonCode'], 'properties': {'test': {'type': 'string', 'description': 'Which gate produced this entry.'}, 'detail': {'type': 'object', 'description': 'Optional structured detail.'}, 'result': {'enum': ['pass', 'reject', 'warn'], 'type': 'string', 'description': 'How the gate concluded.'}, 'reasonCode': {'type': 'string', 'description': 'Stable enum explaining the outcome (e.g. winner_confirmed, kind_below_noise_floor, user_confirmed, single_survivor, out_of_coverage). Read the code, never the free text.'}}}, 'description': 'Why this answer: the gate trail behind the decision. Present none of this to the user; it exists for trust and auditability.'}, 'confirmed': {'type': 'boolean', 'description': 'True when the user verified the target through the confirm gate.'}, 'candidates': {'type': 'array', 'items': {'$ref': '#/definitions/target'}, 'description': 'The pending candidate set. Echo it back verbatim on the next turn.'}}, 'definitions': {'target': {'type': 'object', 'required': ['gers', 'name', 'category', 'confidence', 'location', 'distanceM'], 'properties': {'gers': {'type': 'string', 'description': 'Stable global entity id, persistent across turns and sessions.'}, 'name': {'type': ['string', 'null'], 'description': 'The place name as-is; never paraphrase it.'}, 'address': {'type': 'object', 'required': ['street'], 'properties': {'number': {'type': ['string', 'null']}, 'street': {'type': 'string'}}, 'description': 'Address facts when the target is a house/unit.'}, 'category': {'type': ['string', 'null'], 'description': 'The place category label.'}, 'location': {'type': 'object', 'required': ['lat', 'lng'], 'properties': {'lat': {'type': 'number'}, 'lng': {'type': 'number'}}, 'description': 'Named lat/lng fields; no coordinate-array ordering ambiguity.'}, 'distanceM': {'type': 'number', 'minimum': 0, 'description': 'Straight-line meters from the anchor.'}, 'confidence': {'type': ['number', 'null'], 'maximum': 1, 'minimum': 0, 'description': 'Existence confidence, 0 to 1, or null.'}}}, 'find_target': {'type': 'object', 'oneOf': [{'type': 'object', 'required': ['ref'], 'properties': {'ref': {'type': 'string', 'minLength': 1}}}, {'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'minLength': 1}}}, {'type': 'object', 'required': ['index'], 'properties': {'index': {'type': 'integer', 'minimum': 1}}}], 'description': 'An entity lookup: ref (gers from a previous response), name (exactly as returned), or index (1-based into echoed candidates). Raw coordinates belong to the spatial actions.'}, 'target_anchor': {'type': 'object', 'oneOf': [{'type': 'object', 'required': ['ref'], 'properties': {'ref': {'type': 'string', 'minLength': 1}}}, {'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'minLength': 1}}}, {'type': 'object', 'required': ['at'], 'properties': {'at': {'type': 'object', 'required': ['lat', 'lng'], 'properties': {'lat': {'type': 'number'}, 'lng': {'type': 'number'}}}}}, {'type': 'object', 'required': ['index'], 'properties': {'index': {'type': 'integer', 'minimum': 1}}}], 'description': 'The anchor to act on: ref (gers from a previous response), name (exactly as returned), index (1-based into echoed candidates), or at (raw coordinates). Never a free description.'}}}
Ajouté
kviria
20 September 2026 02:40