Kviria
The location engine for AI agents: one verified coordinate from where a user means. Beta: US.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"kviria": {
"url": "https://api.kviria.com/mcp"
}
}
}Puntos de conexión remotos
https://api.kviria.com/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (1)
🟢kviria(transcript, intent, anchor, candidates, rangeM, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"transcript": {
"type": "string",
"minLength": 2,
"maxLength": 1000,
"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`."
},
"intent": {
"type": "object",
"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": [
{
"type": "object",
"properties": {
"action": {
"const": "find"
},
"target": {
"$ref": "#/definitions/find_target"
}
},
"required": [
"action",
"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",
"properties": {
"action": {
"const": "neighbors"
},
"of": {
"$ref": "#/definitions/target_anchor"
},
"side": {
"enum": [
"left",
"right"
]
}
},
"required": [
"action",
"of"
]
},
{
"type": "object",
"properties": {
"action": {
"const": "near"
},
"of": {
"$ref": "#/definitions/target_anchor"
},
"categoryAny": {
"type": "array",
"items": {
"type": "string"
}
},
"categoryNot": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"action",
"of"
]
},
{
"type": "object",
"properties": {
"action": {
"const": "across"
},
"of": {
"$ref": "#/definitions/target_anchor"
},
"categoryAny": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"action",
"of"
]
},
{
"type": "object",
"properties": {
"action": {
"const": "along"
},
"street": {
"type": "string"
},
"n": {
"type": "integer",
"minimum": 1
}
},
"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"
},
"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"
}
}
},
"required": [
"action",
"street"
]
},
{
"type": "object",
"properties": {
"action": {
"const": "confirm"
},
"value": {
"enum": [
"yes",
"no"
]
}
},
"required": [
"action",
"value"
]
},
{
"type": "object",
"properties": {
"action": {
"const": "select"
},
"index": {
"type": "integer",
"minimum": 1
}
},
"required": [
"action",
"index"
]
}
]
},
"anchor": {
"type": "object",
"description": "The user's current position - Kviria resolves relative to this point.",
"properties": {
"lat": {
"type": "number",
"description": "WGS 84 latitude"
},
"lng": {
"type": "number",
"description": "WGS 84 longitude"
}
},
"required": [
"lat",
"lng"
]
},
"candidates": {
"type": "array",
"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.",
"items": {
"type": "object",
"properties": {
"gers": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"name": {
"type": [
"string",
"null"
],
"maxLength": 512
},
"location": {
"type": "object",
"properties": {
"lat": {
"type": "number"
},
"lng": {
"type": "number"
}
},
"required": [
"lat",
"lng"
]
},
"category": {
"type": [
"string",
"null"
],
"maxLength": 256
},
"distanceM": {
"type": "number",
"minimum": 0
},
"pendingConfirm": {
"type": "boolean",
"description": "Marks the confirm-gate target; echo it back exactly as received."
}
},
"required": [
"gers"
]
}
},
"rangeM": {
"type": "integer",
"minimum": 50,
"maximum": 1000,
"default": 100,
"description": "Search radius around the anchor in meters (clamped to 50-1000)."
},
"confirmation": {
"type": "string",
"enum": [
"on",
"off"
],
"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."
},
"references": {
"type": "array",
"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.",
"items": {
"type": "object",
"properties": {
"gers": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"name": {
"type": [
"string",
"null"
],
"maxLength": 512
},
"lat": {
"type": "number",
"description": "Reference latitude as returned by Kviria."
},
"lng": {
"type": "number",
"description": "Reference longitude as returned by Kviria."
}
},
"required": [
"gers"
]
}
}
},
"required": [
"anchor"
],
"oneOf": [
{
"required": [
"transcript"
]
},
{
"required": [
"intent"
]
}
],
"definitions": {
"find_target": {
"type": "object",
"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": [
{
"type": "object",
"properties": {
"ref": {
"type": "string",
"minLength": 1
}
},
"required": [
"ref"
]
},
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
}
},
"required": [
"name"
]
},
{
"type": "object",
"properties": {
"index": {
"type": "integer",
"minimum": 1
}
},
"required": [
"index"
]
}
]
},
"target_anchor": {
"type": "object",
"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": [
{
"type": "object",
"properties": {
"ref": {
"type": "string",
"minLength": 1
}
},
"required": [
"ref"
]
},
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
}
},
"required": [
"name"
]
},
{
"type": "object",
"properties": {
"at": {
"type": "object",
"properties": {
"lat": {
"type": "number"
},
"lng": {
"type": "number"
}
},
"required": [
"lat",
"lng"
]
}
},
"required": [
"at"
]
},
{
"type": "object",
"properties": {
"index": {
"type": "integer",
"minimum": 1
}
},
"required": [
"index"
]
}
]
}
}
}Esquema de salida
{
"type": "object",
"properties": {
"decision": {
"type": "string",
"enum": [
"resolved",
"confirm",
"candidates",
"notFound",
"clarify"
],
"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\"."
},
"target": {
"$ref": "#/definitions/target",
"description": "The resolved or pending target (on resolved, confirm, address)."
},
"candidates": {
"type": "array",
"items": {
"$ref": "#/definitions/target"
},
"description": "The pending candidate set. Echo it back verbatim on the next turn."
},
"evidence": {
"type": "array",
"items": {
"type": "object",
"properties": {
"test": {
"type": "string",
"description": "Which gate produced this entry."
},
"result": {
"type": "string",
"enum": [
"pass",
"reject",
"warn"
],
"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."
},
"detail": {
"type": "object",
"description": "Optional structured detail."
}
},
"required": [
"test",
"result",
"reasonCode"
]
},
"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."
},
"category": {
"type": "string",
"description": "The absent category on notFound decisions."
}
},
"required": [
"decision"
],
"definitions": {
"find_target": {
"type": "object",
"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": [
{
"type": "object",
"properties": {
"ref": {
"type": "string",
"minLength": 1
}
},
"required": [
"ref"
]
},
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
}
},
"required": [
"name"
]
},
{
"type": "object",
"properties": {
"index": {
"type": "integer",
"minimum": 1
}
},
"required": [
"index"
]
}
]
},
"target_anchor": {
"type": "object",
"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": [
{
"type": "object",
"properties": {
"ref": {
"type": "string",
"minLength": 1
}
},
"required": [
"ref"
]
},
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
}
},
"required": [
"name"
]
},
{
"type": "object",
"properties": {
"at": {
"type": "object",
"properties": {
"lat": {
"type": "number"
},
"lng": {
"type": "number"
}
},
"required": [
"lat",
"lng"
]
}
},
"required": [
"at"
]
},
{
"type": "object",
"properties": {
"index": {
"type": "integer",
"minimum": 1
}
},
"required": [
"index"
]
}
]
},
"target": {
"type": "object",
"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."
},
"category": {
"type": [
"string",
"null"
],
"description": "The place category label."
},
"confidence": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1,
"description": "Existence confidence, 0 to 1, or null."
},
"location": {
"type": "object",
"properties": {
"lat": {
"type": "number"
},
"lng": {
"type": "number"
}
},
"required": [
"lat",
"lng"
],
"description": "Named lat/lng fields; no coordinate-array ordering ambiguity."
},
"distanceM": {
"type": "number",
"minimum": 0,
"description": "Straight-line meters from the anchor."
},
"address": {
"type": "object",
"properties": {
"number": {
"type": [
"string",
"null"
]
},
"street": {
"type": "string"
}
},
"required": [
"street"
],
"description": "Address facts when the target is a house/unit."
}
},
"required": [
"gers",
"name",
"category",
"confidence",
"location",
"distanceM"
]
}
}
}Comunidad
Evidencia