Skip to main content
Glama

mini-cms-mcp

Un CMS mic pentru site-uri de câteva pagini și un blog, administrat de un asistent AI prin MCP (Model Context Protocol).

Principiul: AI-ul e singurul editor. Poate schimba conținutul, niciodată codul.

Site și documentație: cms.paycode.ro, care rulează chiar pe mini-cms-mcp și e administrat din conversația cu Claude, inclusiv de pe telefon. Acolo sunt ghidul de instalare pas cu pas, cu capturi din cPanel, și articolele despre de ce există și cine îl scrie.

  • PHP simplu (8.0+). Fără Composer, fără bază de date, fără fișiere de pe alte servere, fără panou de administrare.

  • Merge pe orice găzduire PHP obișnuită (Apache/cPanel). MCP prin Streamable HTTP fără sesiuni: fiecare cerere e un POST cu răspuns JSON.

  • Circa 3.000 de rânduri PHP pe server, plus teste automate (307 verificări, inclusiv instalarea, actualizarea, copia de siguranță, OAuth, SEO și măsurarea).

  • Se leagă de Claude Code (cheie în antet) și de conectorul din claude.ai, web și telefon (OAuth, aprobat cu cheia site-ului).

  • Instalarea: o comandă pe calculator și un zip urcat în cPanel.

Structura

site/                    ← se urcă pe server, ca rădăcină a site-ului
  index.php              site-ul public (pagini, articole, sitemap, feed, robots, llms.txt)
  mcp.php                punctul de intrare pentru AI  →  https://site/mcp
  jurnal.php             jurnalul, pentru om (cheia se trimite prin formular)
  imagini.php            urcarea imaginilor din browser, pentru om (cheia de scriere, prin formular)
  .htaccess              reguli Apache (doar mod_rewrite și mod_headers, în IfModule)
  assets/stil.css        aspectul implicit
  assets/teme/           teme alese cu seteaza_site: <nume>.css + fonturile în <nume>/ (de bază: simpluspv, cinesunt)
  app/                   codul (blocat din web)
  sabloane/              șabloanele HTML (blocate din web)
  date/                  creat automat: pagini, articole, versiuni, jurnal, documentele PDF (blocat din web)
  media/                 creat automat: imaginile urcate
teste/ruleaza.php        testele: pornesc o copie a site-ului și încearcă funcțiile și atacurile
unelte/instaleaza.php    instalarea: teste, chei, config.php, pachetul .zip, verificarea serverului, legarea Claude Code
unelte/actualizeaza.php  actualizarea codului de pe depozit, cerută de om (cheia de cod), cu copie și punere înapoi
unelte/copie.php         copia de siguranță: salvează tot site-ul pe calculator și îl poate pune la loc (sau pe alt site)
unelte/urca-imagine.php  urcă poze de pe calculator: le întoarce după telefon, le micșorează, scoate locația GPS
unelte/editor.php        editorii unui site (de ex. clientul): cheie pe numele lor, adăugare și scoatere (cheia de cod)
unelte/tema.php          temele proprii ale unui site (lucrări pentru un client): le pune, le înlocuiește, le scoate (cheia de cod)
unelte/comun.php         funcțiile comune ale uneltelor
unelte/stdio.php         puntea stdio: un site demo gol, local, pentru inspectoare și cataloage MCP (Dockerfile)
unelte/genereaza-cheie.php, unelte/router-local.php

Related MCP server: static-mcpify

Instalare, în doi pași

Condiția: un domeniu sau subdomeniu doar pentru site (site-ul stă la rădăcină), cu PHP 8.0+ și HTTPS. Ghidul complet, pentru cine n-a instalat niciodată PHP, cu capturi din cPanel: cms.paycode.ro/instalare-cms-administrat-de-ai.

1. Pe calculator, din folderul repo-ului:

php unelte/instaleaza.php https://test.exemplu.ro

Comanda rulează testele, generează cele două chei, scrie config.php (adresa și doar amprentele cheilor) și face pachetul minicms-<versiune>-<nume>.zip. Cheile și pachetul stau în folderul de deasupra repo-ului, în afara lui git: chei-<nume>.json și _livrare/<nume>/. Cheile nu apar niciodată pe ecran; copiază-le în managerul de parole. La o nouă rulare, cheile existente se refolosesc, iar pachetul și config-ul vechi se păstrează cu data în nume.

2. În cPanel: File Manager → folderul domeniului → Upload zip-ul → Extract → șterge zip-ul. Apoi Enter în terminal. Comanda verifică serverul (/mcp 405; dosarele interne, jurnalul și zip-ul blocate — 403 sau 404, după găzduire, fără nimic din fișier în răspuns; ambele chei), leagă Claude Code de site cu cheia de scriere (pentru folderul proiectului) și arată adresa jurnalului. Dacă ceva nu e în regulă, spune cauza și așteaptă să repari pe server. Verificarea se poate relua oricând:

php unelte/instaleaza.php https://test.exemplu.ro --verifica

După instalare, în Claude: „Cheamă despre_site, apoi setează numele site-ului, descrierea și autorul.” Numele, descrierea, autorul, limba și culoarea sunt conținut: le schimbă AI-ul cu seteaza_site, rămân în jurnal și au versiuni. config.php ține doar ce nu trebuie să schimbe AI-ul: adresa și amprentele. Nu intră în git și nu poate fi modificat prin MCP; ajunge pe server o singură dată, în pachetul urcat de om.

Dacă folderul avea deja un .htaccess pus de cPanel (MultiPHP), după Extract alegi din nou versiunea de PHP în MultiPHP Manager, ca cPanel să-și rescrie blocul.

Teme

O temă e o foaie de stil pusă de om în site/assets/teme/<nume>.css, cu fonturile ei în site/assets/teme/<nume>/ (găzduite pe site: CSP-ul permite fonturi doar de pe același domeniu). Se încarcă după assets/stil.css și schimbă doar aspectul, pe același HTML. AI-ul vede temele în despre_site și alege una cu seteaza_site (tema, "" = aspectul implicit); nu poate scrie CSS. O temă aleasă dar scoasă de pe server e ignorată, fără eroare.

Tema simpluspv copiază blogul de pe simpluspv.eu (Bricolage Grotesque, Hanken Grotesk, Newsreader, toate sub SIL OFL 1.1). Culoarea principală rămâne cea din identitate. Știe și două clase din articolele de acolo: p.aerisit (spațiu mai mare după paragraf) și img.ingust (captură de telefon, 340 px, centrată), plus containerul video div.cai-video.

Tema cinesunt e aspectul site-ului cinesunt.info, mutat aici din CMS-ul lui vechi (Space Grotesk, Inter, JetBrains Mono, tot SIL OFL 1.1): erou pe două coloane cu o cartelă de chat, pașii metodei, pastile colorate pe domenii, carduri cu eticheta peste imagine. Prima pagină se așază în aceeași grilă cu titlul din șablon, doar din CSS.

Ce știe tema despre ea o spune AI-ului: primul comentariu din foaia de stil apare în despre_site (teme.despre). Acolo își descrie autorul temei blocurile (clasele) pe care le știe, ca AI-ul să le folosească în conținut fără să ghicească. Pagina poartă și clasa tipului ei pe <body> (pagina-acasa, pagina-articol, pagina-lista…), iar fiecare etichetă clasa eticheta-<slug>, deci o temă poate așeza diferit prima pagină și poate colora etichetele.

Teme de bază și teme proprii

În depozit stau doar temele de bază (simpluspv, cinesunt): vin cu fiecare pachet, pe orice site. O temă făcută pentru un client e o temă proprie: nu intră în depozit și nici în pachet. Stă doar pe calculatorul tău și pe serverul acelui client. Dosarul ei de lucru e teme/, lângă depozit (implicit <dosar>/teme/, deci în afara repo-ului), așezat exact ca assets/teme/: client.css și, lângă ea, dosarul client/ cu fonturile și imaginile.

php unelte/tema.php https://site.ro                    temele de pe site: de bază și proprii, plus cea aleasă
php unelte/tema.php https://site.ro --pune=client      pune sau înlocuiește tema din teme/client.css + teme/client/
php unelte/tema.php https://site.ro --scoate=client    scoate tema proprie de pe site
php unelte/instaleaza.php https://site.ro --tema=client  la instalare: tema se pune imediat după verificarea serverului
  • Merge cu cheia de cod, ca actualizarea codului: AI-ul (cheia de scriere, conectorul din claude.ai) nu poate pune CSS pe site. După ce tema e pe server, AI-ul o vede în despre_site (teme.proprii) și o alege cu seteaza_site.

  • Tema se pune întreagă. Ce era pe server și lipsește din versiunea nouă iese. Versiunea înlocuită sau scoasă se păstrează întâi în date/versiuni/teme/<nume>/<data>/.

  • Sincronizarea cu depozitul nu atinge temele proprii, nici dacă depozitul capătă cândva o temă cu același nume: registrul lor stă în date/teme-proprii.json, iar date/ nu vine niciodată din depozit. Invers, o temă de bază nu poate fi înlocuită cu una proprie: tema clientului primește alt nume.

  • Ce intră într-o temă: .css, .woff2, .woff, .ttf, .otf, .png, .jpg, .gif, .webp, .avif; cel mult 80 de fișiere, 2 MB fiecare, 6 MB în total. Nu intră SVG (deschis direct, ar rula script pe domeniul site-ului) și nici fișiere ascunse; Thumbs.db și desktop.ini se sar singure.

  • Unealta verifică adresele din foaie: un font care lipsește, sau care vine din dosarul altei teme (o temă făcută din copia uneia de bază, redenumită doar pe jumătate), e semnalat înainte de trimitere.

  • Fonturile se țin în cache un an. Când schimbi un font, dă-i fișierului alt nume. Foaia de stil se reîncarcă singură.

  • Copia de siguranță (copie.php) ține doar numele temei. Pusă pe alt site care nu are tema, copia pune restul identității și îți spune comanda cu care urci tema.

Blocurile comune și paginile de pornire

