uol-mcp-http
README.md
# uol-mcp-http
HTTP MCP server for the [UOL Accounting REST API](https://api.uol.cz/) (Streamable HTTP for Railway and Cursor).
Reads run immediately. POST / PATCH / PUT / DELETE go through `uol_request` and need `confirm=true`.
## Env
- `UOL_API_BASE_URL` — tenant API root, e.g. `https://YOUR-TENANT.ucetnictvi.uol.cz/api` (with or without `/v1`)
- `UOL_API_EMAIL` — UOL login email (Basic Auth username)
- `UOL_API_TOKEN` — token from UOL Settings → `/api_tokens`
- `MCP_AUTH_TOKEN` — Bearer token required by MCP clients
- `PORT` — listen port (Railway sets this)
Demo (OpenAPI): `https://test.demo.uol.cz/api` + the demo email/token from https://api.uol.cz/
## Endpoints
- `GET /health` — healthcheck
- `POST /mcp` — MCP Streamable HTTP (auth required)
## Cursor
Do not commit real tokens. Add this locally in `.cursor/mcp.json`:
```json
{
"mcpServers": {
"uol": {
"url": "https://uol-mcp-production.up.railway.app/mcp",
"headers": {
"Authorization": "Bearer YOUR_MCP_AUTH_TOKEN"
}
}
}
}
```
`YOUR_MCP_AUTH_TOKEN` is `MCP_AUTH_TOKEN` in local `.deploy-secrets` (gitignored) and on the Railway service.
This instance currently talks to the **UOL demo** tenant (`https://test.demo.uol.cz/api`). For live Gramodesky accounting, change Railway vars `UOL_API_BASE_URL` / `UOL_API_EMAIL` / `UOL_API_TOKEN` to the production tenant (same values as shop `UOL_API_*`).
## GramBot (later)
When the shop worktree is clean, attach HTTP MCP with `MCP_UOL_URL` + `MCP_UOL_TOKEN` (same pattern as Daktela / Fio).
## Rate limit
UOL returns HTTP 429 for 30 seconds when exceeded: 30 requests / 10 seconds (receivables: 10 / 10 seconds).
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues