MCP — Model Context Protocol
Veritra exposes a JSON-RPC MCP server for AI agents. Instead of calling REST endpoints and parsing responses, agents get high-level tools (tenders_search, leads_create_filter, …) with typed parameters.
What is MCP
Model Context Protocol is an open standard from Anthropic for connecting LLM applications to external data sources and tools. An AI client (Claude Desktop, custom app) reads the list of available tools from the MCP server and decides which to call based on the conversation with the user.
Veritra MCP server runs as HTTP transport — no local processes, just one POST endpoint that accepts JSON-RPC requests.
Endpoint and authentication
/api/mcpUse a management API key (mrw_…) in the Authorization header. The X-MRW-Client: mcp header signals that the call comes from an MCP client (used internally for audience tracking and entitlement check).
Authorization: Bearer mrw_7fa7785c3d6e… X-MRW-Client: mcp Content-Type: application/json
You'll find the key in the dashboard after onboarding. The same key works for REST and MCP — no separate setup.
JSON-RPC envelope
Every request and response follows the JSON-RPC 2.0 spec. tools/list for discovery, tools/call to invoke a tool.
Request
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "tenders_search",
"arguments": { "qText": "rekonstrukce mostu", "limit": 10 }
}
}Response
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [{ "type": "text", "text": "{ … JSON payload … }" }]
}
}On error, the response contains an error object instead of result:
{
"jsonrpc": "2.0",
"id": 1,
"error": { "code": -32602, "message": "Invalid params: qText is required" }
}Discovery (tools/list)
Client reads the list of available tools — server returns MCP-standard tool definitions including JSON schema for parameters.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}Response contains a tools[] array with { name, description, inputSchema } objects. AI client uses inputSchema to validate arguments.
Tool catalog
Currently 9 tools in 4 categories: tenders (search/detail/filters), leads (filters), accounts, subscriptions, meta.
tenders_search
Live search of tenders across all portals. Returns top N tenders with detail (title, value, deadline, contracting authority, …).
| Parameter | Type | Description |
|---|---|---|
| qText | string | Search text (full-text in title + description). |
| industryTags | string[] | Industry tag IDs (con_buildings, it_development). |
| cpvPrefixes | string[] | CPV prefixes (45, 452). |
| regions | string[] | NUTS leaf codes (CZ010, CZ020, …). |
| minValue | number | Min estimated value. |
| maxValue | number | Max estimated value. |
| deadlineFrom | string (YYYY-MM-DD) | Submission deadline >= YYYY-MM-DD. |
| deadlineTo | string (YYYY-MM-DD) | Submission deadline <= YYYY-MM-DD. |
| sort | "newest"|"deadline"|"value" | Sort. |
| limit | number | Result count (max 1000). For a full dataset export use nextCursor or /matches/export (CSV/XLSX, up to 5000 rows). |
| cursor | string | Pagination cursor. |
tenders_get_detail
Detail of one tender including documents + preference flags.
| Parameter | Type | Description |
|---|---|---|
| tenderId* | number | Numeric tender ID. |
tenders_list_industries
Returns list of industry tags (con_buildings, it_development, …) for filtering — agent can show the LLM a user-friendly menu instead of memorizing IDs.
| Parameter | Type | Description |
|---|---|---|
| locale | "cs"|"en"|"de"|"sk"|"fr" | Label locale (cs default). |
tenders_list_regions
Returns list of NUTS regions for the given country (CZ default).
| Parameter | Type | Description |
|---|---|---|
| country | "CZ"|"SK"|"FR"|"DE" | Country (CZ default). |
leads_list_filters
List of user's saved LEADS filters.
Filters created via MCP / REST are also used in emails, push notifications, and webhooks — agent can set up and user receives through standard channels.
leads_create_filter
Creates a new LEADS filter. New matches trigger webhook + email digest.
| Parameter | Type | Description |
|---|---|---|
| name* | string | Display name of filter. |
| regions | string[] | NUTS leaf codes (CZ010, CZ020, …). |
| industryTags | string[] | Industry tag IDs (con_buildings, it_development). |
| categories | string[] | CPV codes/prefixes (legacy). |
| keywords | string[] | Keywords (OR match). |
| minValue | number | Min estimated value. |
| maxValue | number | Max estimated value. |
| emailDigest | boolean | Send daily email digest. |
account_create_webhook
Register an HTTPS webhook endpoint to receive events (leads.match.created etc.). Returns endpoint id + secret for HMAC verification. The secret is shown ONCE — store it in your env.
| Parameter | Type | Description |
|---|---|---|
| url* | string | Publicly accessible HTTPS URL where Veritra will POST events. |
| enabledEvents* | string[] | Array of event types (e.g. ['leads.match.created']). |
| description | string | Optional human-readable label. |
Max 5 endpoints per account. For secret rotation use /api/v2/account/webhooks/:id/rotate-secret.
subscriptions_list_plans
Public catalog of services and prices (LEADS, PRICING, PROCUREMENT). No auth required.
meta_list_services
Status of all Veritra services (uptime, deprecation flags).
curl example
Find top 5 construction tenders over 1M CZK in Prague:
curl -X POST https://veritra.io/api/mcp \
-H "Authorization: Bearer mrw_…" \
-H "X-MRW-Client: mcp" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "tenders_search",
"arguments": {
"industryTags": ["con_buildings"],
"regions": ["CZ010"],
"minValue": 1000000,
"limit": 5
}
}
}'Setup in Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or equivalent:
{
"mcpServers": {
"veritra": {
"url": "https://veritra.io/api/mcp",
"transport": "http",
"headers": {
"Authorization": "Bearer mrw_…",
"X-MRW-Client": "mcp"
}
}
}
}After restarting Claude Desktop, you'll see the connected MCP server icon in the UI. Open a conversation and ask, e.g., 'What are the current construction tenders in Prague over a million?' — Claude will call tenders_search itself.
Other MCP clients
The MCP server runs over HTTP transport — compatible with any client that speaks JSON-RPC 2.0 over HTTP. Examples below for the most common.
Cursor / Continue / Cline / Zed
Cursor IDE has built-in MCP support. Edit ~/.cursor/mcp.json:
// ~/.cursor/mcp.json
{
"mcpServers": {
"veritra": {
"url": "https://veritra.io/api/mcp",
"headers": {
"Authorization": "Bearer mrw_mgmt_…",
"X-MRW-Client": "mcp"
}
}
}
}Continue.dev
Open-source VS Code extension. Add to config.json:
// ~/.continue/config.json (snippet)
"mcpServers": [
{
"name": "veritra",
"transport": { "type": "http", "url": "https://veritra.io/api/mcp" },
"requestOptions": {
"headers": {
"Authorization": "Bearer mrw_mgmt_…",
"X-MRW-Client": "mcp"
}
}
}
]Generic HTTP MCP client / ChatGPT plugin / custom LLM
If your client has no native MCP support, talk to the API directly via JSON-RPC 2.0. Authorization + X-MRW-Client headers identify your account. Discovery (tools/list) is the first call.
POST https://veritra.io/api/mcp HTTP/1.1
Authorization: Bearer mrw_mgmt_<your_key>
X-MRW-Client: mcp
Content-Type: application/json
{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }Rate limits
MCP calls fall under the same mgmt API limits (60/min read, 10/min write, 5000/day). When exceeded, returns HTTP 429 (JSON-RPC error code -32000).
Questions? michal@veritra.io