关于 strapi-mcp-capabilities
此参考技能面向为 Strapi 5.47.0+ 插件添加自定义 MCP 能力的开发者,介绍工具、提示词和资源的注册方式、架构、授权及处理器行为。
主要功能
- 01注册自定义工具、提示词和资源
- 02使用内联和构建器注册模式
- 03定义类型化输入和输出架构
- 04配置授权策略
- 05通过 /mcp 端点验证能力
适用场景
- 01向 MCP 客户端公开插件操作
- 02为 Strapi 插件添加权限检查型 MCP 工具
- 03在插件设置阶段注册提示词或资源
MCP 相关
介绍 Strapi 插件如何注册供客户端使用的 MCP 工具、提示词和资源。服务器在 config/server.ts 中启用,并通过 POST /mcp 端点提供服务。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ strapi/ skills --skill strapi-mcp-capabilities安装后在 Claude Code 中输入/strapi-mcp-capabilities确认已加载。
附带文件reference.md
详细介绍
Strapi MCP 功能
注册自定义 MCP 工具、提示词和资源,让 AI 客户端可以在运行中的 Strapi 实例上触发插件专属操作。Strapi 5.47.0+。API 的权威来源:@strapi/types,搜索 mcp。
硬性规则
- 启用服务端:
config/server.ts必须设置mcp: { enabled: true }。端点为POST /mcp。 - 仅在
register()阶段注册。 MCP 服务启动时(bootstrap 期间)会锁定功能列表。之后再注册会抛出异常。 - 使用来自
@strapi/utils的 Zod(import { z } from '@strapi/utils'),不要使用独立的zod。 - 切勿在模块顶层使用全局
strapi。 可以直接注册(此时有strapi),也可以使用ai.mcp.defineTool(...)在模块作用域定义,然后用注入的strapi注册。
两种注册模式
内联 — 在作用域内有 strapi 时(从 register() 调用的函数):
// mcp/tools/get-store-kpis.ts
import type { Core } from '@strapi/strapi';
import { z } from '@strapi/utils';
export const registerGetStoreKpisTool = (strapi: Core.Strapi) => {
strapi.ai.mcp.registerTool({ /* definition */ });
};
构建器 — 在模块作用域定义(没有 strapi),之后再注册。defineTool 是一个恒等辅助函数,可缩小访问变体的类型范围以进行类型推断:
// mcp/tools/get-top-products.ts
import { ai } from '@strapi/strapi';
import { z } from '@strapi/utils';
export const getTopProductsTool = ai.mcp.defineTool({ /* definition */ });
// register.ts
strapi.ai.mcp.registerTool(getTopProductsTool);
在插件的 register() 中连接两者:
// register.ts
export const register = ({ strapi }: { strapi: Core.Strapi }) => {
registerGetStoreKpisTool(strapi); // inline
strapi.ai.mcp.registerTool(getTopProductsTool); // builder
};
工具定义(核心单元)
strapi.ai.mcp.registerTool({
name: 'get_store_kpis', // snake_case, unique
title: 'Get Store KPIs',
description: 'What it returns + when to use it. The AI reads this to choose the tool.',
auth: { policies: [{ action: 'plugin::store-analytics.read' }] }, // OR devModeOnly: true
resolveInputSchema: () => inputSchema, // optional; omit if no args
resolveOutputSchema: () => outputSchema, // required; a z.object
createHandler: (strapi, context) => async ({ args, extra }) => {
const result = await strapi
.plugin('store-analytics')
.service('analytics')
.getStoreKpis(args);
return {
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
structuredContent: result, // must match resolveOutputSchema
};
},
});
要点:
createHandler(strapi, context) => handler。处理程序接收一个对象{ args, extra }。args的类型为z.infer<inputSchema>(已类型化);如果没有resolveInputSchema,则省略args。context: { userAbility, user }— 使用userAbility检查实体/字段权限;写入时使用user(令牌所有者)调用setCreatorFields。- 保持处理程序精简:将工作委托给插件服务;工具只是 MCP 接口。
name/title/description/resolveOutputSchema为必填项。description的质量会影响 AI 的工具选择 — 应说明工具的返回内容和适用场景。
架构
- 定义
z.object输入/输出架构;复用共享字段架构(例如带有.describe(...)的isoDateSchema)。 - 为每个不明显的字段添加
.describe()— 描述会传递给 AI 客户端。 - 处理程序返回的
structuredContent必须符合resolveOutputSchema。
身份验证(严格选择一种访问变体)
auth: { policies: [{ action, subject? }] }— CASL 检查;如果令牌的能力满足任意一项策略,会话即通过。action通常是已注册的管理端权限,例如plugin::<plugin-id>.<permission>。devModeOnly: true— 无身份验证;仅当autoReload已开启(开发模式)时可用。用于调试工具。
要让令牌获得 auth 权限,必须在 bootstrap() 中注册权限操作:
await strapi.service('admin::permission').actionProvider.registerMany([
{ section: 'plugins', displayName: 'Access store analytics',
uid: 'read', pluginName: 'store-analytics' },
]);
// → action becomes 'plugin::store-analytics.read'
处理程序返回格式
// success
return { content: [{ type: 'text', text }], structuredContent: result };
// error
return { content: [{ type: 'text', text: 'message' }], isError: true };
structuredContent 和 isError 不能同时使用。
文件夹约定
server/src/
├── register.ts # calls registrations (register phase only)
├── bootstrap.ts # registerMany permission actions
├── mcp/
│ ├── index.ts # registerAllMcpTools(strapi)
│ ├── schemas.ts # shared zod field schemas
│ └── tools/<tool>.ts # one capability per file
└── services/ # business logic the handlers call
验证
- 在
config/server.ts中设置mcp: { enabled: true };重启 Strapi。 - 使用
Authorization: Bearer <admin-token>连接客户端到http://localhost:1337/mcp,该令牌的权限须包含工具的auth操作。 - 确认工具已显示,并返回符合其输出架构的
structuredContent。
提示词和资源
生命周期/身份验证规则相同,但使用不同的构建器:ai.mcp.definePrompt / strapi.ai.mcp.registerPrompt 和 ai.mcp.defineResource / strapi.ai.mcp.registerResource。字段表和签名请参阅 reference.md。
文档
- MCP 服务(配置、权限边界、无状态架构、限制)
- API 类型:
@strapi/types
评论
支持 Markdown