Un site nou nu mai pornește gol. Pentru asta există două piese, amândouă conținut, nu cod pus de AI:

  • Blocurile comune, în assets/stil.css, deci pe orice site și sub orice temă: bloc-carduri (cu bloc-card), bloc-pasi (pași numerotați), bloc-citat (cu cite), bloc-actiune (chemarea de la final, cu a.buton), bloc-coloane, bloc-galerie, bloc-nota (plus nota-verde, nota-galbena, nota-rosie) și bloc-cifre. Întrebările frecvente rămân h2 + h3 + răspuns, direct în conținut, fără cutie: altfel FAQPage nu le mai găsește. AI-ul le vede în despre_site (blocuri), fiecare cu rostul lui și un exemplu de HTML. Testele verifică exemplele: fiecare trece prin filtru neatins și fiecare clasă are reguli în foaia de bază. Regulile au prefixul main .continut, ca să stea deasupra regulilor generale ale unei teme; o temă le restilizează cu același prefix.

  • Paginile de pornire: comanda pagini_de_pornire (cheia de citire ajunge) întoarce scheletele paginilor acasă, despre, servicii, contact și confidențialitate, făcute din blocuri, cu locuri [[COMPLETEAZĂ: …]], plus întrebările de pus omului. Nu creează nimic. AI-ul le completează cu ce află de la om, le salvează ca ciorne, trimite linkul de previzualizare, iar omul aprobă. Răspunsul arată și care pagini există deja, ca să nu fie suprascrise.

  • Un loc de completat oprește publicarea: publica refuză un element care mai are [[COMPLETEAZĂ…]] în titlu, descriere sau conținut, iar salveaza refuză să-l pună pe o pagină deja publicată. Un schelet uitat nu ajunge pe site.

  • Pagina de confidențialitate descrie ce face tehnic site-ul, verificat în cod: nu pune cookie-uri proprii, nu are formulare, nu păstrează căutările, fonturile și imaginile vin de pe site, iar jurnalul lui scrie doar administrarea și încercările de a intra în ea, nu vizitele. Ce e pornit la momentul cererii intră singur: Cloudflare, GA4 (cu atenționarea că site-ul nu are banner de consimțământ) și videoclipurile YouTube/Vimeo din pagini. Datele firmei și ale găzduirii rămân locuri de completat. Nu e consultanță juridică: proprietarul o verifică înainte de publicare.

Actualizarea codului, fără zip și fără cPanel

Din 0.9, site-ul își ia singur versiunea nouă din depozit — dar numai când i-o ceri tu, niciodată de la sine și niciodată la cererea AI-ului. Prima instalare rămâne cu pachetul urcat de mână; de la ea încolo:

php unelte/actualizeaza.php https://site.ro

Comanda întreabă serverul ce versiune are și ce e în depozit, îți arată fișierele care s-ar schimba, apoi (după ce confirmi, sau direct cu --acum) îi cere să se sincronizeze. Același lucru se poate face și din browser, pe https://site.ro/actualizare.php, lipind cheia de cod în formular.

Cheia de cod e a treia cheie, alături de cea de citire și cea de scriere. Stă doar pe calculatorul tău, în chei-<nume>.json, iar pe server e tot o amprentă. Nu e cheie de MCP: AI-ul nu o primește niciodată, iar un token OAuth al conectorului din claude.ai nu deschide nimic din actualizare. Principiul rămâne cel de la început — asistentul schimbă conținutul, nu codul.

Ce face serverul, în ordine, într-o singură cerere:

  1. descarcă pachetul depozitului (depozit din config.php, implicit paycodero/mini-cms-mcp, ramura main);

  2. verifică fiecare cale din el: doar din dosarul site/, fără .., doar extensii din lista permisă; app/config.php, date/ și media/ nu se ating niciodată;

  3. refuză o versiune mai veche decât cea instalată (forta o acceptă, dacă chiar vrei să cobori);

  4. salvează fișierele pe care urmează să le înlocuiască, în date/versiuni/cod/<data>/;

  5. scrie doar ce diferă;

  6. își cere singur prima pagină: dacă nu mai răspunde 200, pune la loc versiunea veche în aceeași cerere și îți spune ce a pățit. Dacă nu poate ajunge la el însuși (unele găzduiri nu permit), spune „necunoscut" și nu presupune nimic — verificarea din afară o face comanda de pe calculatorul tău, care pune și ea înapoi copia dacă site-ul nu răspunde cum trebuie.

Două lecții de pe o găzduire reală (cinesunt.info, 21 septembrie 2026), reparate în 0.12:

  • Memoria PHP a găzduirii (OPcache). Unele găzduiri țin codul compilat și nu se uită după fișierul schimbat: pe disc e versiunea nouă, dar site-ul rulează tot codul vechi și raportează versiunea veche. Acum serverul își golește memoria pentru fiecare fișier PHP pe care îl scrie. Iar comanda de pe calculator pune copia înapoi numai dacă site-ul nu mai răspunde; dacă merge dar raportează încă versiunea veche, așteaptă și reverifică, apoi spune ce vede, fără să atingă ceva.

  • Punerea înapoi a unei copii nu mai poate închide site-ul. Copiile făcute înainte de 0.12 conțineau paza dosarului de date (un .htaccess cu „Require all denied”), iar punerea înapoi o scria peste .htaccess-ul site-ului: 403 pe orice adresă, fără cale de reparat din afară. Acum copiile nu mai au paza lor, iar punerea înapoi sare peste ea și la copiile vechi. Dacă ți s-a întâmplat pe o versiune mai veche: în cPanel urci din nou site/.htaccess peste cel din rădăcină, apoi alegi din nou versiunea PHP în MultiPHP Manager.

Copiile rămân pe server: php unelte/actualizeaza.php https://site.ro --copii le listează, iar --pune=<copie> pune una înapoi. 'actualizare' => false în config.php scoate cu totul pagina și comanda.

⚠️ Prețul acestei comodități, spus pe față: serverul are încredere în depozit. Cine ajunge la contul de GitHub poate pune cod pe site. Ce se poate fără GitHub — cale în afara dosarului site/, extensie nepermisă, atingerea configurării, coborârea versiunii — e refuzat de server. Dacă vrei și apărare împotriva unui depozit compromis, pasul următor e semnarea pachetului cu o cheie privată de pe calculatorul tău; nu e construită.

Imaginile, fără base64 prin conversație

urca_imagine primea imaginea codată base64: bun pentru o siglă mică, prea scump și prea lent pentru o poză. O poză atașată în chat nu ajută nici ea: ajunge la AI ca imagine de privit, nu ca fișier pe care să-l poată trimite mai departe. Drumurile:

  • Poza e la om (telefon, calculator, chat) — drumul obișnuit, din 0.13: AI-ul cheamă link_urcare și îi dă omului un link semnat, valabil 30 de minute (5–120). Omul îl deschide, alege poza, apasă „Urcă”; nicio cheie, nimic de completat. Apoi AI-ul o găsește cu listeaza_imagini și o pune unde trebuie. Semnătura folosește cheia previzualizărilor într-un domeniu separat, deci un link de previzualizare nu merge ca link de urcare; un link falsificat se numără ca încercare eșuată.

  • E deja pe internet: urca_imagine cu url (doar https, portul 443). Serverul o descarcă singur. Apărarea contra SSRF: numele se rezolvă o dată și toate adresele găsite trebuie să fie publice (nu 127.x, 10.x, 192.168.x, 169.254.x și celelalte rezervate; la IPv6 trec doar adresele globale, 2000::/3, deci IPv4 ascuns în IPv6 e refuzat în orice formă ar fi scris: ::ffff:127.0.0.1, ::127.0.0.1, ::a9fe:a9fe); conexiunea se face exact la adresa verificată, deci DNS-ul nu poate fi schimbat între verificare și descărcare; redirecționările, cel mult 3, trec fiecare prin aceleași verificări. Fără curl și fără allow_url_fopen. 'imagini_url' => false în config.php oprește drumul.

  • E pe calculator (Claude Code):

    php unelte/urca-imagine.php https://site.ro poza.jpg [alta.png …] [--latime=1600] [--original]

    Întoarce poza după orientarea din telefon, o micșorează la 1600 px pe latura mare și o rescrie, deci JPEG-ul pierde datele EXIF, inclusiv locația GPS. La final scrie adresele /media/.... Are nevoie de GD; pe Windows, dacă php_gd.dll stă lângă PHP dar e oprit în php.ini, comanda îl pornește doar pentru ea. Fără GD, pozele pleacă neatinse.

  • Fără AI: https://site.ro/imagini.php, cu cheia de scriere în formular (niciodată în adresă, ca la jurnal). Pagina micșorează pozele în browser înainte de trimitere, deci pleacă repede și fără locația GPS; cheia de citire e refuzată, fiecare fișier e verificat și scris în jurnal, pagina nu se indexează. Apoi îi dai AI-ului adresa. Se scoate cu 'pagina_imagini' => false.

Toate trei trec prin aceleași verificări ca base64: tipul aflat din conținut, cel mult 5 MB, fără cod ascuns, fără SVG.

Documentele PDF

urca_fisier pune pe site un document PDF (cel mult 25 MB) și întoarce adresa lui, /fisiere/<nume>.pdf, de pus într-un link în conținut. Numele îl alege AI-ul (curățat: litere mici, cifre, cratime) și rămâne adresa documentului.

  • Nu stau în dosarul public, ca imaginile, ci în date/fisiere/. Le servește PHP, cu Content-Type: application/pdf, nosniff, Content-Disposition: inline și ETag. Un fișier urcat nu poate fi rulat de server oricum s-ar numi, antetele merg și fără mod_headers, actualizarea codului nu le atinge, iar copia de siguranță le ia odată cu conținutul.

  • Tipul se află din conținut: începe cu %PDF- și se încheie cu %%EOF. O imagine, un text redenumit sau un PDF tăiat sunt refuzate.

  • De unde vine: din url (https, aceeași apărare SSRF ca la imagini, 60 de secunde), așa că merg și documentele mari; din continut_base64 încap cel mult ~6 MB, din cauza limitei de 8 MB pe cerere.

  • Înlocuirea aceluiași nume cu alt conținut cere inlocuieste=true. Adresa rămâne aceeași, deci linkurile din pagini nu se strică, iar versiunea veche se păstrează în date/versiuni/fisiere/. Același conținut urcat din nou nu scrie nimic.

  • sterge_fisier refuză un document legat dintr-o pagină sau dintr-un articol, în afară de cazul forteaza=true.

  • Documentul nu primește Content-Security-Policy, și asta e intenționat: sandbox și object-src 'none' fac vizualizatorul PDF din Chrome să arate „blocat”. Protecția e tipul fix cu nosniff: browserul nu-l tratează niciodată ca pagină a site-ului.

  • Pe un site mutat de pe alt CMS, un PDF vechi pus de mână în dosarul public /fisiere/ are întâietate, fiindcă e fișier real. Un document nou cu același nume e refuzat, ca să nu stea ascuns în spatele celui vechi.

Site multilingv (RO + EN) — 0.20

Un site poate fi în mai multe limbi. Se pornește cu seteaza_site (limbi), o listă de coduri unde prima e limba implicită și stă la rădăcină (/), iar celelalte primesc un prefix de adresă (/en/...). O singură limbă sau lista goală = site monolingv, exact ca înainte — funcția e aditivă, nimic nu se schimbă pe site-urile cu o singură limbă.

  • Fiecare pagină și articol are un câmp limba (una dintre limbi; lipsa lui = limba implicită) și un câmp grup, care leagă un element de traducerile lui: despre (ro) și about (en) primesc același grup, iar site-ul știe astfel că sunt aceeași pagină în limbi diferite. Se pun la salveaza.

  • O singură adresă canonică pe limbă: pagina în engleză se vede la /en/<slug> și nu la rădăcină; cea în română la /<slug>. Prima pagină a fiecărei limbi stă la / și /en (slugul ei redirecționează acolo).

  • Comutatorul de limbă apare în antet și duce la traducerea paginii curente (sau la prima pagină a limbii, dacă nu are una).

  • hreflang peste tot: <link rel="alternate" hreflang="…"> + x-default în <head>, și xhtml:link în sitemap — așa Google și asistenții AI știu că paginile sunt aceeași, în limbi diferite. <html lang>, JSON-LD inLanguage, feed-ul și llms.txt urmează limba paginii.

  • Identitatea tradusă: seteaza_site (traduceri) dă, per limbă, variantele de nume, descriere, subsol și nume_articole. Ce lipsește într-o limbă cade pe valoarea de bază. ex. {"en":{"nume":"The New Journal…"}}.

