Integrovaný MCP server v NET Geniu

Každá instance NET Genia obsahuje integrovaný MCP server (Model Context Protocol). Přes něj se k instanci připojí AI asistent nebo agent – Claude nebo jeho vývojářská varianta Claude Code, ChatGPT nebo jeho vývojářská varianta Codex, Microsoft Copilot Studio nebo kterýkoli jiný nástroj podporující protokol MCP – a získá všechno, co k práci s konkrétní implementací potřebuje: data jejích aplikací, popis toho, jak jsou aplikace postavené, a znalosti frameworku NET Genium.

Server je součástí instalace, nic se neinstaluje ani nespouští zvlášť. Postup připojení jednotlivých AI nástrojů je uveden v samostatné příručce Připojení AI nástroje k MCP serveru.

Co server umí

  • Práce s daty – čtení a vyhledávání záznamů a zjišťování jejich počtů, včetně historie změn a příloh; s oprávněním k zápisu i zakládání, úprava a mazání záznamů.
  • Popis implementace – jaké aplikace, editační formuláře, nahlížecí stránky a oprávnění instance obsahuje a jak spolu souvisejí. Asistent dostává AI model implementace přímo ze serveru a vždy v aktuální podobě – nic se nestahuje ani ručně nevkládá.
  • Stavba a úpravy aplikací – s oprávněním k zápisu agent aplikace nejen popíše, ale i založí a dál upravuje: aplikační skupiny, aplikace, editační formuláře, nahlížecí stránky, ovládací prvky, databázové dotazy i skripty.
  • Uživatelská nastavení – rozložení portletů na hlavní stránce, oblíbené položky a individuální nastavení nahlížecích tabulek lze přečíst u kteréhokoli uživatele a s oprávněním k zápisu nastavit jednotlivým uživatelům i celým uživatelským skupinám. Podrobnosti jsou uvedené v kapitole Uživatelská nastavení.
  • Znalosti frameworku – asistent si vyhledá a přečte příslušné kapitoly dokumentace NET Genia, takže navrhuje řešení podle standardů platformy, ne podle obecných zvyklostí. Znalostní báze serveru je výběrem z dokumentace; kompletní dokumentace je k dispozici v AI asistentovi na webu.
  • Analýza výkonu – přímo z běžící instance asistent zjistí, které stránky, dotazy a skripty trvají nejdéle, nad jak velkými tabulkami běží a kde chybí indexy. Statistika používání se sbírá jen tehdy, je-li v Nastavení NET Genia zapnuté logování do databáze.

Asistent s přístupem k datům tak odpoví i na otázky, na které samotný popis aplikací nestačí – například „kolik je záznamů“, „najdi konkrétní doklad“ nebo „jak se záznam v čase měnil“.

Přístup k serveru

MCP server je určený administrátorům instance – smí ho používat jen uživatel s administrátorskými právy, a je-li v Nastavení NET Genia vyplněný seznam Administrátoři s přístupem k MCP serveru, jen účet Administrator a administrátoři uvedení v seznamu. Licenční klíč instance musí povolovat AI; v NET Genium Online se to nevyžaduje. Každý požadavek se přihlašuje jako konkrétní uživatel a smí jen to, co mu dovolí jeho oprávnění. AI nástroj se prokazuje jedním ze dvou způsobů:

  • Osobním MCP tokenem – administrátor si ho vygeneruje sám: klikne na avatar v pravé části záhlaví a v osobní nabídce zvolí MCP token. Tento způsob funguje u každé instance a hodí se i pro agenta běžícího bez obsluhy.
  • Přihlášením – v aplikacích Claude a ChatGPT stačí zadat adresu instance a přihlásit se, token se nikam nekopíruje. Tento způsob je dostupný jen u instancí běžících v kořeni webu přes HTTPS, v NET Genium Online tedy vždy.

Co AI nástroj smí, určují oprávnění tokenu, resp. souhlas udělený při přihlášení:

Oprávnění Co zpřístupní Kdo ho může mít
Čtení všech dat a modelu přes MCP server čtení dat a popisu implementace jen uživatel s administrátorskými právy
Zápis všech dat a modelu přes MCP server změny dat a úpravy aplikací; popis implementace lze číst i s ním jen uživatel s administrátorskými právy
Přístup přes vlastní API ověření uživatele ve vlastním API zákaznického řešení; s MCP serverem nesouvisí kterýkoli uživatel

Znalosti frameworku dostane každý administrátor bez ohledu na zaškrtnutá oprávnění – jde o obecnou dokumentaci platformy, ne o obsah instance. Přístup k serveru lze zúžit jen na vybrané administrátory. Detailní popis tohoto omezení je uveden v samostatné příručce Nastavení NET Genia.

Zápis dat přes MCP server

Zápis přes MCP server nespouští skripty editačního formuláře – neproběhnou tedy ani validace, přepočty, notifikace a změny stavů, které na uložení záznamu navazují. Záznam vznikne, ale procesní logika kolem něj ne. Data, na jejichž uložení taková logika navazuje, proto patří do editačního formuláře, a to i ve vývojové instanci; ostatní data lze přes MCP server zapisovat i v provozu.

Nový záznam navíc nemá vlastníka, pokud ho agent mezi zapisovanými hodnotami výslovně neuvede. Šifrování hodnot rovněž zajišťuje jen editační formulář: hodnota sloupce se zapnutým šifrováním (prvky TextArea a RichTextBox) se přes MCP server zapíše nešifrovaná a čtení vrací hodnoty tak, jak jsou uložené v databázi.

Ve výchozím stavu se zápis nezaznamenává do historie změn a neúčastní se synchronizace – to se hodí u hromadných dávek, typicky ukázkových dat. U změn, které mají zůstat dohledatelné, je proto potřeba zápis s historií změn výslovně požadovat. Totéž platí pro mazání záznamů: ve výchozím stavu se smazání do historie změn nezapisuje a neúčastní se synchronizace. Při mazání s historií změn se záznamy mažou po jednom a smazání se zapíše do historie a odešle k synchronizaci stejně jako smazání v editačním formuláři; skripty editačního formuláře se ani tehdy nespustí.

