MCP API¶
Dveřník poskytuje server Model Context Protocol (MCP) na adrese /mcp pomocí přenosu Streamable HTTP. To umožňuje AI agentům (např. Claude Code, OpenCode, Cursor) interagovat se systémem programově.
Konfigurace¶
Server MCP je řízen vlastností konfigurace MCP_ENABLED (proměnná prostředí nebo kolekce app_config), která ve výchozím nastavení má hodnotu false. Pokud je vypnutý, endpoint vrací HTTP 503.
| Konfigurační klíč | Výchozí hodnota | Popis |
|---|---|---|
MCP_ENABLED |
false |
Zapnutí/vypnutí serveru MCP za běhu |
Server MCP lze přepínat dynamicky — změny MCP_ENABLED se projeví okamžitě bez restartu.
Autentizace¶
Všechny požadavky MCP vyžadují bearer token v hlavičce Authorization:
Tokeny se vytvářejí pro každého uživatele přes API nebo administrační rozhraní.
Vytvoření tokenu¶
Uživatelský endpoint:
POST /api/v1/me/api-tokens
Content-Type: application/json
Authorization: Bearer <pb_auth_token>
{"name": "my-claude-token"}
Administrátorský endpoint (pro libovolného uživatele):
POST /api/v1/admin/users/{userId}/api-tokens
Content-Type: application/json
Authorization: Bearer <pb_auth_token>
{"name": "my-claude-token"}
Odpověď obsahuje kompletní token (dvmcp_<base64url>) — je to jediná příležitost, kdy se zobrazí.
Seznam tokenů¶
Zrušení tokenu¶
Připojení¶
OpenCode¶
{
"mcp": {
"my-dvernik": {
"enabled": true,
"type": "remote",
"url": "https://my-instance.dvernik.cz/mcp",
"headers": {
"Authorization": "Bearer dvmcp_<your-token>"
}
}
}
}
Claude Desktop¶
{
"mcpServers": {
"dvernik": {
"type": "sse",
"url": "https://your-instance.example.com/mcp",
"headers": {
"Authorization": "Bearer dvmcp_<your_token>"
}
}
}
}
Nástroje¶
Uživatelské nástroje¶
Dostupné všem přihlášeným uživatelům.
| Nástroj | Popis | Argumenty |
|---|---|---|
get_zones |
Seznam dostupných zón s cenami a obsazeností | — |
get_dashboard |
Získání přehledu (kredit, dluh, role, aktivní relace včetně settlement — jen pro čtení náhled vyúčtování, viz Relace a vyúčtování) |
— |
start_session |
Zahájení relace v zóně (idempotentní) | zone_id |
end_session |
Ukončení aktivní relace; textový výsledek obsahuje final_price (cena po slevách a zaokrouhlení), zaokrouhlení (rounding) i amount_due (zbývá doplatit) |
session_id |
get_active_session |
Získání detailů aktivní relace | — |
get_session_devices |
Seznam zařízení v relaci | session_id |
control_device |
Ovládání zařízení v relaci | session_id, device_id, action |
get_my_products |
Seznam zakoupených produktů | — |
get_products_catalog |
Seznam produktů k zakoupení | — |
purchase_product |
Zakoupení produktu za kredit | product_id |
get_my_topups |
Historie dobití kreditu | — |
create_topup |
Vytvoření požadavku na dobití kreditu | amount |
get_session_history |
Seznam minulých relací (každá s final_price = cena po slevách a zaokrouhlení, discount = jen skutečné slevy, price_rounding = ± zaokrouhlení a amount_due = zbývá doplatit; stejné pole má admin nástroj list_sessions) |
page (nepovinné), perPage (nepovinné) |
get_session_timeline |
Časová osa akcí v relaci; každá událost má status (success | failed | not_sent) a u failed i failure_reason. Neúspěšné pokusy se do ceny nepočítají. Technický error_detail MCP nevrací. |
session_id |
get_my_reservations |
Seznam rezervací | — |
create_reservation |
Vytvoření rezervace | zone_id, date_start, time_start, time_end, date_end (nepovinné), purpose (nepovinné), description (nepovinné), is_recurring (nepovinné), weekday (nepovinné) |
delete_reservation |
Smazání rezervace | reservation_id |
get_public_zones |
Získání veřejných informací o zónách | — |
ask_dvernik_help |
Zeptat se na konfiguraci, používání nebo řešení problémů Dveřníku | question |
search_documentation nebo documentation_lookup |
Hledat v dokumentaci | question |
Administrátorské nástroje¶
Dostupné pouze uživatelům s rolí admin.
| Nástroj | Popis | Argumenty |
|---|---|---|
list_users |
Seznam uživatelů (volitelný filtr vyhledávání) | search (nepovinné) |
get_user_products |
Získání zakoupených produktů uživatele | user_id |
assign_product |
Přiřazení produktu uživateli | user_id, product_definition_id |
remove_user_product |
Odebrání produktu od uživatele | user_product_id |
list_api_tokens |
Seznam API tokenů uživatele | user_id |
revoke_api_token |
Zrušení API tokenu | token_id |
list_presets |
Seznam vestavěných předvoleb konfigurace (zařízení, produkty, region, ceníky) | kind (nepovinné), target (nepovinné, objekt) |
validate_config |
Zkušební kontrola hodnoty podle kontraktu, nic se neukládá; vrací {valid, issues[]} |
kind, target (nepovinné), value |
get_config_health |
Existující záznamy, které nesplňují kontrakty (stejný dokument jako GET /api/v1/admin/config/health) |
— |
Nástroje pro konfiguraci volají stejné služby jako administrátorské REST endpointy (/api/v1/admin/presets, /api/v1/admin/contracts/validate, /api/v1/admin/config/health), takže se výsledky neliší. Hromadný export a import instalace se přes MCP záměrně nenabízí — zůstává vědomou akcí v administraci (viz Nová instalace). Podrobnosti o kontraktech viz Kontrakty a předvolby.
Příklad: validate_config¶
Odpověď:
Druhy (kind): device (target.communication_adapter, target.device_type, hodnota = adapter_config), product (target.product_type, hodnota = parameters), app_config (target.key, hodnota = text), zone_pricing_rule a device_pricing_rule (hodnota = jedno pravidlo). Varování (severity: warning) ukládání neblokují.
Idempotence¶
start_session je idempotentní. Více volání pro stejného uživatele ve stejné zóně vrací stejné ID relace s Created=false při opakovaných voláních. Toto je bezpečné i při souběžném přístupu — mutex pro dvojici (uživatel, zóna) zabraňuje souběhu.
Formát odpovědi¶
Všechny nástroje vrací odpovědi ve formátu JSON nebo prostý text. Při chybě odpověď sleduje formát:
Běžné kódy chyb:
- unauthorized — Neplatný nebo chybějící token
- zone_at_capacity — Zóna dosáhla maximálního počtu souběžných relací
- zone_closed — Zóna je momentálně uzavřená
- max_debt_exceeded — Dluh uživatele překračuje maximální povolený
- insufficient_credit — Uživatel nemá dostatečný kredit
- session_not_active — Pokus o ukončení relace, která není aktivní