Copia de siguranță

php unelte/copie.php https://site.ro

Salvează tot site-ul în _copii/<nume>/<data>/ (în folderul de deasupra repo-ului): export.json cu paginile și articolele (inclusiv ciornele și cele programate), identitatea și redirecționările, plus imaginile și documentele PDF, verificate după amprentă. Folosește cheia de citire. Nicio copie nu se scrie peste alta.

php unelte/copie.php https://site-nou.ro --pune=_copii/<nume>/<data>

Pune copia pe un site (de obicei unul nou, gol), cu cheia de scriere: imaginile cu aceleași adrese, apoi identitatea, elementele cu starea, data publicării și autorul lor, și redirecționările. Pe un site care are deja conținut cere și --peste; elementele cu același slug se modifică, cu versiunea anterioară păstrată.

Schimbarea cheilor

Dacă o cheie a scăpat: php unelte/instaleaza.php https://site --chei-noi. Cheile vechi se păstrează cu data în nume, config-ul și pachetul se refac. Urci pe server doar app/config.php din _livrare/<nume>/ (sau tot pachetul): din acel moment cheile vechi nu mai merg. Apoi --verifica, care înlocuiește și cheia din conexiunea Claude Code.

Editorii: clientul scrie cu cheia lui (0.19)

Când clientul vrea să modifice singur site-ul, primește cheia lui, nu pe a ta. Poate tot ce poate cheia de scriere — creează, modifică, publică direct, retrage, șterge (reversibil), restaurează, urcă imagini și PDF-uri, redirecționează — afară de două lucruri, care rămân la tine: identitatea site-ului (seteaza_site: nume, logo, temă, subsol, mențiunea realizatorului) și conexiunile OAuth (retrage_conexiune). Comenzile acestea nici nu apar în lista lui.

php unelte/editor.php https://site.ro                            editorii de pe site
php unelte/editor.php https://site.ro --adauga="Maria Popescu"   cheie nouă pentru Maria, pusă pe site
php unelte/editor.php https://site.ro --scoate="Maria Popescu"   cheia ei nu mai merge, nici conexiunile ei OAuth
  • Cheia se scrie în chei-<nume>-editor-<om>.json, lângă cheile tale, cu adresa MCP și comanda claude mcp add gata de copiat: fișierul acela i-l dai omului. Pe server ajunge doar amprenta, în date/securitate/editori.json.

  • Merge cu cheia de cod, ca temele: AI-ul nu își poate face singur chei. Nu se urcă nimic în cPanel.

  • Cine, ce, când: fiecare rând din jurnal are cine (admin sau numele editorului), inclusiv refuzurile; fiecare pagină și articol ține modificat_de, care trece în versiuni — listeaza_versiuni arată cine a scris fiecare versiune. Pozele urcate cu un link de urcare apar pe numele celui care a cerut linkul (semnat, nu se poate schimba).

  • Pe claude.ai (web, aplicația pentru calculator, telefon): își ia singur codul de conectare de pe https://site/oauth/conectare, cu cheia lui, apoi aprobă tot cu ea. Tokenul rămâne al lui; când îl scoți, moare odată cu cheia. În Claude Code se leagă direct cu cheia în antet (comanda e în fișierul lui), fără cod.

Conectorul din claude.ai (web și telefon)