V NET Genium Online server zápis odmítne, je-li instance v režimu pouze pro čtení (vyčerpaný kredit nebo překročený datový prostor).

Podrobnosti
  • Zápis s historií změn se chová jako úprava v editačním formuláři, jen bez skriptů: změna se zapíše do historie s prázdným sloupcem „action“ a zařadí se do fronty synchronizace, jejíž odesílání server spustí hned po zápisu. Nový záznam se zvoleným ID projde vyjednáním ID a může se přečíslovat.
  • Formulář se zakázaným protokolováním historie záznamů historii nezapíše ani při zápisu s historií změn; do fronty synchronizace se změna zařadí.
  • Historii změn samotnou přes MCP server měnit nelze – tabulky historie jsou dostupné jen ke čtení.
  • Webová prezentace si strom stránek a seznam příloh drží v paměti a obnovuje je podle historie změn. Webovou stránku i přílohu webu je proto potřeba zakládat a měnit s historií změn, jinak ji web neuvidí.
  • V NET Genium Online se režim pouze pro čtení týká nástrojů „write_data“, „delete_data“, „create_attachment“, „write_model“, „rename“ i „write_user_settings“.

Uživatelská nastavení

Rozložení portletů na hlavní stránce, oblíbené položky a individuální nastavení nahlížecích tabulek si uživatel jinak upravuje jen sám v rozhraní NET Genia. Přes MCP server je agent přečte u kteréhokoli uživatele a s oprávněním k zápisu je nastaví jednotlivým uživatelům i všem členům vybraných uživatelských skupin; typicky tak připraví rozložení hlavní stránky pro novou skupinu nebo doplní portlet všem jejím členům.

  • Portlety a oblíbené položky lze nahradit celé, nebo jen přidat či odebrat vybrané. Interval obnovení hlavní stránky, zobrazení obrázku a zobrazení oblíbených položek na hlavní stránce zůstávají každému uživateli zachované, pokud je agent výslovně nezmění.
  • Nastavení nahlížecí tabulky odpovídá tomu, co si u ní uživatel může přizpůsobit sám – zobrazované sloupce a sloupce detailů, řazení, počet záznamů na stránce a zobrazené části tabulky; u nahlížecí tabulky v portletu místo sloupců detailů sloupce bublinové nápovědy. Složené filtry se přes MCP server nenastavují a statistická nahlížecí tabulka zatím podporovaná není. Anonymnímu uživateli nelze nastavení nahlížecí tabulky uložit, stejně jako v rozhraní.
  • Uživatel dostane jen to, na co má právo – portlet, oblíbenou položku nebo sloupec, na který právo nemá, server po zápisu odebere a v odpovědi to u daného uživatele uvede.
  • Podrobnosti
    • Nastavení čte nástroj „get_user_settings“ a zapisuje „write_user_settings“; parametr „kind“ volí portlety („portlets“), oblíbené položky („favorites“), nebo nahlížecí tabulku („datagrid“). Čte se vždy jeden uživatel zadaný ID nebo přihlašovacím jménem, bez něj vlastník tokenu; vrací se uložený stav, nefiltrovaný právy.
    • Nahlížecí tabulku určuje typ prvku („viewpagecontrol“ nebo „formcontrol“) a jeho ID, u tabulky v portletu navíc příznak portletu. Odpověď nese i sloupce, ze kterých lze vybírat, a příznak, zda má uživatel vlastní nastavení – nemá-li ho, vrácené sloupce jsou výchozí sloupce prvku.
    • Zápis adresuje uživatele a skupiny ve tvaru práv („U12“, „G3“); skupina se rozbalí na své členy a zapisuje se každému zvlášť. Režim nahrazení, přidání a odebrání platí jen pro portlety a oblíbené položky; u nahlížecí tabulky se přepíšou poslané vlastnosti a ostatní zůstanou.
    • Při chybném vstupu server nezapíše nic: portletem smí být jen DataGrid, Chart, News, Email a RichText nebo HTML označené jako portlet, oblíbená položka musí mířit na existující stránku, sloupce nahlížecí tabulky musí být mezi nabízenými a řadit lze jen podle sloupce, podle kterého jde tabulka řadit.
    • Zapisovaná nastavení mají tvar, jaký vrací čtení. Zápis nastavení statistické nahlížecí tabulky skončí chybou.
    • Zápis uživatelských nastavení se nezaznamenává do historie změn.

Nástroje serveru

Kapitola je referencí pro toho, kdo agenta staví, nebo zjišťuje, proč se nástroj chová jinak, než čekal. Popis nástrojů dostává agent od serveru sám, takže běžná práce s AI asistentem její znalost nevyžaduje.

Nástroj Co dělá Oprávnění tokenu
read_data, count_data, list_tables čtení záznamů, jejich počet, seznam tabulek čtení
read_attachment obsah přílohy čtení
get_model, get_permissions, get_data_model implementační model, uživatelské skupiny a skupiny oprávnění, datový model čtení nebo zápis
get_model_history historie změn skriptů, databázových dotazů a kódu prvků HTML a JavaScript čtení nebo zápis
get_usage_statistics, get_record_counts, get_index_analysis statistika používání, počty záznamů, analýza indexů čtení nebo zápis
get_user_settings portlety, oblíbené položky a nastavení nahlížecí tabulky uživatele čtení nebo zápis
write_data, delete_data zápis a mazání záznamů zápis
create_attachment založení přílohy zápis
rename, write_model přejmenování a změny implementačního modelu zápis
write_user_settings nastavení portletů, oblíbených položek a nahlížecích tabulek zápis
search_framework_docs, get_framework_doc, list_framework_docs znalosti frameworku žádné – stačí administrátorská práva a případně uvedení v seznamu „Administrátoři s přístupem k MCP serveru“

Nástroj, na který token nemá oprávnění, server nenabízí; jeho volání skončí chybou „Method not found“.

Čtení dat

