Pular para o conteúdo

Referência do Servidor MCP

O EmDash inclui um servidor Model Context Protocol (MCP) integrado em /_emdash/api/mcp que expõe operações de gerenciamento de conteúdo como ferramentas para assistentes de IA.

Esta página cobre os detalhes do protocolo: autenticação, transporte, especificações das ferramentas, descoberta OAuth e tratamento de erros.

O servidor MCP suporta três métodos de autenticação:

MétodoComo funciona
OAuth 2.1 Authorization Code + PKCEFluxo padrão para clientes MCP. O usuário aprova os escopos no navegador.
Personal Access Token (PAT)Tokens de longa duração ec_pat_* criados no painel de administração.
Device FlowFluxo estilo CLI onde você aprova um código no navegador. Usado por emdash login.

Cookies de sessão (da interface de administração) também funcionam, mas não são práticos para clientes MCP externos.

Os tokens têm escopo para limitar quais operações um cliente pode realizar. Os escopos são solicitados durante a autorização OAuth e aplicados em cada chamada de ferramenta.

EscopoConcede acesso a
content:readListar, obter, comparar e pesquisar conteúdo. Listar termos de taxonomia e menus.
content:writeCriar, atualizar, excluir, publicar, despublicar, agendar, duplicar e restaurar conteúdo. Criar termos de taxonomia.
media:readListar e obter itens de mídia.
media:writeAtualizar e excluir metadados de mídia.
schema:readListar coleções e obter esquemas de coleção.
schema:writeCriar e excluir coleções e campos.
adminAcesso total a todas as operações.

O escopo admin concede acesso a tudo. A autenticação baseada em sessão (sem token) também tem acesso total com base na função do usuário.

Além dos escopos, algumas ferramentas exigem uma função RBAC mínima:

OperaçãoFunção mínima
Operações de conteúdoNenhum mínimo (os escopos controlam o acesso)
Leitura de esquemaEditor (40)
Escrita de esquemaAdmin (50)

Consulte o guia de Autenticação para definições de função.

O servidor usa o transporte HTTP Streamable no modo stateless. Cada solicitação é independente — não há sessões ou conexões de longa duração.

  • POST /_emdash/api/mcp — Enviar chamadas de ferramenta JSON-RPC
  • GET /_emdash/api/mcp — Retorna 405 (sem SSE no modo stateless)
  • DELETE /_emdash/api/mcp — Retorna 405 (nenhuma sessão para fechar)

As respostas seguem o formato JSON-RPC 2.0. Os erros usam códigos de erro padrão do JSON-RPC, com códigos específicos do MCP para falhas de escopo e permissão.

O servidor expõe 33 ferramentas em sete domínios. Cada ferramenta retorna resultados como conteúdo de texto JSON ou uma mensagem de erro com isError: true em caso de falha.

Lista itens de conteúdo em uma coleção com filtragem e paginação opcionais.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção (ex: posts, pages)
statusstringNãoFiltro: draft, published ou scheduled
limitintegerNãoMáximo de itens a retornar (1-100, padrão 50)
cursorstringNãoCursor de paginação de uma resposta anterior
orderBystringNãoCampo para ordenar (ex: created_at, updated_at)
orderstringNãoDireção da ordenação: asc ou desc (padrão desc)
localestringNãoFiltrar por localidade (ex: en, fr). Apenas relevante com i18n.

Escopo: content:read | Somente leitura: Sim

Obtém um único item de conteúdo por ID ou slug. Retorna todos os valores dos campos, metadados e um token _rev para concorrência otimista.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID do item de conteúdo (ULID) ou slug
localestringNãoLocalidade para pesquisa por slug. IDs são globalmente únicos.

Escopo: content:read | Somente leitura: Sim

Cria um novo item de conteúdo. O objeto data deve conter valores de campo correspondentes ao esquema da coleção — use schema_get_collection para verificar quais campos estão disponíveis. Os itens são criados como draft por padrão.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
dataobjectSimValores dos campos como pares chave-valor
slugstringNãoSlug da URL (gerado automaticamente a partir do título se omitido)
statusstringNãoStatus inicial: draft ou published (padrão draft)
localestringNãoLocalidade para este conteúdo (padrão é o padrão do site)
translationOfstringNãoID do item do qual esta é uma tradução

Escopo: content:write

Atualiza um item de conteúdo existente. Inclua apenas os campos que deseja alterar — os campos não especificados permanecem inalterados.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID do item de conteúdo ou slug
dataobjectNãoValores dos campos para atualizar
slugstringNãoNovo slug da URL
statusstringNãoNovo status: draft ou published
_revstringNãoToken de revisão de content_get para detecção de conflitos

Escopo: content:write

Exclui suavemente um item de conteúdo movendo-o para a lixeira. Use content_restore para desfazer ou content_permanent_delete para removê-lo permanentemente.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID do item de conteúdo ou slug

Escopo: content:write | Destrutivo: Sim

Restaurar um item de conteúdo excluído temporariamente da lixeira.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID ou slug do item de conteúdo

