MCP: obsah, média a vzhled
Nástroje MCP pro stránky, články, bloky stránek, hlavičku a patičku, knihovnu Médií, generování obrázků a vzhled obchodu: oprávnění, potvrzení a parametry.
Obsah obchodu od stránek a článků (včetně rubrik, autora, pokročilého SEO a GEO a přepočtu skóre SEO) přes bloky stránek, které jde přidávat, upravovat i skrývat po jednom (včetně stránky před spuštěním s formulářem čekací listiny a stránky s poděkováním po přihlášení), hlavičku a patičku (i megamenu sestavené z kategorií a volbu loga) po knihovnu Médií a generování obrázků a videí, a k tomu vzhled: šablona, barvy, písma a logo, nebo celý ucelený vzhled najednou.
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_list_content
Vrátí podle resource přehled stránek, článků, rubrik blogu, bloků stránky (bez pageId domovské), souborů v Médiích, nebo galerie jednoho produktu. Články filtruje a řadí jako seznam v administraci (text, rubrika, stav, datum vytvoření, řazení i podle čtenosti), soubory v Médiích podle textu a druhu. Tělo stránky ani článku nevrací, to vrací shopzi_get_content.
- Oprávnění:
content:read, u klíče „Obsah: stránky, blog, sekce, média (čtení)“. - Druh: čtení (
readOnlyHint). - Potvrzení přes MCP: ne.
- Kredity a platba kartou: ne.
shopzi_list_content: oblasti
pagesblog_postsblog_categorieshome_sectionsmedia(Soubor v Médiích)product_media(Obrázek v galerii produktu)
shopzi_list_content: parametry
resource(jedna z hodnotpages,blog_posts,blog_categories,home_sections,mediaaproduct_media; povinný)pageId(UUID; nepovinný): ID stránky zeshopzi_list_contentsresource: pages. Vynechte pro domovskou stránku.productId(UUID; nepovinný): Jenproduct_media: ID produktu zeshopzi_search_products.search(text, 1 až 120 znaků; nepovinný): Jenblog_postsamedia. U článků text v názvu nebo v těle, u médií v cestě nebo v adrese souboru. Hledá se i uvnitř slova a na pořadí slov nezáleží.categoryId(UUID; nepovinný): Jenblog_posts: ID kategorie blogu zeshopzi_list_contentsresource: blog_categories.status(jedna z hodnotpublishedadraft; nepovinný): Jenblog_posts:published= publikované články,draft= koncepty. Vynechané = obojí.dateFrom(text; nepovinný): Jenblog_posts: datum VYTVOŘENÍ od, ve tvaru YYYY-MM-DD (celý den včetně).dateTo(text; nepovinný): Jenblog_posts: datum VYTVOŘENÍ do, ve tvaru YYYY-MM-DD (celý den včetně).sortBy(jedna z hodnottitle,created_at,published_ataview_count; nepovinný): Jenblog_posts: podle čeho řadit.view_count= návštěvnost,published_at= datum publikace,title= název,created_at(výchozí) = datum vytvoření.sortDir(jedna z hodnotascadesc; nepovinný): Jenblog_posts:desc(výchozí) = sestupně,asc= vzestupně. Nejčtenější článek jesortBy: view_countasortDir: desc.mediaType(jedna z hodnotimage,videoadocument; nepovinný): Jenmedia:image= obrázky,video= videa,document= všechno ostatní (PDF a jiné soubory). Vynechané = všechny druhy.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_get_content
Vrátí jednu stránku nebo článek i s celým textem a poli SEO, včetně pokročilého SEO a GEO, u stránky i šířky obsahu a u článku rubriky, autora, úvodního obrázku a strukturovaných dat s FAQ, ve stejném tvaru, v jakém je zapisuje shopzi_manage_content. U souboru z Médií vrátí jeho údaje a obrázek přiloží, aby ho model viděl.
- Oprávnění:
content:read, u klíče „Obsah: stránky, blog, sekce, média (čtení)“. - Druh: čtení (
readOnlyHint). - Potvrzení přes MCP: ne.
- Kredity a platba kartou: ne.
shopzi_get_content: oblasti
page(Stránka)blog_post(Článek)media(Soubor v Médiích)
shopzi_get_content: parametry
resource(jedna z hodnotpage,blog_postamedia; povinný)id(UUID; nepovinný): Stránka a článek: ID zshopzi_list_content. Umediase nepoužívá.mediaUrl(text, nejvýš 500 znaků; nepovinný): Jenmedia: adresa obrázku/media/…. Nevymýšlejte ji.
shopzi_update_appearance
Změní vzhled obchodu v jedné sekci: šablonu a barvy, písma, rozvržení (včetně fotky a jejího rozostření v pruhu s nadpisem stránky), animace, logo, logo pro tmavé pozadí a favicon adresou z knihovny Médií, nebo celý ucelený vzhled (šablona a písma spočítané podle oboru a barvy obchodu, s další variantou na požádání).
- Oprávnění:
appearance:write, u klíče „Vzhled: šablona, písmo, barvy (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.
shopzi_update_appearance: oblasti
theme(Šablona a barvy)typography(Písma)layout(Rozložení)motion(Pohyb a efekty)branding(Logo a ikonka)look(Ucelený vzhled (šablona a písma))
shopzi_update_appearance: parametry
resource(jedna z hodnottheme,typography,layout,motion,brandingalook; povinný): Která část vzhledu. Pole musí patřit do ní.fields(objekt, schéma připouští i další klíče; nepovinný): Pole ke změně. Vynechané pole zůstane beze změny. Uresource: lookse neposílá.fields.template_name(jedna z hodnotdefault,tokio,elegance,brutalist,neon,organic,heritage,onyx,noir,blossom,mono,sunset,sage,azure,butter,boutique,luxe,esso,terminal,vapor,aurora,bauhaus,oro,paperakattegate; nepovinný): Šablona vzhledu obchodu. Šablonu vytvořenou na míru jinému obchodu nástroj odmítne; obchod, který ji už používá, ji smí ponechat. (sekce theme)fields.primary_color(text se vzorem^#[0-9a-fA-F]{6}$; nepovinný): Primární barva obchodu ve tvaru #RRGGBB. Prázdnou hodnotu nelze uložit, obchod musí mít barvu. (sekce theme)fields.secondary_color(text se vzorem^(#[0-9a-fA-F]{6})?$; nepovinný): Sekundární barva ve tvaru #RRGGBB. "" zruší vlastní barvu a použije se barva ze šablony. (sekce theme)fields.accent_color(text se vzorem^(#[0-9a-fA-F]{6})?$; nepovinný): Akcentová barva ve tvaru #RRGGBB. "" zruší vlastní barvu a použije se barva ze šablony. (sekce theme)fields.surface_mode(jedna z hodnot prázdný text,lightadark; nepovinný): Světlost povrchů. "" = podle šablony, light = světlý, dark = tmavý. (sekce theme)fields.heading_font(jedna z hodnot prázdný text,inter,roboto,open-sans,lato,montserrat,poppins,raleway,nunito,work-sans,dm-sans,manrope,outfit,space-grotesk,josefin-sans,playfair-display,merriweather,lora,pt-serif,roboto-slab,cormorant-garamond,eb-garamond,fraunces,oswald,dm-serif-displayajetbrains-mono; nepovinný): Písmo nadpisů z katalogu písem. "" = písmo ze šablony. (sekce typography)fields.body_font(jedna z hodnot prázdný text,inter,roboto,open-sans,lato,montserrat,poppins,raleway,nunito,work-sans,dm-sans,manrope,outfit,space-grotesk,josefin-sans,playfair-display,merriweather,lora,pt-serif,roboto-slab,cormorant-garamond,eb-garamond,fraunces,oswald,dm-serif-displayajetbrains-mono; nepovinný): Písmo textu z katalogu písem. "" = písmo ze šablony. (sekce typography)fields.hero_layout(jedna z hodnotfullwidthasplit; nepovinný): Rozvržení úvodního pruhu: fullwidth (přes celou šířku) nebo split (na dva sloupce). (sekce layout)fields.pdp_sticky_buybox(truenebofalse; nepovinný): Nákupní box na detailu produktu zůstává při rolování na místě. (sekce layout)fields.hero_band_image_url(text, nejvýš 500 znaků; nepovinný): Fotka v pruhu s nadpisem stránky. Adresa musí být z knihovny médií tohoto obchodu, ve tvaru /media/… (vezměte ji z nástroje na média, nevymýšlejte ji). Prázdná hodnota obrázek odebere. (sekce layout)fields.hero_band_blur(jedna z hodnotnone,softastrong; nepovinný): Rozostření fotky v pruhu: none | soft | strong. (sekce layout)fields.welcome_animation_enabled(truenebofalse; nepovinný): Zobrazit uvítací animaci při první návštěvě. (sekce motion)fields.welcome_animation_style(jedna z hodnotfade,zoom,curtainaring; nepovinný): Styl uvítací animace. (sekce motion)fields.welcome_animation_duration(celé číslo od 800 do 6000; nepovinný): Jak dlouho je uvítací animace vidět, v milisekundách (800 až 6000). (sekce motion)fields.welcome_animation_text(text, nejvýš 120 znaků nebonull; nepovinný): Text pod logem v uvítací animaci. (sekce motion)fields.welcome_animation_logo_url(text, nejvýš 500 znaků; nepovinný): Logo v uvítací animaci. Prázdná hodnota použije logo obchodu. Adresa musí být z knihovny médií tohoto obchodu, ve tvaru /media/… (vezměte ji z nástroje na média, nevymýšlejte ji). Prázdná hodnota obrázek odebere. (sekce motion)fields.page_loader_style(jedna z hodnotbar,overlay,bothaoff; nepovinný): Indikátor načítání stránky: bar, overlay, both nebo off. (sekce motion)fields.logo_url(text, nejvýš 500 znaků; nepovinný): Logo obchodu (pro světlé pozadí). Objevuje se v hlavičce, v uvítací animaci a na daňovém dokladu, pokud má obchod zapnuté logo na dokladech; doklad se vykresluje až při stažení, takže se výměna projeví i na dokladech vystavených dřív. Adresa musí být z knihovny médií tohoto obchodu, ve tvaru /media/… (vezměte ji z nástroje na média, nevymýšlejte ji). Prázdná hodnota obrázek odebere. (sekce branding)fields.logo_light_url(text, nejvýš 500 znaků; nepovinný): Logo pro tmavé pozadí. Použije se tam, kde by tmavé logo zaniklo. Adresa musí být z knihovny médií tohoto obchodu, ve tvaru /media/… (vezměte ji z nástroje na média, nevymýšlejte ji). Prázdná hodnota obrázek odebere. (sekce branding)fields.favicon_url(text, nejvýš 500 znaků; nepovinný): Favicon, tedy ikona obchodu na záložce prohlížeče. Adresa musí být z knihovny médií tohoto obchodu, ve tvaru /media/… (vezměte ji z nástroje na média, nevymýšlejte ji). Prázdná hodnota obrázek odebere. (sekce branding)look(objekt; nepovinný): Jen uresource: look: ucelený vzhled (šablona a písma) spočítaný podle oboru a barvy obchodu. Barvy ani logo nemění.look.businessType(jedna z hodnotmoda,elektronika,kosmetika,domacnost,sport,hracky,sperky,potravinyajine; nepovinný): Obor obchodu. Vynechaný = obor uložený v nastavení obchodu.look.variant(celé číslo od 1 do 20; nepovinný): Která varianta: 1 = nejlépe sedící, 2, 3… další. Výchozí 1.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ýž.
shopzi_save_page_blocks
Uloží bloky jedné stránky: přidá, odebere, zkopíruje nebo přesune jeden blok, změní nastavení nebo viditelnost jednoho hotového bloku (update_block, ostatních bloků se nedotkne), nebo operací replace nahradí celou sadu bloků. Bez pageId pracuje s domovskou stránkou, s prelaunchPage: true se stránkou před spuštěním, kterou ukazuje závěs místo obchodu, a s thankYouPage: true se stránkou s poděkováním po přihlášení k odběru (obě se založí, když ještě nejsou).
-
Oprávnění:
content:write, u klíče „Obsah: stránky, blog a média (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í:
Operace „přepsat celou sadu bloků“ nahradí CELOU stránku poslanou sadou: co v ní není, ze stránky zmizí. Přidání, odebrání, zduplikování ani přesun jednoho bloku se ostatních bloků nedotknou. Vrátit to jde v obou případech jedním krokem přes „vrátit zpět“.
shopzi_save_page_blocks: operace
replace(přepsat celou sadu bloků)add_block(přidat blok)remove_block(odebrat blok)duplicate_block(zduplikovat blok)move_block(přesunout blok)update_block(upravit blok)
shopzi_save_page_blocks: parametry
operation(jedna z hodnotreplace,add_block,remove_block,duplicate_block,move_blockaupdate_block, výchozíreplace; nepovinný): Co se stránkou udělat.replace= nahradit CELOU sadu bloků polemblocks(co v něm není, ze stránky zmizí).add_block= přidat jeden nový blok (sectionType, volitelněconfig,isActive,position).remove_block= odebrat jeden blok (blockId).duplicate_block= zkopírovat jeden blok (blockId); kopie vznikne hned pod ním a schovaná, stejně jako po kliknutí na Duplikovat v administraci.move_block= přesunout jeden blok na jiné pořadí (blockId,position).update_block= změnit jeden hotový blok (blockIda aspoň jedno zconfig,isActive).pageId(UUID; nepovinný): ID stránky zeshopzi_list_content(resource=pages). Vynechané = domovská stránka.prelaunchPage(truenebofalse; nepovinný): true = stránka před spuštěním (ukazuje ji závěs místo obchodu); když ještě není, založí se. Nejde kombinovat spageId.thankYouPage(truenebofalse; nepovinný): true = stránka s poděkováním po přihlášení k odběru (/odber-novinek/dekujeme); když ještě není, založí se. Nejde kombinovat spageIdaniprelaunchPage.blocks(pole objektů, 1 až 60 položek; nepovinný): Jen proreplace: celá sada bloků stránky v cílovém pořadí. Prázdný seznam nástroj nepřijímá: stránku bez jediného bloku smažte raději celou přesshopzi_manage_content.blocks[].id(text; nepovinný): ID existujícího bloku zeshopzi_list_content(resource=home_sections). Vynechejte u nového bloku.blocks[].sectionType(jedna z hodnotpage_header,columns,hero,heading,notice,rich_text,image,image_text,gallery,video,cta,spacer,usp_strip,banner,banner_grid,product_grid,product_carousel,category_grid,category_buttons,vendor_grid,search_bar,newsletter,testimonials,logo_carousel,card_carousel,faq,promo_split,process_steps,person_profile,contact_form,contact_info,billing_info,mapabusiness_hours; povinný): Typ bloku. page_header = Záhlaví stránky, columns = Sloupce, hero = Hero, heading = Nadpis, notice = Aktuální informace, rich_text = Text, image = Obrázek, image_text = Obrázek + text, gallery = Galerie, video = Video, cta = Výzva k akci, spacer = Mezera, usp_strip = Výhody, banner = Banner, banner_grid = Mozaika bannerů, product_grid = Mřížka produktů, product_carousel = Karusel produktů, category_grid = Mřížka kategorií, category_buttons = Tlačítka kategorií, vendor_grid = Mřížka dodavatelů, search_bar = Vyhledávání, newsletter = Newsletter, testimonials = Reference, logo_carousel = Loga partnerů, card_carousel = Karusel karet, faq = Časté dotazy, promo_split = Promo dlaždice, process_steps = Postup krok za krokem, person_profile = Profil osoby, contact_form = Kontaktní formulář, contact_info = Kontaktní údaje, billing_info = Fakturační údaje, map = Mapa, business_hours = Pracovní dobablocks[].config(objekt s libovolnými klíči; nepovinný): Nastavení bloku podle jeho typu (nadpis, text, obrázek, odkaz, počet sloupců…). Neznámé pole nebo nepovolená hodnota zápis ODMÍTNE, nic se neuloží napůl. Volitelné_style(pozadí, odsazení) a_responsive(výjimky pro mobil a tablet) mají vlastní kontrolu.blocks[].isActive(truenebofalse; nepovinný): false = blok zůstane uložený, ale na stránce se nezobrazí. Výchozí true.blockId(UUID; nepovinný): Jen proremove_block,duplicate_block,move_blockaupdate_block: ID bloku zeshopzi_list_content(resource=home_sections). Musí patřit té stránce, se kterou pracujete.sectionType(jedna z hodnotpage_header,columns,hero,heading,notice,rich_text,image,image_text,gallery,video,cta,spacer,usp_strip,banner,banner_grid,product_grid,product_carousel,category_grid,category_buttons,vendor_grid,search_bar,newsletter,testimonials,logo_carousel,card_carousel,faq,promo_split,process_steps,person_profile,contact_form,contact_info,billing_info,mapabusiness_hours; nepovinný): Jen proadd_block: typ nového bloku. page_header = Záhlaví stránky, columns = Sloupce, hero = Hero, heading = Nadpis, notice = Aktuální informace, rich_text = Text, image = Obrázek, image_text = Obrázek + text, gallery = Galerie, video = Video, cta = Výzva k akci, spacer = Mezera, usp_strip = Výhody, banner = Banner, banner_grid = Mozaika bannerů, product_grid = Mřížka produktů, product_carousel = Karusel produktů, category_grid = Mřížka kategorií, category_buttons = Tlačítka kategorií, vendor_grid = Mřížka dodavatelů, search_bar = Vyhledávání, newsletter = Newsletter, testimonials = Reference, logo_carousel = Loga partnerů, card_carousel = Karusel karet, faq = Časté dotazy, promo_split = Promo dlaždice, process_steps = Postup krok za krokem, person_profile = Profil osoby, contact_form = Kontaktní formulář, contact_info = Kontaktní údaje, billing_info = Fakturační údaje, map = Mapa, business_hours = Pracovní dobaconfig(objekt s libovolnými klíči; nepovinný): Proadd_block: nastavení nového bloku podle jeho typu. Proupdate_block: jen měněná pole, sloučí se PO KLÍČÍCH,nullpole odebere, seznamy (items[]) se posílají celé. Platí tatáž kontrola jako ublocks: neznámé pole nebo nepovolená hodnota zápis ODMÍTNE, nic se neuloží napůl.isActive(truenebofalse; nepovinný): false = blok se uloží, ale na stránce se nezobrazí (uadd_blockvýchozí true); uupdate_blockblok skryje nebo zobrazí.position(celé číslo od 0 do 59; nepovinný): Pořadí bloku na stránce, počítáno od nuly (0 = úplně nahoře). Uadd_blockvynechané znamená na konec stránky; umove_blockje povinné.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ýž.
shopzi_manage_content
Zakládá, upravuje a maže stránky, články, rubriky blogu, soubory v Médiích a obrázky v galerii produktu. U stránky i článku mění i pokročilé SEO a GEO, u stránky šířku obsahu, u článku rubriku, autora, úvodní obrázek a strukturovaná data s FAQ. Umí znovu sečíst místo, které obchod zabírá v úložišti, a hned přepočítat skóre SEO a GEO obsahu, které se jinak počítá v noci.
-
Oprávnění:
content:write, u klíče „Obsah: stránky, blog a média (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í:
Smazání souboru je TRVALÉ, a platí to i pro fotku odebranou z galerie produktu: soubor se maže z úložiště, takže zmizí i z knihovny médií a všude, kde byl použitý, zůstane prázdné místo. Stránku, článek, rubriku blogu i uspořádání galerie vrátit lze. Přepočet úložiště nic nemaže a místo neuvolní, jen srovná údaj o zabraném místě podle skutečnosti; může tím obchod dostat i přes limit tarifu a zpátky se nevrací.
shopzi_manage_content: oblasti
page(Stránka)blog_post(Článek)blog_category(Rubrika blogu)media(Soubor v Médiích)product_media(Obrázek v galerii produktu)storage(Úložiště)seo_audit(SEO skóre)
shopzi_manage_content: operace
create(založit)delete(smazat)update(upravit)
shopzi_manage_content: parametry resource až displayOrder
resource(jedna z hodnotpage,blog_post,blog_category,media,product_media,storageaseo_audit; povinný): Čeho se změna týká:page= stránka obchodu,blog_post= článek na blogu,blog_category= rubrika blogu,media= soubor v knihovně médií,product_media= galerie jednoho produktu (pořadí, hlavní obrázek, popisky, vazba na barvu),storage= přepočet toho, kolik místa obchod v úložišti zabírá (jen supdate),seo_audit= přepočet SEO a GEO skóre stránek, kategorií, článků a produktů (jen supdate).operation(jedna z hodnotcreate,deleteaupdate; povinný):create= založit (u média nahrát, u galerie produktu přidat obrázek z knihovny),delete= smazat,update= změnit. U stránky a článkuupdatemění pole vfields(titulek, text, SEO, publikaci), u média přepisuje popisky (alt,title) a u galerie produktu uspořádání.title(text, 1 až 200 znaků; nepovinný): Jencreate. Stránka a článek: název (odvodí se z něj i adresa, pokud nepošleteslug). Médium: jméno souboru v knihovně; umediaho lze poslat i supdate. Uproduct_mediasupdateje to popisek obrázku v galerii. U rubriky blogu je to její NÁZEV a posílá se i supdate.slug(text, nejvýš 100 znaků; nepovinný): Jencreateu stránky, článku a rubriky blogu: navrhovaná adresa. Očistí se a případně odduplikuje. Adresu HOTOVÉ stránky, článku ani rubriky tímhle nástrojem změnit nelze.isActive(truenebofalse; nepovinný): Jencreateu stránky: true ji rovnou zveřejní. Výchozí false (skrytá). U rubriky blogu zveřejňuje i přiupdate; výchozí u nové rubriky je true.isPublished(truenebofalse; nepovinný): Jencreateu článku: true ho rovnou publikuje. Výchozí false (rozepsaný).content(text; nepovinný): Jencreateu článku: tělo v HTML. Nebezpečné značky se odstraní. Nechcete-li ho psát hned, vynechte ho a doplňte později volánemupdatetéhož nástroje.excerpt(text, nejvýš 1000 znaků; nepovinný): Jencreateu článku: perex do výpisu. Vynechaný se vytvoří ze začátku těla.categoryId(text; nepovinný): Jencreateu článku: ID rubriky zeshopzi_list_content(resource=blog_categories). Hotový článek se přesouvá přesfields.categoryIduupdate.featuredImageUrl(text, nejvýš 1000 znaků; nepovinný): Jencreateu článku: úvodní obrázek. Použijte adresu z knihovny médií (shopzi_list_contents resource=media), ne odkaz na cizí web.authorName(text, nejvýš 200 znaků; nepovinný): Jencreateu článku: podepsaný autor. U hotového článkufields.authorName.pageId(text; nepovinný):updateadeleteu stránky: ID zeshopzi_list_content(resource=pages).postId(text; nepovinný):updateadeleteu článku: ID zeshopzi_list_content(resource=blog_posts).blogCategoryId(text; nepovinný):updateadeleteu rubriky blogu: ID zeshopzi_list_content(resource=blog_categories).description(text, nejvýš 1000 znaků nebonull; nepovinný): Jen rubrika blogu: popisek rubriky.nullho smaže.displayOrder(celé číslo od 0 do 10000; nepovinný): Jen rubrika blogu: pořadí ve výpisu rubrik. Menší číslo je výš.
shopzi_manage_content: parametry fields až idempotencyKey
fields(objekt; nepovinný): Jenupdateu stránky a článku: pole ke změně. Zapíše se jen to, co pošlete,nullpole vymaže. Text se přepisuje CELÝ, takže si nejdřív načtěte současný přesshopzi_get_content. Ucreate,deletea u média se nepoužívá.fields.title(text; nepovinný)fields.content(text nebonull; nepovinný): Celé tělo v HTML. Nebezpečné značky se odstraní.fields.excerpt(text nebonull; nepovinný): Jen článek: perex do výpisu.fields.featuredImageUrl(text, nejvýš 1000 znaků nebonull; nepovinný): Jen článek: úvodní obrázek. Adresa z knihovny médií (shopzi_list_contents resource=media) nebo zshopzi_generate_media, tedy/media/…; odkaz na cizí web se odmítne.nullobálku článku odebere.fields.isPublished(truenebofalse; nepovinný): Jen článek: publikovat nebo skrýt.fields.isActive(truenebofalse; nepovinný): Jen stránka: zveřejnit nebo skrýt.fields.showInHeader(truenebofalse; nepovinný): Jen stránka: starý příznak „připnuto do hlavičky“. Menu hlavičky ho UŽ NEČTE, odkazy se skládají vshopzi_save_storefront_layout(header.links), takže tímhle polem odkaz v hlavičce nepřidáte ani neodeberete. Nastavujte ho jen tehdy, když si obchodník výslovně řekne o ten příznak.fields.categoryId(UUID nebonull; nepovinný): Jen článek: přesunout do rubriky. ID zeshopzi_list_content(resource=blog_categories);nullčlánek z rubriky vyřadí.fields.authorName(text, nejvýš 200 znaků nebonull; nepovinný): Jen článek: podepsaný autor.nullpodpis odebere.fields.ogImageUrl(text, nejvýš 1000 znaků nebonull; nepovinný): Obrázek pro sdílení (Open Graph):/media/…z knihovny obchodu nebohttps://….null= výchozí obrázek.fields.canonicalOverride(text, nejvýš 1000 znaků nebonull; nepovinný): Kanonická adresa (https://…nebo/…), když je originálem jiná stránka;nullji zruší. Jen na výslovné přání obchodníka: špatná hodnota stránku vyřadí z vyhledávání.fields.seo(objekt nebonull; nepovinný): Pokročilé SEO a GEO. Slučuje se po klíčích: pošlete jen změny;nullu klíče = výchozí,nullza celéseosmaže vše. Stav vracíshopzi_get_content.fields.seo.focusKeyphrase(text, nejvýš 200 znaků nebonull; nepovinný)fields.seo.ogTitle(text, nejvýš 200 znaků nebonull; nepovinný)fields.seo.ogDescription(text, nejvýš 500 znaků nebonull; nepovinný)fields.seo.twitterTitle(text, nejvýš 200 znaků nebonull; nepovinný)fields.seo.twitterDescription(text, nejvýš 500 znaků nebonull; nepovinný)fields.seo.twitterImage(text, nejvýš 1000 znaků nebonull; nepovinný): Stejná pravidla jakoogImageUrl.fields.seo.schemaPageType(jedna z hodnotWebPage,AboutPage,ContactPage,CollectionPageaItemPage, nebonull; nepovinný): Typ pro strukturovaná data;null= WebPage.fields.seo.robotsAdvanced(pole, položka: jedna z hodnotnoimageindex,noarchiveanosnippetnebonull; nepovinný): Pokyny pro roboty, celý seznam.fields.seo.nofollow(truenebofalsenebonull; nepovinný)fields.seo.breadcrumbTitle(text, nejvýš 120 znaků nebonull; nepovinný): Kratší název v drobečkové navigaci.fields.seo.cornerstone(truenebofalsenebonull; nepovinný): true = stěžejní obsah webu.fields.seo.keyFacts(pole, položka: text, 1 až 300 znaků, nejvýš 20 položek nebonull; nepovinný): Klíčová fakta pro AI vyhledávače (GEO), krátké věty. CELÝ seznam.fields.contentWidth(jedna z hodnotboxedafull; nepovinný): Jen stránka:boxed= sloupec (výchozí),full= k okrajům okna.fields.structuredData(objekt nebonull; nepovinný): Jen článek: strukturovaná data a FAQ. Po klíčích;nullu klíče ho odebere,nullza celé smaže vše.fields.structuredData.articleType(jedna z hodnotArticle,NewsArticleaBlogPosting, nebonull; nepovinný)fields.structuredData.keywords(text, nejvýš 500 znaků nebonull; nepovinný): Klíčová slova oddělená čárkou.fields.structuredData.enableBreadcrumbs(truenebofalsenebonull; nepovinný)fields.structuredData.organizationName(text, nejvýš 200 znaků nebonull; nepovinný)fields.structuredData.organizationLogo(text, nejvýš 1000 znaků nebonull; nepovinný): Logo vydavatele: stejná pravidla jakoogImageUrl.fields.structuredData.faqs(pole objektů, nejvýš 30 položek nebonull; nepovinný): FAQ pod článkem (i FAQPage), text bez HTML. CELÝ seznam: co chybí, zmizí.nullnebo[]FAQ odebere.fields.structuredData.faqs[].question(text, 1 až 300 znaků; povinný)fields.structuredData.faqs[].answer(text, 1 až 2000 znaků; povinný)fields.metaTitle(text nebonull; nepovinný): SEO titulek. null smaže.fields.metaDescription(text nebonull; nepovinný): SEO popisek (meta description). null smaže.fields.geoSummary(text nebonull; nepovinný): Stručná přímá odpověď pro AI vyhledávače (GEO). Dvě až tři věty. null smaže.fields.noindex(truenebofalse; nepovinný): true = stránku nemají vyhledávače indexovat.sourceUrl(text, nejvýš 2000 znaků; nepovinný): Jencreateu média: veřejná adresa obrázku, který se má stáhnout do knihovny. Přijímá se JPEG, PNG, WebP a GIF do 5 MB.mediaUrl(text, nejvýš 1000 znaků; nepovinný): Umediasupdateadelete: adresa souboru zeshopzi_list_content(resource=media). Uproduct_mediascreate: adresa obrázku z knihovny, který se má k produktu přidat (soubor už musí v obchodě být, třeba zshopzi_generate_media).alt(text, nejvýš 300 znaků; nepovinný): Umediaiproduct_media: alternativní text (co je na obrázku). Čtou ho čtečky pro nevidomé i vyhledávače.productId(UUID; nepovinný): Jenproduct_media: ID produktu (UUID) zeshopzi_search_products.mediaId(UUID; nepovinný): Jenproduct_media: ID obrázku v galerii (UUID) zeshopzi_list_content(resource=product_media). Potřebné prodeletea pro změnu jednoho obrázku.orderedMediaIds(pole, položka: UUID; nepovinný): Jenproduct_mediasupdate: nové pořadí galerie. Musí obsahovat VŠECHNY obrázky produktu právě jednou, jinak nástroj zápis odmítne; jinak by obrázek, který v seznamu chybí, skončil v pořadí kdekoli.isPrimary(truenebofalse; nepovinný): Jenproduct_mediasupdateamediaId: true udělá z obrázku hlavní (ten se ukazuje ve výpisu produktů). Hlavní obrázek nejde zrušit, jen přenést na jiný.optionValueId(UUID nebonull; nepovinný): Jenproduct_media: navázat obrázek na hodnotu volby (například Barva = Červená), takže se ukáže u všech variant s tou hodnotou.nullvazbu zruší a obrázek je společný pro celý produkt. Hodnoty vracíshopzi_list_contents resource=product_media.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ýž.
shopzi_save_storefront_layout
Změní hlavičku a patičku obchodu: menu (včetně barvy a odznaku odkazu a megamenu sestaveného ze stromu kategorií), tlačítko v liště, oznamovací pruh, barvy, ikony, logo (tmavé nebo světlé logo značky, vlastní obrázek z Médií, v patičce i žádné), sloupce odkazů, sociální sítě a newsletter. Seznamy se nahrazují celé, ostatní pole se slučují s uloženým nastavením; současný stav i s ID vrací shopzi_get_settings se sekcí storefront_layout.
-
Oprávnění:
content:write, u klíče „Obsah: stránky, blog a média (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í:
Seznamy se NAHRAZUJÍ CELÉ: odkazy v menu, sloupce patičky i sociální sítě budou přesně ty vypsané níž a co v nich není, z obchodu zmizí. Ostatní pole (barvy, výška, ikony, oznamovací pruh, newsletter) se slučují s tím, co je uložené, takže se nedotčených hodnot nic netýká. Vrátit to jde jedním krokem přes „vrátit zpět“.
shopzi_save_storefront_layout: parametry header a footer
header(objekt; nepovinný): Změny hlavičky obchodu.header.design(objekt; nepovinný)header.design.bgColor(text se vzorem^#[0-9A-Fa-f]{6}$; nepovinný): Barva ve tvaru #RRGGBB.header.design.textColor(text se vzorem^#[0-9A-Fa-f]{6}$; nepovinný): Barva ve tvaru #RRGGBB.header.design.titleColor(text se vzorem^#[0-9A-Fa-f]{6}$; nepovinný): Barva nadpisů sloupců v megamenu.header.design.sticky(truenebofalse; nepovinný): Hlavička zůstane při rolování nahoře.header.design.bordered(truenebofalse; nepovinný): Linka pod hlavičkou.header.design.transparent(truenebofalse; nepovinný): Hlavička splyne se stránkou a text nese jen stín. Vhodné nad hero fotkou.header.design.height(jedna z hodnotcompact,standardatall; nepovinný)header.design.logoPosition(jedna z hodnotleftacenter; nepovinný): left = logo vlevo a menu vedle něj; center = menu vlevo a logo na střed.header.design.width(jedna z hodnotboxedafull; nepovinný): boxed = obsah lišty do 1200 px; full = až k okraji stránky.header.logo(objekt; nepovinný): Logo v hlavičce.header.logo.source(jedna z hodnotbrand-dark,brand-lightacustom; povinný):brand-*= logo z Vzhled → Logo,custom= vlastní obrázek.header.logo.customUrl(text, nejvýš 1000 znaků nebonull; nepovinný): Jen ucustom:/media/…z knihovny médií obchodu (shopzi_list_contentresource=media neboshopzi_generate_media). Vynechaná = beze změny,nullji odebere.header.cartIcon(jedna z hodnotShoppingCart,ShoppingBagaShoppingBasket; nepovinný): Ikona košíku.header.userIcon(jedna z hodnotUser,UserRound,CircleUseraContact; nepovinný): Ikona účtu.header.search(objekt; nepovinný): Vyhledávací pole v hlavičce.header.search.enabled(truenebofalse; povinný)header.announcement(objekt; nepovinný): Oznamovací pruh nad hlavičkou.header.announcement.enabled(truenebofalse; nepovinný): Zapnout pruh nad hlavičkou.header.announcement.text(text, nejvýš 300 znaků; nepovinný): Text pruhu. Prázdný text pruh vypne.header.announcement.href(text, nejvýš 500 znaků; nepovinný): Kam pruh odkazuje.header.announcement.ctaLabel(text, nejvýš 80 znaků; nepovinný)header.announcement.countdownTo(text, nejvýš 40 znaků; nepovinný): Datum a čas konce v ISO tvaru. Po uplynutí pruh sám zmizí.header.announcement.dismissible(truenebofalse; nepovinný): Návštěvník smí pruh zavřít.header.announcement.tone(jedna z hodnotbrand,darkasoft; nepovinný)header.cta(objekt; nepovinný): Tlačítko vpravo v liště (např. „Stát se dodavatelem“ → /kontakt). Na mobilu je v menu.header.cta.enabled(truenebofalse; nepovinný)header.cta.label(text, nejvýš 40 znaků; nepovinný)header.cta.href(text, nejvýš 500 znaků; nepovinný)header.links(pole objektů, nejvýš 7 položek; nepovinný): Celé menu hlavičky v cílovém pořadí (nejvýš 7 položek). Co v seznamu chybí, se z menu odstraní, takže pošlete i odkazy, které mají zůstat.header.links[].id(text; nepovinný): ID existujícího odkazu. U odkazu typumegaje povinné.header.links[].label(text, 1 až 80 znaků; povinný)header.links[].type(jedna z hodnotlink,dropdownamega; nepovinný): link = prostý odkaz (target); dropdown = rozbalovací seznam (items); mega = velké menu s kategoriemi.megasiduloženého megamenu ho ZACHOVÁ (obsah se převezme);megasfromCategories: truesestaví NOVÉ megamenu z aktuálního stromu kategorií. Výchozí link.header.links[].target(text, nejvýš 500 znaků; nepovinný):link: adresa odkazu.dropdown/mega: volitelná adresa, kam vede klik na samotný popisek.header.links[].color(text se vzorem^#[0-9A-Fa-f]{6}$; nepovinný): Vlastní barva odkazu (#RRGGBB), např. barva značky partnera.header.links[].badge(truenebofalse; nepovinný): Zobrazit odkaz jako odznak vyplněný barvoucolor(text se dopočítá pro čitelnost).header.links[].items(pole objektů, nejvýš 20 položek; nepovinný): Jendropdown: položky rozbalovacího seznamu.header.links[].items[].id(text; nepovinný)header.links[].items[].label(text, 1 až 80 znaků; povinný)header.links[].items[].target(text, nejvýš 500 znaků; povinný): Adresa, kam odkaz vede (např. /produkty).header.links[].fromCategories(truenebofalse; nepovinný): Jenmega: sestavit megamenu z aktuálního stromu kategorií obchodu (nejvýše 4 sloupce, hlavní kategorie s podkategoriemi). Přepíše obsah megamenu s tímtoid, pokud existuje.footer(objekt; nepovinný): Změny patičky obchodu.footer.logo(objekt; nepovinný): Logo v patičce.footer.logo.source(jedna z hodnotbrand-dark,brand-light,customanone; povinný):none= jen název obchodu.footer.logo.customUrl(text, nejvýš 1000 znaků nebonull; nepovinný): Jen ucustom:/media/…z knihovny médií obchodu (shopzi_list_contentresource=media neboshopzi_generate_media). Vynechaná = beze změny,nullji odebere.footer.design(objekt; nepovinný)footer.design.bgColor(text se vzorem^#[0-9A-Fa-f]{6}$; nepovinný): Barva ve tvaru #RRGGBB.footer.design.textColor(text se vzorem^#[0-9A-Fa-f]{6}$; nepovinný): Barva ve tvaru #RRGGBB.footer.design.titleColor(text se vzorem^#[0-9A-Fa-f]{6}$; nepovinný): Barva nadpisů sloupců.footer.description(text, nejvýš 600 znaků; nepovinný): Odstavec o obchodu v patičce.footer.columns(pole objektů, nejvýš 6 položek; nepovinný): Celé sloupce odkazů v cílovém pořadí. Co v seznamu chybí, se odstraní.footer.columns[].id(text; nepovinný)footer.columns[].title(text, nejvýš 80 znaků; povinný): Nadpis sloupce.footer.columns[].links(pole objektů, nejvýš 20 položek; povinný)footer.columns[].links[].id(text; nepovinný)footer.columns[].links[].label(text, 1 až 80 znaků; povinný)footer.columns[].links[].target(text, nejvýš 500 znaků; povinný)footer.social(pole objektů, nejvýš 10 položek; nepovinný): Celý seznam sociálních sítí. Co v seznamu chybí, se odstraní.footer.social[].id(text; nepovinný)footer.social[].platform(jedna z hodnotfacebook,instagram,x,youtube,linkedin,tiktokapinterest; povinný)footer.social[].url(text, nejvýš 500 znaků; povinný): Úplná adresa profilu.footer.showContact(truenebofalse; nepovinný): Zobrazit kontaktní údaje obchodu.footer.newsletter(objekt; nepovinný): Pruh s přihlášením k newsletteru nad sloupci patičky.footer.newsletter.enabled(truenebofalse; nepovinný)footer.newsletter.headline(text, nejvýš 120 znaků; nepovinný)footer.newsletter.text(text, nejvýš 300 znaků; nepovinný)footer.newsletter.buttonLabel(text, nejvýš 60 znaků; nepovinný)footer.newsletter.placeholder(text, nejvýš 80 znaků; nepovinný)footer.newsletter.consentText(text, nejvýš 400 znaků; nepovinný)
shopzi_save_storefront_layout: parametry idempotencyKey
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ýž.
shopzi_generate_media
Vygeneruje obrázek nebo krátké video a uloží ho do knihovny Médií. Video se renderuje na pozadí, takže se volání vrátí hned se stavem queued.
-
Oprávnění:
content:write, u klíče „Obsah: stránky, blog a média (zápis)“. -
Druh: zápis, který jen přidává.
-
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: strhne kredity obchodu.
-
Deník změn: výsledek nese
change_id: null. Vždy null: vygenerovaný soubor se deníkem změn vrátit nedá, protože kredity už jsou utracené. Smazat ho jde v administraci v sekci Média. -
Věta o důsledku, kterou člověk uvidí v potvrzení:
Generování UTRATÍ kredity obchodu a vracejí se jen při technickém selhání, ne když se výsledek nelíbí. Hotový soubor zůstane v Médiích a jde ho tam smazat.
shopzi_generate_media: parametry
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ýž.kind(jedna z hodnotimageavideo; povinný):imagepro obrázek,videopro krátký klip se zvukem.prompt(text, 3 až 1500 znaků; povinný): Detailní popis scény anglicky. U videa popište i pohyb kamery, náladu a zvuk. Značku obchodu doplní server sám, žádnou si nevymýšlejte.productId(text; nepovinný): ID produktu zshopzi_search_products, když má být kreativa o konkrétním zboží. Server sám dohledá jeho skutečnou fotku a model z ní vyjde, takže na výsledku bude TO zboží, ne podobné. Adresu obrázku sem neposílejte, nepřijímá se.shape(jedna z hodnotsquare,portraitalandscape; nepovinný): Jen obrázek:portraitna stories a reels,landscapena web a bannery,squaredo feedu. Výchozísquare.transparent(truenebofalse; nepovinný): Jen obrázek: PNG s průhledným pozadím (loga, samolepky, překryvy). Stojí několikanásobek běžného obrázku, protože to umí jen dražší model.count(celé číslo od 1 do 4; nepovinný): Jen obrázek: kolik variant vyrobit (1 až 4). Každá se účtuje zvlášť, takže víc než jednu dělejte jen na výslovné přání. Výchozí 1.durationSeconds(jedna z hodnot4,6a8; nepovinný): Jen video: povolené jsou POUZE 4, 6 nebo 8 sekund a cena roste s délkou. Výchozí 4.aspectRatio(jedna z hodnot9:16a16:9; nepovinný): Jen video:9:16na stories, reels a TikTok,16:9na web a YouTube. Čtverec model neumí. Výchozí9:16.altText(text, nejvýš 300 znaků; nepovinný): Jen obrázek: český alternativní text do knihovny médií (přístupnost a SEO). Popište, co na obrázku je, ne jak vznikl.