Skip to main content
Glama
Seyn-Labs

mcp-ai-fiskalizacija

by Seyn-Labs
README.md
# mcp-fiskalizacija

MCP (Model Context Protocol) server za **izradu i fiskalizaciju računa** preko [solo.com.hr](https://solo.com.hr) API-ja.

Daj ovaj MCP bilo kojem AI-ju ili agentu (Claude, Cursor, ChatGPT s MCP podrškom, custom agenti...) i reci mu npr.:

> *"Napravi mi račun za tvrtku Acme d.o.o., OIB 12345678901, za konzultantske usluge, 10 sati po 80 EUR, PDV 25%, plaćanje na transakcijski račun."*

AI će pozvati `solo_create_invoice`, Solo će dodijeliti sljedeći broj računa, fiskalizirati ga (ZKI/JIR) i vratiti PDF link.

## Alati

| Alat | Opis |
|------|------|
| `solo_create_invoice` | Izrađuje i fiskalizira novi račun. Vraća broj računa, iznose, ZKI/JIR i PDF link. |
| `solo_get_invoice` | Dohvaća jedan račun po ID-u sa svim detaljima. |
| `solo_list_invoices` | Popis računa (najnoviji prvi, do 1000 po stranici). |
| `solo_next_invoice_number` | Čita zadnji izdani račun i izračunava sljedeći broj (`redni-prostor-uređaj`, npr. `13-1-1`). Solo broj dodjeljuje automatski pri izradi — alat služi za najavu i provjeru. |

## Instalacija

```bash
git clone <ovaj-repo>
cd mcp-fiskalizacija
npm install
npm run build
```

Trebаš **Solo API token** — pronađi ga u *Postavkama* nakon prijave na [solo.com.hr](https://solo.com.hr).

## Spajanje na AI / agenta

### Claude Code

```bash
claude mcp add fiskalizacija \
  --env SOLO_API_TOKEN=tvoj-token \
  -- node /putanja/do/mcp-fiskalizacija/dist/index.js
```

### Claude Desktop / bilo koji MCP klijent (JSON config)

```json
{
  "mcpServers": {
    "fiskalizacija": {
      "command": "node",
      "args": ["/putanja/do/mcp-fiskalizacija/dist/index.js"],
      "env": {
        "SOLO_API_TOKEN": "tvoj-token"
      }
    }
  }
}
```

### Cursor

Isti JSON u `.cursor/mcp.json` u projektu ili globalno u `~/.cursor/mcp.json`.

## Primjer: kako AI izrađuje račun

Korisnik kaže:

> "Napravi račun: kupac Marko Horvat (fizička osoba), usluga 'Izrada web stranice', 1 kom, 500 EUR, PDV 25%, plaćanje karticom."

AI pozove alat ovako:

```json
{
  "tool": "solo_create_invoice",
  "arguments": {
    "tip_kupca": 1,
    "kupac_naziv": "Marko Horvat",
    "usluge": [
      {
        "opis_usluge": "Izrada web stranice",
        "cijena": 500,
        "kolicina": 1,
        "porez_stopa": 25,
        "jed_mjera": "kom"
      }
    ],
    "nacin_placanja": 3
  }
}
```

Odgovor sadrži:

```
Račun uspješno kreiran.

Broj računa: 13-1-1
Kupac: Marko Horvat
Neto: 500,00 | Bruto: 625,00 EUR
Način plaćanja: Kartice
ZKI: e4d909c290d0fb1ca068ffaddf22cbd0
JIR (fiskaliziran): 2cf55235-9470-4b5c-a539-463f52b109d2
PDF: https://solo.com.hr/download/...
```

### Obavezne informacije za račun

Minimalno: **tip kupca**, **stavke** (opis, cijena, PDV stopa) i **način plaćanja**.

Za B2B/B2G kupce (tvrtke, javna nabava) dodatno su obavezni **naziv kupca**, **OIB** i **KPD oznaka** po stavci — server to validira prije slanja i vraća jasnu grešku ako nedostaje.

## Šifrarnici (Solo API)

| Parametar | Vrijednosti |
|-----------|-------------|
| `tip_kupca` | 1=B2C fizička osoba, 2=B2B poslovni subjekt, 3=B2G država/javna nabava, 4=EU, 5=INT |
| `tip_racuna` | 1=R1, 2=R2, 3=bez oznake, 4=avansni |
| `nacin_placanja` | 1=transakcijski račun, 2=gotovina, 3=kartice, 4=ček, 5=ostalo |
| `porez_stopa` | 0, 5, 13, 25 |
| `jezik_racuna` | 1=hrvatski, 2=engleski, 3=njemački, 4=francuski, 5=talijanski, 6=španjolski |
| `valuta_racuna` | 14=EUR (zadano), 12=USD, 11=GBP, 10=CHF, 6=HUF, 13=BAM, ... |
| `status` | 1=otvoren, 2=poslan, 3=opomenut, 5=plaćen |

## Kako funkcionira

```
AI / agent ──(MCP, stdio)──► mcp-fiskalizacija ──(HTTPS)──► api.solo.com.hr ──► Porezna uprava (fiskalizacija)
```

1. AI dobije zahtjev korisnika i prikupi obavezne podatke.
2. Pozove `solo_create_invoice` (po želji prvo `solo_next_invoice_number` da najavi broj).
3. Server validira ulaz (B2B pravila, PDV stope, popusti), pretvori brojeve u Solo format (decimalni zarez) i pošalje form-encoded POST na `https://api.solo.com.hr/racun`.
4. Solo dodijeli broj računa, fiskalizira račun (ZKI/JIR) i vrati PDF.
5. AI korisniku vrati broj računa, iznose i PDF link.

**Numeracija:** hrvatski broj računa ima oblik `redni-poslovniProstor-naplatniUređaj` (npr. `13-1-1`), a redni broj se resetira svake kalendarske godine — `solo_next_invoice_number` to uzima u obzir.

## Ograničenja Solo API-ja

- Plaćeni paket: do **300 računa mjesečno**; besplatni: **3 mjesečno**.
- Fiskalizacija (ZKI/JIR) mora biti uključena u Solo postavkama (certifikat Porezne uprave).
- `solo_get_invoice` koristi Solo **ID** računa (hex string), ne broj računa.

## Razvoj

```bash
npm run dev            # pokreni server iz src/ (tsx)
npm test               # testovi (vitest)
npm run test:coverage  # testovi s pokrivenošću
npm run build          # TypeScript build u dist/
```

Struktura:

```
src/
  index.ts                  # entry point (stdio transport)
  server.ts                 # MCP server + registracija alata
  solo/
    client.ts               # HTTP klijent za api.solo.com.hr
    serialize.ts            # validacija + form-encoding (decimalni zarez, indeksirane stavke)
    invoice-number.ts       # parsiranje i predviđanje broja računa
    types.ts                # tipovi i šifrarnici
  tools/                    # MCP alati (jedan po datoteci)
```

## Roadmap (2.0)

- [ ] Više providera fiskalizacije (apsolutna apstrakcija providera iza zajedničkog sučelja)
- [ ] Storno i brisanje računa (Solo API to podržava)
- [ ] Ponude (Solo API `/ponuda`)
- [ ] Fiskalizacija 2.0 (eRačun B2B obveza od 1.1.2026.)

## Licenca

MIT

TDQS

A4.2/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: create, get by ID, list, and retrieve next invoice number. There is no overlap in functionality.

Naming Consistency4/5

All tools use the 'solo_' prefix and snake_case, but 'solo_next_invoice_number' is a noun phrase rather than a verb+noun pattern, introducing a minor inconsistency.

Tool Count4/5

4 tools cover the core operations for an invoice management server (create, read, list, and a utility). The count is reasonable, though slightly small for a full lifecycle.

Completeness3/5

The tool set provides create, get, list, and next number, but lacks update and delete/cancel functionality, which are notable gaps for invoice management.

Maintenance

ActivitySlowing
ResponsivenessSyncing