Nástroj „read_data“ čte záznamy jedné tabulky, „count_data“ vrací jejich počet a „list_tables“ seznam dostupných tabulek. Dostupné jsou tabulky všech editačních formulářů – včetně tabulky uživatelů („susers“), uživatelských skupin („susergroups“) a skupin oprávnění („srightsgroups“) –, jejich tabulky historie změn a tabulka metadat příloh („sfiles“).

Podrobnosti
  • Tabulka historie změn se adresuje názvem tabulky formuláře s příponou „_history“ (například „ng_faktura_history“). Má ji každý editační formulář, i formulář se zakázaným protokolováním historie záznamů – vrací pak řádky zapsané před zákazem a řádky obnovy záznamu z historie. Nástroj „list_tables“ ji vypíše ke každému formuláři s příponou „(history)“ a „count_data“ umí počítat i její záznamy.
  • Dostupné jsou jen tabulky registrované v systémové tabulce „stables“ a tabulka „sfiles“. Ostatní systémové tabulky (například „scolumns“, „smcptokens“ nebo „stables“ samotná) čitelné nejsou a čtení skončí chybou „Table not found“. V NET Genium Online nejsou dostupné ani tabulky statistik „sstatistics“, „sstatistics2“ a „sstatistics3“ a tabulka synchronizace „ssynchro“, včetně jejich tabulek historie.
  • Sloupce, jejichž název obsahuje „password“ nebo „md5“ (bez ohledu na velikost písmen), server nevrací nikdy.
  • Šifrování hodnot zajišťuje jen editační formulář, takže hodnoty sloupců se zapnutým šifrováním (prvky TextArea a RichTextBox) server vrací tak, jak jsou uložené v databázi.
  • Token jen s oprávněním k zápisu dostane od „list_tables“ jen tabulky, do kterých smí zapisovat – bez „sfiles“, tabulek historie a tabulky uživatelů.
  • Názvy sloupců nese odpověď „read_data“ jen u vrácených řádků; z prázdné tabulky nebo s podmínkou, které nevyhovuje žádný záznam, se vrátí prázdné pole. Seznam sloupců tabulky vrací „get_data_model“.
  • „count_data“ vrací počet jako 64bitové číslo. Spouští „SELECT COUNT(*)“, takže nad velkou tabulkou, zvlášť s podmínkou nad sloupcem bez indexu, může trvat dlouho. Počty záznamů všech tabulek najednou vrací „get_record_counts“.
  • Datum a čas server vrací ve formátu ISO 8601 bez označení časového pásma (například „2026-06-18T14:30:00.0000000“), jako čas v časovém pásmu instance nastaveném v Nastavení NET Genia. Vlastní časové pásmo uživatele se přes MCP server neuplatní ani při čtení, ani při zápisu. Pásmo instance a čas instance v okamžiku připojení vydává server agentovi v instrukcích při připojení, má-li token oprávnění ke čtení nebo zápisu.

Podmínky

Parametr „conditions“ nástrojů „read_data“, „count_data“ a „delete_data“ je část dotazu za klíčovým slovem WHERE, bez tohoto slova – například „ng_stav = 'Aktivní' AND ng_castka > 1000“. Literály se zapisují stejně bez ohledu na to, zda instance běží nad MS SQL Serverem, nebo nad Firebirdem:

  • text v jednoduchých uvozovkách, apostrof uvnitř zdvojený („'O''Brien'“); předpona „N“ se nepíše – na MS SQL Serveru ji server doplní sám a na Firebirdu by byla neplatná,
  • datum jako token mezi znaky „#“ mimo uvozovky – „#2026-06-18#“ nebo „#2026-06-18T14:30:00#“; server ho převede na datumový literál databázového enginu,
  • číslo bez uvozovek.
  • Podrobnosti
    • Podmínka musí být jediný výraz: mimo řetězcové literály nesmí obsahovat středník, komentář („--“, „/* */“), neuzavřený literál ani nevyvážené závorky, a nesmí obsahovat poddotaz (SELECT) ani sloupec, jehož název obsahuje „password“ nebo „md5“. Takovou podmínku server odmítne chybou „Invalid conditions: ...“. Filtr podle souvisejícího záznamu se proto skládá ze dvou volání – nejdřív se přečtou ID odkazovaných záznamů a pak se předají výčtem („ng_idfirma IN (12, 15, 18)“).
    • Datum zapsané jako textový literál („'2026-06-18'“) by na jednom z databázových enginů selhalo, protože se jejich syntaxe datumových literálů liší. Token s označením „Z“ nebo s posunem od UTC server odmítne.

Zápis dat

Nástroj „write_data“ zakládá a mění záznamy jedné tabulky, „delete_data“ je maže podle ID nebo podle podmínky. Hodnoty se posílají podle datového typu sloupce, který vrací „get_data_model“:

Datový typ Hodnota
int celé číslo; u cizího klíče ID odkazovaného záznamu (případně hodnota sloupce zvoleného jako „Hodnota uložená v databázi“), u prvků File a Image ID přílohy
float desetinné číslo
datetime řetězec ve formátu ISO 8601 bez označení časového pásma – „2026-06-18T00:00:00.0000000“ pro datum bez času, „2026-06-18T14:30:00.0000000“ pro datum s časem
nvarchar text; u výběrových prvků jedna z hodnot definovaných v modelu, viz níže

Hodnota výběrového prvku musí odpovídat hodnotám, které má prvek v implementačním modelu:

  • ComboBox, ListBox a Radio – jedna položka z hodnot prvku, opsaná doslova včetně jazykových variant „#en:“, mezer a jednotek,
  • MultiListBox – jedna nebo více položek oddělených tabulátorem; oddělovač nastavený u prvku určuje jen zobrazení,
  • CheckBox – zaškrtnuto je přesný text výchozí hodnoty prvku, nezaškrtnuto prázdný řetězec,
  • prvek s hodnotami z databázového dotazu – některá z hodnot, které v datech existují.
  • Podrobnosti
    • Nepřípustnou hodnotu výběrového prvku server uloží bez chyby. Výběrové prvky kromě CheckBoxu ji ve formuláři zobrazí jako volbu navíc a filtr nahlížecí tabulky ji nabídne jako další hodnotu. CheckBox s jiným textem, než je jeho výchozí hodnota, se ve formuláři zobrazí nezaškrtnutý, filtr „Ano“ ho přesto počítá mezi zaškrtnuté a nejbližší uložení formuláře hodnotu přepíše na prázdný řetězec – kromě prvku jen ke čtení se zákazem změny hodnoty JavaScriptem a prvku s výchozí hodnotou „Aktuální hodnota v databázi“, který je jen ke čtení nebo ji vyplňuje před každým uložením.
    • Datum se zapisuje jako čas v časovém pásmu instance; hodnotu s označením „Z“ nebo s posunem od UTC server odmítne. Lokalizovaný formát („18.06.2026“) ani literál databázového enginu se nepoužívá – převod na syntaxi databáze zajistí server.
    • Vyžadovanost pole je jen validací editačního formuláře. Databázový sloupec prázdnou hodnotu přijme vždy a zápis přes MCP server vyžadovanost nekontroluje.
    • Výchozí hodnoty ovládacích prvků se neuplatní. Nevyplněná textová pole nového záznamu dostanou prázdný řetězec stejně jako ve formuláři, sloupce „pid“ a „pform“ se vyplňují jen u vnořených záznamů.
    • ID záznamu smí být i 64bitové, takže zápis i mazání obslouží i formulář s primárním klíčem typu Long.
    • Zápis do tabulky uživatelů („susers“) server odmítne chybou „Table not available for writing“; tabulky historie a „sfiles“ se zápisem neobsluhují vůbec. Uživatelské skupiny a skupiny oprávnění zakládat, přejmenovat i mazat lze, členství uživatelů v uživatelských skupinách a přiřazení uživatelských skupin do skupin oprávnění ale ne – leží ve vazebních tabulkách, které přes MCP server dostupné nejsou, a mění se v NET Geniu.
    • Smazání uživatelské skupiny uklidí její vazby stejně jako editační formulář – členství uživatelů, přiřazení do skupin oprávnění, povolené IP adresy a veřejné externí funkce skupiny. Smazání skupiny oprávnění uklidí přiřazené uživatelské skupiny a uživatelům, kteří ji měli, vynuluje pole „Skupina oprávnění“; toto vynulování se zapíše do historie změn uživatelů a do fronty synchronizace i při mazání bez historie změn.
    • Záznam s příznakem „system“ – vestavěné uživatelské skupiny „Administrators“, „Users“ a „External Users“ a další systémem chráněné záznamy – smazat nelze: mazání podle ID skončí chybou, mazání podle podmínky ho vynechá. Přejmenovat ho lze; sloupec „system“ samotný ale zapsat nelze („Column 'system' cannot be written“), takže ochranu nejde vypnout. Stejně chráněný je aktivní vzhled v tabulce „slayout“. Zápis do ní přes MCP server ale nedělá nic z toho, co uložení ve formuláři „Vzhled“ – styly portálu se nepřegenerují, příznak aktivního vzhledu se u ostatních vzhledů nezruší a velikost textu se neomezí na rozsah 10–16 –, takže se vzhled mění ve formuláři.
    • Mazání s historií změn maže záznamy po jednom, každý ve vlastní transakci.

Přílohy

Hodnotou sloupce prvku File nebo Image je ID záznamu v tabulce „sfiles“, jejíž metadata čte „read_data“. Obsah přílohy vrací „read_attachment“ – obrázek ve formátu png, jpg, gif nebo webp jako obrázek, SVG jako text, textové formáty jako JSON s metadaty a textem (vlastnost „encoding“ s hodnotou „text“) a ostatní soubory jako vložený zdroj protokolu MCP s obsahem v kódování Base64. Nástroj „create_attachment“ založí novou přílohu a vrátí její ID; obsah nese právě jeden z parametrů „content“ (text, uloží se v kódování UTF-8 s BOM) a „content_base64“ (binární obsah). Vrácené ID se pak nástrojem „write_data“ zapíše do sloupce.

  • Uloženou přílohu měnit nelze – výměna přílohy znamená založit novou a v záznamu přepsat ID.
  • Každé ID přílohy patří jedinému záznamu a sloupci. Záznamy se stejným ID by sdílely jeden soubor, takže jeho smazání nebo úprava na místě (serverová funkce „REDUCEATTACHMENT“) by zasáhly všechny.
  • Příloha, jejíž ID se nezapíše do žádného záznamu, zůstane v instanci bez odkazu.
  • Podrobnosti
    • Přílohu větší než 10 MB „read_attachment“ odmítne. Kódování textu pozná podle BOM; soubor bez BOM čte znakovou stránkou serveru, takže starší soubory v kódování Windows-1250 přečte správně.
    • Obrázek vložený do textu prvku RichText, který framework přesunul do databáze, nevrátí – jeho soubor na disku už není a nástroj skončí chybou „Attachment file not found on the server“.

Implementační model

Implementační model instance je přes MCP server dostupný jen ke čtení a stačí k němu kterékoli z oprávnění ke čtení a k zápisu – model lze tak přečíst i před zápisem změn. Nástroje vracejí tytéž údaje jako soubory AI modelu implementace, které stahuje utilita „ai-model“:

