QVeris is the capability routing network for agents. It lets your agent:
QVeris works well in agent loops (Discover → Inspect → Call → feed results back to the model) and supports multiple integration styles.
Cost: Discover is free. Call costs 1–100 credits per invocation, priced by data and task value. Free tier includes 1,000 credits. Details at qveris.ai/pricing.
There are three ways to use QVeris.
If your client supports Model Context Protocol (MCP), you can add the official QVeris MCP server and immediately get:
search_tools (Discover)get_tools_by_ids (Inspect)execute_tool (Call)For the full MCP reference, see MCP Server documentation.
Configure (Cursor / any MCP client)
{
"mcpServers": {
"qveris": {
"command": "npx",
"args": ["-y", "@qverisai/mcp"],
"env": {
"QVERIS_API_KEY": "your-api-key-here"
}
}
}
}
Try it
"Discover a weather capability and get the current weather in Tokyo"
The assistant will:
search_tools to discover matching capabilities (e.g. "weather")get_tools_by_ids to inspect the best candidateexecute_tool with the capability id + parametersGet it from github and install:
pip install qveris
Set environment variables:
QVERIS_API_KEY (from QVeris)OPENAI_API_KEY (or your OpenAI-compatible provider key)OPENAI_BASE_URL (optional; for OpenAI-compatible providers)Minimal streaming example:
import asyncio
from qveris import Agent, Message
async def main():
agent = Agent()
messages = [Message(role="user", content="Discover a weather capability and check New York weather.")]
async for event in agent.run(messages):
if event.type == "content" and event.content:
print(event.content, end="", flush=True)
if __name__ == "__main__":
asyncio.run(main())
Base URL
https://qveris.ai/api/v1
Authentication
Send your API key in the Authorization header:
Authorization: Bearer YOUR_API_KEY
POST /search
cURL
curl -sS -X POST "https://qveris.ai/api/v1/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"query\":\"weather forecast API\",\"limit\":10}"
You'll get a search_id and a list of capabilities (each with tool_id, params schema, examples, etc.).
Python
import os
import requests
API_KEY = os.environ["QVERIS_API_KEY"]
resp = requests.post(
"https://qveris.ai/api/v1/search",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
json={"query": "weather forecast API", "limit": 10},
timeout=30,
)
resp.raise_for_status()
data = resp.json()
print(data["search_id"])
print(data["results"][0]["tool_id"] if data.get("results") else None)
TypeScript
const apiKey = process.env.QVERIS_API_KEY!;
const resp = await fetch("https://qveris.ai/api/v1/search", {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ query: "weather forecast API", limit: 10 }),
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);
const data = await resp.json();
console.log(data.search_id);
console.log(data.results?.[0]?.tool_id);
POST /tools/by-ids
Before calling, you can inspect one or more capabilities to see full details (parameters, success rate, latency, etc.).
cURL
curl -sS -X POST "https://qveris.ai/api/v1/tools/by-ids" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"tool_ids\":[\"openweathermap.weather.execute.v1\"],\"search_id\":\"YOUR_SEARCH_ID\"}"
Python
resp = requests.post(
"https://qveris.ai/api/v1/tools/by-ids",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
json={
"tool_ids": ["openweathermap.weather.execute.v1"],
"search_id": "YOUR_SEARCH_ID",
},
timeout=30,
)
resp.raise_for_status()
print(resp.json())
TypeScript
const resp = await fetch("https://qveris.ai/api/v1/tools/by-ids", {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
tool_ids: ["openweathermap.weather.execute.v1"],
search_id: "YOUR_SEARCH_ID",
}),
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);
const data = await resp.json();
console.log(data.results);
Returns the same schema as /search — full capability details including params, examples, and stats.
POST /tools/execute?tool_id={tool_id}
cURL (call the capability returned by Discover)
curl -sS -X POST "https://qveris.ai/api/v1/tools/execute?tool_id=openweathermap.weather.execute.v1" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"search_id\":\"YOUR_SEARCH_ID\",\"parameters\":{\"city\":\"London\",\"units\":\"metric\"},\"max_response_size\":20480}"
If output exceeds max_response_size, the response includes truncated_content plus a temporary full_content_file_url.
Python
import os
import requests
API_KEY = os.environ["QVERIS_API_KEY"]
tool_id = "openweathermap.weather.execute.v1" # from Discover results
search_id = "YOUR_SEARCH_ID" # from /search response
resp = requests.post(
f"https://qveris.ai/api/v1/tools/execute?tool_id={tool_id}",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
json={
"search_id": search_id,
"parameters": {"city": "London", "units": "metric"},
"max_response_size": 20480,
},
timeout=60,
)
resp.raise_for_status()
print(resp.json())
TypeScript
const apiKey = process.env.QVERIS_API_KEY!;
const toolId = "openweathermap.weather.execute.v1"; // from Discover results
const searchId = "YOUR_SEARCH_ID"; // from /search response
const resp = await fetch(
`https://qveris.ai/api/v1/tools/execute?tool_id=${encodeURIComponent(toolId)}`,
{
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
search_id: searchId,
parameters: { city: "London", units: "metric" },
max_response_size: 20480,
}),
}
);
if (!resp.ok) throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);
const data = await resp.json();
console.log(data);
QVERIS_API_KEY env var (MCP / Python SDK), orAuthorization: Bearer ... header (REST API)Use this (copy/paste) in your assistant's system prompt when enabling QVeris tools:
You are a helpful assistant that can dynamically discover and call capabilities to help the user. First think about what kind of capabilities might be useful to accomplish the user's task. Then use the search_tools tool with a query describing the capability, not the specific parameters you will pass later. Then call suitable capabilities using the execute_tool tool, passing parameters through params_to_tool. If a capability has success_rate and avg_execution_time, consider them when selecting which to call. You can reference the examples given for each capability. You can make multiple tool calls in a single response.
QVeris's core engine is a managed service. All client-side tooling (MCP server, SDK, skills, plugins) is open source: