MCP: objednávky, vratky a doklady
Nástroje MCP pro objednávky, zásilky, vratky, párování plateb a vystavené doklady: oprávnění, potvrzení, důsledky zápisu a všechny parametry.
Hledání a detail objednávek, fronta párování plateb, vratky a reklamace i s detailem jedné vratky a vystavené doklady, a k tomu nástroj, který u existující objednávky mění stav, platbu, zásilky a vratky (včetně schválení uznaných množství), páruje platby z výpisu a znovu posílá vystavenou fakturu.
Nástroje volá klient přes server MCP na doméně obchodu, například https://muj-eshop.cz/api/mcp, a v odpovědi na tools/list dostane jen ty, na jejichž oprávnění klíč dosáhne. Jak server mluví, kdy se ptá člověka a jak se změny vracejí, popisuje článek MCP server.
U každého nástroje stojí oprávnění, které chce, jestli se server před provedením zeptá člověka a kudy, jestli volání strhne kredity obchodu nebo peníze z karty, co vrací pro deník změn a jakou větu o důsledku člověk v potvrzení uvidí. Všechno z toho se vyhodnocuje z téhož kódu, podle kterého se server rozhoduje. Popisy parametrů jsou převzaté ze schématu, které server posílá v tools/list; kde se v něm text obrací přímo k modelu, je tady převedený do vykání. Povinnost parametru platí uvnitř objektu, ve kterém parametr leží.
Před zápisem, který přepisuje nebo maže, před útratou kreditů nebo platbou kartou a před hledáním mimo obchod se server ptá člověka a do té doby neprovede nic. Nejdřív použije schválení, které pro totéž volání se stejnými hodnotami už v administraci leží schválené. Jinak se zeptá formulářem, když ho klient deklaruje a politika akce ho dovoluje; formulář potvrzuje ten, kdo drží klíč, takže před ukradeným klíčem takové potvrzení nechrání. Otázka ve formuláři nese pod nadpisem „Co se změní“ tytéž řádky jako stránka schválení. Klient s elicitací URL dostane odkaz na stránku schválení v administraci a klient bez elicitace odmítnutí approval_required s odkazem v _meta; po schválení volání zopakuje se stejnými hodnotami. Na stránce schválení rozhoduje jen přihlášený člověk, kterého u každé akce jmenuje odrážka Potvrzení přes MCP, a účet podpory SHOPZI nikdy. Když politika nedovoluje nic, co klient umí, přijde odmítnutí confirmation_required a neprovede se nic. Výsledek potvrzeného volání nese v _meta["cz.shopzi/confirmation"] údaj, že akci potvrdil člověk a kde (form nebo approval), a v obsahu českou větu pro model, u placené akce i s cenou a zůstatkem kreditů z dotazu. Na otázku formulářem je 15 minut, schválení na stránce platí 60 minut, pokud u akce není uvedeno jinak.
Zápisové nástroje vracejí v poli change_id ID záznamu v deníku změn; co pole u kterého nástroje nese, říká jeho odrážka Deník změn. Změnu z deníku vrací shopzi_undo_change podle jejího druhu: obnoví předchozí hodnoty, u skladu zapíše vyrovnávací pohyb, u běžné ceny zapíše návrat do 30denní historie cen (nic z ní nemaže) a změnu, která už opustila obchod nebo stála peníze (odeslaný e-mail, stržené kredity, platbu kartou), odmítne s vysvětlením.
shopzi_search_orders
V režimu search vrátí stránku objednávek se stejnými filtry jako obrazovka Objednávky, v režimu labels objednávky čekající na předání Zásilkovně s odkazem na jedno PDF se všemi štítky a v režimu payment_queue frontu párování plateb (nespárované platby z bankovního výpisu a dobírky), ze které platbu potvrdí nebo odsune shopzi_manage_order. Tržby za období počítá shopzi_get_analytics, součet řádků výpisu je nenahradí.
- Oprávnění:
orders:read, u klíče „Objednávky (čtení)“. - Druh: čtení (
readOnlyHint). - Potvrzení přes MCP: ne.
- Kredity a platba kartou: ne.
shopzi_search_orders: parametry
mode(jedna z hodnotsearch,labelsapayment_queue, výchozísearch; nepovinný):search= stránka objednávek podle filtrů.labels= fronta štítků Zásilkovny.payment_queue= fronta párování plateb; bere jenlimit.status(jedna z hodnotpending,received,confirmed,processing,shipped,delivered,completed,cancelledarejected; nepovinný): Stav objednávky, napříkladpendingnebocompleted.paymentStatus(jedna z hodnotpending,authorized,paid,failed,refundedapartially_refunded; nepovinný): Stav platby, napříkladpaidnebopending.updatedSince(text se vzorem; nepovinný): ISO datum. Jen objednávky změněné od té doby.search(text; nepovinný): Podřetězec ČÍSLA OBJEDNÁVKY, e-mailu nebo jména na faktuře. Použijte, když obchodník zmíní číslo objednávky nebo zákazníka (shopzi_get_orderbere jen vnitřní ID). Obecná slova z věty („web“, „administrace“, „objednávky“) sem nedávejte, nic nenajdou.placedFrom(text; nepovinný): Objednané OD, včetně, jako pražský kalendářní denRRRR-MM-DD. Používejte ho na otázky typu „za červenec“ nebo „za posledních 30 dní“;updatedSinceje datum poslední ZMĚNY objednávky, což je jiná otázka.placedTo(text; nepovinný): Objednané DO, včetně celého toho dne,RRRR-MM-DD.orderType(jedna z hodnotordersaquotations; nepovinný):orders= jen objednávky,quotations= jen velkoobchodní poptávky. Vynechané = obojí dohromady.fulfillment(returned; nepovinný):returned= jen objednávky, jejichž zásilka se vrátila nebo se nepodařilo doručit.limit(celé číslo od 1 do 100, výchozí25; nepovinný): Počet položek na stránku, 1 až 100. Velká stránka se do jedné odpovědi nemusí vejít a nástroj ji pak odmítne, což stojí krok navíc: berte jen tolik položek, kolik na odpověď opravdu potřebujete.cursor(text; nepovinný): Průběžná pozice z předchozí odpovědi (next_cursor). Vynechte pro první stránku.
shopzi_get_order
Vrátí jednu objednávku i s položkami a s tím, co ukazuje její detail v administraci: zásilky, platby, příplatky, vystavené doklady včetně dobropisů, historii stavů a interní poznámky (ty jen v panelu Agenta v administraci). Nákupní ceny neobsahuje. Každá částka objednávky i položky přijde v haléřích i jako hotový text pod jménem bez _minor, třeba total vedle total_minor.
- Oprávnění:
orders:read, u klíče „Objednávky (čtení)“. - Druh: čtení (
readOnlyHint). - Potvrzení přes MCP: ne.
- Kredity a platba kartou: ne.
shopzi_get_order: parametry
orderId(UUID; povinný): ID objednávky (UUID) zeshopzi_search_orders. VYMYŠLENÉ id nástroj odmítne.
shopzi_list_returns
Vrátí vratky a reklamace od nejnovějších i se zákonnou lhůtou na vyřízení a s částkami v haléřích, u každé i jako hotový text. S returnId vrátí detail jedné vratky i s ID položek, které potřebuje schválení a naskladnění v shopzi_manage_order.
- Oprávnění:
orders:read, u klíče „Objednávky (čtení)“. - Druh: čtení (
readOnlyHint). - Potvrzení přes MCP: ne.
- Kredity a platba kartou: ne.
shopzi_list_returns: parametry
status(jedna z hodnotrequested,received,approved,partially_approved,rejected,refunded,closedacancelled; nepovinný): Filtr stavu, napříkladrequestedneboreceived.search(text; nepovinný): Hledá podle čísla vratky, čísla objednávky nebo e-mailu.returnId(UUID; nepovinný): ID vratky z výpisu: vrátí její detail, filtry se nepoužijí.limit(celé číslo od 1 do 100, výchozí25; nepovinný): Počet položek na stránku, 1 až 100. Velká stránka se do jedné odpovědi nemusí vejít a nástroj ji pak odmítne, což stojí krok navíc: berte jen tolik položek, kolik na odpověď opravdu potřebujete.offset(celé číslo od 0 do 100000, výchozí0; nepovinný): Kolik položek přeskočit. 0 = první stránka.
shopzi_list_documents
V režimu list vrátí vystavené doklady se stejnými filtry jako obrazovka Fakturace (typ, číslo nebo odběratel, zaplacenost, období vystavení), v režimu detail jeden doklad celý: položky, rekapitulaci DPH po sazbách, odběratele a odkazy ke stažení PDF a ISDOC. Vystavenou fakturu znovu pošle e-mailem nebo zaplacenost faktury bez objednávky přepne shopzi_manage_order.
- Oprávnění:
documents:read, u klíče „Doklady: metadata, položky a stažení PDF/ISDOC (čtení)“. - Druh: čtení (
readOnlyHint). - Potvrzení přes MCP: ne.
- Kredity a platba kartou: ne.
shopzi_list_documents: parametry
mode(jedna z hodnotlistadetail, výchozílist; nepovinný):list= stránka metadat.detail= jeden doklad celý, vyžadujedocumentId.documentId(UUID; nepovinný): ID dokladu zmode: "list". Povinné promode: "detail".docType(jedna z hodnotorder,invoice,credit_note,proforma,pos_receiptaquotation; nepovinný): Filtr typu, napříkladinvoicenebocredit_note.search(text; nepovinný): Hledá podle ČÍSLA DOKLADU, čísla objednávky nebo odběratele. Použijte ho vždy, když obchodník nebo účetní zmíní číslo faktury:mode: "detail"bere jen vnitřní identifikátor, který v obchodě nikde nevidí.paid(jedna z hodnotpaidaunpaid; nepovinný):unpaid= doklady, které nikdo nezaplatil,paid= zaplacené. Dobropisy z výsledku vypadnou, ty se neplatí.issuedFrom(text; nepovinný): Vystavené OD, včetně, jako pražský kalendářní denRRRR-MM-DD. Na otázky typu „doklady za srpen“ nebo „kolik jsem letos vyfakturoval“.issuedTo(text; nepovinný): Vystavené DO, včetně celého toho dne,RRRR-MM-DD.limit(celé číslo od 1 do 100, výchozí25; nepovinný): Počet položek na stránku, 1 až 100. Velká stránka se do jedné odpovědi nemusí vejít a nástroj ji pak odmítne, což stojí krok navíc: berte jen tolik položek, kolik na odpověď opravdu potřebujete.cursor(text; nepovinný): Průběžná pozice z předchozí odpovědi (next_cursor). Vynechte pro první stránku.
shopzi_manage_order
Mění existující objednávku: stav, platbu, cenu dopravy a příplatky, nacenění poptávky, zásilky u dopravce, vratky včetně schválení uznaných množství a párování plateb z bankovního výpisu. Vystavenou fakturu objednávky pošle zákazníkovi znovu e-mailem a fakturu bez objednávky označí za zaplacenou nebo nezaplacenou. Některé operace posílají zákazníkovi e-mail, objednávají skutečnou zásilku nebo vedou k vystavení faktury; které, říká věta o důsledku u operací v seznamu níž.
- Oprávnění:
orders:write, u klíče „Objednávky: stav, platba, zásilky, vratky a faktury (zápis)“. - Druh: zápis, který umí přepsat nebo smazat existující data (
destructiveHint). - Potvrzení přes MCP: ano: formulář v klientu, který potvrdí ten, kdo drží klíč; jinak odkaz na stránku schválení přes elicitaci URL; jinak odkaz na stránku schválení v odmítnutí
approval_required. Na stránce schválení rozhoduje vlastník nebo manažer obchodu. - Kredity a platba kartou: ne.
- Deník změn: výsledek nese
change_id. ID záznamu v deníku. Předejte ho doshopzi_undo_change. - Věta o důsledku, kterou člověk uvidí v potvrzení: podle
operation, viz seznam níž.
shopzi_manage_order: operace
-
set_status(změnit stav objednávky)-
Věta o důsledku v potvrzení:
Změna stavu objednávky ODEŠLE zákazníkovi e-mail a vzít se zpátky nedá.
-
-
set_payment_status(změnit stav platby)-
Věta o důsledku v potvrzení:
Označení platby ODEŠLE zákazníkovi e-mail a vzít se zpátky nedá. Zaplacená objednávka se zapíše do tržeb a zboží na zakázku odejde do výroby. U objednávky placené kartou nebo na dobírku se navíc vystaví faktura.
-
-
set_billing_extras(upravit dopravu a příplatky) -
set_quotation_prices(nacenit poptávku) -
create_shipment(založit zásilku)-
Věta o důsledku v potvrzení:
U dopravce s napojením (Zásilkovna, PPL, GLS) se OBJEDNÁ SKUTEČNÁ zásilka se štítkem a sledovacím číslem; u osobního odběru a vlastního rozvozu se nikam nevolá.
-
-
set_shipment_status(změnit stav zásilky)-
Věta o důsledku v potvrzení:
Změna stavu zásilky ODEŠLE zákazníkovi e-mail, posune i stav objednávky a vzít se zpátky nedá. Doručení na dobírku navíc označí platbu za přijatou a vystaví doklad; zrušení zruší zásilku i u dopravce.
-
-
track_shipment(zjistit stav u dopravce)-
Věta o důsledku v potvrzení:
Zeptá se dopravce na stav zásilky. Když se tím stav pohne, zákazník dostane e-mail stejně jako při ruční změně.
-
-
create_return(založit vratku)-
Věta o důsledku v potvrzení:
Vratka dostane číslo z řady a vzít se zpátky nedá; u reklamace od jejího vzniku běží zákonná třicetidenní lhůta.
-
-
set_return_status(změnit stav vratky)-
Věta o důsledku v potvrzení:
Stav vratky jde jen dopředu, takže se tahle změna nevrací.
-
-
restock_return(vrátit zboží z vratky na sklad)-
Věta o důsledku v potvrzení:
Naskladnění z vratky zapíše skutečný skladový pohyb a označí položky za vyřízené, takže se nevrací; chybu opravíte odpisem ve Skladu.
-
-
create_return_shipment(vygenerovat zpětnou zásilku)-
Věta o důsledku v potvrzení:
Zpětná zásilka vznikne u Zásilkovny doopravdy a ta o ní zákazníkovi SAMA pošle e-mail s heslem k podání.
-
-
approve_return(schválit množství vratky)-
Věta o důsledku v potvrzení:
Schválení určí, kolik kusů a za kolik se z vratky uznává; z té částky pak člověk vystaví dobropis. Peníze ani doklad se tím nepohnou, ale samo se nevrací: jiná množství zapíšete novým schválením, dokud dobropis neexistuje.
-
-
resend_invoice(znovu poslat fakturu e-mailem)-
Věta o důsledku v potvrzení:
Zákazníkovi ODEJDE e-mail s už vystavenou fakturou a vzít se zpátky nedá. Doklad se tím nemění a číslo z řady se nespotřebuje.
-
-
set_invoice_paid(označit fakturu za (ne)zaplacenou) -
match_payment_by_vs(potvrdit přijatý převod)-
Věta o důsledku v potvrzení:
Spárování OZNAČÍ OBJEDNÁVKU ZAPLACENOU: zákazníkovi odejde e-mail o přijetí platby, částka se zapíše do tržeb a zboží na zakázku odejde do výroby, takže vrátit to NELZE. Potvrdí se jen platba, která sedí na haléř, je v korunách a patří právě jedné objednávce placené převodem nebo fakturou.
-
-
dismiss_bank_payment(uklidit frontu párování)
Hodnota bez odrážky Věta o důsledku v potvrzení žádnou takovou větu nemá.
shopzi_manage_order: parametry operation až documentId
operation(jedna z hodnotset_status,set_payment_status,set_billing_extras,set_quotation_prices,create_shipment,set_shipment_status,track_shipment,create_return,set_return_status,restock_return,create_return_shipment,approve_return,resend_invoice,set_invoice_paid,match_payment_by_vsadismiss_bank_payment; povinný): set_status = stav objednávky; set_payment_status = stav platby; set_billing_extras = doprava a příplatky; set_quotation_prices = nacenění velkoobchodní poptávky; create_shipment = založit zásilku (u dopravce s napojením objedná skutečný svoz); set_shipment_status = ručně posunout stav zásilky; track_shipment = zjistit stav u dopravce; create_return = založit vratku nebo reklamaci k objednávce; create_return_shipment = vygenerovat zpětnou zásilku Zásilkovnou; set_return_status = zapsat přijetí vráceného zboží nebo uzavření případu; restock_return = vrátit schválené kusy z vratky na sklad; match_payment_by_vs = potvrdit přijatý bankovní převod, tedy označit objednávku zaplacenou podle variabilního symbolu a částky; dismiss_bank_payment = uklidit frontu párování (položka výpisu s objednávkami nesouvisí, nebo se vrací zpátky do fronty); approve_return = schválit množství vratky; resend_invoice = znovu poslat fakturu; set_invoice_paid = (ne)zaplacená faktura bez objednávky.orderId(UUID; nepovinný): ID objednávky (UUID) zeshopzi_search_orders. Povinné u všech operací kroměset_return_status,restock_return,create_return_shipmentaapprove_return, které chtějíreturnId, aset_invoice_paid(documentId). Uresend_invoicestačí místodocumentId.status(jedna z hodnotpending,received,confirmed,processing,shipped,delivered,completed,cancelledarejected; nepovinný): Jenset_status. Nový stav objednávky. Jen dopředu: z „delivered“ zpět na „processing“ to nejde.cancelledarejectednástroj odmítne, zrušení patří do administrace.paymentStatus(jedna z hodnotpending,authorized,paid,failed,refundedapartially_refunded; nepovinný): Jenset_payment_status.paid= potvrzení přijaté platby (typicky bankovní převod),failed= platba se nezdařila.refundedapartially_refundednástroj odmítne, vrácení peněz je dobropis ve Vratkách.shippingPriceMinor(celé číslo; nepovinný): Jenset_billing_extrasaset_quotation_prices. Cena dopravy včetně DPH v haléřích. Vynechané pole nechá dopravu, jak je.charges(pole objektů; nepovinný): Jenset_billing_extras. CELÝ seznam příplatků: co v něm není, to se z objednávky smaže. Prázdný seznam zruší všechny příplatky, vynechané pole je nechá beze změny.charges[].label(text; povinný): Název příplatku. Vytiskne se na doklad jako název položky.charges[].amountMinor(celé číslo; povinný): Částka VČETNĚ DPH v haléřích (149 Kč = 14900). Nikdy ne nula.charges[].vatRate(celé číslo; povinný): Sazba DPH jako celé procento: 21, 12 nebo 0. Nikdy ne 0.21.lines(pole objektů; nepovinný): Jenset_quotation_prices. Ceny VŠECH řádků poptávky. Chybějící řádek nástroj odmítne, protože nenaceněná položka by se prodala za nulu.lines[].lineId(UUID; povinný): ID řádku poptávky (UUID) zeshopzi_get_order.lines[].unitPriceMinor(celé číslo; povinný): Cena za JEDEN kus včetně DPH, v haléřích.shipmentId(UUID; nepovinný): Jenset_shipment_statusatrack_shipment: ID zásilky (UUID). VYNECHTE HO, když má objednávka jedinou zásilku, což je běžný případ: nástroj si ji dohledá sám. Když jich má víc, odmítne a všechny je vypíše i s dopravcem, takže si vyberete z toho výpisu.shipmentStatus(jedna z hodnotlabel_created,handed_over,ready_for_pickup,deliveredacancelled; nepovinný): Jenset_shipment_status.handed_over= předáno dopravci (pošle zákazníkovi e-mail „odesláno“),ready_for_pickup= připraveno k vyzvednutí,delivered= doručeno (u dobírky tím platba platí za přijatou a vystaví se doklad),cancelled= zrušit zásilku i u dopravce. Stavy jdou jen dopředu.trackingNumber(text, nejvýš 120 znaků; nepovinný): Jenset_shipment_status. Sledovací číslo, když si obchodník posílá sám. Zapíše se před posunem stavu, aby ho e-mail zákazníkovi nesl s sebou.trackingUrl(text, nejvýš 1000 znaků; nepovinný): Jenset_shipment_status. Odkaz na sledování zásilky.parcelWeightGrams(celé číslo; nepovinný): Jencreate_shipment. Hmotnost balíku v gramech. Vynechané pole = spočítá se z položek objednávky.parcelLengthMm(celé číslo; nepovinný): Jencreate_shipment. Délka balíku v milimetrech. Rozměry se použijí jen tehdy, když pošlete všechny tři; jinak se spočítají z položek objednávky.parcelWidthMm(celé číslo; nepovinný): Jencreate_shipment. Šířka balíku v milimetrech.parcelHeightMm(celé číslo; nepovinný): Jencreate_shipment. Výška balíku v milimetrech.returnId(UUID; nepovinný): ID vratky (UUID) zeshopzi_list_returns. Chtějí hoset_return_status,restock_return,create_return_shipmentaapprove_return.returnRegime(jedna z hodnotwithdrawalareklamace; nepovinný): Jencreate_return, a je povinný.withdrawal= odstoupení od smlouvy do čtrnácti dnů (zboží je v pořádku, zákazník si to rozmyslel),reklamace= vada zboží. Rozhoduje o lhůtách i o tom, co vůbec jde vrátit.returnReason(jedna z hodnotchanged_mind,better_price,wrong_size,looks_different,arrived_late,no_longer_needed,defective,damaged_in_transit,wrong_item,missing_parts,not_as_described,quality_issueaother; nepovinný): Jencreate_return. Důvod, který zákazník uvedl. Vynechané pole = bez důvodu.returnNote(text, nejvýš 2000 znaků; nepovinný): Jencreate_return. Poznámka zákazníka k vratce, například co přesně je vadné.returnItems(pole objektů; nepovinný): Jencreate_return. Které položky se vracejí a kolik kusů. VYNECHEJTE ho, když se vrací celá objednávka: nástroj vezme všechno, co z ní ještě vrátit jde. Prázdný seznam odmítne, protože „nic jsem nevybral“ a „vrať všechno“ jsou dvě různá zadání.returnItems[].orderLineId(UUID; povinný): ID řádku objednávky (UUID) zeshopzi_get_order, tedy položka, která se vrací.returnItems[].quantity(celé číslo aspoň 1; povinný): Kolik kusů se vrací. Nejvýš tolik, kolik z té položky ještě vrátit jde; víc nástroj odmítne.returnStatus(jedna z hodnotreceivedaclosed; nepovinný): Jenset_return_status.received= vrácené zboží dorazilo do obchodu,closed= případ je vyřízený a uzavřený. Stavy jdou jen dopředu. Zrušit vratku nástroj neumí.approvals(pole objektů; nepovinný): Jenapprove_return: uznaná množství po položkách. VYNECHEJTE = vše uplatněné. Prázdný seznam i samé nuly nástroj odmítne.approvals[].returnItemId(UUID; povinný):detail.items[].idzeshopzi_list_returnssreturnId.approvals[].quantity(celé číslo aspoň 0; povinný): Uznané kusy, nejvýš uplatněné; 0 = neuznat.documentId(UUID; nepovinný): Jenresend_invoiceaset_invoice_paid: ID faktury zeshopzi_list_documentsneboshopzi_get_order.
shopzi_manage_order: parametry invoicePaid, payment a idempotencyKey
invoicePaid(truenebofalse; nepovinný): Jenset_invoice_paid: true = zaplacená. Jen faktura BEZ objednávky, jinakset_payment_status.payment(objekt; nepovinný): Jenmatch_payment_by_vsadismiss_bank_payment. Údaje o platbě, kterou párujeme.payment.orderNumber(text, 1 až 64 znaků; nepovinný): Číslo objednávky, kterou platba hradí (například 2026-0042), zeshopzi_search_orders. Povinné umatch_payment_by_vs. Udismiss_bank_paymentho NEPOSÍLEJTE: ten žádnou objednávku neoznačuje.payment.variableSymbol(text, nejvýš 32 znaků; nepovinný): Variabilní symbol platby, opsaný přesně tak, jak ho obchodník vidí (i s nulami na začátku). Povinný umatch_payment_by_vs; udismiss_bank_paymentho pošlete tehdy, když ta platba nějaký symbol má.payment.paidAmountMinor(celé číslo; nepovinný): Částka v HALÉŘÍCH, celé číslo (1 250,50 Kč = 125050). Povinná u obou operací; podle ní se platba dohledá ve frontě. U potvrzení musí sedět na haléř, nástroj nic nezaokrouhluje. U bankovního poplatku bývá záporná, opište ji i se znaménkem.payment.bankVerdict(jedna z hodnotignorearequeue; nepovinný): Jendismiss_bank_payment.ignore= ta položka výpisu s objednávkami nesouvisí (bankovní poplatek, převod mezi vlastními účty);requeue= vrátit dřív ignorovanou položku zpátky do fronty k posouzení.idempotencyKey(text, 1 až 200 znaků; nepovinný): Klíč idempotence. Stejný klíč = stejný zápis: opakované volání vrátí původní výsledek a NEZAPÍŠE podruhé. Použijte vlastní náhodný řetězec pro každou zamýšlenou změnu; při opakování po chybě sítě pošlete tentýž.