MCP — Model Context Protocol
Tendero stellt einen JSON-RPC MCP-Server für KI-Agenten bereit. Statt REST-Endpunkte aufzurufen und Responses zu parsen, erhalten Agenten High-Level-Tools (tenders_search, leads_create_filter, …) mit typisierten Parametern.
Was ist MCP
Model Context Protocol ist ein offener Standard von Anthropic für die Verbindung von LLM-Anwendungen mit externen Datenquellen und Tools. Ein KI-Client (Claude Desktop, eigene App) liest die Liste verfügbarer Tools vom MCP-Server und entscheidet selbst, welches er aufruft, basierend auf der Konversation mit dem Benutzer.
Tendero MCP-Server läuft als HTTP-Transport — keine lokalen Prozesse, nur ein POST-Endpunkt, der JSON-RPC-Requests akzeptiert.
Endpunkt und Authentifizierung
/api/mcpVerwende einen Management-API-Key (mrw_…) im Authorization-Header. Der Header X-MRW-Client: mcp signalisiert, dass der Call von einem MCP-Client kommt (intern für Audience-Tracking und Entitlement-Check).
Authorization: Bearer mrw_7fa7785c3d6e… X-MRW-Client: mcp Content-Type: application/json
Den Key findest du im Dashboard nach dem Onboarding. Der gleiche Key funktioniert für REST und MCP — kein separates Setup.
JSON-RPC-Envelope
Jeder Request und Response folgt der JSON-RPC 2.0-Spec. tools/list für Discovery, tools/call für Tool-Aufruf.
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 … }" }]
}
}Bei Fehler enthält Response ein error-Objekt statt result:
{
"jsonrpc": "2.0",
"id": 1,
"error": { "code": -32602, "message": "Invalid params: qText is required" }
}Discovery (tools/list)
Client liest die Liste verfügbarer Tools — Server gibt MCP-Standard-Tool-Definitionen inkl. JSON-Schema für Parameter zurück.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}Response enthält tools[]-Array mit { name, description, inputSchema }-Objekten. KI-Client nutzt inputSchema zur Validierung der Arguments.
Tool-Katalog
Aktuell 9 Tools in 4 Kategorien: tenders (search/detail/filters), leads (filters), accounts, subscriptions, meta.
tenders_search
Live-Suche nach Tendern über alle Portale. Gibt Top-N-Tender mit Details (Titel, Wert, Frist, Auftraggeber, …) zurück.
| Parameter | Typ | Beschreibung |
|---|---|---|
| qText | string | Suchtext (Volltext 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 Schätzwert. |
| maxValue | number | Max Schätzwert. |
| deadlineFrom | string (YYYY-MM-DD) | Abgabefrist >= YYYY-MM-DD. |
| deadlineTo | string (YYYY-MM-DD) | Abgabefrist <= YYYY-MM-DD. |
| sort | "newest"|"deadline"|"value" | Sortierung. |
| limit | number | Ergebnisanzahl (max. 1000). Für vollständigen Datensatz-Export nextCursor oder /matches/export (CSV/XLSX, bis 5000 Zeilen) verwenden. |
| cursor | string | Pagination-Cursor. |
tenders_get_detail
Detail eines Tenders inkl. Documents + Preference Flags.
| Parameter | Typ | Beschreibung |
|---|---|---|
| tenderId* | number | Numerische Tender-ID. |
tenders_list_industries
Gibt Liste der Industry-Tags zurück (con_buildings, it_development, …) zum Filtern — Agent kann LLM ein user-friendly Menü statt IDs zeigen.
| Parameter | Typ | Beschreibung |
|---|---|---|
| locale | "cs"|"en"|"de" | Label-Locale (cs default). |
tenders_list_regions
Gibt Liste der NUTS-Regionen für das angegebene Land zurück (CZ default).
| Parameter | Typ | Beschreibung |
|---|---|---|
| country | "CZ"|"SK"|"FR"|"DE" | Land (CZ default). |
leads_list_filters
Liste der gespeicherten LEADS-Filter des Users.
Filter, die via MCP / REST erstellt werden, werden auch in E-Mails, Push-Notifications und Webhooks verwendet — Agent kann einrichten, User erhält über Standard-Kanäle.
leads_create_filter
Erstellt neuen LEADS-Filter. Neue Matches triggern Webhook + Email-Digest.
| Parameter | Typ | Beschreibung |
|---|---|---|
| name* | string | Display-Name des Filters. |
| 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 Schätzwert. |
| maxValue | number | Max Schätzwert. |
| emailDigest | boolean | Tägliches Email-Digest senden. |
account_create_webhook
Registriert einen HTTPS-Webhook-Endpoint zum Empfang von Events (leads.match.created etc.). Gibt Endpoint-ID + Secret für HMAC-Verifikation zurück. Secret wird NUR EINMAL angezeigt — in deine ENV speichern.
| Parameter | Typ | Beschreibung |
|---|---|---|
| url* | string | Öffentlich erreichbare HTTPS-URL, an die Tendero POSTs sendet. |
| enabledEvents* | string[] | Array von Event-Types (z. B. ['leads.match.created']). |
| description | string | Optionales menschenlesbares Label. |
Max 5 Endpoints pro Konto. Für Secret-Rotation /api/v2/account/webhooks/:id/rotate-secret verwenden.
subscriptions_list_plans
Öffentlicher Katalog der Services und Preise (LEADS, PRICING, PROCUREMENT). Ohne Auth.
meta_list_services
Status aller Tendero-Services (Uptime, Deprecation-Flags).
curl-Beispiel
Top 5 Bau-Tender über 1M CZK in Prag finden:
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
Hinzufügen zu ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) oder Äquivalent:
{
"mcpServers": {
"tendero": {
"url": "https://veritra.io/api/mcp",
"transport": "http",
"headers": {
"Authorization": "Bearer mrw_…",
"X-MRW-Client": "mcp"
}
}
}
}Nach Neustart von Claude Desktop siehst du das Icon des verbundenen MCP-Servers im UI. Öffne eine Konversation und frage z.B.: 'Welche Bau-Tender gibt es aktuell in Prag über einer Million?' — Claude ruft tenders_search selbst auf.
Andere MCP-Clients
Der MCP-Server läuft über HTTP-Transport — kompatibel mit jedem Client, der JSON-RPC 2.0 über HTTP spricht. Beispiele unten für die häufigsten.
Cursor / Continue / Cline / Zed
Cursor IDE hat eingebauten MCP-Support. Bearbeite ~/.cursor/mcp.json:
// ~/.cursor/mcp.json
{
"mcpServers": {
"tendero": {
"url": "https://veritra.io/api/mcp",
"headers": {
"Authorization": "Bearer mrw_mgmt_…",
"X-MRW-Client": "mcp"
}
}
}
}Continue.dev
Open-Source VS Code Extension. Füge zu config.json hinzu:
// ~/.continue/config.json (snippet)
"mcpServers": [
{
"name": "tendero",
"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 / eigenes LLM
Wenn dein Client keinen nativen MCP-Support hat, sprich direkt über JSON-RPC 2.0 mit der API. Authorization- und X-MRW-Client-Header identifizieren dein Konto. Discovery (tools/list) ist der erste 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 fallen unter die gleichen Mgmt-API-Limits (60/min read, 10/min write, 5000/Tag). Bei Überschreitung wird HTTP 429 zurückgegeben (JSON-RPC error code -32000).
Fragen? michal@veritra.io