Legarea se face într-o fereastră deschisă de tine, de pe calculator (din 0.6 — înainte, oricine putea porni o aprobare pe site-ul tău, cu numele „Claude", și dacă o aprobai primea el token-urile):

php unelte/instaleaza.php https://site.ro --oauth

Comanda cere serverului, cu cheia de scriere, să deschidă înregistrarea 15 minute și îți arată în terminal un cod de conectare de 6 cifre. Fără terminal (0.19.1): pagina https://site/oauth/conectare face același lucru, după ce lipești cheia de scriere sau o cheie de editor; codul apare pe pagină. Apoi, în claude.ai: Settings → Connectors → Add custom connector, cu adresa https://site/mcp. Claude se înregistrează singur și deschide pagina de aprobare a site-ului: acolo introduci codul din terminal și cheia de scriere (sau pe cea de citire, pentru acces doar de citire) și apeși Permite. După aprobare fereastra se închide singură; o închizi mai devreme cu --oauth --inchide. De acolo, Claude primește token-uri temporare; conectorul apare și în aplicația de telefon.

Reînnoirea token-urilor merge oricând, și cu fereastra închisă: o conexiune aprobată nu se rupe.

  • În afara ferestrei, /oauth/inregistrare și pagina de aprobare răspund „închis": un link de aprobare trimis de un străin nu deschide nimic. Codul de 6 cifre e singurul lucru pe care nu-l poate avea cineva care îți citește codul sursă.

  • 'oauth' => 'deschis' în config.php readuce purtarea din 0.5 (fără fereastră, fără cod), iar false scoate OAuth cu totul.

  • OAuth 2.1 cu PKCE (S256) obligatoriu, înregistrare automată a clientului (RFC 7591), descoperire prin /.well-known/oauth-protected-resource și /.well-known/oauth-authorization-server.

  • Codul de aprobare poate fi trimis doar spre claude.ai, claude.com sau calculatorul omului (localhost, pentru Claude Code); alte gazde se adaugă în config.php, la 'oauth_gazde'.

  • Token de acces 1 oră, de reînnoire 60 de zile, rotit la fiecare folosire. Pe server stau doar amprentele lor.

  • Un token are drepturile cheii cu care a fost aprobat și nu mai merge după --chei-noi. Accesul se vede cu listeaza_conexiuni și se retrage cu retrage_conexiune. Fiecare pas e în jurnal, fără token-uri sau coduri.

Legarea de mână la Claude Code

instaleaza.php o face singur. De mână, cu cheia citită din fișier (PowerShell), din folderul proiectului:

$k = (Get-Content chei-<nume>.json -Raw | ConvertFrom-Json).scriere.cheie
claude mcp add --transport http <nume> https://site/mcp --header "Authorization: Bearer $k"

Dacă găzduirea nu transmite antetul Authorization către PHP, se folosește --header "X-API-Key: $k" (instaleaza.php detectează singur cazul). Cheia de citire se folosește pentru un asistent care doar verifică. Conectorul din claude.ai (web, telefon) cere OAuth, care e în lucru (vezi mai jos).

Comenzile

Comanda

Cheie

Ce face

despre_site

citire

regulile site-ului, HTML-ul permis, blocurile comune, temele, rolul cheii

pagini_de_pornire

citire

scheletele paginilor unui site nou (acasă, despre, servicii, contact, confidențialitate), de completat cu omul; nu creează nimic

listeaza

citire

paginile și articolele, fără conținut

citeste

citire

un element întreg

cauta

citire

caută în titluri, descrieri, conținut

listeaza_versiuni

citire

versiunile salvate automat ale unui element

listeaza_imagini

citire

imaginile din /media/

citeste_jurnal

citire

ultimele intrări și verificarea lanțului

previzualizeaza

citire

link temporar (implicit 60 de minute) la care omul vede o ciornă exact ca pe site, înainte de publicare

listeaza_redirectionari

citire

adresele vechi care trimit spre adrese noi

exporta

citire

tot conținutul, pentru copia de siguranță (vezi unelte/copie.php)

listeaza_conexiuni

citire

aplicațiile legate prin OAuth (conectorul claude.ai): cine, cu ce drepturi, dacă au acces acum

salveaza

scriere

creează (ca ciornă) sau modifică o pagină ori un articol (pe un site multilingv: și limba + grup)

seteaza_site

scriere

numele, descrierea, autorul, limba (și limbi + traduceri pentru un site multilingv), culoarea, logo-ul, favicon-ul, tema, legăturile și textul din subsol, mențiunea realizatorului, identificatorul GA4, numele articolelor și data vizibilă; păstrează versiunea anterioară

publica / retrage

scriere

pune pe site / scoate de pe site (rămâne ciornă); publica cu la în viitor programează, în trecut păstrează data

retrage_conexiune

scriere

anulează accesul unei aplicații legate prin OAuth

redirectioneaza

scriere

adresă veche → adresă nouă de pe site, 301 (doar când la adresa veche nu mai e nimic); la gol o scoate

sterge

scriere

mută elementul între versiuni (reversibil)

restaureaza

scriere

aduce înapoi o versiune, ca ciornă

link_urcare

scriere

un link temporar la care omul urcă poze fără cheie; AI-ul le găsește apoi cu listeaza_imagini

urca_imagine

scriere

JPEG/PNG/GIF/WebP, max 5 MB, din url (https, cu apărare SSRF) sau continut_base64; extensia se stabilește din conținut

sterge_imagine

scriere

mută imaginea între versiuni; refuză dacă e folosită

listeaza_fisiere

citire

documentele PDF din /fisiere/

urca_fisier

scriere

un PDF, max 25 MB, din url (https, cu apărare SSRF) sau continut_base64 (~6 MB); adresa /fisiere/<nume>.pdf; inlocuieste=true pune conținut nou la aceeași adresă, cu versiunea veche păstrată

sterge_fisier

scriere

mută documentul între versiuni; refuză dacă e legat din conținut

Paginile și articolele au adrese comune: /despre, /primul-articol. Pagina acasa e prima pagină.

Vizitatorii au căutare (/cauta?q=…, în antet): doar în ce e pe site, cu sau fără diacritice ("sedinta" găsește "ședința"). Articolele programate apar singure la ora lor: nu e nevoie de sarcini programate pe server.

SEO și citit de agenți

Site-ul e făcut ca să fie găsit de oameni prin Google și Bing, dar și citit de asistenți AI, fără nicio unealtă în plus.

  • Adrese generate singure: /sitemap.xml (cu lastmod, coperțile ca imagini și paginile de etichetă), /feed.xml (RSS cu legătură spre el însuși, autor și etichete), /robots.txt (îi numește pe rând pe Googlebot, Bingbot, GPTBot, ClaudeBot, PerplexityBot și restul, și arată unde e llms.txt), /llms.txt (rezumatul site-ului pentru modele: adresă, limbă, autor, lista paginilor și a articolelor cu descriere, dată și etichete).

  • Date structurate (JSON-LD): Article cu editor, limbă, etichete și pagina-părinte · WebSite cu SearchAction (căutarea site-ului, pentru Google) · BreadcrumbList pe fiecare pagină · FAQPage construit singur dintr-o secțiune <h2>Întrebări frecvente</h2> cu <h3> întrebare + răspuns, dacă articolul are una.

  • Cardurile sociale: og: complet, cu og:locale, măsurile copertei, textul ei alternativ, data publicării și a modificării, etichetele. Titlul din bara browserului nu repetă numele site-ului când e deja în el.

  • Verificarea în Search Console și Bing Webmaster Tools: 'verificari' => ['google-site-verification' => '…', 'msvalidate.01' => '…'] în config.php pune etichetele meta cerute.

  • IndexNow: la publicare, modificare sau retragere, adresa pleacă singură spre Bing (și Yandex, Seznam, Naver). Cheia stă în date/securitate/ și se servește la https://site/<cheie>.txt, fără niciun fișier pus în rădăcină. Se oprește cu 'indexnow' => false. Google nu are un punct echivalent: acolo rămâne sitemap-ul.

  • Măsurarea (GA4): seteaza_site (ga4) primește DOAR identificatorul, ex. G-798XLP278H — eticheta o compune site-ul, cu nonce-ul paginii, iar sursele de care are nevoie intră singure în CSP. AI-ul poate porni măsurarea, dar nu poate pune JavaScript în pagină: identificatorul e validat cu un tipar, iar orice altceva e refuzat. Se încarcă numai pe paginile publice — jurnalul, actualizarea, căutarea, previzualizările și aprobările nu se măsoară.

  • Rețeaua autorului: seteaza_site (legaturi) pune celelalte site-uri și conturi în subsol, pe fiecare pagină, și aceleași adrese în sameAs din datele structurate — de acolo află Google și Bing că profilurile sunt ale aceleiași entități. Sunt conținut, nu configurare: rămân la locul lor când urci un pachet nou.

  • Textul din subsol: seteaza_site (subsol) pune o mențiune scurtă pe fiecare pagină și în llms.txt — ce nu oferă site-ul, sau firma și CUI-ul. Text simplu, fără HTML.

  • Cine a făcut site-ul: seteaza_site (realizare, ex. „Website realizat cu AI și miniCMS”, plus realizare_url) pune mențiunea pe rândul cu ©, ca link dacă are adresă. Nu e o legătură a autorului: nu intră în sameAs, nu are rel="me" și nu apare în llms.txt, ca Google să nu lege site-ul realizatorului de entitatea autorului.

  • Cum se numesc articolele: seteaza_site (nume_articole, ex. ghiduri) schimbă cuvântul din meniu, de pe prima pagină și din liste („Ultimele ghiduri", „Toate ghidurile"). Adresa rămâne /articole.

  • Meniul pe două niveluri: o pagină cu parinte (slugul unei pagini din meniu) stă în submeniul ei, în ordinea din meniu; adresa rămâne /<slug>. Submeniul se deschide la mouse și din tastatură, fără JavaScript; pe ecrane tactile, pagina-părinte își listează singură subpaginile („În această secțiune”), iar subpagina are un link înapoi și firimituri Acasă › Secțiune › Pagină. Un singur nivel de subpagini; o pagină care are subpagini nu se șterge până nu le muți.

  • Data pe pagini: implicit nu apare (pe un site de documentație o dată lângă titlu face conținutul să pară vechi); arata_data = da o pune pe articol și pe carduri, pentru un blog. În sitemap, feed și datele structurate e oricum.

  • Evenimente: un articol care anunță un concert, un curs sau o lansare primește câmpul eveniment (început, sfârșit, tip, loc, adresă, artiști, organizator, bilete, stare). Din el site-ul compune datele structurate Event (sau MusicEvent, Festival…) pentru Google: conținutul nu poate avea <script>, deci JSON-LD scris de mână ar fi scos. Cardul arată ziua și ora evenimentului (și „amânat”/„anulat”), iar prima pagină pune întâi evenimentele care urmează, cel mai apropiat primul, apoi restul articolelor.

  • Sub articol: „Citește mai departe" cu două articole, întâi cele cu aceeași primă etichetă. Coperta nu se repetă sus când aceeași imagine e deja în text. Blocurile <pre> primesc un buton „Copiază", pus de șablon (cu nonce).

  • Întrebările frecvente (FAQPage) se opresc la primul <aside> sau <section>: un bloc de final pus după ele nu se mai lipește de ultimul răspuns.

  • Iconița site-ului: o pui cu seteaza_site (favicon), iar /apple-touch-icon.png trimite spre ea, pentru telefon. ⚠️ Adresa /favicon.ico e singura care nu se poate rezolva din cod pe un domeniu prin Cloudflare: e prinsă la margine și nu ajunge niciodată la PHP (verificat: /altceva.ico și /favicon.ICO ajung, /favicon.ico nu). Dacă o vrei și pe aceea, omul pune un favicon.ico adevărat în rădăcina site-ului, o singură dată.

  • Fără sărituri la încărcare: coperțile și miniaturile primesc width/height din fișier, iar coperta articolului are fetchpriority="high" (e candidatul LCP).

Securitate

  • Nicio comandă nu scrie fișiere .php, șabloane, configurare sau jurnal. Conținutul stă în JSON, în date/.

  • HTML-ul trece printr-o listă de etichete și atribute permise, la scriere și la afișare. Se scot script, style, formulare, SVG, evenimentele on*, javascript:, iframe-urile care nu sunt YouTube/Vimeo. Răspunsul spune AI-ului ce s-a scos. Un id nu poate lua numele variabilelor citite de eticheta GA4 (dataLayer, gtag, google…): în browser, un id devine și variabilă globală.

  • Două chei (citire / scriere). Pe server stau doar amprentele SHA-256, comparate cu hash_equals.

  • 8 încercări eșuate în 5 minute = adresă blocată 15 minute, pe toate punctele de intrare. La IPv6 se blochează prefixul /64, nu adresa exactă: cine are un bloc întreg nu trece prin plafon schimbând adresa la fiecare cerere.

  • Adresele care răspund fără cheie (fluxul OAuth) au și un plafon pe numărul de cereri, nu doar pe eșecuri.

  • Cererile din browser de pe alt site (antet Origin străin) sunt refuzate. Cererile peste 8 MB sunt refuzate înainte de a fi citite.

  • Înainte de orice modificare se salvează o versiune. Ștergerea mută fișierul între versiuni.

  • Paginile publice au Content-Security-Policy cu nonce (fără unsafe-inline), nosniff, X-Frame-Options: DENY.

  • Imaginile: tipul se află din conținut; fișierele cu cod PHP ascuns și SVG-urile sunt refuzate.

  • Documentele PDF: tipul se află din conținut (%PDF- … %%EOF); stau în afara rădăcinii web (date/fisiere/) și le servește PHP, ca application/pdf cu nosniff.

  • Arhivele și copiile de siguranță (.zip, .tar, .gz, .sql, .bak etc.) nu se servesc: pachetul de instalare uitat pe server nu se poate descărca.

  • IP-ul real din CF-Connecting-IP e crezut doar când cererea vine chiar din rețeaua Cloudflare; altfel antetul e ignorat. Setarea se potrivește singură, cu sau fără Cloudflare ('cloudflare' => false o oprește).

  • HSTS pe orice răspuns servit prin https ('hsts' => false îl oprește).

  • Linkurile de previzualizare sunt semnate (HMAC, cheie în date/securitate/), expiră în cel mult 24 de ore, nu se indexează și sunt scrise în jurnal, inclusiv încercările cu semnătură greșită.

  • Redirecționările duc doar spre adrese de pe același site; adresele site-ului (/mcp, /app, /date, …) nu se pot redirecționa, iar buclele sunt refuzate. Excepție: sub /articole/ site-ul nu servește nimic, deci acolo se pot scrie (adresele unui blog mutat). Fără ele, /articole/<slug> trimite singur, cu 301, spre /<slug> când articolul (sau pagina) există și se vede pe site.

Jurnalul

Fiecare apel (citire, scriere, încercare eșuată, blocare) e un rând JSON în date/jurnal/AAAA-LL.ndjson: când, IP, cheie, cine (admin sau numele editorului), comandă, țintă, rezultat, amprenta conținutului scris, durata. Fără rotație care să șteargă istoric.

Fiecare rând poartă amprenta rândului anterior (lanț SHA-256): un rând modificat, scos sau adăugat pe dinafară rupe lanțul, iar verificarea arată unde. AI-ul poate citi jurnalul, nu îl poate modifica.

Lanțul e tamper-evident, nu tamper-proof: prinde editarea sau ștergerea unui rând, dar cine are drept de scriere pe date/ poate recalcula tot lanțul și rescrie .lant. Pentru dovadă în fața cuiva din afară, copiază periodic amprenta de final în altă parte. Adresele vizitatorilor care deschid linkuri de previzualizare se scriu trunchiate (ultimul octet la IPv4, prefixul /64 la IPv6). La 16 MB, fișierul lunii se arhivează singur sub un nume care îi păstrează locul în lanț.

Teste

php teste/ruleaza.php

Pornesc o copie a site-ului într-un dosar temporar, cu chei de unică folosință, pe serverul PHP încorporat, și verifică protocolul, cheile, conținutul, versiunile, imaginile, accesul la fișierele interne, antetele și jurnalul, inclusiv atacurile: cod PHP trimis ca conținut, imagini cu cod ascuns, ../ în adrese, lanț de jurnal modificat de mână.

nginx

.htaccess nu se aplică pe nginx. Echivalentul minim:

location ~ ^/(app|sabloane|date)(/|$) { deny all; }
location ~ /\.(?!well-known/) { deny all; }
location ~* \.(zip|tar|gz|tgz|7z|rar|sql|bak|old|orig|swp)$ { deny all; }
location ~* ^/media/.+\.(php[0-9]?|phtml|phar|pht|shtml|cgi|pl|py|sh)$ { deny all; }
location = /mcp { rewrite ^ /mcp.php last; }
location / { try_files $uri /index.php$is_args$args; }

Limitări cunoscute

  • post_max_size al găzduirii limitează mărimea imaginilor urcate (base64 adaugă ~33%).

  • Căutarea și listele citesc toate fișierele JSON la fiecare cerere: potrivit pentru zeci sau sute de elemente, nu pentru zeci de mii.

Licență

MIT — vezi LICENSE. Poți folosi, modifica și distribui codul, inclusiv comercial, cu condiția să păstrezi mențiunea de copyright.

Available Tools

26 tools
cautaCaută în conținutA
Read-onlyIdempotent

Caută un text în titlul, descrierea și conținutul paginilor și articolelor (inclusiv ciorne). Întoarce și fragmentul găsit.

ParametersJSON Schema
NameRequiredDescriptionDefault
tipNo
textYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavioral context beyond the annotations: it clarifies the scope (including drafts) and the return value (fragment). Given that readOnlyHint, idempotentHint, and destructiveHint are already present, the description's added detail is valuable and consistent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, compact sentence that immediately conveys the purpose. It fronts the action and scope, with no wasted words. Structure is exemplary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple search tool with no output schema, the description covers key aspects: search targets, inclusion of drafts, and return of fragment. It does not detail search semantics (case sensitivity, pagination, etc.) but these are not essential for basic use. The description is sufficiently complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for undocumented parameters. It does not mention 'text' or 'tip' explicitly. While it implies text search and mentions pages/articles (hinting at the enum), it fails to explain parameter meanings or usage. The description adds little beyond the schema itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (search), the resource (title, description, content of pages and articles, including drafts), and the return value (the found fragment). It is specific enough to distinguish from other tool names like 'listeaza' or 'citeste'. No ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: search for text in content. However, it does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions or alternative tools. Since no sibling tool serves a similar search function, the implied usage is acceptable but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

citesteCitește o pagină sau un articolA
Read-onlyIdempotent

Tot elementul, cu conținutul HTML, exact cum e salvat.

ParametersJSON Schema
NameRequiredDescriptionDefault
tipYes"pagina" = pagină fixă (Despre, Contact; "acasa" e prima pagină) · "articol" = articol de blog, cu dată și etichete
slugYesAdresa: litere mici fără diacritice, cifre, cratime. Ex. "despre-noi" → /despre-noi. Pagina "acasa" e /.

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds meaningful behavioral detail beyond those annotations by stating that the tool returns the whole element with HTML content exactly as saved, which clarifies output fidelity and the lack of transformation. This is useful context, though it does not cover authentication or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no filler or repetition. It is appropriately sized for a simple read tool, though it could have added more value by including usage guidance. Still, every word earns its place and the output-relevant detail is front and center.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity, the strong annotations, and the complete input schema, the description is mostly adequate. Since there is no output schema, the description's statement about returning the whole element with HTML content exactly as saved helps fill that gap. It could be more complete by mentioning typical edge cases, but nothing critical is missing for a simple read operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already thoroughly documents both `tip` and `slug`, including enums, patterns, and examples. The description adds no parameter-specific guidance, so it does not improve on the schema. A baseline of 3 is appropriate because the schema carries the full semantic load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title 'Citește o pagină sau un articol' clearly names the action (read) and the resource (page or article), and the schema's `tip` enum reinforces the page/article distinction. However, the description itself ('Tot elementul, cu conținutul HTML, exact cum e salvat.') describes the output rather than explicitly distinguishing this tool from siblings such as previzualizeaza or listeaza, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool instead of alternatives. It does not mention that previzualizeaza, cauta, or listeaza should be used for other cases, and there are no exclusions or prerequisites. The only usable context comes implicitly from the schema parameters `tip` and `slug`, not from the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

citeste_jurnalCitește jurnalulA
Read-onlyIdempotent

Ultimele intrări din jurnal (cine, când, de unde, ce comandă, ce rezultat) și verificarea lanțului: "intact" = niciun rând modificat sau scos.

ParametersJSON Schema
NameRequiredDescriptionDefault
ultimeleNo
doar_problemeNodoar încercări eșuate, refuzuri, erori, blocări

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds useful behavioral detail by stating that it returns the latest journal entries and performs a chain verification, with 'intact' meaning no row was modified or removed. This goes beyond the annotation hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence states the core function and then the expected output detail. There is no filler or redundancy; every part of the description earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description properly explains the response shape (entry fields and chain status), which is sufficient for a read-only tool with two optional parameters. It does not state default limits or sorting, but those are covered by the parameter schema and defaults.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema documents both parameters, with a description for 'doar_probleme' and types/defaults for both. The description says 'ultimele intrări' which aligns with the 'ultimele' parameter, but it does not explicitly map parameters or mention the 'doar_probleme' filter. With 50% schema coverage, the description only partially compensates for the missing parameter explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (jurnal) and a specific verb (citește), and also lists what the entries contain and the chain verification result. This clearly distinguishes it from generic siblings like 'citeste' and 'cauta', which target other resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The tool's purpose is implied by the resource name and description, but there is no explicit statement about when to use this tool versus siblings such as 'citeste' or 'listeaza'. No alternatives, exclusions, or conditions are provided, so the agent must infer the usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

despre_siteDespre site și regulile luiA
Read-onlyIdempotent

Numele, descrierea și adresa site-ului, câte pagini și articole are, ce HTML e permis, cum se formează adresele și ce drepturi are cheia folosită. Cheam-o prima.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to restate safety. It adds useful behavioral context by specifying that the tool also reports what rights the current key has and what content rules apply, which helps the agent plan subsequent calls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single information-dense sentence with no filler, and the imperative 'Cheam-o prima' is a useful directive. It is compact, though the list is long and the call-order instruction appears at the end rather than being front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only, idempotent tool, the description covers the essential returned content and usage order. It does not describe output format or error behavior, but with no output schema and a simple informational purpose, the provided details are sufficient for an agent to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is effectively 100%, so there is little to explain. The description still adds meaning by indicating the kinds of site-wide facts returned, but it does not explicitly mention that no arguments are required; the empty schema already covers that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly communicates what information the tool provides: site identity, description, address, page/article counts, allowed HTML, URL formation, and key permissions. It lacks an explicit operative verb like 'returns' or 'gets', and it does not contrast itself with read siblings such as 'citeste' or 'listeaza', so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Cheam-o prima' explicitly tells the agent to call this tool before others, which is strong usage guidance for a bootstrap/discovery tool. It does not spell out when not to use it or name alternatives, but the first-call instruction gives clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

exportaExportă tot conținutulA
Read-onlyIdempotent

Tot conținutul, pentru o copie de siguranță: identitatea site-ului, paginile și articolele întregi (și ciornele), redirecționările și lista imaginilor, cu amprentele lor. Imaginile se descarcă separat, de la adresele lor.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds useful behavioral context beyond those annotations: it lists the export scope and explicitly notes that images are downloaded separately from their addresses, which is not inferable from the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single well-structured sentence that front-loads the purpose ('All content, for a backup') and then enumerates the included items without redundancy. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only export operation, the description is essentially complete: it states purpose, content scope, and the separate handling of images. It does not describe the output format or delivery mechanism, but no output schema exists and the absence of parameters lowers the burden.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema description coverage is 100%, so the schema leaves no gaps. The description does not need to explain parameters; it correctly focuses on what the export contains.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Exportă') and resource ('tot conținutul'), then enumerates exactly what is included: site identity, full pages and articles with drafts, redirects, and an image list with fingerprints. This clearly distinguishes it from sibling tools like listeaza, publica, or salveaza.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'pentru o copie de siguranță' provides a clear context for when to use this tool. It does not explicitly name alternatives or state when not to use it, but the backup purpose is enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listeazaListează paginile și articoleleA
Read-onlyIdempotent

Lista paginilor și/sau articolelor, fără conținut: slug, titlu, stare (ciorna/publicat), adresă, date.

ParametersJSON Schema
NameRequiredDescriptionDefault
tipNotoate
stareNotoate

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that the result excludes content and lists specific fields, which is useful context. However, it does not mention pagination, ordering, or limits, which could be relevant for a listing tool. It adds moderate value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that front-loads the core purpose and includes the key output details. There is no fluff or redundant phrasing; every word contributes to the meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter listing tool with annotations covering safety, the description is nearly complete. It states the resource type, the fields returned, and the lack of content. It does not mention return format (e.g., array) or ordering, but these are minor omissions for a straightforward list. The absence of an output schema is mitigated by the field enumeration.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It mentions 'paginilor și/sau articolelor' (implying the 'tip' parameter) and 'stare (ciorna/publicat)' (implying the 'stare' parameter). While the enums are self-explanatory, the description ties them to the output fields, providing some added meaning. However, it does not explicitly explain the parameters or their defaults, leaving some inference required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists pages and/or articles without content, and enumerates the returned fields (slug, title, status, address, date). It distinguishes from sibling list tools by specifying the resource (pages/articles) and the 'without content' scope. This is a specific verb+resource that is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the purpose and filtering (by type and status) but does not explicitly state when to prefer this tool over alternatives like 'cauta' (search) or 'citeste' (read). It also does not mention exclusions, such as when content is needed. Usage guidance is implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listeaza_conexiuniListează conexiunile aprobateA
Read-onlyIdempotent

Aplicațiile legate de site prin OAuth (ex. conectorul din claude.ai): nume, unde întorc, dacă au acces acum și cu ce drepturi. Legătura prin cheie în antet (Claude Code) nu apare aici.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful scoping (OAuth vs header-key) and output fields, but it does not describe return format, ordering, or pagination. This is comparable to a safe read-only list tool with moderate added context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences front-load the subject and provide an example plus an exclusion. Every sentence adds information and there is no redundancy with the title or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only list tool, the description is complete: it states what is listed, what fields are returned, and what is excluded. The annotations cover the safety profile, and no output schema exists to explain return values, so the description carries the necessary burden and satisfies it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty, so there are no parameter semantics to clarify. Baseline 4 applies because the description correctly focuses on what the tool returns rather than inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the specific resource (OAuth-linked applications) and the action (list), and enumerates the returned fields: name, redirect target, current access status, and permissions. It also explicitly excludes header-key (Claude Code) links, which distinguishes it from other listing tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states the tool is for OAuth connections and explicitly says header-key links do not appear here, giving the agent a boundary for when not to use it. It does not name a specific alternative for header-key connections, so it stops short of full when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listeaza_fisiereListează documenteleA
Read-onlyIdempotent

Documentele PDF urcate, cu adresele lor /fisiere/..., cele mai noi primele.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description does not contradict them. It adds useful behavioral detail beyond annotations by stating that the response includes /fisiere/ addresses and that results are sorted newest first.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence that front-loads the resource type, then includes scope, address format, and ordering. Every element earns its place and there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read-only list tool, the description covers the essential return information: uploaded PDF documents, their addresses, and newest-first sorting. Annotations cover safety. It does not mention pagination or additional metadata, but these are not clearly necessary given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema requires no clarification. The description still adds semantic value by specifying what is returned, which is the appropriate baseline for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it lists uploaded PDF documents with their /fisiere/... addresses and newest-first ordering. This clearly distinguishes it from sibling list tools such as listeaza_imagini or listeaza_versiuni.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context: use this tool when you need uploaded PDF documents and their addresses. However, it does not explicitly mention when not to use it or how it differs from generic siblings like listeaza, relying instead on the 'PDF urcate' scope.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listeaza_imaginiListează imaginileA
Read-onlyIdempotent

Imaginile urcate în /media/, cele mai noi primele.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by specifying the /media/ path and newest-first ordering, but does not disclose pagination or return format. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, compact phrase with no filler. It front-loads the key scope (/media/) and ordering, and every word contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only listing tool, the path and sort order together with the annotations are sufficient for an agent to call it correctly. It does not mention recursion or pagination behavior, but that is a minor gap given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty, so no parameter documentation is needed. The description adds no parameter detail, which is appropriate here; the baseline for a zero-parameter tool is satisfied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the exact resource ('Imaginile urcate în /media/') and the ordering ('cele mai noi primele'), while the title supplies the action. This makes it clearly distinct from generic listing tools like 'listeaza' and from 'listeaza_fisiere'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use or alternative mention, but the scope 'images in /media/' implies the intended use case. Sibling names like 'listeaza_fisiere' and 'listeaza_versiuni' provide contrast, though exclusions and conditions are left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listeaza_redirectionariListează redirecționărileA
Read-onlyIdempotent

Adresele vechi care trimit (301) spre adrese noi de pe site.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the safety profile is covered. The description adds the 301 redirect context, which clarifies the data returned, but it does not disclose additional behavior such as pagination, ordering, or whether all redirects are returned. Given the annotations, this is a reasonable level of transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, compact phrase that directly states what the tool lists. There is no filler or redundant information. It is front-loaded with the core concept (old addresses) and efficiently communicates the 301 redirect relationship.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool, the description adequately conveys the tool's purpose and the nature of the data returned. It does not specify the output format or fields (e.g., old URL, new URL), but the description implies these. With no output schema, a bit more detail could help, but the tool is simple enough that this is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the baseline for parameter semantics is 4. The description does not need to elaborate on parameters because there are none, and the schema already indicates additionalProperties: false. The description focuses on the tool's output rather than inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: it lists old addresses that issue 301 redirects to new site addresses. This uses a specific verb-resource relationship and distinguishes it from siblings like 'redirectioneaza' (which likely creates redirects) and the generic 'listeaza'. The title reinforces the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: when you need to view existing redirects, use this tool. However, it does not explicitly mention when not to use it or name alternatives, such as 'redirectioneaza' for creating redirects or 'listeaza' for other list types. This is adequate but leaves selection to the agent's inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listeaza_versiuniVersiunile unui elementA
Read-onlyIdempotent

Versiunile salvate automat înainte de fiecare modificare, publicare, retragere sau ștergere. Cele mai noi primele.

ParametersJSON Schema
NameRequiredDescriptionDefault
tipYes"pagina" = pagină fixă (Despre, Contact; "acasa" e prima pagină) · "articol" = articol de blog, cu dată și etichete
slugYesAdresa: litere mici fără diacritice, cifre, cratime. Ex. "despre-noi" → /despre-noi. Pagina "acasa" e /.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, establishing the safety profile. The description adds valuable behavioral context: versions are auto-saved before every modification and are returned newest-first. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with zero redundancy. It front-loads the core purpose and includes the most important behavioral detail (ordering) without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with two fully documented parameters, the description covers the purpose, trigger, and ordering. It does not describe the output fields (e.g., version number, date, author), but given there is no output schema and the tool is read-only, this is a minor gap. The description is adequate for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%: both 'tip' and 'slug' have detailed descriptions with enums, patterns, and examples. The description does not reference parameters, and since the schema fully documents them, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists saved versions of an element, specifies the trigger (auto-saved before modifications/publications/withdrawals/deletions), and notes the ordering (newest first). This distinguishes it from sibling tools like 'listeaza' (lists elements), 'citeste' (reads a single element), and 'restaureaza' (restores a version).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used to view version history but does not explicitly mention when to use it over alternatives like 'restaureaza' (which would consume these versions) or 'citeste' (which reads the current state). The context is clear enough for an agent to infer its use, but no direct routing or exclusions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pagini_de_pornirePaginile de pornire ale unui site nouA
Read-onlyIdempotent

Scheletele paginilor acasă, despre, servicii, contact și confidențialitate, făcute din blocurile comune, cu locuri [[COMPLETEAZĂ: …]]. Nu creează nimic: le completezi cu ce afli de la om, le salvezi ca ciorne cu salveaza, apoi omul le aprobă. Pagina de confidențialitate descrie ce face tehnic acest site și ce e pornit acum pe el (GA4, Cloudflare, video).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag read-only and non-destructive, and the description reinforces this with 'Nu creează nimic'. It adds non-obvious behavior: output is incomplete templates with [[COMPLETEAZĂ]] placeholders, meant to be saved as drafts and approved, plus specific privacy-page content (GA4, Cloudflare, video).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences front-load the resource and composition before adding workflow and privacy context. No redundant or filler content; each sentence adds distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only template-provider, this is complete: it names the included pages, the placeholder format, the save/approve workflow, and the special content of the privacy page. No critical call-time information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters and the schema has no properties, so the schema already fully covers the input surface. The description's mention of placeholders refers to content in the tool's output, not to call parameters, so no additional semantic burden exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific resource—skeleton templates for home, about, services, contact, and privacy pages—and immediately distinguishes it from mutation tools by stating 'Nu creează nimic'. This clearly separates it from siblings like publica or sterge.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit workflow: fill the placeholders from user input, save as drafts using the sibling salveaza, then have the human approve. It also tells the agent when not to expect creation and names the save tool directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

previzualizeazaLink de previzualizareA
Read-only

Un link temporar la care omul vede o ciornă (sau un element programat) exact cum va arăta pe site, înainte de "publica". Linkul expiră după "minute" (implicit 60) și nu e indexat.

ParametersJSON Schema
NameRequiredDescriptionDefault
tipYes"pagina" = pagină fixă (Despre, Contact; "acasa" e prima pagină) · "articol" = articol de blog, cu dată și etichete
slugYesAdresa: litere mici fără diacritice, cifre, cratime. Ex. "despre-noi" → /despre-noi. Pagina "acasa" e /.
minuteNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=true, destructiveHint=false), the description discloses meaningful behavior: the link is temporary, expires after 'minute' (default 60), and is not indexed. It also clarifies that the preview shows the draft as it will appear, not the current live state. These lifecycle details are genuinely valuable and not present in the annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One information-dense sentence packs in purpose, preview scope, expiry control, default value, and indexing behavior with no filler. The structure is slightly run-on, but every element earns its place and the key facts are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple flat 3-parameter tool with no nested objects, the description covers purpose, parameter semantics, expiry, and indexing behavior. The main gap is the absence of an explicit statement of the return value (the generated URL) — implied by the title but never confirmed — and no mention of failure behavior for an unknown slug.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 'tip' and 'slug' with rich descriptions (67% coverage), and the description compensates for the undocumented 'minute' parameter by explaining that it controls link expiry with a default of 60. It does not merely repeat schema content — it adds the behavioral meaning of the one parameter the schema leaves unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise purpose: generating a temporary link that shows a draft or scheduled item exactly as it will appear on the site before publishing. This clearly distinguishes it from siblings like 'publica' (publish), 'citeste' (read), and 'cauta' (search) — it is neither a content mutation nor a retrieval tool, but a preview-link generator.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'înainte de publica' (before publish) and the mention of drafts ('ciornă') and scheduled items ('element programat') give a clear usage context: use it for pre-publish review, not for live content. However, it does not explicitly name alternatives or state when-not-to-use cases, such as when the content is already live.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publicaPublicăA
Idempotent

