For more detailed discovery query formulation, tool selection criteria, parameter handling, and error recovery, see the Agent Guidelines.
When external functionality is needed, follow this two-phase workflow:
Phase 1: Discover and Call Capabilities via MCP
- Identify what tool capability the user needs
- Call
discover with a functionality description (not parameter names) — limit results to 10
- Call
inspect when you need full parameter details, examples, success rate, latency, or billing metadata
- Call
call to test a candidate, passing parameters via paramstotool
- Repeat or broaden the discovery query if no suitable capability is found
Compatibility note: legacy MCP names searchtools, gettoolsbyids, and execute_tool remain deprecated aliases only. Prefer discover, inspect, and call in all new workflows.
Billing and Audit
QVeris separates pricing rules, pre-settlement billing, and final settlement:
billing_rule explains how a capability is priced.
billing / presettlementbill explains the theoretical charge for a call.
usagehistory and creditsledger answer whether credits were actually charged and how the balance changed.
When the user asks whether a failed call was charged, do not infer from cost alone. Query usagehistory with the executionid and inspect charge_outcome.
Use context-safe audit patterns:
- Start with
mode: "summary" for usage or ledger totals.
- Use
mode: "search" with precise filters such as executionid, chargeoutcome, mincredits, maxcredits, or a date range.
- Use
mode: "export_file" for large analysis; read the resulting JSONL file in chunks instead of returning all rows into context.
Phase 2: Generate Production Code
Once a suitable tool is identified, generate code that calls the QVeris REST API directly. Do not reuse the MCP tool-call result — produce standalone code the user can run.
- Read the API key from the MCP server config (
QVERISAPIKEY)
- Set a 5-second request timeout
- Handle errors by checking the
success field and error_message
- Verify the response structure matches expectations before delivering to the user; if the call fails (invalid key, rate limit, tool not found), report the error and suggest corrective action
Example: Fetch Weather Data
import requests
import os
API_KEY = os.environ.get("QVERIS_API_KEY", "<QVERIS_API_KEY from MCP config>")
BASE_URL = os.environ.get("QVERIS_BASE_URL", "https://qveris.ai/api/v1").rstrip("/")
def call_tool(tool_id: str, search_id: str, params: dict) -> dict:
"""Call a QVeris capability and return the result."""
resp = requests.post(
f"{BASE_URL}/tools/execute",
params={"tool_id": tool_id},
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"search_id": search_id,
"session_id": "",
"parameters": params,
"max_response_size": 20480,
},
timeout=5,
)
resp.raise_for_status()
try:
data = resp.json()
except requests.exceptions.JSONDecodeError:
raise RuntimeError("Failed to decode API response as JSON.")
if not data.get("success"):
raise RuntimeError(f"QVeris error: {data.get('error_message', 'Unknown error')}")
result = data.get("result")
if result is None:
raise RuntimeError("API response is missing the 'result' field.")
return result
# Usage
result = call_tool(
tool_id="openweathermap_current_weather",
search_id="<search_id from Phase 1>",
params={"city": "London", "units": "metric"},
)
print(result) # {"data": {"temperature": 15.5, "humidity": 72}}
API Reference
Base URL: https://qveris.ai/api/v1 by default. Set QVERISBASEURL to the active deployment's API root when an explicit override is required.
Authentication: Authorization: Bearer YOURAPIKEY
POST /tools/execute?toolid={toolid}
| Field |
Type |
Description |
search_id |
string |
ID returned by discover |
session_id |
string |
Optional session identifier |
parameters |
object |
Tool-specific input parameters |
maxresponsesize |
number |
Max response bytes (default 20480) |
Response Fields
| Field |
Type |
Description |
execution_id |
string |
Unique ID for the execution. |
result |
object |
Contains the tool's output, typically under a data key. |
success |
boolean |
true if the call succeeded, false otherwise. |
error_message |
string |
Details of the error if success is false. |
elapsedtimems |
number |
Execution time in milliseconds. |