Riferimento server MCP

In questa pagina

EmDash include un server Model Context Protocol (MCP) integrato in /_emdash/api/mcp che espone le operazioni di gestione dei contenuti come strumenti per gli assistenti IA.

Questa pagina copre i dettagli del protocollo: autenticazione, trasporto, specifiche degli strumenti, scoperta OAuth e gestione degli errori.

Autenticazione

Il server MCP supporta tre metodi di autenticazione:

MetodoCome funziona
OAuth 2.1 Authorization Code + PKCEFlusso standard per i client MCP. L’utente approva gli scope nel browser.
Personal Access Token (PAT)Token ec_pat_* a lunga durata creati nel pannello di amministrazione.
Device FlowFlusso tipo CLI dove approvi un codice nel browser. Usato da emdash login.

I cookie di sessione (dall’UI di amministrazione) funzionano anche ma non sono pratici per client MCP esterni.

Scope

I token hanno portata limitata per restringere le operazioni che un client può eseguire. Gli scope vengono richiesti durante l’autorizzazione OAuth e applicati ad ogni chiamata di strumento.

ScopeConcede accesso a
content:readElencare, ottenere, confrontare e cercare contenuti. Elencare tassonomie, termini e menu.
content:writeCreare, aggiornare, eliminare, pubblicare, depubblicare, programmare, deprogrammare, duplicare e ripristinare contenuti. Concede implicitamente taxonomies:manage e menus:manage.
media:readElencare e ottenere elementi multimediali.
media:writeRegistrare (creare), aggiornare e eliminare metadati multimediali.
schema:readElencare collezioni e ottenere schemi.
schema:writeCreare e eliminare collezioni e campi.
taxonomies:manageCreare, aggiornare e eliminare termini di tassonomia.
menus:manageCreare, aggiornare e eliminare menu di navigazione e i loro elementi.
settings:readLeggere le impostazioni del sito.
settings:manageAggiornare le impostazioni del sito.
mcp:toolsInvocare strumenti MCP esplicitamente abilitati da qualsiasi plugin.
mcp:tools:<pluginId>Invocare strumenti MCP esplicitamente abilitati da un plugin.
adminAccesso completo a tutte le operazioni.

Requisiti di ruolo

OperazioneRuolo minimo
Lettura contenutiSubscriber (10) per pubblicati; Contributor (20) per bozze, programmati, cestino e revisioni
Creazione contenutiContributor (20)
Modifica/eliminazione propriAuthor (30)
Pubblicazione contenutiAuthor (30) per propri; Editor (40) per quelli altrui
Lettura schemaEditor (40)
Scrittura schemaAdmin (50)
Gestione tassonomieEditor (40)
Gestione menuEditor (40)
Lettura impostazioniEditor (40)
Gestione impostazioniAdmin (50)
Upload multimediale (media_upload)Contributor (20)
Registrazione multimediale (media_create)Author (30)
Riparazione uso multimedialeAdmin (50)

Consulta la guida all’autenticazione per le definizioni dei ruoli.

Trasporto

Il server utilizza il trasporto Streamable HTTP in modalità stateless. Ogni richiesta è indipendente.

  • POST /_emdash/api/mcp — Inviare chiamate di strumenti JSON-RPC
  • GET /_emdash/api/mcp — Restituisce 405
  • DELETE /_emdash/api/mcp — Restituisce 405

Le risposte seguono il formato JSON-RPC 2.0.

Strumenti

Il server espone strumenti in otto domini: contenuto, schema, media, ricerca, tassonomie, menu, revisioni e impostazioni. Ogni strumento restituisce risultati come contenuto testo JSON, o un messaggio di errore con isError: true in caso di fallimento.

Strumenti di contenuto

content_list

Elenca gli elementi di contenuto in una collezione con filtro e paginazione opzionali.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
statusstringNoFiltro: draft, published o scheduled
limitintegerNoMax elementi (1-100, default 50)
cursorstringNoCursore di paginazione
orderBystringNoCampo di ordinamento
orderstringNoDirezione: asc o desc (default desc)
localestringNoFiltrare per locale

Scope: content:read | Sola lettura:

content_get

Ottiene un singolo elemento di contenuto per ID o slug.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento (ULID) o slug
localestringNoLocale per la ricerca per slug

Scope: content:read | Sola lettura:

content_create