Face elementul vizibil pe site. Publică doar după ce omul a aprobat conținutul (vezi previzualizeaza). Cu "la" în viitor, elementul e programat: apare singur la ora aceea.

ParametersJSON Schema
NameRequiredDescriptionDefault
laNoopțional: data și ora publicării, ex. "2026-10-01 09:00" (ora României). În viitor = programat; în trecut = păstrează data (ex. la mutarea unui articol vechi).
tipYes"pagina" = pagină fixă (Despre, Contact; "acasa" e prima pagină) · "articol" = articol de blog, cu dată și etichete
slugYesAdresa: litere mici fără diacritice, cifre, cratime. Ex. "despre-noi" → /despre-noi. Pagina "acasa" e /.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description adds key behavior: it makes the element visible, it should be used only after human approval, and with 'la' in the future it schedules automatic publication. This enriches the agent's understanding of timing and workflow. It does not contradict annotations; rather it complements them with scheduling and approval context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loads the core action, and then adds the approval workflow and scheduling behavior. Every clause adds value; no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter publish tool with full schema coverage, no output schema, and helpful annotations, the description covers the essential context: visibility change, approval gate, and scheduling behavior. It could mention the 'la' in the past case, but that is already in the schema's parameter description, so the description is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters are already documented in the schema. The description adds a brief note about 'la' scheduling that reinforces the schema's explanation, but does not significantly extend parameter meaning beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb-resource statement: 'Face elementul vizibil pe site' (makes the element visible on the site), which uniquely identifies the publish action. It also references the sibling 'previzualizeaza' to distinguish the pre-approval preview step, and explains the scheduling nuance with 'la', so an agent can differentiate it from save or retract.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states the precondition: publish only after human approval, pointing to previzualizeaza as the approval step. It also covers the scheduling use case ('cu la în viitor... programat'). However, it does not explicitly mention when not to use it compared with salveaza or retrage, but the approval condition and visibility outcome provide enough context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

