Skip to main content
Glama
ondrejsanetrnik

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

Maintenance

ActivityMaintained
ResponsivenessNo issues