Nástroj Co vrací
get_model stavební prvky v JSON: bez parametrů přehled aplikačních skupin, aplikací a editačních formulářů; s parametrem „app“ (název nebo ID) inventář jedné aplikace; s parametrem „form“ (název, identifikátor nebo ID) jediný editační formulář s jeho prvky a tlačítky, bez nahlížecích stránek a kategorií aplikace, hledaný v celé instanci. Parametr „depth“ s hodnotou „structure“ vynechá těla skriptů a definice dotazů. Model celé instance najednou nevrací.
get_model_history historii změn jednoho skriptu, databázového dotazu nebo kódu jednoho prvku HTML či JavaScript – uložené verze od nejnovější, každou s datem, uživatelem, který ji uložil, a celým textem po uložení; skript se vrací jako textový výpis kroků včetně definic jejich dotazů, dotaz jako textový výpis definice. Skript události editačního formuláře se adresuje parametry „form“ (ID formuláře) a „event“ („onBeforeOpen“, „onAfterOpen“, „onBeforeSave“, „onAfterSave“, „onBeforeDelete“, „onAfterDelete“), prvek editačního formuláře parametrem „formcontrol“, prvek nahlížecí stránky parametrem „viewpagecontrol“ a databázový dotaz parametrem „query“ (ID dotazu z „get_model“); u prvku HTML a JavaScript se vrací historie jeho kódu, u ostatních prvků (typicky Button) historie jeho skriptu.
get_permissions uživatelské skupiny a skupiny oprávnění
get_data_model datový model jako příkazy CREATE TABLE – tabulky, sloupce, datové typy a vyžadovanost (značka „/*R*/“)
get_usage_statistics statistiku používání za 30 dní – počet spuštění a celkový, průměrný i maximální čas editačních formulářů, nahlížecích stránek, databázových dotazů, externích funkcí a skriptů
get_record_counts počty záznamů všech tabulek, seřazené od největší tabulky
get_index_analysis analýzu indexů – u sloupců „pid“, „pform“ a každého databázového ovládacího prvku zapnutý index a počty použití ve spojeních, podmínkách a filtrech; sloupec použitý ve spojení bez indexu nese příznak „missing_index“ a parametr „missing_only“ omezí výstup jen na takové sloupce
Podrobnosti
  • Model vrácený s parametrem „app“ je týž JSON jako stažený model, jen omezený na jednu aplikaci – vzniká toutéž cestou.
  • Statistika používání obsahuje data jen tehdy, je-li v Nastavení NET Genia zapnuté logování do databáze; jinak vypíše formuláře a stránky s nulovými hodnotami. Období končí okamžikem volání a začíná 30 dní před dnešní půlnocí.
  • „get_record_counts“ spouští „SELECT COUNT(*)“ nad všemi tabulkami, takže nad velkou databází trvá dlouho.
  • Analýza indexů odpovídá reportu „Indexy“; souboru AI modelu implementace neodpovídá.
  • Historie změn skriptů, databázových dotazů a kódu prvků HTML a JavaScript také žádnému souboru AI modelu implementace neodpovídá. Verze se zapíše při každém uložení skriptu, dotazu nebo kódu se změnou, v NET Geniu i nástrojem „write_model“; prázdný text znamená, že byl skript nebo kód odstraněn. Odpověď nese celkový počet verzí („total“) a příznak, zda následují starší („more“). Najednou vrací nejvýš 50 verzí (výchozí počet 10, parametr „limit“); starší se čtou parametrem „before“ s ID nejstarší vrácené verze.
  • Definice dotazu kroku skriptu je součástí verze skriptu. Uložení dotazu v návrháři databázových dotazů ale novou verzi skriptu nezapíše – ta vznikne až při další akci v návrháři skriptů (uložení, spuštění, přidání, přesunu nebo smazání kroku). Změna dotazu kroku nástrojem „write_model“ zapíše novou verzi skriptu hned.

Přejmenování

Nástroj „rename“ změní název jedné entity implementačního modelu. Parametry jsou „type“, „id“ a „name“ a odpověď vrací „type“, „id“, původní název („old_name“) a nový název („name“). Hodnoty „type“ jsou „appgroup“ (aplikační skupina), „app“ (aplikace), „category“ (kategorie), „form“ (editační formulář), „viewpage“ (nahlížecí stránka), „formcontrol“ (ovládací prvek editačního formuláře) a „viewpagecontrol“ (prvek nahlížecí stránky).

Přejmenování mění jen název, nikdy identifikátor ani data – databázová tabulka ani sloupec se nepřejmenují, takže dotazy, skripty a kód fungují dál.

Podrobnosti
  • Navazující přejmenování proběhnou stejně jako v konfiguračním dialogu: nový název prvku nahlížecí stránky se propíše do titulků portletů, nový název nahlížecí stránky do názvů oblíbených položek všech uživatelů (u stránky v kategorii pojmenované jinak ve tvaru „Kategorie / Stránka“). Nahlížecí stránka typu „Otevřít editační formulář“ nebo „Nová e-mailová zpráva“ bez nastavené stránky pro návrat ji dostane nastavenou na sebe samu, stejně jako po uložení v dialogu.
  • Platí stejná omezení jako v administrátorském režimu: entitu aplikační skupiny omezené volbou Uživatel „Administrator“ a následující administrátoři ani systémový objekt aplikace „Nastavení“ nepřejmenuje vlastník tokenu, který by ji nesměl změnit v konfiguračním dialogu – dostane chybu „Changing the ... with ID ... is not allowed.“
  • Neexistující ID server odmítne chybou „Record not found“.
  • Sloučenou aplikační skupinu a aplikaci (skupina s jedinou aplikací shodného názvu) přejmenuje spolu.
  • Prvky bez názvu – Title, Tab a Space, v editačním formuláři navíc RichText a History, na nahlížecí stránce Email – přejmenovat nelze. Popisek prvků Title, Tab a RichText je jejich text, který se mění nástrojem „write_model“.
  • Názvy, které model vydává u odkazů na sloupce (zobrazované sloupce tabulek, klíče končící „ColumnName“), jsou odvozené z odkazovaného prvku; vlastní záznam nemají a srovnají se přejmenováním prvku samotného.
  • Po přejmenování server zahodí odpovídající mezipaměť, takže se změna projeví okamžitě. Ostatní procesy nad touž databází (další aplikační pool nebo server) ji uvidí hned jen tehdy, je-li v Nastavení NET Genia vyplněno více intranetových adres, jinak nejpozději po svém restartu.
  • Jedno volání „write_model“ unese celou dávku přejmenování (položky se změnou vlastnosti „name“), kdežto „rename“ vždy jen jednu entitu. Identifikátor ani data zůstanou nedotčené a mezipaměť se zahodí rovněž.

Zápis změn modelu

