Sari la conținut

Changelog: MCP-ul de administrare VIStudio

Istoricul versiunilor MCP-ului de administrare (https://app.vistudio.ro/mcp), de la cea mai nouă la cea mai veche. Versiunea curentă este 1.15.0, din 28.10.2026; o vezi și în câmpul version întors de whoami. Regulile de versionare (semver) și politica de depreciere de cel puțin 30 de zile sunt pe pagina pentru dezvoltatori.

După o actualizare, reconectează clientul: lista uneltelor și parametrii lor se negociază la conectare.

1.15.0 — 28.10.2026

  • ChatGPT se poate conecta din nou prin CIMD: un document de metadate al clientului care declară none printre metodele de autentificare (lista token_endpoint_auth_methods_supported din SEP-3149 sau câmpul vechi token_endpoint_auth_method) e acceptat ca client public cu PKCE, chiar dacă metoda lui preferată e private_key_jwt. Un document fără none, sau cu o metodă cu secret partajat (client_secret_basic, client_secret_post, client_secret_jwt), rămâne refuzat cu invalid_client. Metadatele serverului nu se schimbă;
  • OAuth: o cerere la /oauth/token sau /oauth/revoke cu client_assertion sau client_assertion_type e refuzată explicit cu invalid_client („client_assertion is not supported by this server: use token_endpoint_auth_method none”), în loc să fie tratată tăcut ca un client public;
  • cheia de sesiune: fiecare conectare are o cheie stabilă, aceeași la toate reînnoirile orare ale tokenului. whoami întoarce câmpul nou session.key (lângă session.id, care rămâne rândul tokenului curent și se schimbă la reînnoire) și câmpul nou clientId, id-ul aplicației: uuid-ul înregistrării dinamice sau adresa documentului CIMD. La cheia API ambele sunt null;
  • agent_sessions_list întoarce câte o intrare pe sesiune (o conectare), nu pe token, cu câmpurile noi sessionKey, clientId și generations; createdAt e al primei generații, iar lastUsedAt, refreshExpiresAt, revokedAt și active sunt ale ultimei. Lista nu mai e tăiată la 200 de rânduri;
  • jurnalul agenților din admin reține, la fiecare acțiune nouă, sesiunea și id-ul aplicației: doi agenți care lucrează cu același utilizator (de exemplu ChatGPT și Claude, sau două conversații ale aceleiași aplicații) se deosebesc;
  • limita de 120 de apeluri pe minut se socotește pe sesiune și nu se mai resetează la reînnoirea tokenului;
  • fără unelte noi. Descrierile actualizate ale lui whoami și agent_sessions_list se văd după reconectarea clientului.

1.14.0 — 25.10.2026

  • unealtă nouă page_table_edit: schimbă celule sau rânduri dintr-un bloc table fără să retrimită blocul. Operațiile (setCell, hideRow, showRow, insertRow, removeRow, moveRow) se aplică în ordine, cu indexuri de la 0 care numără și rândurile ascunse; un index în afara tabelului refuză tot apelul (invalid), fără nimic scris; o cheie sau o operație necunoscută e refuzată înainte de unealtă, ca eroare de validare a parametrilor. Lucrează pe o singură limbă (locale obligatoriu) și are dry_run; răspunsul întoarce tabelul rezultat (table: { columns, rows, hidden });
  • bloc nou de pagină table: titlu și/sau legendă, stil default sau board, 1–8 coloane (cu aliniere), rânduri cu câte o celulă pe coloană, rânduri ascunse, rând evidențiat și legătură opțională pe rând. Apare în blocks_schema și block_template; regula „fiecare rând are exact câte celule are capul” e verificată în block_validate, page_block_insert, page_block_update, page_blocks_set, pages_create și pages_create_many, iar mesajul numește rândul. Rândurile ascunse lipsesc din llms-full.txt și din Markdown-ul paginii, unde tabelul apare ca tabel Markdown;
  • argument nou accent în pages_create, pages_create_many și pages_update (none, blue, green, yellow, orange, red, purple, teal, pink): un indiciu de culoare pentru pagină, pe care tema site-ului îl poate folosi; pages_get și pages_tree îl întorc (none când lipsește), iar pages_update cu dry_run îl arată în changes. pages_create_many primește și hideTitle, ca pages_create;
  • blocul image-gallery (galeria cu lightbox) se poate pune acum și pe pagini, nu doar în articole;
  • settings_update acceptă tiktok în rețelele sociale, iar settings_get îl întoarce;
  • modulul nou search (căutarea pe site) poate apărea în modules din region_info și regions_list; îl pornește administratorul platformei, pe fiecare site. Nu adaugă unelte MCP;
  • descrierile și parametrii noi se văd după reconectarea clientului.

1.13.0 — 24.10.2026

  • planul de site: task_link refuză acum cu conflict un task revendicat activ de alt agent, ca task_update; plan_apply_structure refuză cu conflict, înainte de orice scriere și și la dry_run, când un task pe care l-ar anula (sau E9.0, al cărui text îl rescrie) e ținut de alt agent, iar mesajul listează cheile și cine le ține. Administratorul site-ului trece;
  • regula revendicării se aplică acum pe orice cale: o modificare din adminul web sau din API-ul REST pe un task revendicat activ de alt agent primește 409 plan_task_claimed, fără nimic scris; eticheta clientului din revendicare se schimbă doar la o revendicare nouă sau la eliberare;
  • un blocaj reciproc în baza de date pe scrierea unei pagini (de exemplu o pagină publicată exact când părintele ei e redenumit) nu mai iese internal: Failed query: …, ci conflict: [page_busy] …, fără nimic scris: reîncearcă după câteva secunde. Se aplică uneltelor de pagini și lui translate_document / translation_unlock când documentul e o pagină. Cursa în sine nu mai apare: redenumirea părintelui așteaptă publicarea copilului;
  • OAuth: POST /oauth/revoke pe o sesiune ale cărei site-uri aprobate au fost toate șterse răspunde 200 (înainte, 500); sesiunea e revocată, iar reînnoirea ei dă invalid_grant;
  • fără unelte noi și fără schimbări în parametrii uneltelor. Descrierea actualizată a lui plan_apply_structure se vede după reconectarea clientului.

1.12.0 — 23.10.2026

  • câmp nou theme.release în design_schema, design_get și design_validate: { tag, version, schema }, release-ul temei pe care rulează site-ul și schema după care se validează designul ("release" = schema acelui release; "current" = schema curentă a temei, când release-ul nu are o schemă proprie);
  • un site fixat pe un release mai vechi al temei își păstrează opțiunile: design_validate, design_draft_set, design_restore, design_submit și design_publish validează după schema acelui release (înainte, după schema curentă a temei), iar themeVersion al versiunii salvate e versiunea release-ului;
  • o valoare zecimală aflată pe pasul opțiunii (de exemplu 0.3 la pasul 0.1) nu mai e refuzată din cauza erorilor de rotunjire; 0.35 la pasul 0.1 rămâne refuzat;
  • la schimbarea temei site-ului, opțiunile pe care tema nouă nu le are sau nu le permite revin la valorile implicite, într-o versiune activă nouă cu nota „Schimbarea temei …”, vizibilă în design_versions și design_get;
  • fără unelte noi. Descrierea actualizată a lui design_schema se vede după reconectarea clientului.

1.11.4 — 22.10.2026

  • plan_delete: un subtask mutat într-un alt plan pleacă odată cu task-ul lui părinte și intră în numărul tasks din refuz, din dry_run și din deleted (înainte rămânea în celălalt plan, ca task de nivel superior);
  • frontend_update, frontend_set_page_role, frontend_set_homepage și frontend_set_blog_page nu mai pică cu „invalid selections” când pagina de start, pagina de blog sau o pagină cu rol (about, contact, privacy, terms, pricing) e în coș: legătura păstrată trece, iar una nouă spre o pagină din coș e refuzată cu [link_target_trashed];
  • posts_delete și posts_unpublish (și cu dry_run) întorc linkedFrom și linkedFromNote: ce trimite la articol (blocurile și textul paginilor și articolelor, redirecturile, meniurile);
  • avertismentul warning al uneltelor settings_menu_* spune acum că legăturile spre coș au devenit text și nu mai blochează alte salvări;
  • OAuth: un client_id cu caractere de control sau mai lung de 512 caractere primește invalid_client (la /oauth/authorize direct, fără redirect; 401 la /oauth/token și /oauth/revoke), nu 500 server_error;
  • OAuth: redirectul automat la erorile de la /oauth/authorize și eticheta „aplicație cunoscută” de pe pagina de consimțământ se dau doar pe adresa de callback a aplicației (https://claude.ai/api/mcp/auth_callback, https://claude.com/api/mcp/auth_callback, https://chatgpt.com/connector/oauth/<id>), în forma ei canonică; adresele loopback rămân de încredere pe orice cale și port. Pentru altă adresă de pe aceste gazde, adminul afișează eroarea, fără s-o urmeze;
  • pagina de consimțământ: butoanele devin active abia la primul gest pe pagină (mișcarea mouse-ului, o tastă) sau la 1 s după ce fereastra primește focus; o decizie trimisă la mai puțin de 1 s de la afișarea paginii e refuzată (400), iar o pagină de consimțământ deschisă înainte de actualizare răspunde „Formular invalid sau expirat”: conectarea se reia din aplicație;
  • fără unelte noi și fără schimbări în parametrii uneltelor.

1.11.3 — 22.10.2026

  • traducerea automată pornește de la versiunea publicată a limbii principale, nu de la ultima ciornă: o ciornă salvată imediat după publicare nu mai ajunge în limbile traduse înaintea limbii principale, ci odată cu publicarea ei; un document retras înainte să ruleze traducerea nu mai e tradus și republicat. Descrierea translate_document și autoTranslate.note din translation_status o spun;
  • design_preview_url: calea cerută e verificată pe fiecare segment, și după decodare; segmentele goale, . și .. (și codate, de exemplu %2e sau %252e), %2f, %5c, ~, caracterele de control și codările invalide sunt refuzate cu invalid, iar mesajul le numește;
  • design_schema: exemplul are culorile în forma normalizată de server (#rrggbb, litere mici), deci design_validate pe el întoarce conversions: [];
  • sugestiile „Did you mean …?” recunosc și sinonimele pentru umbra cardurilor (shadows, card shadow, card elevation și altele);
  • posts_create și posts_update întorc o eroare când autorul articolului nu poate fi salvat, în loc de un succes fals;
  • fără unelte noi și fără schimbări în parametrii uneltelor.

1.11.2 — 22.10.2026

  • un bloc citit cu pages_get se poate trimite înapoi neschimbat la page_blocks_set, page_block_insert, page_block_update, pages_create, pages_create_many și block_validate: câmpurile adăugate la citire (href și publicHref din legături, în ambele formate) sunt scoase înainte de validare; înainte, orice bloc cu o legătură era refuzat cu link: must NOT have additional properties. Altă cheie necunoscută e refuzată în continuare;
  • o legătură (CTA, card, blocul de redirect, linkul din text, redirectul) salvată într-o ciornă cu id-ul unei pagini, al unui articol sau al unui fișier media din alt site nu mai întoarce calea sau adresa acelei ținte: href e null (în pages_get cu format: json și în previzualizare); legăturile din același site nu se schimbă;
  • pages_delete și pages_unpublish pe o pagină dinamică publicată (o listare, inclusiv pagina de blog) întorc în gone căile ei, pe limbi (înainte, gone: []); la mutarea unei astfel de pagini, platforma creează și redirectul 301 automat, iar redirects_list și redirects_test îi văd calea;
  • OAuth: POST /oauth/token (reînnoirea tokenului sau schimbul de cod) pe o sesiune ale cărei site-uri aprobate au fost toate șterse întoarce 400 invalid_grant, nu 500; nimic nu se revocă, iar clientul reia autorizarea. O reînnoire picată lasă valabil vechiul refresh token, deci clientul poate reîncerca;
  • pașii de reconectare după un scope nou sunt în skill-urile administer-site și design-site și în ghidul de conectare: în Claude Code, /mcp → conectorul → Clear authentication, apoi Authenticate; în claude.ai, Disconnect, apoi Connect (Re-authenticate păstrează scope-urile vechi);
  • region_clone_check (mode=plan) nu mai numără printre referințele fără pereche legăturile care n-au avut niciodată o referință în sursă;
  • fără unelte noi și fără schimbări în parametrii uneltelor.

1.11.1 — 22.10.2026

  • două salvări sau publicări simultane ale aceleiași pagini trec acum pe rând, așa că o alegere de meniu făcută în admin nu se mai pierde; dacă pagina e ocupată mai mult de 10 secunde, uneltele răspund conflict: [page_busy] …, fără nimic scris: reîncearcă după câteva secunde;
  • o salvare a unei pagini-părinte oprită de salvarea simultană a unei subpagini răspunde conflict: [child_resave_busy] … (înainte, internal: [child_resave_failed]), fără nimic scris: reîncearcă;
  • traducerea automată nu mai ține pagina ocupată cât traduce, doar cât scrie limbile traduse;
  • fără unelte noi și fără schimbări în parametrii uneltelor.

1.11.0 — 22.10.2026

  • stratul de CSS al designului: pe site-urile unde administratorul platformei l-a pornit, o versiune de design poate avea și un CSS propriu, filtrat și limitat la conținutul paginii (nu poate acoperi antetul, subsolul sau bannerul de cookie-uri). Argument opțional nou css la design_validate și design_draft_set; design_get întoarce cssLayer și css, design_validate, design_draft_set și design_restore întorc css, iar design_schema are limits.cssLayer. Refuzuri noi: design_css_disabled (stratul e oprit pe site) și design_css_invalid (cu codurile filtrului, css_*);
  • formularele: ce întoarce forms_get se poate trimite înapoi neschimbat la forms_update. Câmpul ascuns reference e acceptat (doar name și required): valoarea lui e titlul documentului ales ca sursă în blocul formularului, goală fără sursă, deci required: true are sens doar dacă fiecare bloc are sursa setată; fields[].label și submitButtonLabel acceptă null (submitButtonLabel: null șterge eticheta butonului);
  • jurnalul agenților arată documentul corect pentru fiecare unealtă (articole, etichete, sedii, media, formulare, setări, plan, task-uri); task_link întoarce și id, iar plan_apply_structure întoarce planId;
  • clonarea unui site: avertismentul pentru o legătură fără referință în sursă spune că tipul și referința nu au fost setate niciodată;
  • fără unelte noi. Descrierile uneltelor atinse se văd după reconectarea clientului.

1.10.0 — 21.10.2026

  • legăturile spre o pagină mutată în coș sau ștearsă nu mai blochează salvarea: o legătură existentă, în același câmp, rămâne, iar o legătură nouă spre o pagină din coș e refuzată cu [link_target_trashed] (sau [link_target_deleted] pentru o pagină ștearsă);
  • pages_delete (și cu dry_run) întoarce linkedFrom și linkedFromNote: ce trimite la pagină (blocuri, text, redirecturi, meniuri, rolurile din front-end), ca să le schimbi înainte sau după;
  • redirects_list marchează cu broken redirecturile spre o țintă din coș sau ștearsă (cu brokenTotal și note), iar redirects_coverage întoarce brokenRedirects; redirects_update pe un redirect fără țintă cere o țintă nouă;
  • settings_update întoarce convertedMenuLinks și convertedNote când un element de meniu rămas fără țintă a devenit text;
  • pages_delete și pages_undelete lucrează în limba principală a site-ului: o pagină doar în română nu mai capătă un rând gol în engleză;
  • fără unelte noi. Descrierile uneltelor atinse se văd după reconectarea clientului.

1.9.0 — 21.10.2026

  • redirecturi automate: când se schimbă calea publică a unei pagini sau a unui articol publicat (slug, părinte, slug-ul tradus), platforma creează singură redirectul 301 de la adresa veche, pe fiecare limbă, și pentru subpaginile publicate (iar la pagina de blog, pentru articole); fără lanțuri și fără bucle;
  • pages_publish, posts_publish, iar pages_update / posts_update când publică direct, întorc redirects: { created, updated, deleted }; pages_unpublish, pages_delete, posts_unpublish și posts_delete întorc gone, căile care nu mai răspund;
  • redirects_list arată și redirecturile spre articole (to.type: 'post', postId), iar redirects_test le urmărește, pe calea publicată a articolului;
  • mutarea paginii de blog repornește site-ul, ca noua rutare să se aplice; pages_publish o spune în note;
  • forms_delete cu confirm: true șterge formularul și trimiterile lui într-o singură operație (înainte, o ștergere picată putea pierde trimiterile); refuzul fără confirm spune câte trimiteri are formularul;
  • plan_delete cu confirm: true șterge planul, task-urile și toate comentariile lor (și pe ale altor utilizatori) într-o singură operație; răspunsul are deleted.comments, iar refuzul fără confirm numără și comentariile;
  • două publicări programate ale aceluiași document (pages_publish / posts_publish cu at) nu mai rulează simultan; ștergerea definitivă a unei pagini sau a unui articol îi scoate programările;
  • formulări ca „în toate limbile”, „și în engleză” sau „multilingv” nu mai sunt luate drept o cerere de traducere manuală: agentul scrie doar în limba principală, iar platforma traduce restul (instrucțiunile serverului, policy din whoami și descrierile uneltelor de scriere);
  • fără unelte noi. Descrierile uneltelor atinse se văd după reconectarea clientului.

1.8.0 — 21.10.2026

  • câmp nou mcpOnly în răspunsul whoami: regiunile sesiunii pe care contul lucrează doar prin MCP și o notă pentru agent; null când nu există. Bifa „Doar prin MCP” o pune administratorul platformei pe contul agentului, pe fiecare site. Pe aceste site-uri contul are rolul lui doar prin MCP (OAuth sau cheie API); în adminul web și în API-ul REST nu are mai mult decât un vizitator anonim, deci agentul lucrează doar cu uneltele MCP;
  • regula de lucru recomandată: fiecare agent are contul lui, separat de contul persoanei pentru care lucrează;
  • fără unelte noi și fără schimbări în parametrii uneltelor.

1.7.1 — 20.10.2026

  • schimbarea paginii de blog (frontend_set_blog_page) și a limbilor site-ului (region_languages_update) repornește acum site-ul, ca noua rutare să se aplice; înainte, un site altfel neschimbat rămânea pornit cu rutarea veche;
  • descrierea și câmpul note din răspunsul lui frontend_set_blog_page spun că repornirea durează 1–2 minute și cum o verifici: până când /api/health al site-ului arată un startedAt nou, lista articolelor răspunde pe calea veche;
  • region_languages_update spune același lucru în descriere și în note, alături de nota despre conținutul limbilor scoase;
  • doar texte: fără unelte noi și fără schimbări în parametrii uneltelor.

1.7.0 — 20.10.2026

  • posts_get întoarce conținutul articolului ca Markdown în câmpul nou markdown;
  • content din posts_get e depreciat: e o copie identică a lui markdown și dispare după 19.11.2026 (versiunea 2.0.0); citește markdown;
  • în ChatGPT, posts_get ajungea ca {}, fiindcă lanțul ChatGPT pierde rezultatul unei unelte care are un câmp content la primul nivel; clientului ChatGPT nu i se mai trimite content, deci primește articolul întreg;
  • fără unelte noi și fără schimbări în parametrii uneltelor.

1.6.0 — 20.10.2026

  • Agent Skill nou get-started (https://app.vistudio.ro/.well-known/agent-skills/get-started/SKILL.md): promptul pe care îl copiezi în chat-ul agentului tău ca să-l pornești. Agentul conectează MCP-ul, află site-ul cu whoami, face un raport doar-citire al stării lui și continuă cu tine pe regulile serverului. Promptul în română e pe pagina Pornește un agent AI pe site-ul tău;
  • ghidul de conectare (https://app.vistudio.ro/mcp/guide) are secțiunea „Pornește un agent nou”, cu același prompt;
  • fără unelte noi și fără schimbări în parametrii uneltelor.

1.5.0 — 20.10.2026

  • slug-ul dat explicit rămâne al documentului: un slug trimis la pages_create, pages_create_many, pages_update, posts_create, posts_update sau tags_create, diferit de cel derivat din titlu, nu mai e rescris din titlu când documentul e deschis în admin;
  • câmp nou slugLocked (pe limbă): true = slug-ul urmează titlul, false = rămâne cel dat; în pages_get, posts_get, posts_list, pages_tree și în răspunsurile scrierilor;
  • pages_update și posts_update primesc slugLocked, care blochează sau deblochează slug-ul fără să-l schimbe;
  • pages_get și posts_get întorc note pe o limbă fără conținut propriu (tradusă de platformă la publicare sau lipsă): câmpurile goale nu sunt o eroare.

1.4.0 — 19.10.2026

  • dry_run la uneltele care șterg (pages_delete, posts_delete, media_delete, forms_delete, redirects_delete, offices_delete, plan_delete): nu scrie nimic, nici cu confirm: true;
  • un parametru care nu e în schema uneltei refuză apelul cu invalid și „Did you mean …?” (înainte era ignorat); region la o unealtă care nu-l are și confirm în plus sunt ignorate, cu nota ignored;
  • titlurile cu caractere de control sunt refuzate.

1.3.0 — 18.10.2026

  • unelte noi pentru designul site-ului: design_schema, design_get, design_validate, design_preview_url, design_versions, design_draft_set, design_restore, design_submit, design_publish; scope nou mcp:design. Un design nu se publică niciodată direct: design_publish cere rolul de admin, mcp:publish și confirm: true.

1.2.0 — 12.10.2026

  • frontend_update primește whenToUse, textul secțiunii „When to use” din llms.txt (pe limbă, cel mult 1000 de caractere); settings_get îl întoarce în site.whenToUse;
  • pages_publish, și publicarea programată, adaugă pagina în meniurile alese în admin, în secțiunea „Meniu” a paginii;
  • mutarea unei pagini în coș (pages_delete) și ștergerea ei definitivă o scot din meniuri;
  • uneltele settings_menu_* raportează converted când transformă în text un element de meniu spre o pagină din coș sau inexistentă;
  • restaurarea unei versiuni din admin rulează în limba principală a site-ului (pages_restore rula deja așa).

1.1.0 — 12.10.2026

  • unelte noi: pages_schedule_cancel și posts_schedule_cancel (anulează programările active ale unei pagini sau ale unui articol, fără să schimbe documentul);
  • pages_publish și posts_publish primesc at, publicarea programată: o dată și oră ISO 8601 în viitor, cel mult 365 de zile; fără fus orar, ora e cea a României. Ca la orice publicare, agentul cere întâi confirmarea utilizatorului;
  • pages_get și posts_get întorc schedules, programările active;
  • conectarea: CIMD. client_id poate fi adresa https a documentului de metadate al clientului; înregistrarea dinamică rămâne;
  • o salvare de pagină care nu poate actualiza calea unei subpagini întoarce eroarea child_resave_failed și nu scrie nimic (înainte raporta succes fără să scrie);
  • crearea unei pagini a cărei cale nu se poate scrie întoarce eroarea page_breadcrumbs_failed și nu creează nimic (înainte întorcea pagina, deși ea nu exista).

1.0.0 — 12.10.2026

Prima versiune cu politică de versiuni și depreciere. Față de versiunea anterioară:

  • unelte noi: frontend_set_page_role (rolurile de pagină: about, contact, privacy, terms, pricing), region_clone_check și region_clone (doar pentru super-admin);
  • limba principală: paginile, articolele și etichetele se scriu doar în limba principală. Celelalte limbi le traduce platforma la publicare (region_info.autoTranslate, pendingAutoTranslation în pages_tree și content_status). translation_unlock deblochează o limbă doar la cererea explicită a utilizatorului;
  • region_languages_update primește autoTranslateNewDocuments;
  • translation_status are manualLanguages;
  • translate_document traduce și formularele, la cerere (collection: forms);
  • conectarea: scope= în WWW-Authenticate, resource_documentation în metadatele resursei, listChanged: false în capabilități;
  • limitele: retry after N s în rate_limited și Retry-After pe 429-ul OAuth;
  • whoami întoarce version.