redirectioneazaRedirecționează o adresă vecheA
Idempotent

Trimite vizitatorii de la o adresă veche (ex. după schimbarea unui slug, sau de pe un site vechi mutat aici) spre una nouă, de pe acest site, cu 301. Se aplică doar când la adresa veche nu mai e nimic. Cu "la" gol, scoate redirecționarea.

ParametersJSON Schema
NameRequiredDescriptionDefault
deYesadresa veche, ex. "/despre-noi.html" sau "/pagina.php?id=5"
laYesadresa nouă de pe site, ex. "/despre"; "" sau null = scoate redirecționarea

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate idempotentHint=true, destructiveHint=false, and readOnlyHint=false. The description adds the 301 status and the removal behavior when 'la' is empty, which is not covered by annotations. It doesn't contradict annotations and provides useful behavioral context beyond the structured data. The description implies state modification (creating/updating/removing redirects) consistent with the readOnlyHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the main action, and includes a condition and removal semantics. Every sentence carries meaningful information with no filler. The structure is efficient and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two parameters and no output schema, the description covers the core usage, the condition, and the removal behavior. It doesn't mention potential errors, limits, or permissions, but these are not critical for a redirect-setting tool and the annotations cover idempotency and safety. It is complete enough for an agent to call it correctly in most scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for both parameters, so the baseline is 3. The description adds value by clarifying that an empty or null 'la' removes the redirect, which is not fully explicit in the schema (though the schema does note it). It also gives examples in the schema, and the description reinforces the semantics. This goes beyond the schema's raw type definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: sending visitors from an old address to a new one with a 301 redirect. It gives concrete use cases (slug change, old site moved) and explicitly distinguishes itself from the sibling 'listeaza_redirectionari' by focusing on creation/update/removal rather than listing. The verb+resource are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear condition: 'Se aplică doar când la adresa veche nu mai e nimic' (only when the old address has no content). It also explains the removal behavior when 'la' is empty. While it doesn't explicitly name alternatives, the condition is a strong usage guideline that prevents misuse. It could be improved by mentioning that listing redirects is a separate concern, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restaureazaRestaurează o versiuneA

Aduce înapoi o versiune (și un element șters). Revine ca ciornă, ca să fie verificată înainte de publicare; versiunea curentă se păstrează.