Nástroj „write_model“ zakládá, mění i maže aplikační skupiny, aplikace, kategorie, editační formuláře, nahlížecí stránky, ovládací prvky, databázové dotazy, skripty, uživatelské skupiny a skupiny oprávnění. Přijímá tři pole položek – „insert“, „update“ a „delete“ –, která se zpracují v tomto pořadí. Položka nese druh entity („key“), její ID a změněné vlastnosti („changes“) pod stejnými názvy jako v implementačním modelu; nově zakládaná entita má dočasné záporné ID, na které se mohou odkazovat ostatní položky a které server při zápisu nahradí skutečným.

{
"id": -1000,
"key": "editFormControls",
"formId": 11,
"name": "Cena",
"context": "Faktura",
"changes": {
"type": "TextBox",
"dbName": "ng_cena",
"name": "Cena"
}
}
Skupina Hodnoty „key“
Oprávnění userGroups, rightsGroups
Struktura portálu appGroups, apps, categories, forms, viewPages
Ovládací prvky editFormControls, viewPageControls, actionButtons
Skripty editFormControlScript, viewPageControlScript, onBeforeOpen, onAfterOpen, onBeforeSave, onAfterSave, onBeforeDelete, onAfterDelete
Databázové dotazy prvků dataSource, valuesQuery, defaultValueQuery, helpQuery, inQuery, resourceQuery, availabilitiesDataSource, picker

Úspěšný zápis vrátí příznak „written“, mapu dočasných ID na skutečná („ids“) a případně pole „skipped“ s položkami, které server vědomě nezapsal – každou s vlastnostmi „key“, „id“, „name“, „context“ a důvodem „reason“; ostatní položky zápisu se přitom zapíšou. Zápis přes „write_model“ je tatáž cesta, kterou model nahrává utilita „ai-model“; liší se jen identitou – „write_model“ zapisuje jako vlastník tokenu, utilita jako uživatel „Administrator“ (ID 1), takže smí měnit i aplikační skupiny omezené volbou Uživatel „Administrator“ a následující administrátoři a systémové objekty aplikace „Nastavení“. Ostatní kontroly zápisu, včetně zákazu mazání systémových objektů, platí pro obě cesty.