Crea un nuovo elemento di contenuto.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
dataobjectValori dei campi come coppie chiave-valore
slugstringNoSlug URL (auto-generato dal titolo se omesso)
statusstringNoStato iniziale: draft o published (default draft)
localestringNoLocale per questo contenuto
translationOfstringNoID dell’elemento di cui questo è una traduzione

Scope: content:write

content_update

Aggiorna un elemento di contenuto esistente. Includi solo i campi da modificare.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento o slug
dataobjectNoValori dei campi da aggiornare
slugstringNoNuovo slug URL
statusstringNoNuovo stato
_revstringNoToken di revisione per rilevazione conflitti

Scope: content:write

content_delete

Elimina un elemento spostandolo nel cestino.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento o slug

Scope: content:write | Distruttivo:

content_restore

Ripristina un elemento dal cestino.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento o slug

Scope: content:write

content_permanent_delete

Elimina permanentemente e irreversibilmente un elemento dal cestino.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento o slug

Scope: content:write | Distruttivo:

content_publish

Pubblica un elemento di contenuto, rendendolo visibile sul sito.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento o slug

Scope: content:write

content_unpublish

Riporta un elemento pubblicato allo stato di bozza.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento o slug

Scope: content:write

content_schedule

Programma un elemento per pubblicazione futura.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento o slug
scheduledAtstringData/ora ISO 8601

Scope: content:write

content_unschedule

Annulla una pubblicazione programmata.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento o slug

Scope: content:write

content_compare

Confronta la versione pubblicata con la bozza corrente.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento o slug

Scope: content:read | Sola lettura:

content_discard_draft

Scarta la bozza corrente e ripristina l’ultima versione pubblicata.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento o slug

Scope: content:write | Distruttivo:

content_list_trashed

Elenca gli elementi eliminati nel cestino di una collezione.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
limitintegerNoMax elementi (1-100, default 50)
cursorstringNoCursore di paginazione

Scope: content:read | Sola lettura:

content_duplicate

Crea una copia di un elemento esistente.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID o slug da duplicare

Scope: content:write

content_translations

Ottiene tutte le varianti di locale di un elemento.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento o slug

Scope: content:read | Sola lettura:

Strumenti di schema

schema_list_collections

Elenca tutte le collezioni di contenuto.

Nessun parametro.

Scope: schema:read | Ruolo minimo: Editor | Sola lettura:

schema_get_collection

Ottiene informazioni dettagliate su una collezione.

ParametroTipoRichiestoDescrizione
slugstringSlug della collezione

Scope: schema:read | Ruolo minimo: Editor | Sola lettura:

schema_create_collection

Crea una nuova collezione di contenuto.

ParametroTipoRichiestoDescrizione
slugstringIdentificatore unico (/^[a-z][a-z0-9_]*$/)
labelstringNome visualizzato (plurale)
labelSingularstringNoNome singolare
descriptionstringNoDescrizione
iconstringNoNome icona per l’UI admin
supportsstring[]NoFunzionalità: drafts, revisions, preview, scheduling, search

Scope: schema:write | Ruolo minimo: Admin

schema_delete_collection

Elimina una collezione e la sua tabella. Irreversibile.

ParametroTipoRichiestoDescrizione
slugstringSlug da eliminare
forcebooleanNoForzare anche se ha contenuto

Scope: schema:write | Ruolo minimo: Admin | Distruttivo:

schema_create_field

Aggiunge un nuovo campo a una collezione.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
slugstringIdentificatore del campo
labelstringNome visualizzato
typestringTipo di dati
requiredbooleanNoSe obbligatorio
uniquebooleanNoSe i valori devono essere unici
defaultValueanyNoValore predefinito
validationobjectNoVincoli
optionsobjectNoConfig widget
searchablebooleanNoIncludere nella ricerca full-text
translatablebooleanNoSe traducibile (default true)

Tipi di campo: string, text, number, integer, boolean, datetime, select, multiSelect, portableText, image, file, reference, json, slug.

Scope: schema:write | Ruolo minimo: Admin

schema_delete_field

Rimuove un campo da una collezione. Irreversibile.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
fieldSlugstringSlug del campo

Scope: schema:write | Ruolo minimo: Admin | Distruttivo:

Strumenti multimediali

media_list

Elenca i file multimediali caricati.

ParametroTipoRichiestoDescrizione
mimeTypestringNoFiltrare per prefisso tipo MIME
limitintegerNoMax elementi (1-100, default 50)
cursorstringNoCursore di paginazione