ParametersJSON Schema
NameRequiredDescriptionDefault
tipYes"pagina" = pagină fixă (Despre, Contact; "acasa" e prima pagină) · "articol" = articol de blog, cu dată și etichete
slugYesAdresa: litere mici fără diacritice, cifre, cratime. Ex. "despre-noi" → /despre-noi. Pagina "acasa" e /.
versiuneYesidentificatorul din listeaza_versiuni, ex. "20260918-153000"

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds useful behavior beyond annotations: the restored version returns as a draft, the current version is preserved, and a deleted item may also be brought back. These details clarify the non-destructive nature of the operation, which is especially valuable given the annotations only mark the operation as not read-only and not destructive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the primary action, and every sentence adds meaningful behavioral detail. It avoids redundancy and fits the tool's simple scope well.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with three fully documented required parameters and no nested objects, the description provides enough context to invoke it correctly: it clarifies the restore behavior, the draft state, and the preservation of the current version. The lack of explicit return-value details is a minor gap, but the schema and description together cover what the agent needs to know before calling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the input schema already documents all three required parameters thoroughly. The description does not add parameter-level meaning, but with complete schema coverage, the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Aduce înapoi o versiune' (brings back a version) and adds that it can also restore a deleted item. It further distinguishes the operation from publishing by noting the restored version 'Revine ca ciornă', making the purpose clear and unique among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: to restore a previous version as a draft for review. However, it provides no explicit when-not-to-use guidance or references to alternatives, even though the sibling list includes related actions like publare, listare, and publicare.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

retrageRetrage de pe siteA
Idempotent

Trece elementul înapoi în ciornă: dispare de pe site, rămâne salvat.

ParametersJSON Schema
NameRequiredDescriptionDefault
tipYes"pagina" = pagină fixă (Despre, Contact; "acasa" e prima pagină) · "articol" = articol de blog, cu dată și etichete
slugYesAdresa: litere mici fără diacritice, cifre, cratime. Ex. "despre-noi" → /despre-noi. Pagina "acasa" e /.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the operation as non-read-only, idempotent, and non-destructive. The description adds meaningful behavioral context: the element is moved back to draft, disappears from the public site, and remains stored. This is useful beyond the structured annotations, though it does not detail what happens to URLs or existing versions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence that leads with the core action and then clarifies the key consequences. Every word earns its place; there is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with fully described schema fields and informative annotations, the description is almost sufficient. It explains the operation's effect and non-destructive nature. The main missing contextual detail is an explicit statement about preconditions, such as the element needing to be live or published before retraction.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with detailed descriptions for both required parameters ('tip' and 'slug'). The description adds no extra parameter-level information, but the schema already carries the full burden, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear state transition: 'Trece elementul înapoi în ciornă' (moves the element back to draft), and then clarifies the consequences: it disappears from the site but remains saved. This unambiguously differentiates the tool from 'sterge' (delete) and 'publica' (publish) without relying on the tool name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case: unpublish or retract an item while preserving it in the system. However, it does not explicitly say when to prefer this over 'sterge', 'restaureaza', or 'publica', and it does not state prerequisites such as the item needing to be currently published.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

retrage_conexiuneRetrage accesul unei conexiuniA
Destructive

Anulează accesul unei aplicații legate prin OAuth (client_id din listeaza_conexiuni): token-urile ei nu mai merg, iar ca să se lege din nou trebuie aprobată iar, cu cheia. Doar la cererea omului.

ParametersJSON Schema
NameRequiredDescriptionDefault
client_idYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive and non-read-only. The description adds meaningful context by explaining that existing OAuth tokens are invalidated and that reconnection requires a new approval with the key. This goes beyond what annotations alone communicate and does not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence that front-loads the action, then states consequences and policy. Every clause earns its place, and there is no repetition of schema or annotation details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter destructive tool, the description covers the effect, reconnection flow, and a usage policy. It does not mention error behavior for invalid client_id or repeated calls, but given the low complexity and strong annotations, this is not a significant gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by telling the agent that client_id should come from listeaza_conexiuni, making the required parameter actionable. It does not provide format or example values, but for a single string parameter this guidance is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Anulează'), the resource (OAuth-linked application), and the concrete effect (its tokens no longer work). It also references sibling listeaza_conexiuni as the source for client_id, which distinguishes this tool from generic retrage or sterge sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states a clear prerequisite (client_id from listeaza_conexiuni) and a policy constraint ('Doar la cererea omului'), telling the agent when this tool is appropriate. It does not explicitly discuss when-not-to-use or name alternative tools, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

salveazaCreează sau modifică o pagină ori un articolA
Idempotent

Creează elementul (ca ciornă) sau îl modifică. La modificare trimite doar câmpurile care se schimbă; restul rămân. Dacă elementul e publicat, modificarea apare imediat pe site. Versiunea anterioară se salvează automat. HTML-ul e filtrat; "curatari" din răspuns spune ce s-a scos.

ParametersJSON Schema
NameRequiredDescriptionDefault
tipYes"pagina" = pagină fixă (Despre, Contact; "acasa" e prima pagină) · "articol" = articol de blog, cu dată și etichete
slugYesAdresa: litere mici fără diacritice, cifre, cratime. Ex. "despre-noi" → /despre-noi. Pagina "acasa" e /.
autorNodoar la articole: autorul, dacă nu e cel implicit al site-ului
meniuNodoar la pagini: poziția în meniu (la o subpagină: în submeniul părintelui); null = nu apare în meniu
titluNoobligatoriu la creare; devine <h1>
imagineNodoar la articole: coperta, adresa /media/... întoarsă de urca_imagine
parinteNodoar la pagini: slugul paginii din meniu sub care stă în submeniu (un singur nivel); "" = nicio secțiune
eticheteNodoar la articole
descriereNoo frază: apare în Google, în listă și în llms.txt
evenimentNodoar la articole care anunță un eveniment; null = fără eveniment. Site-ul compune din el datele structurate Event (Google), pune ziua evenimentului pe card și așază evenimentele care urmează primele pe prima pagină.
imagine_altNodoar la articole: descrierea copertei
continut_htmlNoobligatoriu la creare; HTML de la <h2> în jos (vezi despre_site)

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds valuable behavioral context beyond annotations: it explains draft creation, immediate publication on update if already published, automatic versioning, and HTML filtering with the 'curatari' response field. This goes beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, front-loaded with the core action, and every sentence adds meaningful operational detail. No fluff or repetition—only essential behavioral information is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 12 parameters and complex conditional logic (some fields only for pages/articles), the description covers the key behaviors an agent needs: creation as draft, update semantics, immediate publication, versioning, and HTML filtering response. The schema handles parameter details and required fields at creation, so the description is reasonably complete. It doesn't mention error conditions or output format, but the schema already provides parameter specifics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds a general instruction to send only changed fields but does not elaborate on any specific parameter semantics beyond the schema. Since schema already fully documents each parameter, the description provides marginal added value here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it creates an element as a draft or modifies it, and the title specifies pages or articles. It conveys the core create/update action for two entity types. However, it doesn't explicitly name alternative sibling tools (like 'publica' or 'sterge') to differentiate itself, so it falls slightly short of the highest bar.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful usage tips: when modifying, send only changed fields; if the element is published, changes appear immediately; previous version is auto-saved. But it doesn't explicitly state when to prefer this tool over siblings like 'publica' or 'restaureaza', leaving that inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

seteaza_siteSetează numele și descrierea site-uluiA
Idempotent

Schimbă identitatea site-ului: numele (antet, titluri, feed), descrierea (Google, feed, llms.txt), autorul implicit al articolelor, limba, culoarea de accent, tema (aspectul), legăturile și textul din subsol, mențiunea despre cine a făcut site-ul, cum se numesc articolele pe site și dacă li se vede data. Trimite doar câmpurile care se schimbă. Schimbarea apare imediat pe tot site-ul; valorile anterioare se păstrează ca versiune și apar în răspuns.

ParametersJSON Schema
NameRequiredDescriptionDefault
ga4Noidentificatorul Google Analytics 4, ex. "G-798XLP278H"; site-ul compune singur eticheta, cu nonce și cu sursele adăugate în CSP. Se trimite DOAR identificatorul, niciodată cod. "" = fără măsurare
logoNosigla din antet: adresa /media/... întoarsă de urca_imagine; "" = fără logo
numeNo
temaNoaspectul site-ului: una dintre temele din despre_site; "" = aspectul implicit
autorNoautorul implicit al articolelor noi
limbaNoex. "ro"
subsolNoo mențiune scurtă, în subsol, pe fiecare pagină (ex. ce nu oferă site-ul, sau firma și CUI-ul); "" = fără
culoareNoculoarea de accent, ex. "#6d2be8"
faviconNoiconița din tab: adresa /media/... a unei imagini pătrate (PNG); "" = fără
legaturiNocelelalte site-uri și conturi ale aceluiași autor: apar în subsol, pe fiecare pagină, și în datele structurate ca "sameAs" (așa știu Google și Bing că sunt ale aceleiași entități). Lista goală le scoate.
descriereNoo frază despre site
realizareNocine a făcut site-ul, în subsol, pe rândul cu ©, ex. "Website realizat cu AI și miniCMS"; "" = fără
arata_dataNo"da" = data publicării apare pe articol și pe carduri (potrivit unui blog); "" = nu apare (implicit). Datele rămân oricum în sitemap, feed și datele structurate.
nume_articoleNocum se numesc articolele pe site, un cuvânt la plural cu litere mici, ex. "ghiduri": apare în meniu, pe prima pagină și în liste ("Ultimele ghiduri", "Toate ghidurile"). Adresa rămâne /articole. "" = "articole"
realizare_urlNoadresa spre care duce mențiunea "realizare" (https://...); "" = mențiunea fără link. Nu intră în "sameAs": realizatorul nu e un profil al autorului

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (idempotentHint=true, destructiveHint=false), the description discloses genuinely additive behavior: changes propagate immediately site-wide ('Schimbarea apare imediat pe tot site-ul'), prior values are retained as versions and surfaced in the response, and only changed fields are applied. This informs the agent about side effects and response content that annotations alone cannot convey; it only stops short of auth, rate-limit, or version-retention-limit details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The action is front-loaded in the first clause and the scope sweep is dense but complete, touching all 15 parameters without padding. Each of the three sentences earns its place: scope, partial-update instruction, and behavioral consequences. It is near the upper bound of acceptable length and would scan slightly better with bulleted enumeration, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter write tool with no output schema, the description covers the critical contextual gaps: what changes, that changes are immediate and site-wide, that old values are versioned and returned, and that partial payloads are expected. The residual gap is that the response format beyond 'versions appear' is unspecified, and since no output schema exists, the description carries that burden only partially.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 93% schema description coverage, the baseline is 3 per the rubric: the schema already explains each parameter deeply, including ga4's CSP/nonce behavior, legaturi's sameAs semantics, arata_data's sitemap/feed caveat, and realizare_url's exclusion from sameAs. The description adds only the global partial-update rule, which mildly informs how parameters should be sent but does not substantively supplement the per-parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('Schimbă identitatea site-ului') and enumerates the full scope: numele, descrierea, autorul, limba, culoarea, tema, subsol, realizare, nume_articole, arata_data. This makes the tool's job unambiguous and its scope broader than the title suggests, but it never names a sibling to differentiate itself, so an agent must infer the boundary between site-identity settings and content operations like salveaza or despre_site.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides one operational rule — 'Trimite doar câmpurile care se schimbă' — signaling partial-update semantics, and the field list implies the tool is for site-identity changes. However, it offers no explicit when-to-use versus when-not-to-use guidance and no alternative routing, which is a real gap given 25 siblings including salveaza and despre_site that could plausibly overlap with 'setting' something about the site.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stergeȘterge (reversibil)A
Destructive

Scoate elementul de pe site și din listă, mutându-l între versiuni. Se poate reface cu "restaureaza".

ParametersJSON Schema
NameRequiredDescriptionDefault
tipYes"pagina" = pagină fixă (Despre, Contact; "acasa" e prima pagină) · "articol" = articol de blog, cu dată și etichete
slugYesAdresa: litere mici fără diacritice, cifre, cratime. Ex. "despre-noi" → /despre-noi. Pagina "acasa" e /.

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive and non-read-only, and the description adds valuable behavior beyond that: the deletion is reversible, the item is moved between versions, and it can be restored with 'restaureaza'. It also discloses that the effect is both 'de pe site' and 'din listă', which is useful for the agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler: the primary action is front-loaded, and the reversibility/restore info follows immediately. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation with strong annotations, the description covers the core behavior, scope, and reversibility. It does not describe the return format or post-condition details, but those are not essential for selecting and invoking this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are fully documented in the schema itself, including enum values, patterns, and examples. The description adds no extra parameter semantics, which is acceptable given the high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete action and resource: it removes an element from the site and the list, moving it between versions. This clearly identifies the tool as the reversible deletion operation for pages/articles, and the mention of 'restaureaza' plus the sibling 'sterge_fisier' helps distinguish it from file deletion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: delete a content element (page/article) rather than a file. However, the description does not explicitly give when-to-use or when-not-to-use guidance, nor does it name alternatives such as 'sterge_fisier' for files or 'retrage' for publication status.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sterge_fisierȘterge un document (reversibil)A
Destructive

Mută documentul între versiuni: adresa lui nu mai răspunde. Refuză dacă o pagină sau un articol are link spre el, afară de cazul forteaza=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
numeYesnumele din listeaza_fisiere, ex. "raport-anual-2025.pdf"
forteazaNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructiveHint=true), the description discloses that deletion is reversible, that the file's address no longer responds, and that backlinks cause a refusal with a force override. This is valuable behavioral context that the annotations alone do not provide, and it does not contradict the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, no filler. The core behavior is front-loaded, and the refusal/force condition follows immediately, making the description easy to parse and act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no output schema and strong annotations, the description covers the action, reversibility, and the guard condition. It does not detail return values or version mechanics, but those are not essential for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema describes 'nume' with a source and example, but leaves 'forteaza' undocumented. The tool description supplies the critical meaning of forteaza by tying it to the link-refusal override, compensating well for the 50% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description frames the action as moving a document between versions so its address stops responding, which clearly signals a reversible delete on a specific file resource. The title adds 'reversibil', distinguishing it from a permanent delete, though the phrasing is somewhat euphemistic and does not explicitly contrast it with the sibling 'sterge'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides one explicit usage condition: the tool refuses to act when a page or article links to the file, unless forteaza=true. However, it does not state when to choose this tool over alternatives like 'sterge' or 'restaureaza', leaving that routing to the agent's inference from sibling names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sterge_imagineȘterge o imagine (reversibil)A
Destructive

