AI integration

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

POST/api/mcp

Use 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, …).

ParameterTypeDescription
qTextstringSearch text (full-text in title + description).
industryTagsstring[]Industry tag IDs (con_buildings, it_development).
cpvPrefixesstring[]CPV prefixes (45, 452).
regionsstring[]NUTS leaf codes (CZ010, CZ020, …).
minValuenumberMin estimated value.
maxValuenumberMax estimated value.
deadlineFromstring (YYYY-MM-DD)Submission deadline >= YYYY-MM-DD.
deadlineTostring (YYYY-MM-DD)Submission deadline <= YYYY-MM-DD.
sort"newest"|"deadline"|"value"Sort.
limitnumberResult count (max 1000). For a full dataset export use nextCursor or /matches/export (CSV/XLSX, up to 5000 rows).
cursorstringPagination cursor.

tenders_get_detail

Detail of one tender including documents + preference flags.

ParameterTypeDescription
tenderId*numberNumeric 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.

ParameterTypeDescription
locale"cs"|"en"|"de"|"sk"|"fr"Label locale (cs default).

tenders_list_regions

Returns list of NUTS regions for the given country (CZ default).

ParameterTypeDescription
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.

ParameterTypeDescription
name*stringDisplay name of filter.
regionsstring[]NUTS leaf codes (CZ010, CZ020, …).
industryTagsstring[]Industry tag IDs (con_buildings, it_development).
categoriesstring[]CPV codes/prefixes (legacy).
keywordsstring[]Keywords (OR match).
minValuenumberMin estimated value.
maxValuenumberMax estimated value.
emailDigestbooleanSend 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.

ParameterTypeDescription
url*stringPublicly accessible HTTPS URL where Veritra will POST events.
enabledEvents*string[]Array of event types (e.g. ['leads.match.created']).
descriptionstringOptional 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).