MCP 服务器参考

本页内容

EmDash 在 /_emdash/api/mcp 包含一个内置的 Model Context Protocol(MCP)服务器,将内容管理操作作为 AI 助手的工具暴露。

本页涵盖协议详情:认证、传输、工具规范、OAuth 发现和错误处理。

认证

MCP 服务器支持三种认证方法:

方法工作方式
OAuth 2.1 Authorization Code + PKCEMCP 客户端的标准流程。用户在浏览器中批准作用域。
Personal Access Token(PAT)在管理面板中创建的长期有效 ec_pat_* 令牌。
Device Flow在浏览器中批准代码的 CLI 风格流程。由 emdash login 使用。

作用域

作用域授予访问权限
content:read列出、获取、比较和搜索内容。列出分类法、术语和菜单。
content:write创建、更新、删除、发布、取消发布、计划、取消计划、复制和恢复内容。隐式授予 taxonomies:managemenus:manage
media:read列出和获取媒体项。
media:write注册(创建)、更新和删除媒体元数据。
schema:read列出集合和获取集合模式。
schema:write创建和删除集合及字段。
taxonomies:manage创建、更新和删除分类术语。
menus:manage创建、更新和删除导航菜单及其项目。
settings:read读取站点设置。
settings:manage更新站点设置。
mcp:tools调用任何插件中显式启用的 MCP 工具。
mcp:tools:<pluginId>调用特定插件中显式启用的 MCP 工具。
admin所有操作的完全访问权限。

角色要求

操作最低角色
内容读取Subscriber(10)已发布项; Contributor(20)草稿、已计划、回收站、修订版
内容创建Contributor(20)
编辑/删除自己的Author(30)
内容发布Author(30)自己的; Editor(40)他人的
模式读取Editor(40)
模式写入Admin(50)
分类管理Editor(40)
菜单管理Editor(40)
设置读取Editor(40)
设置管理Admin(50)
媒体上传(media_uploadContributor(20)
媒体注册(media_createAuthor(30)
媒体使用修复Admin(50)

参阅认证指南了解角色定义。

传输

服务器使用 无状态模式的 Streamable HTTP 传输。每个请求都是独立的。

  • POST /_emdash/api/mcp — 发送 JSON-RPC 工具调用
  • GET /_emdash/api/mcp — 返回 405
  • DELETE /_emdash/api/mcp — 返回 405

工具

服务器在八个领域暴露工具:内容、模式、媒体、搜索、分类法、菜单、修订版和设置。

内容工具

content_listcontent_getcontent_createcontent_updatecontent_deletecontent_restorecontent_permanent_deletecontent_publishcontent_unpublishcontent_schedulecontent_unschedulecontent_comparecontent_discard_draftcontent_list_trashedcontent_duplicatecontent_translations

模式工具

schema_list_collectionsschema_get_collectionschema_create_collectionschema_delete_collectionschema_create_fieldschema_delete_field

字段类型:stringtextnumberintegerbooleandatetimeselectmultiSelectportableTextimagefilereferencejsonslug

媒体工具

media_listmedia_uploadmedia_createmedia_getmedia_updatemedia_deletemedia_usage_repair

搜索工具

跨内容集合的全文搜索。

参数类型必需描述
querystring搜索查询文本
collectionsstring[]限制到特定集合
localestring按区域设置过滤
limitinteger最大结果数(1-50,默认 20)

作用域: content:read | 只读:

分类工具

taxonomy_listtaxonomy_list_termstaxonomy_create_termtaxonomy_update_termtaxonomy_delete_term

菜单工具

menu_listmenu_getmenu_createmenu_updatemenu_deletemenu_set_items

修订版工具

revision_listrevision_restore

设置工具

settings_getsettings_update

OAuth 发现

受保护资源元数据

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"]
}

授权服务器元数据

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"
}

错误处理

工具错误以带有 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" }
}

传输层错误返回 JSON-RPC 错误代码 -32603(内部错误),不泄露实现细节。