Scope: media:read | Sola lettura:

media_upload

Carica un file multimediale da dati base64 o un URL esterno.

ParametroTipoRichiestoDescrizione
filenamestringNome file con estensione
base64stringUno tra base64 / urlContenuto codificato base64
urlstringUno tra base64 / urlURL http(s) pubblico
contentTypestringCon base64Tipo MIME
altstringNoTesto alternativo

Scope: media:write | Ruolo minimo: Contributor

media_create

Registra un file multimediale già caricato nello storage.

ParametroTipoRichiestoDescrizione
filenamestringNome file originale
mimeTypestringTipo MIME
storageKeystringPercorso/chiave di storage
sizeintegerNoDimensione in byte
widthintegerNoLarghezza immagine
heightintegerNoAltezza immagine
contentHashstringNoHash del contenuto
blurhashstringNoBlurhash per placeholder
dominantColorstringNoColore dominante esadecimale

Scope: media:write | Ruolo minimo: Author

media_get

Ottiene i dettagli di un file multimediale per ID.

ParametroTipoRichiestoDescrizione
idstringID elemento multimediale

Scope: media:read | Sola lettura:

media_update

Aggiorna i metadati di un file multimediale.

ParametroTipoRichiestoDescrizione
idstringID elemento
altstringNoTesto alternativo
captionstringNoDidascalia
widthintegerNoLarghezza
heightintegerNoAltezza

Scope: media:write

media_delete

Elimina permanentemente un file multimediale.

ParametroTipoRichiestoDescrizione
idstringID elemento

Scope: media:write | Distruttivo:

media_usage_repair

Ripara gli indici di utilizzo dei media.

ParametroTipoRichiestoDescrizione
scope"collection" | "all"Riparare una o tutte le collezioni
collectionstringPer scope collezioneSlug della collezione

Scope: admin | Ruolo minimo: Admin

Strumento di ricerca

Ricerca full-text nelle collezioni di contenuto.

ParametroTipoRichiestoDescrizione
querystringTesto di ricerca
collectionsstring[]NoLimitare a collezioni specifiche
localestringNoFiltrare per locale
limitintegerNoMax risultati (1-50, default 20)

Scope: content:read | Sola lettura:

Strumenti di tassonomia

taxonomy_list

Elenca tutte le definizioni di tassonomia.

Nessun parametro.

Scope: content:read | Sola lettura:

taxonomy_list_terms

Elenca i termini in una tassonomia.

ParametroTipoRichiestoDescrizione
taxonomystringNome della tassonomia
limitintegerNoMax elementi (1-100, default 50)
cursorstringNoCursore di paginazione

Scope: content:read | Sola lettura:

taxonomy_create_term

Crea un nuovo termine.

ParametroTipoRichiestoDescrizione
taxonomystringNome della tassonomia
slugstringIdentificatore URL-safe
labelstringNome visualizzato
parentIdstringNoID termine padre
descriptionstringNoDescrizione

Scope: taxonomies:manage | Ruolo minimo: Editor

taxonomy_update_term

Aggiorna un termine esistente.

ParametroTipoRichiestoDescrizione
taxonomystringNome della tassonomia
termSlugstringSlug attuale del termine
slugstringNoNuovo slug
labelstringNoNuovo nome
parentIdstring | nullNoNuovo ID padre; null per scollegare
descriptionstringNoNuova descrizione

Scope: taxonomies:manage | Ruolo minimo: Editor

taxonomy_delete_term

Elimina permanentemente un termine.

ParametroTipoRichiestoDescrizione
taxonomystringNome della tassonomia
termSlugstringSlug del termine

Scope: taxonomies:manage | Ruolo minimo: Editor | Distruttivo:

Strumenti di menu

Elenca i menu di navigazione.

ParametroTipoRichiestoDescrizione
localestringNoFiltrare per locale

Scope: content:read | Sola lettura:

Ottiene un menu per nome con tutti i suoi elementi.

ParametroTipoRichiestoDescrizione
namestringNome del menu
localestringNoLocale per risolvere il menu

Scope: content:read | Sola lettura:

Crea un nuovo menu di navigazione.

ParametroTipoRichiestoDescrizione
namestringIdentificatore stabile
labelstringNome visualizzato
localestringNoLocale per questo menu
translationOfstringNoID menu esistente per la variante locale

Scope: menus:manage | Ruolo minimo: Editor

Aggiorna l’etichetta di un menu.

