Kviria
Server Details
Location understanding for AI agents: words in, one verified location out. Beta: contiguous US.
- Status
- Healthy
- Uptime
- 100.0% over 23 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 1 tool
With only one tool, there is no possibility of confusion between tools. The single tool's purpose is clearly described, eliminating any ambiguity in tool selection.
There is only one tool, so there are no naming inconsistencies to evaluate. The name 'kviria' matches the server name and is used consistently, though it is not descriptive of its function.
A single tool is borderline in the rubric, but it is appropriate for the server's narrow scope of resolving spoken place references. The tool encapsulates the entire workflow, so the count is acceptable though minimal.
The tool covers the full interaction lifecycle: accepting raw input and anchor, returning candidates, handling confirmations and rejections, and providing evidence trails. There are no missing operations within its defined purpose.
Available Tools
1 toolkviriaKviriaInspect
Kviria finds the place, address or street corner a user means near their current position and returns its verified coordinate with an evidence trail.
When to call: on every user turn of a place conversation, from the first time the user mentions a place, a kind of place, an address, a street, a corner or what is around them, until the place is settled. That includes yes or no answers, picks ("the second one"), corrections ("no, the other one"), follow-ups ("what's across from it") and questions about your last answer ("are you sure?"). Kviria resolves each of these from the state, so do not answer them yourself.
What to send: transcript is the user's whole last turn, word for word. state is the state field of the previous kviria response, copied exactly: that field only, never the whole response; send an empty string on the first call. anchor is the user's current position exactly as you were given it: send it on the first call, and after that only when the position changes; never invent or round it.
What comes back, and your move: one - the place is settled; say its name and distance exactly as returned. one_unconfirmed - ask "Is it {name} ({distanceM} m)?" and send the user's answer as the next call. many - name the candidates with their distances, ask which one, and send the user's answer as the next call. none - Kviria looked and found nothing; say so and ask for a nearby business or landmark. unclear - ask the user to say more about the place. not_a_place_request - the user's words are not about a place; reply to the user yourself.
Phrase your reply from the returned facts only; never invent a place, a distance or any other detail. Distances are meters; convert them for your user.
Coverage: the contiguous United States. Outside it the answer is none with an out_of_coverage entry and the turn is free; tell the user instead of retrying.
Errors: 400 invalid_state means the state was altered; start again with an empty state. 503 parser_unavailable: do not retry the call. Tell the user you cannot look it up right now and to ask again in a moment; never ask the user to rephrase for it.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | The `state` field of the previous kviria response, copied character for character: that field only, never the whole response, and never shortened. Empty string on the first call. | |
| anchor | No | The user's current position - Kviria resolves relative to this point. Required on the first call of a conversation; later calls may leave it out while the user has not moved. | |
| rangeM | No | Search radius around the anchor in meters (clamped to 50-350). | |
| transcript | Yes | The user's whole last turn, word for word: yes or no, corrections, hesitations and everything around the place included. Never shorten, rephrase, correct or complete it. If one turn arrived in pieces, join them in order. | |
| confirmation | No | "on" (default): a place the user named only in part is returned as one_unconfirmed, and its coordinate is released only after the user verifies it. "off": it is returned as one immediately, for agents without a human in the loop. | on |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | Yes | The conversation state. Send it back unchanged as `state` on the next call. |
| target | No | The settled target (one), or the target waiting for the user's yes or no (one_unconfirmed, without a location). |
| category | No | The category that was asked for and is absent, on a none decision. |
| decision | Yes | The decision for this turn: how many answers there are and whether the single answer is certain, or not_a_place_request when the user's words are not about a place. An exact address is "one" with the door facts riding target.address; several door clusters for one number come back as "many". |
| evidence | Yes | Why this answer: the gate trail behind the decision. Present none of this to the user; it exists for trust and auditability. |
| confirmed | No | True when the user verified the target through the confirm gate. |
| candidates | No | The candidates to present on many. Never send them back: send state. |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
kviria34 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / definitionsRemoved value: -{ - "find_target": { - "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.", - "oneOf": [ - { - "properties": { - "ref": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "ref" - ], - "type": "object" - }, - { - "properties": { - "name": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - { - "properties": { - "index": { - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "index" - ], - "type": "object" - } - ], - "type": "object" - }, - "target_anchor": { - "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.", - "oneOf": [ - { - "properties": { - "ref": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "ref" - ], - "type": "object" - }, - { - "properties": { - "name": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - { - "properties": { - "at": { - "properties": { - "lat": { - "type": "number" - }, - "lng": { - "type": "number" - } - }, - "required": [ - "lat", - "lng" - ], - "type": "object" - } - }, - "required": [ - "at" - ], - "type": "object" - }, - { - "properties": { - "index": { - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "index" - ], - "type": "object" - } - ], - "type": "object" - } -} - removed
Input schema / oneOfRemoved value: -[ - { - "required": [ - "transcript" - ] - }, - { - "required": [ - "intent" - ] - } -] - added
Input schema / properties / anchor / additionalPropertiesAdded value: +false - changed
Input schema / properties / anchor / descriptionPrevious value: -"The user's current position - Kviria resolves relative to this point."New value: +"The user's current position - Kviria resolves relative to this point. Required on the first call of a conversation; later calls may leave it out while the user has not moved." - added
Input schema / properties / anchor / properties / lat / maximumAdded value: +90 - added
Input schema / properties / anchor / properties / lat / minimumAdded value: +-90 - added
Input schema / properties / anchor / properties / lng / maximumAdded value: +180 - added
Input schema / properties / anchor / properties / lng / minimumAdded value: +-180 - removed
Input schema / properties / candidatesRemoved value: -{ - "description": "The pending candidates from the previous response, echoed VERBATIM (including the pendingConfirm marker) so clarification answers and confirm yes/no bind mechanically.", - "items": { - "properties": { - "category": { - "maxLength": 256, - "type": [ - "string", - "null" - ] - }, - "distanceM": { - "minimum": 0, - "type": "number" - }, - "gers": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "location": { - "properties": { - "lat": { - "type": "number" - }, - "lng": { - "type": "number" - } - }, - "required": [ - "lat", - "lng" - ], - "type": "object" - }, - "name": { - "maxLength": 512, - "type": [ - "string", - "null" - ] - }, - "pendingConfirm": { - "description": "Marks the confirm-gate target; echo it back exactly as received.", - "type": "boolean" - } - }, - "required": [ - "gers" - ], - "type": "object" - }, - "maxItems": 50, - "type": "array" -} - changed
Input schema / properties / confirmation / descriptionPrevious value: -"\"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."New value: +"\"on\" (default): a place the user named only in part is returned as one_unconfirmed, and its coordinate is released only after the user verifies it. \"off\": it is returned as one immediately, for agents without a human in the loop." - removed
Input schema / properties / intentRemoved value: -{ - "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", - "oneOf": [ - { - "properties": { - "action": { - "const": "find" - }, - "target": { - "$ref": "#/definitions/find_target" - } - }, - "required": [ - "action", - "target" - ], - "type": "object" - }, - { - "properties": { - "action": { - "const": "search" - }, - "categoryAny": { - "description": "Exact labels the user WANTS (e.g. [\"mexican_restaurant\"])", - "items": { - "type": "string" - }, - "type": "array" - }, - "categoryNot": { - "description": "Exact labels the user rejects (e.g. [\"cafe\"])", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - { - "properties": { - "action": { - "const": "neighbors" - }, - "of": { - "$ref": "#/definitions/target_anchor" - }, - "side": { - "enum": [ - "left", - "right" - ] - } - }, - "required": [ - "action", - "of" - ], - "type": "object" - }, - { - "properties": { - "action": { - "const": "near" - }, - "categoryAny": { - "items": { - "type": "string" - }, - "type": "array" - }, - "categoryNot": { - "items": { - "type": "string" - }, - "type": "array" - }, - "of": { - "$ref": "#/definitions/target_anchor" - } - }, - "required": [ - "action", - "of" - ], - "type": "object" - }, - { - "properties": { - "action": { - "const": "across" - }, - "categoryAny": { - "items": { - "type": "string" - }, - "type": "array" - }, - "of": { - "$ref": "#/definitions/target_anchor" - } - }, - "required": [ - "action", - "of" - ], - "type": "object" - }, - { - "properties": { - "action": { - "const": "along" - }, - "n": { - "minimum": 1, - "type": "integer" - }, - "street": { - "type": "string" - } - }, - "required": [ - "action", - "street", - "n" - ], - "type": "object" - }, - { - "properties": { - "action": { - "const": "at_address" - }, - "number": { - "type": "string" - }, - "street": { - "type": "string" - } - }, - "required": [ - "action", - "number" - ], - "type": "object" - }, - { - "properties": { - "action": { - "const": "street_zoom" - }, - "street": { - "type": "string" - } - }, - "required": [ - "action", - "street" - ], - "type": "object" - }, - { - "properties": { - "action": { - "const": "street_end" - }, - "categoryAny": { - "description": "Optional kind filter for the end places (\"is there any market at the end of this street?\").", - "items": { - "type": "string" - }, - "type": "array" - }, - "categoryNot": { - "items": { - "type": "string" - }, - "type": "array" - }, - "street": { - "description": "The street whose end places the user wants.", - "type": "string" - } - }, - "required": [ - "action", - "street" - ], - "type": "object" - }, - { - "properties": { - "action": { - "const": "confirm" - }, - "value": { - "enum": [ - "yes", - "no" - ] - } - }, - "required": [ - "action", - "value" - ], - "type": "object" - }, - { - "properties": { - "action": { - "const": "select" - }, - "index": { - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "action", - "index" - ], - "type": "object" - } - ], - "type": "object" -} - changed
Input schema / properties / rangeM / descriptionPrevious value: -"Search radius around the anchor in meters (clamped to 50-1000)."New value: +"Search radius around the anchor in meters (clamped to 50-350)." - changed
Input schema / properties / rangeM / maximumPrevious value: -1000New value: +350 - removed
Input schema / properties / referencesRemoved value: -{ - "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.", - "items": { - "properties": { - "gers": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "lat": { - "description": "Reference latitude as returned by Kviria.", - "type": "number" - }, - "lng": { - "description": "Reference longitude as returned by Kviria.", - "type": "number" - }, - "name": { - "maxLength": 512, - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "gers" - ], - "type": "object" - }, - "maxItems": 5, - "type": "array" -} - added
Input schema / properties / stateAdded value: +{ + "description": "The `state` field of the previous kviria response, copied character for character: that field only, never the whole response, and never shortened. Empty string on the first call.", + "maxLength": 2263, + "type": "string" +} - changed
Input schema / properties / transcript / descriptionPrevious value: -"The user's raw message (voice transcript or text), as spoken, typos and all. Do not normalize or paraphrase it. Mutually exclusive with `intent`."New value: +"The user's whole last turn, word for word: yes or no, corrections, hesitations and everything around the place included. Never shorten, rephrase, correct or complete it. If one turn arrived in pieces, join them in order." - changed
Input schema / properties / transcript / minLengthPrevious value: -2New value: +1 - changed
Input schema / requiredPrevious value: -[ - "anchor" -]New value: +[ + "transcript" +] - removed
Output schema / definitions / find_targetRemoved value: -{ - "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.", - "oneOf": [ - { - "properties": { - "ref": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "ref" - ], - "type": "object" - }, - { - "properties": { - "name": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - { - "properties": { - "index": { - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "index" - ], - "type": "object" - } - ], - "type": "object" -} - added
Output schema / definitions / target / properties / acrossStreetAdded value: +{ + "description": "Set when the user named a street to be across, or when the place is on a corner and so has two acrosses: one answer per street, each naming the street it is across.", + "type": "string" +} - added
Output schema / definitions / target / properties / baseDistanceMAdded value: +{ + "description": "Set when the answer is relative to a place (near, across, next to): metres from that place. distanceM stays the distance from the user.", + "type": "number" +} - added
Output schema / definitions / target / properties / intersectionAdded value: +{ + "description": "Set when the target is a street corner: every street that meets there. Such a target has category and confidence null.", + "properties": { + "streets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "streets" + ], + "type": "object" +} - changed
Output schema / definitions / target / properties / location / descriptionPrevious value: -"Named lat/lng fields; no coordinate-array ordering ambiguity."New value: +"Named lat/lng fields; no coordinate-array ordering ambiguity. Absent on one_unconfirmed: the coordinate comes with the user's yes." - changed
Output schema / definitions / target / requiredPrevious value: -[ - "gers", - "name", - "category", - "confidence", - "location", - "distanceM" -]New value: +[ + "gers", + "name", + "category", + "confidence", + "distanceM" +] - removed
Output schema / definitions / target_anchorRemoved value: -{ - "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.", - "oneOf": [ - { - "properties": { - "ref": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "ref" - ], - "type": "object" - }, - { - "properties": { - "name": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - { - "properties": { - "at": { - "properties": { - "lat": { - "type": "number" - }, - "lng": { - "type": "number" - } - }, - "required": [ - "lat", - "lng" - ], - "type": "object" - } - }, - "required": [ - "at" - ], - "type": "object" - }, - { - "properties": { - "index": { - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "index" - ], - "type": "object" - } - ], - "type": "object" -} - changed
Output schema / properties / candidates / descriptionPrevious value: -"The pending candidate set. Echo it back verbatim on the next turn."New value: +"The candidates to present on many. Never send them back: send state." - changed
Output schema / properties / category / descriptionPrevious value: -"The absent category on notFound decisions."New value: +"The category that was asked for and is absent, on a none decision." - changed
Output schema / properties / decision / descriptionPrevious value: -"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\"."New value: +"The decision for this turn: how many answers there are and whether the single answer is certain, or not_a_place_request when the user's words are not about a place. An exact address is \"one\" with the door facts riding target.address; several door clusters for one number come back as \"many\"." - changed
Output schema / properties / decision / enumPrevious value: -[ - "resolved", - "confirm", - "candidates", - "notFound", - "clarify" -]New value: +[ + "one", + "one_unconfirmed", + "many", + "none", + "unclear", + "not_a_place_request" +] - changed
Output schema / properties / evidence / items / properties / reasonCode / descriptionPrevious value: -"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."New value: +"Stable enum explaining the outcome (e.g. user_confirmed, single_survivor_pending, partial_name, out_of_coverage). Read the code, never the free text." - added
Output schema / properties / stateAdded value: +{ + "description": "The conversation state. Send it back unchanged as `state` on the next call.", + "type": "string" +} - changed
Output schema / properties / target / descriptionPrevious value: -"The resolved or pending target (on resolved, confirm, address)."New value: +"The settled target (one), or the target waiting for the user's yes or no (one_unconfirmed, without a location)." - changed
Output schema / requiredPrevious value: -[ - "decision" -]New value: +[ + "decision", + "evidence", + "state" +]
1 tool update
- First observed
kviria
Related MCP Connectors
Address validation & geocoding for AI agents: 240+ countries, UK PAF, free US/CA enrichment
Mobility, geocoding and nearby urban services for AI agents.
Geolocate Me turns your phone into location context for any AI assistant. Install the iOS or Android app, connect once with OAuth, and your GPS is queryable in natural language. Ask where you are, where you parked, where you were yesterday at 3pm, or how long you were at the office — the assistant calls the tool and answers with a real street address. https://geolocateme.app
US address intelligence: 120M+ addresses, verify, suggest, reverse geocode, coverage stats.
Related MCP Servers
AlicenseAqualityBmaintenanceLocation & routing intelligence for AI agents — geocoding, truck routing, traffic, weather, and place search.619212 npm1MIT
mcp-radarofficial
AlicenseNot gradedqualityBmaintenanceEnables address autocomplete, forward and reverse geocoding, IP geolocation, and place/geofence context lookups using Radar's API, letting AI agents resolve locations through natural language.51 npmMIT- AlicenseAqualityDmaintenanceEnhances LLM capabilities with location-based services and geospatial data, enabling users to geocode addresses, find nearby points of interest, get directions, optimize meeting points, and analyze neighborhoods.12226MIT

Magic Lane MCP Serverofficial
AlicenseBqualityBmaintenanceEnables AI agents to become geospatially intelligent assistants with tools for location search, smart routing, round trip planning, reverse geocoding, isochrone analysis, route visualization, geofence management, and interactive map display.818 npm7Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.