Escopo: content:write

Excluir permanentemente e de forma irreversível um item de conteúdo da lixeira. O item deve estar primeiro na lixeira.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID ou slug do item de conteúdo

Escopo: content:write | Destrutivo: Sim

Publicar um item de conteúdo, tornando-o visível no site. Cria uma revisão publicada a partir do rascunho atual. Edições posteriores criam um novo rascunho sem afetar a versão ao vivo até ser republicado.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID ou slug do item de conteúdo

Escopo: content:write

Reverter um item publicado para o status de rascunho. Ele não será mais visível no site ao vivo, mas seu conteúdo será preservado.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID ou slug do item de conteúdo

Escopo: content:write

Agendar um item de conteúdo para publicação futura. Ele será automaticamente publicado na data/hora especificada.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID ou slug do item de conteúdo
scheduledAtstringSimData e hora no formato ISO 8601 (ex: 2026-06-01T09:00:00Z)

Escopo: content:write

Comparar a versão publicada (ao vivo) de um item de conteúdo com seu rascunho atual. Retorna ambas as versões e um indicador se há alterações.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID ou slug do item de conteúdo

Escopo: content:read | Somente leitura: Sim

Descartar o rascunho atual e reverter para a última versão publicada. Funciona apenas em itens que foram publicados pelo menos uma vez.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID ou slug do item de conteúdo

Escopo: content:write | Destrutivo: Sim

Listar itens de conteúdo excluídos temporariamente na lixeira de uma coleção.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
limitintegerNãoNúmero máximo de itens (1-100, padrão 50)
cursorstringNãoCursor de paginação

Escopo: content:read | Somente leitura: Sim

Criar uma cópia de um item de conteúdo existente. A duplicata é criada como um rascunho com “(Cópia)” anexado ao título e um slug gerado automaticamente.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID ou slug do item de conteúdo a duplicar

Escopo: content:write

Obter todas as variantes de localidade de um item de conteúdo. Retorna o grupo de tradução e um resumo de cada versão de localidade. Relevante apenas quando o i18n está ativado.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID ou slug do item de conteúdo

Escopo: content:read | Somente leitura: Sim

Listar todas as coleções de conteúdo definidas no CMS. Retorna slug, rótulo, recursos suportados e timestamps.

Sem parâmetros.

Escopo: schema:read | Função mínima: Editor | Somente leitura: Sim

Obter informações detalhadas sobre uma coleção, incluindo todas as definições de campo. Os campos descrevem o modelo de conteúdo: nome, tipo, restrições e regras de validação. Use isso para entender o que content_create e content_update esperam.

ParâmetroTipoObrigatórioDescrição
slugstringSimSlug da coleção (ex: posts)

Escopo: schema:read | Função mínima: Editor | Somente leitura: Sim

Criar uma nova coleção de conteúdo. Isso cria uma tabela de banco de dados e uma definição de esquema. O slug deve ser alfanumérico em minúsculas com sublinhados, começando com uma letra.

ParâmetroTipoObrigatórioDescrição
slugstringSimIdentificador único (/^[a-z][a-z0-9_]*$/)
labelstringSimNome de exibição (plural, ex: “Posts do Blog”)
labelSingularstringNãoNome de exibição no singular
descriptionstringNãoDescrição desta coleção
iconstringNãoNome do ícone para a interface de administração
supportsstring[]NãoRecursos: drafts, revisions, preview, scheduling, search (padrão: ['drafts', 'revisions'])

Escopo: schema:write | Função mínima: Admin

Excluir uma coleção e sua tabela de banco de dados. Isso é irreversível e exclui todo o conteúdo da coleção.

ParâmetroTipoObrigatórioDescrição
slugstringSimSlug da coleção a excluir
forcebooleanNãoForçar exclusão mesmo se a coleção tiver conteúdo

Escopo: schema:write | Função mínima: Admin | Destrutivo: Sim

Adicionar um novo campo ao esquema de uma coleção. Isso adiciona uma coluna à tabela do banco de dados.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
slugstringSimIdentificador do campo (/^[a-z][a-z0-9_]*$/)
labelstringSimNome de exibição
typestringSimTipo de dados (veja abaixo)
requiredbooleanNãoSe o campo é obrigatório
uniquebooleanNãoSe os valores devem ser únicos
defaultValueanyNãoValor padrão para novos itens
validationobjectNãoRestrições: min, max, minLength, maxLength, pattern, options
optionsobjectNãoConfiguração do widget: collection (para referências), rows (para textarea)
searchablebooleanNãoIncluir no índice de busca de texto completo
translatablebooleanNãoSe este campo é traduzível (padrão verdadeiro)

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

Para os tipos select e multiSelect, forneça os valores permitidos em validation.options.

Escopo: schema:write | Função mínima: Admin

Remove um campo de uma coleção. Isso exclui a coluna e apaga todos os dados nesse campo. Irreversível.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
fieldSlugstringSimSlug do campo a ser removido

Escopo: schema:write | Função mínima: Admin | Destrutivo: Sim