ParametroTipoRichiestoDescrizione
namestringNome del menu
labelstringNuova etichetta
localestringNoLocale del menu

Scope: menus:manage | Ruolo minimo: Editor

Elimina un menu e tutti i suoi elementi. Irreversibile.

ParametroTipoRichiestoDescrizione
namestringNome del menu
localestringNoLocale del menu

Scope: menus:manage | Ruolo minimo: Editor | Distruttivo:

Sostituisce l’intera lista di elementi di un menu. Atomico.

ParametroTipoRichiestoDescrizione
namestringNome del menu
localestringNoLocale del menu
itemsMenuItem[]Lista ordinata di elementi

Ogni MenuItem ha:

CampoTipoRichiestoDescrizione
labelstringTesto visualizzato
typestringUno tra custom, page, post, taxonomy, collection
customUrlstringNoURL per type: "custom"
referenceCollectionstringNoSlug collezione target
referenceIdstringNoID contenuto/termine target
titleAttrstringNoAttributo HTML title
targetstringNoAttributo HTML target
cssClassesstringNoClassi CSS
parentIndexintegerNoIndice dell’elemento padre

Scope: menus:manage | Ruolo minimo: Editor

Strumenti di revisione

revision_list

Elenca la cronologia delle revisioni, più recente per prima.

ParametroTipoRichiestoDescrizione
collectionstringSlug della collezione
idstringID elemento o slug
limitintegerNoMax revisioni (1-50, default 20)

Scope: content:read | Sola lettura:

revision_restore

Ripristina un elemento a una revisione precedente.

ParametroTipoRichiestoDescrizione
revisionIdstringID revisione da ripristinare

Scope: content:write

Strumenti impostazioni

settings_get

Ottiene tutte le impostazioni del sito.

Nessun parametro.

Scope: settings:read | Ruolo minimo: Editor | Sola lettura:

settings_update

Aggiorna una o più impostazioni del sito.

ParametroTipoRichiestoDescrizione
titlestringNoTitolo del sito
taglinestringNoBreve descrizione
logoMediaRefNoRiferimento media logo
faviconMediaRefNoRiferimento media favicon
urlstringNoURL canonico del sito
postsPerPageintegerNoDimensione pagina predefinita (1-100)
dateFormatstringNoFormato data
timezonestringNoIdentificatore fuso orario IANA
socialobjectNoHandle social
seoobjectNoValori SEO predefiniti

Scope: settings:manage | Ruolo minimo: Admin

Scoperta OAuth

Metadati della risorsa protetta

GET /.well-known/oauth-protected-resource
{
  "resource": "https://example.com/_emdash/api/mcp",
  "authorization_servers": ["https://example.com/_emdash"],
  "scopes_supported": [
    "content:read", "content:write",
    "media:read", "media:write",
    "schema:read", "schema:write",
    "taxonomies:manage", "menus:manage",
    "settings:read", "settings:manage",
    "admin"
  ],
  "bearer_methods_supported": ["header"]
}

Metadati del server di autorizzazione

GET /.well-known/oauth-authorization-server/_emdash
{
  "issuer": "https://example.com/_emdash",
  "authorization_endpoint": "https://example.com/_emdash/oauth/authorize",
  "token_endpoint": "https://example.com/_emdash/api/oauth/token",
  "scopes_supported": ["content:read", "content:write", "..."],
  "response_types_supported": ["code"],
  "grant_types_supported": [
    "authorization_code",
    "refresh_token",
    "urn:ietf:params:oauth:grant-type:device_code"
  ],
  "code_challenge_methods_supported": ["S256"],
  "token_endpoint_auth_methods_supported": ["none"],
  "device_authorization_endpoint": "https://example.com/_emdash/api/oauth/device/code"
}

Gestione degli errori

Gli errori degli strumenti vengono restituiti come contenuto testo con isError: true:

{
  "content": [{ "type": "text", "text": "[NOT_FOUND] Collection 'nonexistent' not found" }],
  "isError": true,
  "_meta": { "code": "NOT_FOUND" }
}
{
  "content": [
    { "type": "text", "text": "[INSUFFICIENT_SCOPE] Insufficient scope: requires content:write" }
  ],
  "isError": true,
  "_meta": { "code": "INSUFFICIENT_SCOPE" }
}

Gli errori a livello di trasporto restituiscono il codice di errore JSON-RPC -32603 (Errore interno) senza divulgare dettagli di implementazione.