Mută imaginea între versiuni. Refuză dacă e folosită undeva, afară de cazul forteaza=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
numeYesnumele din listeaza_imagini
forteazaNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint=true, but the description adds meaningful context: the operation is a reversible move between versions, not a permanent deletion, and it refuses to act when the image is in use unless forteaza=true. This goes beyond the structured hints and clarifies the actual behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and followed by the key refusal condition. There is no filler, no repetition of schema details, and every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter mutation with no output schema, the description covers the operation, reversibility, and the force override. It does not describe the response format or exactly what 'between versions' entails, but the essential calling decision is well supported.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema documents nume as 'numele din listeaza_imagini', but forteaza is only a bare boolean with a default. The description compensates by explaining that forteaza=true bypasses the usage check, giving the undocumented parameter concrete meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Mută') and resource ('imaginea'), and clarifies the reversible nature by saying the image is moved between versions rather than permanently erased. It implicitly distinguishes itself from permanent-delete siblings like sterge_fisier, but it does not explicitly name alternatives, so it stops short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives such as sterge_fisier, sterge, or restaureaza. The conditional 'Refuză dacă e folosită undeva, afară de cazul forteaza=true' describes behavior rather than providing usage context or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

urca_fisierUrcă un document PDFA
Idempotent

Urcă un document PDF (cel mult 25 MB) și întoarce adresa /fisiere/.pdf, de pus într-un link în conținut (ex. Descarcă raportul (PDF)). Numele îl dai tu și rămâne adresa documentului. Trimite FIE "url" (adresa https a unui PDF public: serverul îl descarcă singur, adresele interne sunt refuzate; așa merg și documentele mari), FIE "continut_base64" (cel mult ~6 MB). Doar PDF: conținutul se verifică, nu numele. Dacă numele există deja cu alt conținut, înlocuirea cere inlocuieste=true: adresa rămâne, versiunea veche se păstrează.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoadresa https a PDF-ului, ex. "https://exemplu.ro/documente/raport.pdf"
numeNonumele documentului, devine adresa: ex. "subiectiv-despre-identitatea-nationala.pdf"; la "url" poate lipsi (se ia din adresă)
inlocuiesteNotrue = pune noul conținut la aceeași adresă, peste un document existent (cel vechi rămâne între versiuni)
continut_base64Nofișierul codat base64 (se acceptă și data:application/pdf;base64,...)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly=false, destructive=false), the description discloses size limits for both modes, the security behavior of refusing internal addresses, magic-byte content verification ('conținutul se verifică, nu numele'), and full replacement semantics: inlocuieste=true is required to overwrite, the address stays stable, and the old version is retained. This is exactly the behavioral context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five dense sentences, front-loaded with purpose and return value before moving to modes, validation, and replacement rules. Each sentence carries distinct information; the example link is slightly redundant but pedagogically useful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-param tool with two mutually exclusive modes, validation rules, and versioning semantics, the description covers the essential decisions: mode selection, naming behavior, replacement, and return format. Minor gaps: the exact failure/error behavior on invalid PDFs is not described, and the output format is informally given rather than structured.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics beyond the schema: the either/or exclusivity between url and continut_base64, the differing size ceilings, and the consequence of inlocuieste=true (old version kept). This meaningfully compensates wherever the schema is terse.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Urcă un document PDF') and states the concrete return value (the /fisiere/<nume>.pdf address for embedding in links). The PDF-only constraint and max size scope clearly distinguish it from sibling upload tools like urca_imagine.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit routing guidance between the two upload modes: url for public PDFs up to 25 MB (server fetches it) and continut_base64 for files up to ~6 MB, plus a warning that internal addresses are refused. It doesn't explicitly name sibling alternatives (e.g., when to prefer urca_imagine), but the PDF-only constraint implies the exclusion boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

urca_imagineUrcă o imagineA
Idempotent

Urcă o imagine JPEG/PNG/GIF/WebP (cel mult 5 MB) și întoarce adresa /media/... de folosit în conținut sau drept copertă. Trimite FIE "url" (adresa https a unei imagini publice: serverul o descarcă singur, adresele interne sunt refuzate), FIE "continut_base64" (doar pentru imagini mici). Când poza e la om (telefon, calculator, atașată în chat), nu o coda: cheamă link_urcare și dă-i omului linkul.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoadresa https a imaginii, ex. "https://exemplu.ro/poze/coperta.jpg"
numeNonume descriptiv, ex. "coperta-ghid-dimineata.png"; extensia se stabilește din conținut; la "url" poate lipsi (se ia din adresă)
continut_base64Nofișierul codat base64 (se acceptă și data:image/...;base64,...)

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description discloses significant behavioral details: the server downloads the image itself from a public URL, internal addresses are rejected, base64 is only for small images, and the output is a /media/ address. Nothing contradicts the annotations, and the extra context helps an agent predict side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence in the description earns its place. The core action and return value are front-loaded, input modes are clearly delineated with FIE...FIE, and the alternative tool routing is given as a final concise instruction. No filler, no repetition of schema field names without added value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 3 optional parameters, no required fields, and no output schema, the description is complete: it explains the purpose, the input alternatives, size limits, format restrictions, the return type, and when to use a different tool. An agent has enough information to call this correctly in most scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already covers all three parameters with descriptions, the tool description adds critical constraints not in the schema: 'url' and 'continut_base64' are mutually exclusive alternatives, 'nume' can be omitted when using 'url', the extension is inferred from content, and base64 may include a data:image prefix. This is essential for correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Urcă o imagine'), the accepted image formats (JPEG/PNG/GIF/WebP), the size limit (max 5 MB), and the specific return value (/media/... address). It also differentiates from sibling link_urcare by explicitly naming it as the alternative for images on a person's device. This leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use and when-not-to-use guidance: send either 'url' or 'continut_base64', and explicitly says when the image is with the person (phone, computer, chat), do not encode it but call link_urcare and provide the link. It also mentions that internal addresses are refused, preventing a class of invalid calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 26 tool updatesv0.19.1
    • First observedcauta
    • First observedciteste
    • First observedciteste_jurnal
    • First observeddespre_site
    • First observedexporta
    • First observedlink_urcare
    • First observedlisteaza
    • First observedlisteaza_conexiuni
    • First observedlisteaza_fisiere
    • First observedlisteaza_imagini
    • First observedlisteaza_redirectionari
    • First observedlisteaza_versiuni
    • First observedpagini_de_pornire
    • First observedprevizualizeaza
    • First observedpublica
    • First observedredirectioneaza
    • First observedrestaureaza
    • First observedretrage
    • First observedretrage_conexiune
    • First observedsalveaza
    • First observedseteaza_site
    • First observedsterge
    • First observedsterge_fisier
    • First observedsterge_imagine
    • First observedurca_fisier
    • First observedurca_imagine

TDQS

A3.8/5.0

Scored across 26 tools

Disambiguation4/5

Most tools are clearly separated by resource and action, and the descriptions are specific enough to guide an agent. The main risk is the delete/unpublish family (sterge, retrage, sterge_imagine, sterge_fisier), which can look similar at a glance but is differentiated in the descriptions.

Naming Consistency3/5

All names are lowercase snake_case, which helps readability, but they mix conventions: many are bare verbs (listeaza, citeste, sterge), others are verb_noun (sterge_imagine, urca_fisier), and a few are noun phrases (despre_site, pagini_de_pornire, link_urcare). This is still understandable but not a consistent predictable pattern.

Tool Count2/5

At 26 tools, the server sits above the 25+ threshold and is heavy even for a mini-CMS with media, files, redirects, and connection management. The number of choices increases the chance of mis-selection and would benefit from consolidation.

Completeness5/5

The set covers the full lifecycle for the main content resources: save, read, list, search, publish, retract, delete, restore, preview, versions, redirects, media, files, export, and connection management. There are no evident dead ends in the described domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers