push_contempt_mcp
This MCP server lets an AI assistant operate a WooCommerce store via the push_contempt plugin, with preview/confirm safety for sensitive changes and tools for SEO and competitor analysis.
Search/list products and inspect prices, stock, SKUs; run catalog health checks, low-stock reports, and sales reports.
List/filter WooCommerce orders and read full order details, including customer data when needed.
Create draft simple products with images, SEO fields, and ALT text; scan local product folders; list draft products.
Calculate bulk category price updates, apply approved updates, and prepare/confirm/cancel single-product price edits via browser automation.
Read, bulk-read, update, and restore Yoast SEO fields for products; update category SEO; read real Yoast analysis.
Analyze competitor sites or saved HTML pages for SEO/content/style, score their SEO structure, remove saved analyses, and check text similarity.
Purge site cache manually after out-of-band changes.
Basic utility tools: add two numbers and return a greeting.
Connects directly to the WordPress MySQL database for fast catalog reads and product folder name comparisons.
Provides tools for managing a WooCommerce catalog, including listing products, creating draft products with images and SEO, bulk price updates, inventory checks, sales reports, and cache purging.
Integrates with WordPress through a companion plugin's REST API, Application Passwords, and wp-admin browser automation to manage WooCommerce data and settings.
Allows reading and writing Yoast SEO fields (SEO title, meta description, focus keyword) for WooCommerce products and product categories.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@push_contempt_mcp check my WooCommerce catalog for products missing images or categories"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
push_contempt_mcp
Server MCP in Python (SDK mcp 2.x, classe MCPServer) per gestire un
catalogo WooCommerce da un assistente AI (Claude Code e altri client MCP),
in coppia con il plugin WordPress push_contempt (repo separato). La
maggior parte dei tool sono client sottili della REST API di quel plugin
(nessun accesso diretto al DB, funziona anche su hosting che blocca
connessioni MySQL esterne); un numero ridotto di operazioni passa invece
da automazione browser (Playwright) su wp-admin, quando serve poter
rivedere una modifica prima che diventi effettiva.
Per l'installazione completa (plugin + server + collegamento con
l'assistente AI, in ordine) vedi HOWTO.md.
Configurazione
Copia .env.example in .env e compila:
WP_SITE_URL— URL del sito WordPress.WP_APP_USER/WP_APP_PASSWORD— Application Password di WordPress (wp-admin → Utenti → Profilo → Password per le applicazioni), usata dalla maggior parte dei tool per chiamare la REST API del pluginpush_contempt. Il plugin la genera in automatico dal tab "Impostazioni" (un click, non serve WP-CLI). Le Application Password native di WordPress non scadono da sole.WP_ADMIN_USER/WP_ADMIN_PASSWORD— credenziali di login wp-admin, usate solo dai tool che passano da automazione browser (modifica prezzo singolo con anteprima, SEO categoria). Il browser Playwright gira in modalità headed (non headless): su alcuni host la build Chromium "fallback" (OS non ufficialmente supportato) ha problemi di rendering in headless, vedi i commenti inbrowser_tools.py. Serve quindi un display disponibile (DISPLAY).Sessione e captcha: il login passa da una sessione salvata in
.auth/wp_admin_state.json(permessi 600, in.gitignore): finche' il cookie e' valido non si rifa' il login, nemmeno dopo un riavvio del server. Se serve un nuovo login, la somma Jetpack Protect viene risolta da sola, mentre il reCAPTCHA "Non sono un robot" va spuntato a mano nella finestra del browser (si aspetta fino a 2 minuti).
Related MCP server: WooCommerce MCP Server
Versioni
Il server e il plugin push_contempt hanno lo stesso numero di
versione e lo cambiano insieme a ogni pubblicazione (stesso tag, per esempio v0.1.14 su entrambi). Per
funzionare bene usa le due parti con lo stesso numero: se un tool risponde che una rotta non esiste, il plugin
sul sito è più vecchio del server. Il server si aggiorna con git pull, il plugin reinstallando lo zip della
pagina Releases.
Tool disponibili
Catalogo
lista_prodotti— ricerca testuale nel catalogo: titolo, sku, scorte, tipo (simple, variable, grouped, external) e prezzo. Un prodotto variabile o raggruppato non ha un prezzo solo:prezzoè null e si leggonoprezzo_mineprezzo_max(le varianti in vendita), piùnumero_varianti. Gli stessi campi sono inleggi_seo_prodotto.controllo_salute_catalogo— prodotti pubblicati ma incompleti (nessuna immagine in evidenza, nessuna categoria, prezzo non valido, descrizione troppo corta).prodotti_sotto_scorta— prodotti esauriti o sotto una soglia di scorte. Di un prodotto variabile compaiono anche le singole varianti esaurite o sotto soglia (variante,variante_id); quelle che ereditano le scorte dal padre non si ripetono.report_vendite_prodotti— più venduti e mai venduti in un periodo.
Ordini (sola lettura, richiedono il plugin ≥ della versione che include
/ordini)
lista_ordini— ordini filtrabili per stato WooCommerce (pending,processing,on-hold,completed,cancelled,refunded,failed; non esiste uno stato "evaso") e per finestra temporale (ultime_ore,piu_vecchi_di_ore,da/a). L'elenco non contiene dati personali oltre alla città di spedizione.dettaglio_ordine— un singolo ordine con righe, importi, date e dati del cliente (nome, email, telefono, indirizzi).
Creazione prodotti
scansiona_cartella_prodotti— confronta una cartella locale con il catalogo e separa i prodotti nuovi da quelli già presenti. Le cartelle sono lo specchio dell'albero delle categorie di WooCommerce, a qualsiasi profondità (fino a 5 livelli): una cartella con foto o un.txtè un prodotto, le cartelle sopra di lei sono il suopercorso_categoria(Indumenti/Magliette/Maglietta rossa/= prodotto «Maglietta rossa» nella categoria Magliette, dentro Indumenti). Confronta i percorsi con le categorie del sito (sola lettura) e restituisce per ogni prodottopiano_categorie(per ogni livello: esiste / da_creare / conflitto), piùcategorie_da_creare,conflitti_categorieeda_controllare(cartelle dubbie).crea_prodotto— crea un prodotto WooCommerce in bozza (titolo, descrizione, prezzo, categoria opercorso_categoria, immagini: la prima diventa quella in evidenza, le altre vanno in galleria), con SEO e ALT delle immagini già impostati nella stessa chiamata. Non viene mai pubblicato in automatico: resta da rivedere e pubblicare da wp-admin (o conpubblica_prodotti, su richiesta e con la conferma dell'utente). La risposta includeavvisi_seo(densità frase chiave, sottotitoli H2/H3, link interni) da controllare prima di considerare il prodotto pronto.crea_prodotto_variabile— comecrea_prodottoma per un prodotto con varianti (colori, memoria, taglie): una variante per ogni combinazione degli attributi, tutte allo stesso prezzo e senza scorte, sempre in bozza. Parte dall'anteprima (anteprima=True, predefinita): non scrive niente, nemmeno immagini o categoria, e mostra le varianti che nascerebbero. Solo conanteprima=Falsecrea davvero. Due modi per dare gli attributi, vedi sotto.prodotti_in_bozza— elenco dei prodotti creati e non ancora pubblicati.Blog (articoli scritti dall'assistente, sempre in bozza):
leggi_brief_blogesalva_brief_blog(argomento, pubblico, tono, lingua, lunghezza, categorie di prodotti, note eottimizza_aeo_geo: attivo, il brief includeregole_aeo_geo, le regole AEO/GEO contenute nel server),contesto_blog(negozio, prodotti con indirizzo e immagine, articoli già presenti),lista_articoli_blog,leggi_articolo_blog,carica_immagine_blog(immagine dell'utente con ALT),crea_articolo_bozzaeaggiorna_articolo_bozza. Le due ultime restituisconoavvisisui controlli on-page (frase chiave, H2, titolo SEO e meta description, link interni ed esterni, lunghezza rispetto al brief, segnaposto). Un titolo già usato viene rifiutato e un articolo pubblicato non si modifica da qui. Il server istruisce l'assistente a usare solo informazioni verificabili e a non pubblicare mai.pubblica_prodotti— pubblica bozze (max 50 per volta). Azione visibile a tutti, sempre in due tempi: l'anteprima (predefinita) non pubblica niente, elenca cosa verrebbe pubblicato con gli avvisi (niente immagine, SEO vuota...) e cosa no con i motivi (niente prezzo, varianti sbagliate), e restituisce uncodice_conferma; la pubblicazione vera lo richiede e il plugin la rifiuta se anche un solo prodotto è cambiato dopo l'anteprima.lista_categorie_prodotti— l'albero delle categorie con id, percorso, livello, prodotti e indirizzo.crea_categoria_prodotti— crea una categoria da sola (senza prodotti), alla radice o sotto un'altra: serve quando la categoria deve esistere prima (per esempio «Indumenti» prima di spostarci sotto «Magliette»). Anteprima di default. Un nome esiste una volta sola nell'albero (se c'è già, anche in un altro ramo, rifiuta e dice dove), al massimo 5 livelli. Una categoria vuota non è visibile a nessuno, quindi non serve il codice di conferma.sposta_categoria_prodotti— sposta una categoria (con le sottocategorie) sotto un'altra o alla radice. Stessa regola: anteprima con percorso e indirizzo prima/dopo, prodotti coinvolti e avvisi (WordPress non crea il redirect 301: il vecchio indirizzo resta raggiungibile con canonical sul nuovo), poi l'azione vera solo con ilcodice_conferma.
Categorie: l'albero delle cartelle
Con
percorso_categoria(es.["Indumenti", "Magliette"]) le categorie che mancano si creano una dentro l'altra, quelle che esistono già si riusano (il confronto ignora maiuscole e spazi) e il prodotto va solo nella categoria più in basso: quelle sopra lo mostrano comunque. Senzapercorso_categoriavale lacategoriasingola di sempre.Un nome di categoria esiste una volta sola in tutto l'albero. Se sul sito c'è già una categoria con quel nome in un altro punto (la cartella vuole
Indumenti > Magliette, il sito haAbbigliamento > Magliette), o ce n'è più di una, o lo stesso nome compare in due rami delle cartelle, non si crea niente (né prodotto né categorie): il plugin risponde con un errore 409 che dice dove sta la categoria e dove la vorrebbe la cartella, e la scansione lo segnala già inproblemi_categorie. Va sistemato a mano (spostando la cartella o la categoria), non aggirato.Cartelle dubbie, non caricate e riportate in
da_controllare: una cartella con foto o testo e sottocartelle con altri prodotti, e un prodotto fuori da una cartella di categoria.
Prodotti variabili: i due modi
Preciso (
riga_varianti): nel file di testo del prodotto una riga sola che comincia convarianti:, con gli attributi separati da|e i valori da virgola:varianti: Colore: Nero, Bianco | Memoria: 256 GB, 512 GB(4 varianti). La legge il server senza interpretarla (scansiona_cartella_prodottila restituisce già letta invarianti); se è scritta male dà un errore chiaro. I nomi e i valori non possono contenere|né virgole.Automatico (
attributi): se la riga non c'è, l'assistente ricava gli attributi dal testo libero. È comodo ma può sbagliare: leggere male un valore, inventarne uno, scambiare una frase descrittiva per una variante. Per questo l'assistente deve usare solo valori scritti davvero, chiedere se il testo è ambiguo e mostrarti l'anteprima aspettando il tuo ok prima di creare. Controllala sempre.Regole comuni, controllate dal plugin prima di scrivere: al massimo 4 attributi e 50 varianti, niente valori doppi o vuoti, prezzo numerico maggiore di zero con il punto come decimale. Se qualcosa fallisce a metà, il plugin toglie quello che aveva già creato.
Prezzi o scorte diversi per variante e foto per variante non sono gestiti: si cambiano dopo da wp-admin.
Prezzi
calcola_aggiornamento_prezzi/applica_aggiornamento_prezzi— aggiornamento prezzi in blocco per categoria (percentuale o delta fisso), con anteprima da far approvare prima di scrivere.prepara_modifica_prezzo_prodotto/conferma_modifica_in_corso/annulla_modifica_in_corso— modifica prezzo di un singolo prodotto in due fasi via browser (compila e mostra uno screenshot da controllare, poi salva o scarta).
SEO
lista_stato_seo_prodotti— vista d'insieme: titolo SEO e meta description impostati o mancanti su tutto il catalogo.leggi_seo_prodotto/leggi_seo_prodotti_selezionati/aggiorna_seo_prodotto— lettura/scrittura dei campi Yoast (titolo SEO, meta description, parola chiave focus) di uno o più prodotti. Solo I/O: l'ottimizzazione dei testi la fa chi chiama i tool. Il plugin tiene base e precedente di ogni prodotto (originedice chi ha scritto).ripristina_seo_prodotti— rimette i campi Yoast di uno o più prodotti come nella base (punto di partenza, di norma lo stato originale di Yoast) o nel precedente (la versione sostituita dall'ultima scrittura); la versione lasciata diventa il precedente, quindi si può tornare indietro. I prodotti mai modificati non si toccano. Ridefinire la base non è un tool: lo fa solo l'utente dalla tab SEO.leggi_descrizione_prodotto/aggiorna_descrizione_prodotto— descrizione lunga e breve di un prodotto (HTML filtrato come in un articolo WordPress). Restituisce prima/dopo; il plugin tiene base e precedente come per la SEO.ripristina_descrizione_prodotti— rimette descrizione e descrizione breve come nella base o nel precedente; la versione lasciata diventa il precedente. I prodotti mai modificati con questi tool non si toccano.leggi_alt_immagini_prodotto/aggiorna_alt_immagini_prodotto— testo ALT dell'immagine in evidenza e della galleria, con la parola chiave focus Yoast a portata di mano. In scrittura si indicano gliallegato_idda cambiare; gli allegati che non sono del prodotto vengono rifiutati.leggi_seo_varianti/aggiorna_seo_varianti— SEO dei prodotti variabili: attributi, varianti (prezzo, SKU, immagine, descrizione) e i problemi trovati, dal più grave; in scrittura descrizione e/o SKU delle varianti (rifiuta varianti non del prodotto e SKU già in uso, consolo_anteprimanon salva). Le immagini delle varianti si trattano con gli strumenti ALT (ruolo «variante»). Le regole per l'assistente e i dati strutturatiProductGroupche genera il plugin sono nella wiki, pagina «SEO dei prodotti variabili».analizza_link_prodotto— i link nella descrizione di un prodotto, divisi in interni, esterni e altri (ancore, mailto, tel), conha_link_in_uscita: la verifica che Yoast segnala più spesso come mancante. Sola lettura.analizza_link_prodotti— la stessa verifica su tutti i prodotti in una chiamata: per ciascuno i totali di link interni ed esterni, più i conteggi complessivi (quanti senza link in uscita, quanti senza link interni); consolo_senza_link_in_uscital'elenco è solo di quelli a cui manca. Per gli indirizzi di un prodotto si usaanalizza_link_prodotto.aggiorna_seo_categoria— stessa cosa per le categorie prodotto (tassonomiaproduct_cat), via browser: per i termini di tassonomia Yoast non rilegge i campi scritti via REST/DB diretto (vedi Note).analizza_seo_sito— analisi a campione del sito di un altro negozio per capire come è fatta la sua SEO e come descrive i prodotti (home, sitemap, qualche categoria, una decina di prodotti). Oltre ai campi SEO (titoli, meta description, H1/H2, dati strutturati) analizza il testo: vocabolario (parole e coppie di parole ricorrenti, unità di misura), segnali di stile e intenzione ogni 1000 parole (inviti all'acquisto, fiducia e servizio, offerte, confronto e guida, tono "tu"/"noi", tecnicismo, lunghezza delle frasi), struttura delle descrizioni e un breve estratto per pagina (caratteri_per_pagina, 600 di default: è quello che pesa sui token), così l'assistente giudica intenzione e tono. Le formule ripetute su tutto il sito (spedizioni, resi, "aggiungi al carrello") sono separate dai contenuti. Gira sul tuo PC, non sul sito WordPress; rispettarobots.txt, fa una pausa fra le richieste. Se l'indirizzo punta a una sezione (es.https://sito.it/telefonia/) l'analisi resta dentro quella sezione (perimetro); se punta a una pagina di categoria (.../smartphone-1001.html) il campione viene dai link di quella pagina, senza sitemap. Metodi, dal più leggero: HTTP; se la home risponde 403/429 o è costruita con JavaScript e il browser è attivo (SEO_ANALISI_USA_BROWSER=1ousa_browser), dopo aver aspettato ilRetry-Aftersi passa a un Chromium vero in locale; se non basta,analizza_pagine_salvate. Conbrowser_visibile(oSEO_ANALISI_BROWSER_VISIBILE=1) il browser si apre con la finestra visibile: alcuni siti rifiutano quello senza finestra. È un tentativo in più dopo un rifiuto, da usare con il consenso dell'utente. Il report dice ilmetodousato. Conusa_curl(scelta esplicita dell'utente) fa le richieste con il programmacurl, sempre con il nostro User-Agent dichiarato; se il sito risponde ancora 429 si ferma, non aggira i blocchi. Rifiuta reti private; per provarlo su un sito localeSEO_ANALISI_CONSENTI_RETE_PRIVATA=1. Vocabolario ed estratti servono ad analizzare: i testi nostri vanno scritti con parole proprie.analizza_pagine_salvate— la stessa analisi su pagine.htmlsalvate dall'utente dal proprio browser (file o cartelle), senza nessuna richiesta di rete: per i siti che bloccano gli strumenti automatici o si costruiscono con JavaScript.controlla_somiglianza— misura quanto un testo nostro somiglia ai testi di un sito analizzato conanalizza_seo_sito(salvati in locale dopo ogni analisi) o a testi dati a mano, su una scala da 0 (nessuna somiglianza) a 9 (copia). Si basa su sequenze di almeno 5 parole consecutive in comune e restituisce punteggio, significato, passaggi coincidenti e fonti più simili. Lasoglia(0-9) è il massimo che l'utilizzatore accetta: con essa il risultato dice anche se il testo è accettabile. Specifiche tecniche uguali alzano un po' il punteggio anche in testi originali, per questo i passaggi sono elencati e il giudizio finale resta all'utilizzatore. Il punteggio è solo un riferimento, non vincolante: va mostrato all'utente e il livello accettato scelto da lui prima di applicare qualsiasi modifica ai prodotti.rimuovi_analisi_sito— toglie un sito dalla tabella «Concorrenti e confronto» della tab SEO (con il suo storico) e, di norma, ne cancella anche i testi salvati in locale; si usa solo su richiesta dell'utente, per esempio quando un report è inutile. Dopo,controlla_somiglianzanon confronta più con quel sito finché non lo si analizza di nuovo. L'utente può anche togliere la riga a mano dalla tab («Togli dalla lista»), che però lascia i testi locali.Il riepilogo di ogni valutazione (punteggi per area con la prova dei criteri, mai i testi delle pagine) viene mandato al plugin (
POST /concorrenti) e compare nella sezione "Concorrenti e confronto" della tab SEO; se l'indirizzo è quello diWP_SITE_URLè marcato come "Il tuo sito" e gli altri mostrano la differenza. Non blocca mai l'analisi (il report ha un campoplugin);SEO_ANALISI_SALVA_NEL_PLUGIN=0lo disattiva.La
valutazionecheanalizza_seo_sitoeanalizza_pagine_salvateaggiungono al report (moduloseo_scorecard.py) dà alla struttura SEO del sito analizzato un punteggio da 0 a 9 per area (titoli, meta description, intestazioni, dati strutturati, contenuto, aspetti tecnici) e complessivo, con la prova di ogni criterio. Dice se il sito è un buon modello da cui prendere spunto: è solo un riferimento, e un sito scadente può essere buono su un'area. Le soglie (lunghezze di titolo e meta, parole minime) sono costanti in testa al modulo. Alcuni difetti gravi pongono un tetto al voto dell'area (ALT mancante a scaglioni: oltre il 15% delle immagini contenuto al massimo 8, oltre il 25% 7, oltre il 35% 6, oltre il 50% 5, oltre il 75% 3; H3 senza H2 su più della metà delle pagine: intestazioni al massimo 6); il report mostra ogni tetto con la sua misura e il suo effetto. Regole decise con l'utente: una meta description vale in base a quanto aggiunge al titolo (testo proprio 1; titolo più frase generica uguale su più della metà delle pagine, o su almeno 3 pagine dello stesso tipo, 0,5; solo il titolo, frase fissa uguale su più della metà delle pagine o scheda incollata 0; con meno di 5 meta utili, lunghezza e unicità pesano in proporzione); gli H1 contano a livelli (uno solo 1; più H1 uguali 0,6; più H1 diversi 0,3; nessuno 0). Prima di proporre testi, all'utente vanno mostrati punteggio e aree, e lui decide se e per quali aree usare il sito come ispirazione.
Manutenzione
purga_cache_sito— invalida manualmente la cache del sito (gli altri tool di scrittura la chiamano già in automatico dove serve).
Comandi
Cosa | Comando |
Installare/aggiornare le dipendenze |
|
Avviare il server (stdio) |
|
Test |
|
Lint / format |
|
Provarlo con MCP Inspector (UI web) |
|
Aggiungere una dipendenza |
|
Struttura
src/push_contempt_mcp/server.py— registrazione dei tool, resource e prompt MCPsrc/push_contempt_mcp/db.py— connessione MySQL diretta, usata solo dove serve davvero (lettura veloce, scansione cartella)src/push_contempt_mcp/product_tools.py— creazione prodotto: client REST + upload immagini su/wp/v2/mediasrc/push_contempt_mcp/pricing_tools.py— aggiornamento prezzi in blocco: client RESTsrc/push_contempt_mcp/inventory_tools.py— scorte: client RESTsrc/push_contempt_mcp/order_tools.py— ordini: client RESTsrc/push_contempt_mcp/sales_tools.py— report vendite: client RESTsrc/push_contempt_mcp/catalog_health.py— salute catalogo: client RESTsrc/push_contempt_mcp/seo_tools.py— lettura/scrittura campi SEO Yoast: client RESTsrc/push_contempt_mcp/competitor_seo.py— scarico e campione di pagine di un sito concorrente, campi SEO (solo libreria standard +requests)src/push_contempt_mcp/seo_scorecard.py— valutazione 0-9 per area della struttura SEO di un sito analizzatosrc/push_contempt_mcp/text_similarity.py— controllo di somiglianza 0-9 fra un nostro testo e quelli analizzati (cache locale dei testi dei concorrenti)src/push_contempt_mcp/competitor_text.py— analisi del testo di quelle pagine: template, vocabolario, segnali di stile e intenzionesrc/push_contempt_mcp/product_sync.py— scansione cartella prodotti locale (lettura diretta dal DB, solo confronto nomi)src/push_contempt_mcp/browser_tools.py— automazione Playwright per le operazioni ancora manuali (prezzo singolo con anteprima, SEO categoria)src/push_contempt_mcp/cache_tools.py— invalidazione cache del sito dopo una scritturasrc/push_contempt_mcp/__init__.py—main(), entry pointtests/— test in-process conmcp.Client(mcp)per il server, test unitari arequestsmockato per i client REST.mcp.json— registra il server in Claude Code quando apri questa cartella
Note
Con trasporto stdio non usare
print(): stdout è riservato al protocollo. Usalogging.SDK 2.x:
FastMCPè stato rinominatoMCPServer(from mcp.server.mcpserver import MCPServer). Molti esempi online sono ancora per la v1.Per Claude Desktop aggiungi lo stesso blocco di
.mcp.jsona~/.config/Claude/claude_desktop_config.json.Per i termini di tassonomia (categorie prodotto)
wp yoast index --reindexnon basta: l'indicizzabile Yoast del termine resta vuoto anche dopo, a prescindere da reindex/cache flush/wp term update. L'unico modo affidabile trovato è salvare davvero dalla UI di modifica categoria (da cuiaggiorna_seo_categoria, via browser) — i campi titolo/meta description lì sono editor Draft.js, non<input>, vanno riempiti cliccando + selezionando tutto + ridigitando, non con.fill().
Available Tools
28 toolsaggiorna_seo_categoriaA
Scrive titolo SEO e meta description di una categoria prodotto, via wp-admin.
A differenza dei prodotti, per le categorie Yoast non rilegge i campi SEO scritti via DB diretto: questo tool passa dalla UI reale di modifica categoria, l'unico modo affidabile di aggiornarli. Invalida anche la cache del sito.
Inputs: term_id (required), titolo_seo (required), meta_description (required).
aggiorna_seo_prodottoA
Scrive titolo SEO, meta description e parola chiave focus di un prodotto
(sovrascrive i valori esistenti). Restituisce prima/dopo per controllo,
perché l'effetto è pubblico (quello che Google mostra in SERP). Invalida
anche la cache del sito. Il plugin tiene la base (stato prima del primo
intervento) e il precedente: l'utente li ritrova nella tab SEO e puoi
rimetterli con ripristina_seo_prodotti. Se i testi si ispirano a un concorrente, passa in
origine il suo sito (es. "concorrente tomatosmartphone.it").
Se i testi nascono da un'analisi di un sito concorrente (analizza_seo_sito o analizza_pagine_salvate), PRIMA di chiamare questo tool: controllali con controlla_somiglianza, mostra all'utente punteggio e passaggi, spiegagli la scala 0-9 e fagli scegliere il livello che accetta; applica solo dopo la sua scelta. Il punteggio e' un riferimento, la responsabilita' e' sua.
Inputs: titolo_seo (required), prodotto_id (required), meta_description (required), parola_chiave_focus (required), +1 more.
analizza_pagine_salvateA
Stessa analisi di analizza_seo_sito (campi SEO, vocabolario, stile e
intenzione, estratti) su pagine .html SALVATE dall'utente dal proprio
browser (file singoli o cartelle), senza nessuna richiesta di rete. Serve per
i siti che bloccano gli strumenti automatici o costruiscono le pagine con
JavaScript (salvare la pagina gia' caricata). Il tipo di pagina (home,
categoria, prodotto) si deduce dall'indirizzo che la pagina dichiara; sito
e' solo un'etichetta per quelle che non lo dichiarano. Valgono le stesse
regole d'uso di analizza_seo_sito: testi originali, mai copiati, e
controlla_somiglianza prima di applicarli.
Inputs: percorsi (required), sito, caratteri_per_pagina.
analizza_seo_sitoA
Analizza a campione il sito di un altro negozio (di norma un concorrente) per capire come e' fatta la sua SEO e come descrive i prodotti: scarica la home, la sitemap, qualche categoria e una decina di prodotti (dura qualche decina di secondi: rispetta robots.txt e fa pause fra le richieste).
Il report contiene, oltre ai campi SEO (titoli, meta description, H1/H2,
dati strutturati, ALT), il TESTO analizzato: vocabolario (parole e coppie
di parole ricorrenti, unita' di misura), segnali di stile e intenzione ogni
1000 parole (inviti all'acquisto, fiducia e servizio, offerte, confronto e
guida, tono "tu" o "noi", tecnicismo, lunghezza delle frasi), struttura
delle descrizioni (paragrafi, elenchi, tabelle, video), i messaggi che il
sito ripete ovunque (spedizione, resi, inviti) e, per ogni pagina, un
breve estratto della descrizione. Non esegue JavaScript: se il sito
costruisce le pagine cosi' o serve pagine segnaposto, lo dice negli avvisi.
Rifiuta indirizzi di reti private.
url puo' essere l'indirizzo del sito o di una sua SEZIONE (es.
https://www.euronics.it/telefonia/): in quel caso sitemap e link restano dentro
quella sezione e il report indica il perimetro. Utile per i grandi cataloghi. Se
punta a una PAGINA di categoria (es. .../smartphone-1001.html) il campione si sceglie
fra le sottocategorie e i prodotti che quella pagina elenca, senza usare la sitemap.
COME USARLO: dal report ricava tu l'intenzione (informativa, comparativa, d'acquisto), il tono, cosa il sito enfatizza e come struttura le descrizioni, quali termini e misure usa per la categoria. Poi scrivi testi ORIGINALI per i nostri prodotti, con parole tue: gli estratti servono ad analizzare, non a riusare. Mai copiare frasi, titoli o description del concorrente, e solo cose vere sui nostri prodotti. Prima di applicare i testi con i tool SEO (aggiorna_seo_prodotto, crea_prodotto) passali a controlla_somiglianza, fai scegliere all'utente il livello di somiglianza che accetta e mostragli l'anteprima.
Il riepilogo dei punteggi (senza i testi delle pagine) viene mandato anche al plugin,
che lo mostra nella tab SEO di wp-admin; plugin nel report dice se e' stato salvato.
Se l'indirizzo e' quello del sito dell'utente, e' segnato come "Il tuo sito".
caratteri_per_pagina e' la lunghezza dell'estratto di ogni pagina (0 =
nessun estratto, massimo 2000): e' quello che pesa sui token del report.
max_categorie e max_prodotti alzano il campione fino a un tetto (10 e 30).
I testi analizzati restano salvati in locale per controlla_somiglianza.
Il report ha una valutazione della struttura SEO del sito da 0 a 9, per area
(titoli, meta description, intestazioni, dati strutturati, contenuto, aspetti
tecnici) e complessiva, con la prova di ogni criterio: dice se il sito e' un buon
modello. E' SOLO UN RIFERIMENTO: un sito scadente puo' essere buono su un'area.
Prima di proporre testi ispirati al sito, mostra all'utente punteggio e aree e
chiedigli se vuole usarlo come ispirazione e per quali aree; non decidere tu.
usa_curl: fa le richieste con il programma curl invece che con la libreria
Python (stesso User-Agent dichiarato, stesso rispetto di robots.txt, pause e
Retry-After: se il sito risponde ancora 429 si ferma). Usalo SOLO se l'utente
lo chiede esplicitamente, tipicamente per un sito che risponde 429 alla
libreria ma non a curl: e' una sua scelta e una sua responsabilita'.
Non cambiare User-Agent e non aggirare altri blocchi.
usa_browser: attiva il metodo con un browser vero (Chromium in locale, con il
suo User-Agent di serie, senza scaricare immagini e video). Funziona anche per i
siti costruiti con JavaScript. L'utente puo' attivarlo una volta per tutte con
SEO_ANALISI_USA_BROWSER=1; imposta questo parametro solo se l'utente lo chiede.
Con il browser attivo la scala e': HTTP; se la home risponde 403/429 o sembra
costruita con JavaScript, si aspetta il Retry-After e si passa al browser. Il
report dice il metodo usato. Se nemmeno il browser basta, l'errore suggerisce
analizza_pagine_salvate.
browser_visibile: come usa_browser ma con la finestra del browser visibile sullo
schermo dell'utente (SEO_ANALISI_BROWSER_VISIBILE=1 per averlo sempre). Alcuni siti
rifiutano il browser senza finestra e non quello visibile. Usalo solo se l'utente lo
chiede o lo approva dopo un rifiuto (403/429) anche con usa_browser: e' un tentativo
in piu' contro un rifiuto del sito, non il metodo predefinito.
Inputs: url (required), usa_curl, usa_browser, max_prodotti, +3 more.
annulla_modifica_in_corsoA
Scarta la modifica in sospeso da un tool prepara_*, senza salvare.
Inputs: no named parameters.
applica_aggiornamento_prezziA
Scrive i nuovi prezzi (lista approvata, stessa forma dell'output di
calcola_aggiornamento_prezzi: ogni elemento serve id e
prezzo_regolare_nuovo). Scrittura diretta sul DB, aggiorna anche la
lookup table di WooCommerce, e invalida la cache del sito (altrimenti il
prezzo nuovo non si vedrebbe online pur essendo corretto nel DB).
Inputs: aggiornamenti (required).
calcola_aggiornamento_prezziA
Prodotti semplici di una categoria con prezzo attuale e quello calcolato (percentuale, es. 10/-15, oppure delta fisso in valuta, es. -5: specificarne solo uno). Solo lettura - da far rivedere all'utente prima di chiamare applica_aggiornamento_prezzi. I prodotti variabili della categoria sono elencati a parte, esclusi dal calcolo.
Inputs: categoria (required), delta, percentuale.
conferma_modifica_in_corsoA
Salva (click su 'Aggiorna') la modifica lasciata in sospeso da un tool prepara_*, e invalida la cache del sito (altrimenti la modifica non si vedrebbe online).
Inputs: no named parameters.
controlla_somiglianzaA
Misura quanto un testo NOSTRO somiglia ai testi di un sito analizzato con analizza_seo_sito (o a testi dati a mano), su una scala da 0 a 9: 0 = nessuna somiglianza, 9 = copia. Usalo su ogni testo scritto prendendo spunto da un concorrente (descrizioni, titoli SEO, meta description) PRIMA di applicarlo.
Come si calcola: sequenze di almeno 5 parole consecutive in comune (maiuscole
e punteggiatura ignorate). Il punteggio e' il piu' alto fra la quota di parole
del nostro testo coperta da quelle sequenze e la lunghezza della sequenza piu'
lunga. Circa: 1-2 coincidenze occasionali, 3-4 qualche frase in comune, 5-6
parti ricalcate, 7-8 riscrittura appena ritoccata, 9 copia. Specifiche
tecniche e nomi di prodotto uguali alzano un po' il punteggio anche in un
testo originale: guarda passaggi_simili per distinguere.
Il punteggio e' SOLO UN RIFERIMENTO per l'utilizzatore, non e' vincolante e la
responsabilita' dei testi pubblicati e' sua. Per questo: PRIMA di applicare
qualsiasi modifica ai prodotti, mostragli punteggio, significato e passaggi
simili, spiegagli la scala e chiedigli quale livello accetta (soglia, 0-9);
non sceglierla tu e non applicare nulla finche' non ha deciso. Con la soglia
il risultato include accettabile. Se il testo la supera, proponi una
riscrittura con parole tue (cambiando la struttura delle frasi, non solo
qualche parola) e ricontrolla; l'ultima parola e' dell'utente.
sito limita il confronto a un sito (es. "casualbay.it"); vuoto = tutti quelli
analizzati. riferimenti aggiunge testi da confrontare a mano.
Inputs: testo (required), sito, soglia, riferimenti.
controllo_salute_catalogoA
Prodotti pubblicati ma incompleti: nessuna immagine in evidenza,
nessuna categoria, prezzo mancante/zero/non valido (solo prodotti
semplici - quelli variabili non hanno un prezzo proprio), descrizione
più corta di soglia_descrizione caratteri. Prodotti senza problemi
non compaiono nel risultato.
Inputs: soglia_descrizione. Returns: result
crea_prodottoA
Crea un nuovo prodotto WooCommerce IN BOZZA (titolo, descrizione, prezzo,
categoria, immagini), con SEO e ALT immagini gia' impostati in automatico:
non serve piu' chiamare aggiorna_seo_prodotto dopo. La prima immagine
diventa quella in evidenza, le altre vanno nella galleria. Il prezzo va
scritto con il punto come decimale. alt_immagini deve avere un elemento
per ogni immagine (stesso ordine di percorsi_immagini). La risposta include
avvisi_seo: se non vuoto, la descrizione non rispetta ancora densita'
della frase chiave, sottotitoli o link interni - da sistemare. Non viene
pubblicato: resta da rivedere e pubblicare da wp-admin (vedi
prodotti_in_bozza e la tab "Carica prodotti" del plugin), quindi non
serve invalidare la cache del sito.
Se i testi nascono da un'analisi di un sito concorrente (analizza_seo_sito o analizza_pagine_salvate), PRIMA di chiamare questo tool: controllali con controlla_somiglianza, mostra all'utente punteggio e passaggi, spiegagli la scala 0-9 e fagli scegliere il livello che accetta; applica solo dopo la sua scelta. Il punteggio e' un riferimento, la responsabilita' e' sua.
Inputs: titolo (required), categoria (required), titolo_seo (required), descrizione (required), +5 more.
dettaglio_ordineB
Dettaglio completo di un ordine: righe con id prodotto, importi (subtotale, sconto, spedizione, tasse), date di pagamento e completamento, metodo di spedizione, nota del cliente e DATI PERSONALI del cliente (nome, email, telefono, indirizzi). Usalo solo quando serve davvero.
Inputs: ordine_id (required).
leggi_analisi_seo_yoastA
Legge il verdetto REALE di Yoast per un prodotto (problemi, miglioramenti, risultati buoni), cosi' come appare nell'editor di wp-admin - non un'approssimazione: e' l'analisi calcolata da Yoast stesso. Usalo dopo aggiorna_seo_prodotto per sapere se manca ancora qualcosa (es. un link in uscita, lunghezza minima del testo) prima di considerare chiuso il lavoro.
Inputs: prodotto_id (required).
leggi_seo_prodotti_selezionatiA
Stato SEO di una selezione di prodotti in un'unica chiamata (stesso contenuto di leggi_seo_prodotto, per ciascun id). Pensato per il bottone "ottimizza SEO" del plugin: funziona anche su prodotti caricati prima del plugin, non solo su quelli appena creati con scansiona_cartella_prodotti.
Inputs: prodotto_ids (required). Returns: result
leggi_seo_prodottoA
Stato SEO dettagliato di un prodotto (titolo SEO, meta description, parola chiave focus), più titolo/descrizione/prezzo come contesto per scrivere i nuovi testi.
Inputs: prodotto_id (required).
lista_ordiniA
Elenco ordini WooCommerce, filtrabile per stato e finestra temporale.
stato: uno o piu' stati WooCommerce separati da virgola, con lo slug
nativo (non esiste uno stato "evaso"): pending (in attesa di pagamento),
processing (in lavorazione), on-hold (in sospeso), completed
(completato), cancelled, refunded, failed. Vuoto = tutti gli stati.
ultime_ore: solo ordini creati nelle ultime N ore (24 = ultima giornata).
piu_vecchi_di_ore: solo ordini creati da piu' di N ore.
da/a: estremi (YYYY-MM-DD o YYYY-MM-DDTHH:MM, fuso del sito); a con la
sola data include tutta la giornata. I filtri di data si combinano
(intersezione). ordina: "desc" (piu' recenti prima) o "asc".
Restituisce totale_trovati (anche oltre limite, massimo 200) e, per ogni
ordine, numero, stato, data, totale, pagamento, citta' e prodotti: nessun
dato personale oltre alla citta'. Per i dettagli di un ordine usa
dettaglio_ordine.
Inputs: a, da, stato, limite, +3 more.
lista_prodottiA
Elenca i prodotti WooCommerce via REST (titolo, sku, prezzo, scorte).
ricerca filtra per titolo (sottostringa, case-insensitive); vuoto = tutti.
Inputs: limite, ricerca. Returns: result
lista_stato_seo_prodottiA
Vista d'insieme SEO su tutti i prodotti pubblicati o in bozza: titolo SEO e meta description impostati o mancanti, con le rispettive lunghezze, stato e data di creazione. Utile per capire da dove iniziare un'ottimizzazione SEO del catalogo, distinguendo i prodotti appena inseriti da quelli del catalogo consolidato.
Inputs: no named parameters. Returns: result
prepara_modifica_prezzo_prodottoA
Compila il nuovo prezzo regolare di un prodotto in wp-admin, senza salvare.
Operazione sensibile: usa il browser (non il DB diretto) così l'utente puo' controllare lo screenshot prima che la modifica diventi effettiva. Dopo questo tool chiama conferma_modifica_in_corso oppure annulla_modifica_in_corso.
Inputs: prodotto_id (required), nuovo_prezzo_regolare (required).
prodotti_in_bozzaA
Prodotti creati con crea_prodotto e non ancora pubblicati, piu' recenti prima: promemoria di cosa resta da rivedere su wp-admin.
Inputs: no named parameters. Returns: result
prodotti_sotto_scortaA
Prodotti pubblicati esauriti o con scorte sotto soglia (solo quelli
con gestione scorte attiva in WooCommerce - per gli altri conta solo lo
stato esaurito/in attesa, non c'è un numero di scorte attendibile).
Esauriti per primi, poi per scorte crescenti: utile per capire cosa
rifornire con più urgenza.
Inputs: soglia. Returns: result
purga_cache_sitoA
Invalida manualmente la cache del sito (stessa procedura che gli altri tool di scrittura chiamano già in automatico). Utile se qualcosa è stato modificato fuori da questi tool e il frontend mostra ancora contenuti vecchi.
Inputs: no named parameters.
report_vendite_prodottiA
Report vendite per prodotto: più venduti con quantità e ricavo netto,
più i prodotti pubblicati mai venduti (su tutta la storia del negozio).
periodo: uno tra "1_mese", "3_mesi", "6_mesi", "1_anno".
Inputs: periodo.
rimuovi_analisi_sitoA
Toglie un sito analizzato dalla tabella «Concorrenti e confronto» della tab
SEO del plugin (con il suo storico), per esempio perche' il report era
inutile. Con anche_testi_locali (predefinito) cancella anche i testi di quel
sito salvati sul computer dell'utente: dopo, controlla_somiglianza non puo'
piu' confrontare con quel sito finche' non viene analizzato di nuovo.
Usalo SOLO su richiesta esplicita dell'utente, dicendogli quale sito stai
togliendo. Non tocca i prodotti ne' i campi SEO gia' scritti. sito e' il
nome come compare nella tabella (es. "tomatosmartphone.it") o l'indirizzo.
Inputs: sito (required), anche_testi_locali.
ripristina_seo_prodottiA
Rimette titolo SEO, meta description e parola chiave focus di uno o più prodotti come in una delle versioni conservate dal plugin: "base" (il punto di partenza, di norma lo stato originale di Yoast) o "precedente" (la versione da cui si viene, cioè quella sostituita dall'ultima scrittura). La versione che si lascia diventa il "precedente", quindi si può sempre tornare indietro. Un prodotto mai modificato non viene toccato. Restituisce l'esito per ogni id: "ripristinato", "gia_in_uso", "nessuno_snapshot" o "non_trovato". Invalida anche la cache del sito. Usalo solo su richiesta dell'utente: sovrascrive i testi attuali. Non esiste un tool per ridefinire la base: lo fa solo l'utente dalla tab SEO.
Inputs: prodotto_ids (required), versione.
salutaC
Restituisce un saluto per la persona indicata.
Inputs: nome (required), formale. Returns: result
scansiona_cartella_prodottiA
Confronta una cartella locale (<Categoria>/<Prodotto>/ con foto + .txt)
con il catalogo WooCommerce: separa i prodotti già presenti (ignorati) da
quelli nuovi. Non crea né modifica nulla - per i prodotti nuovi restituisce
categoria, percorsi immagini e testo grezzo del .txt, da cui vanno estratti
prezzo e descrizione (leggendo il testo) prima di chiamare crea_prodotto
per ciascuno. Pensato per il bottone "carica prodotti" del plugin.
Inputs: percorso_cartella (required).
sommaC
Somma due numeri.
Inputs: a (required), b (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 28 tools
Most tools map to distinct resources/actions, but there are two overlapping price-update paths (prepara_modifica_prezzo_prodotto + conferma/annulla via browser vs calcola/applica_aggiornamento_prezzi via DB), and leggi_seo_prodotto vs leggi_seo_prodotti_selezionati differ only by batch size. The junk tools somma and saluta add further confusion with no clear domain role. Descriptions do help disambiguate the main flows.
Nearly all names are Italian snake_case with a readable verb_noun/noun_qualifier pattern (leggi_seo_prodotto, aggiorna_seo_prodotto, lista_ordini, dettaglio_ordine). Minor deviations are noun-only names like prodotti_in_bozza and prodotti_sotto_scorta, plus the generic somma/saluta. Overall consistent and predictable.
28 tools is on the heavy side for the apparent scope, and the surface spans several sub-domains (SEO, products, pricing, orders, competitor analysis). Most tools earn their place, but somma and saluta are clearly extraneous filler that inflate the count. Borderline between well-scoped and bloated.
Strong coverage of the SEO and pricing lifecycle (read, write, restore snapshots, similarity checks, cache invalidation) plus order reporting. Minor gaps: no product delete/update-general tool, no category listing, and single-product detail is only via leggi_* rather than a full get. Core workflows are well covered.
Maintenance
Related MCP Connectors
Run a WooCommerce store from Claude: reports, SEO, prices, stock. You approve every change first.
Let your AI manage WooCommerce and Shopify stores: products, SEO, descriptions and images.
WooCommerce MCP server for ChatGPT, Claude and any AI agent: list orders, update order status, create refund, create coupon, update product and get sales report in your own WooCommerce account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to WooCommerce yourself; Cotlet does not store your password and you need no WooCommerce API key. About the official WooCommerce API: Yes. WooCommerce has a full REST API (wc/v3) for orders, products, customers, coupons, refunds and reports, and a store owner creates consumer keys for it per store (checked 16 Oct 2026). Setup and FAQ: https://cotlet.dev/integrations/woocommerce-api-mcp-server
Ask Claude or ChatGPT about your WooCommerce sales, stock and orders. Safe edits with undo.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables AI to view and manage e-commerce data such as products, orders, and coupons, and perform actions like updating prices, stock, and generating sales reports.-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to manage WooCommerce stores, including products, orders, customers, categories, coupons, attributes, variations, order notes, refunds, reports, payment gateways, meta data, reviews, settings, data, posts, and system status through natural language.MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to manage online store data through the WordPress REST API, including products, orders, customers, shipping, taxes, coupons, reports, and store settings. It exposes these capabilities as JSON-RPC 2.0 tools that also cover WordPress posts and metadata.-
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to manage an online store's products, variations, orders, refunds, customers, coupons, shipping, taxes, payment gateways, reports, and settings through the WordPress REST API. It also supports WordPress content operations such as creating and updating posts and metadata.MIT