Paketi Nalog MAX,
Podjetje in
Računovodstvo vključujejo
MCP strežnik za AI asistente in REST API:
potni nalogi, evidenca delovnega časa, odsotnosti in mesečni obračuni — vprašaš Claude-a ali
povežeš ERP. Za MCP ti ni treba biti podjetje: dovolj je Nalog MAX. Ključ privzeto samo
bere; ustvarjanje odkleneš posebej in AI tudi
takrat ničesar ne uredi, ne izda in ne potrdi. Brez skritih pravil: vse, kar dostop zmore in
česa ne, piše na tej strani.
MCP strežnik za AI asistente ključ = samo tvoja organizacija privzeto samo branje 120 zahtev/min na ključ uporaba iz brskalnika je blokirana
Začetek v dveh minutah
1 · Ustvari ključ — v aplikaciji: Nastavitve podjetja → API za razvijalce (lastnik ali admin). Ključ nalog_live_… se prikaže samo enkrat; hranimo zgolj njegov SHA-256.
2 · Pošlji zahtevo — ključ sodi v glavo Authorization: Bearer … in živi izključno na strežniku. Klici z brskalniškimi glavami (Sec-Fetch, Origin) so zavrnjeni, ključ pa označen kot razkrit.
3 · Določi podjetje — organizacije z enim podjetjem parameter ?company= lahko izpustijo; računovodski servisi ga podajo za vsako stranko (seznam: /v1/companies).
MCP strežnik — nalog.si v tvojem AI asistentu
Poleg REST API-ja je na isti ključ vezan tudi MCP strežnik
(Model Context Protocol, Streamable HTTP). Poveži ga s Claude-om ali katerim koli MCP odjemalcem in
vprašaj kar po slovensko: »koliko nadur je imela ekipa maja?« — asistent sam pokliče prava orodja.
razpored: kdo je razporejen na katero delovišče po dnevih
list_sites
delovišča — edini način, da dobiš siteId za create_shift_assignment
get_urnik
urnik osebe ali privzeti urnik podjetja — z navedbo, kateri od obeh dejansko velja
get_pravila
veljavna pravila odobritev za osebo (pravila podjetja + njene izjeme) — pojasni, zakaj je zapis čakal
monthly_summary
mesečni zbir po osebah: ure, nadure, km, EUR, nalogi — iste deterministične številke kot obračun
create_trip_draft ✎
USTVARI potni nalog kot osnutek (samo ključ z obsegom pisanja)
get_member
VSE o eni osebi v enem klicu: urnik, pravila, nalogi, ure, odsotnosti, razpored
describe_modules
kaj aplikacija zna in kaj ima ta organizacija vklopljeno — zakaj nekdo česa ne vidi
create_shift_assignment ✎
razporedi osebo na PROST dan; obstoječega razporeda ne prepiše (samo ključ z obsegom pisanja)
create_site ✎
ustvari delovišče (samo ključ z obsegom pisanja)
invite_member ✎
povabi osebo in ji hkrati dodeli module; vrne žeton, e-pošte ne pošlje (samo ključ z obsegom pisanja)
MCP je podvržen istim pravilom kot REST: isti ključi, ista izolacija organizacije,
ista zaščita pred razkritjem v brskalniku in ista omejitev 120 zahtev/min.
Isti obseg ključa velja povsod: branje je odprto
vsakemu veljavnemu ključu, ustvarjanje pa zahteva
ključ z obsegom pisanja — v MCP in v REST enako.
Pisanje: ključ z obsegom »write«
Ključ ima obseg. Privzeto je
read — takrat asistent lahko samo bere.
Ob izdaji lahko izbereš write, ki odklene
samo ustvarjanje. AI ne izdaja, ne ureja in ne potrjuje ničesar.
Ključi, izdani pred tem, ostanejo bralni — obseg se ne podeli za nazaj.
Orodje
Kaj naredi
Meja
create_trip_draft
Ustvari potni nalog kot osnutek.
Nikoli izdan — brez zaporedne številke, dokler ga človek ne potrdi v aplikaciji.
create_shift_assignment
Razporedi osebo na delovišče za en dan; oseba prejme obvestilo.
Samo na PROST dan. Če je vodja tisti dan že razporedil, vrne napako in ne prepiše ničesar.
create_site
Ustvari delovišče, na katero razpored kaže.
Referenčni podatek: nikogar ne obvesti, ur ne premakne. Zahteva modul Razpored.
Prek MCP samo zaposlenega (vodjo prek REST ali v aplikaciji). E-pošte ne pošljemo in nihče ni samodejno včlanjen. Dodeljeni moduli spremenijo znesek.
Pravilo, po katerem se odločamo, kaj sme AI pisati: samo tam, kjer
že obstaja človekova potrditev. Zato urnika in pravil odobritev prek MCP ni mogoče spreminjati —
urnik premakne normo ur in s tem saldo, pravila pa določajo, kdo je sploh podvržen nadzoru. Oboje lahko
asistent bere (get_urnik,
get_pravila), ne more pa spreminjati.
Pisalni ključ mora imeti tudi znanega avtorja — zapis nastane v imenu osebe, ki je ključ izdala,
in zanjo veljajo iste omejitve modula, vloge in mesečnega števila nalogov kot v aplikaciji.
Povabila prek API-ja
Povabilo in dodelitev modulov sta en klic, tako kot v
aplikaciji. Dvoje je vredno vedeti: e-pošte ne pošljemo —
dobiš žeton in povezavo dostaviš sam, oseba pa mora povabilo sprejeti (nihče ni nikoli samodejno včlanjen);
in dodeljeni moduli spremenijo znesek, ker se zaračunavajo
po sedežu. Zato povabilo preverimo proti rezerviranim količinam (skupaj z že odprtimi povabili), da sprejem
ne dvigne obračuna mimo rezervacije.
Prek MCP lahko povabiš samo zaposlenega, prek REST tudi vodjo;
administratorja in računovodjo dodeliš izključno v aplikaciji. Razlika ni muha: klic na
/v1 napiše razvijalec, klic prek MCP pa izbere
model, ki je v istem pogovoru bral besedilo iz tvoje baze — namene poti, opombe razporeda. Kdor to besedilo
piše, ne sme prek asistenta doseči vloge, ki bere tuje podatke ali potrjuje delo. Vsako povabilo prek ključa
zato tudi sproži obvestilo lastnikom in administratorjem
organizacije — rezultat orodja vidi model, obvestilo pa človek.
Zaščita pred ključem v brskalniku
Ključ, vgrajen v spletno stran, lahko prebere vsak — zato zahteve, ki pridejo iz brskalnika, zavrnemo z
browser_blocked in ključ v aplikaciji označimo
za zamenjavo. Prepoznamo jih po glavah, ki jih nastavi brskalnik sam in jih koda na strani ne more ne
odstraniti ne ponarediti: Sec-Fetch-Site,
Sec-Fetch-Dest in
Origin.
Sec-Fetch-Mode namenoma NI med njimi: Node-ov
vgrajeni fetch ga pošlje sam, čeprav teče na
strežniku. Odjemalci MCP, ki stojijo nanj (Claude Desktop, Claude Code …), zato delujejo normalno.
REST končne točke
Vsi datumi so YYYY-MM-DD in se, tako kot v aplikaciji, razlagajo po slovenskem (stenskem) času.
V primerih je $NALOG_KEY tvoj ključ.
GET /v1/absences
Dopusti, bolniške in druge odsotnosti, ki se prekrivajo z obdobjem from/to.
true = stranka računovodskega servisa (dostop prek aktivne povezave), ne servisova lastna organizacija
data[].clientOrgName
string | null
naziv stranke, kadar managed = true; sicer null
POST /v1/invites
Povabi osebo v podjetje IN ji hkrati dodeli module — pravi postopek povabila v enem klicu. Zahteva ključ z obsegom pisanja in paket, ki sme vabiti (Podjetje / Računovodstvo).
VSE o eni osebi v enem klicu: profil, urnik, pravila, nalogi, ure, odsotnosti in razpored. Privzeto tekoči mesec; &from/&to za drugo obdobje, &include=urnik,pravila za manjši odgovor.
naziv delovišča; ob preimenovanju pade nazaj na posnetek ob razporeditvi
data[].note
string | null
opomba vodje
data[].assignedBy
string · uuid | null
vodja, ki je razporedil; null, če je bil račun izbrisan
POST /v1/shift-assignments
Razporedi osebo na delovišče za EN dan. Samo na prost dan — če je vodja tisti dan že razporedil, dobiš 409 in nič se ne prepiše. Oseba prejme obvestilo. Zahteva ključ z obsegom pisanja.
Zahteva
curl -X POST "https://api.nalog.si/v1/shift-assignments" -H "Authorization: Bearer $NALOG_KEY" -H "Content-Type: application/json" -d '{"member":"71ac9d02-…","siteId":"b41d8e22-…","date":"2026-06-10","note":"pridi ob 7h"}'
tisti dan je že razporejen; obstoječi razpored se NE prepiše
GET /v1/sites
Delovišča za razpored. Edini način, da dobiš siteId, preden razporediš osebo (POST /v1/shift-assignments). Arhivirana so izpuščena, razen z &includeArchived=true.
koordinati; preverjanje prisotnosti meri od tod, zato sta obvezni in validirani
radiusM
number
polmer prisotnosti, privzeto 200 m
GET /v1/summary/{YYYY-MM}
Mesečni zbir po osebah kot JSON: ure, nadure, kilometri, povračila in število nalogov. Iste deterministične številke kot obračun v aplikaciji — brez prebiranja xlsx.
Potni nalogi po datumu izdaje (from/to, YYYY-MM-DD, vključujoče; privzeto od 1. tega meseca naprej). Neobvezno: &status=draft|confirmed|issued|settled, &member=<userId> za nalogé ene osebe, &limit / &offset za strani.
KATERI urnik dejansko velja — odsoten urnik osebe ne pomeni »brez urnika«, ampak da podeduje privzetega
data.urnik
object | null
veljavna konfiguracija urnika
data.dayNormMinutes
number | null
dnevna norma podjetja v minutah
Napake
Pri REST (/v1) je telo napake vedno { "error": "koda" } z ustreznim HTTP statusom. Prek MCP se ista napaka vrne kot rezultat orodja z isError: true in besedilom (koda je v besedilu).
HTTP
Koda
Pomen
401
unauthorized
ključ manjka, je napačen ali preklican
403
plan_without_api
paket organizacije ne vključuje API-ja (Nalog MAX / Podjetje / Računovodstvo)
403
browser_blocked
zahteva je prišla iz brskalnika (glave Sec-Fetch/Origin) — ključ je razkrit v javni kodi; zahteva je zavrnjena, ključ pa v aplikaciji označen za zamenjavo
400
company_required
organizacija ima več podjetij — dodaj ?company=
404
company_not_found
podjetje ne obstaja ali ne pripada tvoji organizaciji
400
bad_date / bad_month
datum ni YYYY-MM-DD oziroma mesec ni YYYY-MM
400
member_required
orodje/pot zahteva &member=, a ga ni
404
member_not_found
oseba ni član tega podjetja
404
not_found
zapis ne obstaja (ali pripada drugi organizaciji — namerno ista koda)
429
rate_limited
več kot 120 zahtev/min na ključ (ali zaščita pred navalom po IP); glej glavo Retry-After
403
key_is_read_only
ključ nima obsega pisanja — izdaj ključ z obsegom »write«
403
module_locked
organizacija ali oseba nima modula, ki ga pisanje zahteva (Nalogi / Razpored)
403
forbidden
avtor ključa nima vloge za to dejanje (npr. razporeja lahko le vodja+)
403
trip_limit
presežena mesečna kvota nalogov paketa
400
invalid_input: <polje>
telo ne prestane validacije — sporočilo poimenuje polje (npr. legs.0.from, role)
409
day_already_assigned
oseba je tisti dan že razporejena; obstoječega se ne prepiše
404
site_not_found
delovišče (siteId) ne obstaja v tem podjetju
Varnost ključev
• Ključ vidiš samo enkrat. Pri nas je shranjen izključno kot SHA-256 — nihče (niti mi) ga ne more prebrati nazaj. Izgubljen ključ prekličeš in ustvariš novega.
• Zaščita pred razkritjem v brskalniku. Brskalniki vsaki zahtevi samodejno dodajo glave Sec-Fetch-* (JavaScript jih ne more odstraniti) in Origin. Če katera od njih prispe na /v1, ključ očitno živi v javni kodi — zahteva je zavrnjena s browser_blocked, ključ pa v aplikaciji označen z opozorilom za zamenjavo. Strežniških integracij (curl, Node, Python …) to nikoli ne prizadene.
• Zaščito je mogoče izklopiti (Nastavitve podjetja → API za razvijalce) — z dvojno potrditvijo, ker je smiselna le za interne kioske ali Electron aplikacije. Ne priporočamo.
• Vsaka uporaba pušča sled — čas zadnje uporabe je viden ob vsakem ključu.
Pošteno o omejitvah
• Pisanje samo ustvarja. S ključem z obsegom write nastanejo nalog (kot osnutek), delovišče, povabilo in razpored na prost dan. Urejanje, izdaja, potrjevanje in brisanje ostanejo v aplikaciji, prav tako vpisovanje ur in odsotnosti — če to potrebuješ, se oglasi, gradimo po dejanskih potrebah.
• Brez webhookov (zaenkrat). Spremembe pridobivaš s poizvedovanjem; za mesečne obračune zadošča en klic na mesec.
• 120 zahtev/min na ključ. Pri prekoračitvi dobiš 429 z glavo Retry-After; trajna prekoračitev ne vodi v blokado, samo v upočasnitev.
• Do 10 aktivnih ključev na organizacijo; vsak se prekliče z enim klikom in neha veljati takoj.
• Seznami so straničeni (privzeto in največ: nalogi 500, ure/odsotnosti/razpored 2000 na stran) — odgovor nosi hasMore, naslednjo stran vzameš z &limit in &offset.
Manjka končna točka?
API širimo po potrebah strank — napiši nam, kaj integriraš, in povemo, kdaj (ali zakaj ne).