Lista arquivos de mídia enviados com filtragem opcional por tipo MIME e paginação.

ParâmetroTipoObrigatórioDescrição
mimeTypestringNãoFiltrar por prefixo de tipo MIME (ex: image/, application/pdf)
limitintegerNãoMáximo de itens (1-100, padrão 50)
cursorstringNãoCursor de paginação

Escopo: media:read | Somente leitura: Sim

Obtém detalhes de um único arquivo de mídia por ID. Retorna metadados incluindo nome do arquivo, tipo MIME, tamanho, dimensões, texto alternativo e URL.

ParâmetroTipoObrigatórioDescrição
idstringSimID do item de mídia

Escopo: media:read | Somente leitura: Sim

Atualiza metadados de um arquivo de mídia enviado. O arquivo em si não pode ser alterado.

ParâmetroTipoObrigatórioDescrição
idstringSimID do item de mídia
altstringNãoTexto alternativo para acessibilidade
captionstringNãoTexto da legenda
widthintegerNãoLargura da imagem em pixels
heightintegerNãoAltura da imagem em pixels

Escopo: media:write

Exclui permanentemente um arquivo de mídia. Remove o registro do banco de dados e o arquivo do armazenamento. Conteúdo que referencia esta mídia terá referências quebradas.

ParâmetroTipoObrigatórioDescrição
idstringSimID do item de mídia

Escopo: media:write | Destrutivo: Sim

Busca de texto completo em coleções de conteúdo. As coleções devem ter search em sua lista supports e os campos devem estar marcados como searchable.

ParâmetroTipoObrigatórioDescrição
querystringSimTexto da consulta de busca
collectionsstring[]NãoLimitar a busca a slugs de coleções específicas
localestringNãoFiltrar resultados por localidade
limitintegerNãoMáximo de resultados (1-50, padrão 20)

Escopo: content:read | Somente leitura: Sim

Lista todas as definições de taxonomia (ex: categorias, tags). Retorna nome, rótulo, se é hierárquica e coleções associadas.

Sem parâmetros.

Escopo: content:read | Somente leitura: Sim

Lista termos em uma taxonomia com paginação.

ParâmetroTipoObrigatórioDescrição
taxonomystringSimNome da taxonomia (ex: categories, tags)
limitintegerNãoMáximo de itens (1-100, padrão 50)
cursorstringNãoCursor de paginação

Escopo: content:read | Somente leitura: Sim

Cria um novo termo em uma taxonomia. Para taxonomias hierárquicas, especifique um parentId para criar um termo filho.

ParâmetroTipoObrigatórioDescrição
taxonomystringSimNome da taxonomia
slugstringSimIdentificador seguro para URL
labelstringSimNome de exibição
parentIdstringNãoID do termo pai (para taxonomias hierárquicas)
descriptionstringNãoDescrição do termo

Escopo: content:write

Lista todos os menus de navegação. Retorna nome, rótulo e timestamps.

Sem parâmetros.

Escopo: content:read | Somente leitura: Sim

Obtém um menu pelo nome incluindo todos os seus itens em ordem. Os itens têm um rótulo, URL, tipo e opcionalmente um pai para aninhamento.

ParâmetroTipoObrigatórioDescrição
namestringSimNome do menu (ex: main, footer)

Escopo: content:read | Somente leitura: Sim

Lista o histórico de revisões para um item de conteúdo, do mais recente para o mais antigo. Requer que a coleção suporte revisions.

ParâmetroTipoObrigatórioDescrição
collectionstringSimSlug da coleção
idstringSimID ou slug do item de conteúdo
limitintegerNãoMáximo de revisões (1-50, padrão 20)

Escopo: content:read | Somente leitura: Sim

Restaura um item de conteúdo para uma revisão anterior. Substitui o rascunho atual pelos dados da revisão especificada. Não é publicado automaticamente — use content_publish depois, se necessário.

ParâmetroTipoObrigatórioDescrição
revisionIdstringSimID da revisão a ser restaurada

Escopo: content:write

Os clientes MCP que suportam OAuth 2.1 podem descobrir automaticamente como autenticar. O servidor publica dois documentos de metadados:

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",
"admin"
],
"bearer_methods_supported": ["header"]
}
GET /_emdash/.well-known/oauth-authorization-server
{
"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"
}

Quando uma solicitação não autenticada atinge o endpoint MCP, o servidor retorna:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://example.com/.well-known/oauth-protected-resource"

Isso aciona o fluxo padrão de descoberta do cliente MCP.

Erros de ferramenta são retornados como conteúdo de texto com isError: true:

{
"content": [{ "type": "text", "text": "Collection 'nonexistent' not found" }],
"isError": true
}

Erros de escopo e permissão lançam erros de protocolo MCP:

{
"jsonrpc": "2.0",
"error": {
"code": -32600,
"message": "Insufficient scope: requires content:write"
},
"id": 1
}

Erros de nível de transporte (configuração incorreta do servidor, exceções não tratadas) retornam o código de erro JSON-RPC -32603 (Erro interno) sem vazar detalhes de implementação.