Podrobnosti
  • Tvar položky. Vlastnost „changes“ server přijme jako prostý objekt, nebo jako pole dvojic „key“ a „value“ (starší tvar zachovaný kvůli zpětné kompatibilitě). Vlastnosti „name“ a „context“ položky jsou jen popisné – server je vrací v hlášení chyby.
  • Rodič nového prvku. Nově zakládaný prvek editačního formuláře nese na úrovni položky (ne v „changes“) „formId“, prvek nahlížecí stránky „viewPageId“; bez nich zápis skončí chybou „Required key 'formId' was not found“. U existujícího prvku se rodič bere z modelu a „formId“ se ignoruje, takže jím prvek přesunout nelze.
  • Umístění. Vlastnost „location“ v „changes“ je vždy objekt: aplikace „{"appGroup": 3}“, kategorie a formulář „{"appGroup": 3, "app": 2}“, nahlížecí stránka „{"app": 2}“, volitelně s „category“. Hodnota uvnitř smí být číslo i objekt „{"id": 3, "name": "..."}“, jaký vydává model. Umístění, které objektem není nebo v něm chybí „appGroup“ (u aplikace), resp. „app“ (u ostatních), skončí chybou. Umístění nahlížecí stránky bez „category“ ji z kategorie vyjme; kategorie musí existovat a patřit do aplikace uvedené v témže umístění.
  • Dočasná ID. Dočasné ID smí stát v kterémkoli odkazu („formId“, „viewPageId“, „location“, odkazy dotazů, v právech jako „G-1000“), ale jen když odkazovaná entita vzniká dřív v témže zápisu – mapa dočasných ID je společná pro všechna tři pole. Odkaz na entitu, která ještě nevznikla, server odmítne chybou o nerozřešeném dočasném ID jen u ID -1000 a nižších; vyšší záporné číslo se zapíše doslova. Odkazy uvnitř JavaScriptu („BT-<id>“, „jsUserInGroup(<id>)“) se dosazují až po zpracování celého zápisu, takže smějí mířit i na entitu zakládanou později; skončí-li zápis chybou, dosadí se jen odkazy na entity, které do té doby vznikly.
  • Pořadí zakládání. Výchozí pořadí položek pole „insert“ je userGroups, rightsGroups, appGroups, apps, categories, forms, editFormControls, actionButtons, editFormControlScript, viewPages, viewPageControls, viewPageControlScript. Server pořadí nehlídá – rozhoduje jen, zda odkazovaná entita v okamžiku zpracování položky už existuje; tlačítko formuláře, které otevírá nově zakládanou nahlížecí stránku, proto patří až za ni.
  • Skripty. U klíčů skriptů je ID položky ID vlastníka skriptu – ovládacího prvku u „editFormControlScript“ a „viewPageControlScript“, formuláře u událostí formuláře – a „changes“ je pole kroků. Kroky se do skriptu slučují podle svého ID, takže se posílají jen měněné. Krok se maže položkou pole „delete“ s klíčem téhož skriptu, ID vlastníka a „changes“ ve tvaru „[{ "id": <ID kroku> }]“; klíč „scriptStep“ neexistuje. Krok s kladným ID, který do skriptu vlastníka nepatří, skončí chybou „Script step with ID ... was not found in this script.“, neexistující vlastník chybou „Referenced ... with ID ... was not found.“ Typ existujícího kroku změnit nelze – krok se smaže a založí znovu; při úpravě beze změny typu se typ smí vynechat. Poslaná strana kroku (cíl, zdroj, levá nebo pravá strana podmínky, u e-mailu odesílatel, příjemce, kopie a předmět) přepíše celou svou skupinu vlastností – co se z ní nepošle, vyprázdní se. Smazání kroku na rozdíl od návrháře skriptů nepřečísluje řádky ostatních kroků ani cíle skoků a u cyklu nesmaže párový krok „Další“.
  • Vnořené objekty. Výběrový dialog lze poslat vnořený v prvku („picker“), nebo jako samostatnou položku s klíčem „picker“ a ID prvku. Zakládaný výběrový dialog musí nést dotaz („pickerQuery“), protože přiřazení a sloupce výběrového dialogu patří k němu; bez dotazu projde jen změna dialogu, který prvek už má. Skripty a tlačítka formuláře vnořené v prvku poslat nelze – zapisují se jen jako samostatné položky. Výběrový dialog se ruší položkou pole „delete“ s klíčem „picker“ a ID prvku, nebo hodnotou „null“ vlastnosti „picker“ (neexistující prvek skončí chybou, prvek bez výběrového dialogu projde bez zápisu); smažou se přiřazení sloupců, nastavení dialogu na prvku zůstane a dotaz dialogu zůstane v databázi bez vazby na prvek, stejně jako po zrušení dialogu v NET Geniu.
  • Neznámé vlastnosti. Vlastnost, kterou zápis neumí zpracovat, skončí chybou – v „changes“ prvku hlášením „Unknown key '...'“, ve vnořeném objektu (dotaz, podmínka, spojení, sloupec, řada grafu, krok skriptu a jeho části, zobrazované sloupce, přiřazení výběrového dialogu) hlášením s výčtem vlastností, které objekt zná. Tolerované jsou jen odvozené názvy, „identifier“, „system“ a „type“. Přímo v „changes“ položky se tiše ignoruje každá vlastnost končící „Name“, která není skutečnou vlastností („dbName“, „shortName“, „templateName“, „pickerTemplateName“), takže překlep v ní chybu nevyvolá. Skutečná vlastnost u typu prvku, který ji nemá, skončí chybou „not supported by this control type“; „validation“ se toleruje jen u existujícího prvku, kterému se v témže zápisu mění typ. U kroku skriptu se vlastnosti kontrolují podle jeho typu.
  • Výčtové hodnoty. Výčtová vlastnost přijímá právě ty hodnoty, které vydává čtení modelu; jinou odmítne chybou „Invalid value '...' in key '...'. Allowed values: '...'.“ s výčtem přípustných hodnot. Výjimkou je funkce sloupce datového zdroje („function“), kterou zápis ověřuje proti nabídce typu prvku. Velikost písmen rozhoduje jen tehdy, když by hodnota jinak nešla spárovat („LEFT“ se zapíše jako „left“). Prázdnou hodnotu přijímají jen vlastnosti, u kterých ji model vynechává (operátor, „andOr“, typ spojení, priorita e-mailu, „function“ a „alignment“ sloupce dotazu, „sortDirection2“), a dále „sortDirection“ (vzestupně), „filterRecordsPerPage“ („default“), „nestedRecords“ („overwriteRows“) a „displayInForm“, „displayInTable“ a „displayInDetails“ („link“), u kterých znamená výchozí hodnotu uvedenou v závorce. Přípustné hodnoty způsobu hledání („searchType“) závisí na ovládacím prvku – u textového pole na jeho datovém typu a výchozí hodnotě, u prvků pro soubor a obrázek je význam hodnot „enabled“ a „disabled“ opačný.
  • Práva. Nově zakládaný ovládací prvek bez vlastnosti „rights“ dostane uživatelskou skupinu „Users“; prázdné pole práv znamená prvek viditelný jen administrátorovi a hodnotu „[null]“ server odmítne chybou „Invalid value null in key 'rights'“. Na jedné položce aplikace, kategorie a nahlížecí stránky smí být jediná z vlastností „rights“, „replaceRights“, „addRights“ a „deleteRights“; u formuláře lze „rights“ (spoluvlastníci) kombinovat s jednou z ostatních. Vlastnost „assignedUserGroups“ skupiny oprávnění nahradí celou sadu přiřazených uživatelských skupin; položkou smí být ID i objekt „{ id, name }“ a neexistující skupinu zápis odmítne.
  • Omezení administrátorského režimu. Aplikační skupinu omezenou volbou Uživatel „Administrator“ a následující administrátoři a systémové objekty aplikace „Nastavení“ smí vlastník tokenu měnit jen tehdy, smí-li to i v konfiguračních dialozích. Položka prvku, prvku nahlížecí stránky, skriptu, výběrového dialogu nebo dotazu, jejíž formulář či stránku měnit nesmí, skončí chybou „Changing the form with ID ... is not allowed.“ (resp. „view page“, „query“). Existující dotaz smí změnit nebo připojit jen ten, kdo smí měnit všechny jeho dosavadní vlastníky; u skupin, aplikací, kategorií, formulářů, stránek a tlačítek se taková položka nezapíše a odpověď ji uvede mezi nezapsanými. Kontroluje se i cíl založení nebo přesunu – nepovolená aplikační skupina či aplikace skončí chybou „Changing the application group with ID ... is not allowed.“ (resp. „application“), neexistující chybou „... was not found.“ Systémovou aplikační skupinu, aplikaci, kategorii, formulář ani nahlížecí stránku smazat nelze („System ... cannot be deleted.“).
  • Neexistující entity. Položka pole „update“ s kladným ID, které neexistuje, skončí chybou „Record with ID ... was not found.“ (u tlačítek a událostí formuláře „Referenced form with ID ... was not found.“, u prvků editačního formuláře a samostatného výběrového dialogu „Referenced column with ID ... was not found.“, u prvků nahlížecí stránky „Referenced viewfield with ID ... was not found.“) – novou entitu nezaloží. Stejně skončí položka pole „delete“ aplikační skupiny, aplikace, kategorie, formuláře, nahlížecí stránky, ovládacího prvku, prvku nahlížecí stránky i samostatného výběrového dialogu, jejíž entita neexistuje; položka tlačítka se přeskočí bez chyby.
  • Co zápis nedělá. Uživatelskou skupinu ani skupinu oprávnění „write_model“ nesmaže – položka pole „delete“ s klíčem „userGroups“ nebo „rightsGroups“ skončí chybou; skupina se maže v NET Geniu nebo nástrojem „delete_data“. Dotaz se samostatně nemaže – taková položka skončí mezi nezapsanými; od prvku se odpojí hodnotou „null“ (například „"dataSource": null“). Sloupec prvku Calendar, Planner, TimeTable, Kanban a Map nevyprázdní – hodnota 0 znamená „nezadáno“ a uložený sloupec zůstane. Rozsah proměnných skriptu se nezadává; jen zkracuje nabídky návrháře skriptů, který ho při otevření skriptu rozšíří podle nejvyšší použité proměnné.
  • Sloučená aplikační skupina a aplikace. Obsahuje-li aplikační skupina právě jednu aplikaci se shodným názvem (posuzovaným v jazyce vlastníka tokenu), změna názvu, ikon nebo práv jedné z nich se zapíše i do druhé a smazání aplikace smaže i skupinu, není-li systémová. Přenáší se jen hodnota, která se zápisem skutečně změnila. Založením skupiny aplikace nevznikne – sloučenou dvojici je potřeba založit dvěma položkami.
  • Chyba v průběhu zápisu. Zápis se zastaví na první položce, která selže. Chyba nese počet položek zpracovaných před ní, mapu dočasných ID a seznam položek, které server do té doby vědomě nezapsal. Položka, na které zápis selhal, může být zapsaná zčásti (vnořený dotaz, dřívější kroky skriptu, prvek založený před chybou jeho výběrového dialogu) – i to, co z ní vzniklo, je v mapě dočasných ID.
  • Vedlejší účinky. Změna identifikátoru („dbName“) existujícího formuláře nebo databázového prvku přejmenuje fyzickou tabulku, resp. sloupec. Tlačítko s akcí „openForm“, „openViewPage“ nebo „printTemplate“ spustí skript při kliknutí jen se zapnutým „runScript“ (nastavení „Spustit skript“); program „RunScript.exe“ a serverová funkce „SCHEDULESCRIPT“ ho spustí i bez něj. U akce „script“ se skript spustí vždy a model u ní vydá „runScript“ s hodnotou „true“ bez ohledu na uloženou hodnotu. Při náhradě dotazu nově založeným dotazem nad týmž formulářem převezme server ze starého dotazu každý seznam zobrazovaných sloupců, který nový dotaz nemá, i poslaný prázdný; u dotazu nad jiným formulářem dostane prvek seznamy jen tehdy, jsou-li poslané s ním.
  • Osobní nastavení tabulky. Zápis prvku DataGrid, History, Tree nebo Email přepíše osobní nastavení té tabulky tomu, kdo zapisuje, stejně jako uložení prvku v konfiguračním dialogu – u DataGridu a Tree na nahlížecí stránce i v editačním formuláři, a to při každé změně prvku, i té, která s tabulkou nesouvisí. U DataGridu, History a Tree se mu výběr sloupců (u Tree sloupců detailů) nahradí sloupci prvku a vymažou se mu hodnoty filtrů ve sloupcích; u DataGridu a History se navíc zobrazení tabulky (součty, horní navigační lišta, filtry, detaily, bublinová nápověda, u DataGridu i počet záznamů na stránce) srovná s prvkem a smaže se mu nastavení portletu nad touto tabulkou. U prvku Email se srovná jen výběr časového úseku a bublinová nápověda. U DataGridu a History se zakázaným uživatelským přizpůsobením se všem ostatním uživatelům smaže výběr sloupců, nastavení tabulky i portletu (aktuální složený filtr zůstává); u DataGridu navíc šablony složeného filtru ostatních uživatelů kromě uživatele „Administrator“ (ID 1), má-li ten nad tabulkou vlastní šablonu. Zapisujícím je u „write_model“ vlastník tokenu, u nahrání utilitou „ai-model“ uživatel „Administrator“.
  • Obrázky v prvku RichText. Model vydává obrázky vložené do textu prvku RichText jako zástupný text „[[Obrázek: odstraněn (base64)]]“ (anglicky „[[Image: removed (base64)]]“). Zápis je nahradí obrázky z uložené hodnoty v pořadí, ve kterém v textu stojí, takže text kolem nich lze měnit. Nesouhlasí-li počet zástupných textů s počtem obrázků v uložené hodnotě, zápis skončí chybou; u nově zakládaného prvku, kde není z čeho obrázky obnovit, server zástupný text odmítne.

Bezpečnost

  • Každý požadavek se přihlašuje jako konkrétní uživatel – vlastník tokenu, nebo ten, kdo AI nástroj přihlášením povolil – a podléhá povoleným IP adresám i licencím stejně jako běžné přihlášení.
  • Oprávnění se ověřují při každém požadavku – ztráta administrátorských práv ukončí přístup okamžitě.
  • Úpravy aplikací podléhají stejným omezením jako konfigurační dialogy administrátorského režimu – co administrátor nesmí změnit v dialogu, nezmění ani přes MCP server.
  • Token platí 90 dnů a lze ho kdykoli smazat; aplikaci připojenou přihlášením lze kdykoli odpojit.
  • Server je chráněn proti hádání tokenů.
  • Oprávnění k zápisu dovoluje měnit libovolná data instance, ne jen vybranou tabulku nebo vlastní záznamy – je proto vhodné ho zapínat uvážlivě a jen tomu, kdo ho potřebuje.

Typické využití

  • dotazy nad daty v přirozeném jazyce – „najdi zakázky bez odpovědné osoby“, „kolik faktur měsíčně přibývá“,
  • kontroly konzistence a souhrnné analýzy dat napříč aplikacemi,
  • dohledání, kdy a jak se záznam změnil,
  • orientace v implementaci – jak je aplikace postavená a které tabulky a sloupce k ní patří,
  • stavba nových aplikací a úpravy stávajících,
  • příprava hlavní stránky, oblíbených položek a nahlížecích tabulek pro celé skupiny uživatelů,
  • analýza výkonu – které stránky, dotazy a skripty trvají nejdéle a nad jak velkými tabulkami běží,
  • ověření, jak se daná věc ve frameworku NET Genium správně dělá, ještě před samotným návrhem.

Na tento server přirozeně navazuje agentní vývoj – práce s AI agentem, který zná framework i konkrétní implementaci a dokáže v ní cíleně pracovat.