考夫曼数字公司。MCP——Neos MCP服务器
⚠ 进行中 该软件包是实验性的,正在积极开发中。不建议用于生产。 API和工具签名可能会更改,恕不另行通知。使用风险自负。
A. 模型上下文协议 Neos CMS服务器。允许AI助手(Claude Code、Codex等)通过简单的HTTP+JSON-RPC接口直接访问和操作Neos内容库。
小心使用!!!
让人工智能直接访问你的CR可能会导致绝对混乱。在允许AI进行更改之前,了解AI正在做什么,并仔细检查一切。确保备份可用!
______________________________________________________________________
先决条件
- Neos CMS 7.x或8.x
- Flowpack。ElasticSearch。内容仓库适配器 --需要
search_nodes和find_by_property - PHP 8.1+
______________________________________________________________________
安全注意事项
部署前请阅读本节内容。
- API令牌(和IP-Filter)是唯一的访问控制。 任何获得令牌的人都可以对您的Neos内容存储库进行完全的读/写访问,包括创建、更新和发布节点的能力。
- 使用强随机生成的令牌 (最少32个字符)。永远不要将其提交给版本控制。
- 这
upload_asset该工具接受本地文件系统路径。 如果启用,令牌持有者可以导入web服务器进程可读的任何文件(例如配置文件)。仅限受信任的用户访问。 - 所有写入操作都绕过Flow的授权检查 (
withoutAuthorizationChecks).这是为人工智能驱动的自动化而设计的,但意味着没有Neos后端角色限制。 - 只暴露
/mcp开发环境中的端点 或者在防火墙后面。不要在公共生产服务器上公开它。 - 仅在ddev/localhost中使用HTTP。 如果通过网络公开端点,请使用HTTPS保护传输中的令牌。
______________________________________________________________________
安装
composer require kaufmanndigital/neos-mcp______________________________________________________________________
配置
1.设置API令牌,并可选择通过IP限制访问 在 Configuration/Development/Settings.yaml (从来没有 Settings.yaml --以使其不受版本控制):
KaufmannDigital:
MCP:
Token: 'your-strong-random-token-here'
allowedIps:
- '127.0.0.1' # localhost IPv4
- '::1' # localhost IPv6
- '172.16.0.0/12' # Docker bridge (ddev, docker-compose, ...)
- '1.2.3.4' # your office IPallowedIps是必需的——空列表会阻止所有请求(默认情况下为拒绝)。 支持IPv4和IPv6的精确IP和CIDR表示法。 关于ddev的说明: 来自主机的请求通过Docker网桥IP到达PHP(172.x.x.x),而不是您机器的实际IP。这172.16.0.0/12CIDR覆盖了整个Docker网桥范围,是允许本地ddev访问的推荐方式。
2.配置MCP(克劳德代码示例) (~/.claude.json):
{
"mcpServers": {
"neos": {
"type": "http",
"url": "https:///mcp",
"headers": { "X-Api-Token": "your-strong-random-token-here" }
}
}
}注: 通过ddev从Claude Code连接时使用HTTP(不是HTTPS)——Bun的HTTP客户端不信任ddev的自签名证书。
______________________________________________________________________
工具
get_node
按UUID加载单个节点。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
nodeIdentifier | string | ✓ | 节点UUID |
workspaceName | string | 工作区(默认值: live) | |
includeChildren | boolean | 包括直接子节点(默认值: false) | |
responseProperties | array | 要返回的字段(默认值: identifier 仅) |
______________________________________________________________________
search_nodes
通过Elasticsearch在所有节点上进行全文搜索。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
query | string | 搜索词(如果是可选的 nodeType 已设置) | |
nodeType | string | 按节点类型筛选,例如。 Neos.Neos:Document | |
workspaceName | string | 工作区(默认值: live) | |
limit | integer | 最大结果(默认值: 10) | |
responseProperties | array | 要返回的字段(默认值: identifier 仅) |
______________________________________________________________________
find_by_property
通过Elasticsearch查找具有精确属性值匹配的节点。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
propertyName | string | ✓ | 要匹配的属性名称 |
propertyValue | 任何 | ✓ | 要搜索的确切值 |
nodeType | string | 按节点类型筛选(可选) | |
workspaceName | string | 工作区(默认值: live) | |
limit | integer | 最大结果(默认值: 10) | |
responseProperties | array | 要返回的字段(默认值: identifier 仅) |
______________________________________________________________________
get_children
返回给定节点的直接子节点。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
nodeIdentifier | string | ✓ | 父节点UUID |
nodeTypeFilter | string | 节点类型筛选器,例如。 Neos.Neos:Document | |
workspaceName | string | 工作区(默认值: live) | |
responseProperties | array | 要返回的字段(默认值: identifier 仅) |
______________________________________________________________________
create_node
在给定的父节点下创建新节点。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
parentNodeIdentifier | string | ✓ | 父节点UUID |
nodeType | string | ✓ | 节点类型名称,例如。 Neos.Neos:Document |
properties | object | 要设置的属性的键/值映射 | |
workspaceName | string | 工作区(默认值: live) | |
responseProperties | array | 要返回的字段(默认值: identifier 仅) |
______________________________________________________________________
delete_node
按UUID删除节点。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
nodeIdentifier | string | ✓ | 要删除的节点UUID |
workspaceName | string | 工作区(默认值: live) | |
publishAfterDelete | boolean | 将删除从用户工作区发布到基本工作区(默认值: false) | |
responseProperties | array | 已删除节点返回的字段(默认值: identifier 仅) |
______________________________________________________________________
update_property
在节点上设置单个属性。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
nodeIdentifier | string | ✓ | 节点UUID |
propertyName | string | ✓ | 物业名称 |
propertyValue | 任何 | ✓ | 新价值 |
workspaceName | string | ✓ | 要写入的工作区 |
responseProperties | array | 要返回的字段(默认值: identifier 仅) |
______________________________________________________________________
batch_update_property
在一次调用中设置多个节点的属性。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
nodes | 数组 | ✓ | 列表 {nodeIdentifier, properties} 物体 |
workspaceName | string | ✓ | 要写入的工作区 |
responseProperties | array | 每个节点的字段(默认值: identifier 仅) |
______________________________________________________________________
publish_nodes
将节点从用户工作区发布到基本工作区(通常 live).
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
nodeIdentifiers | 数组 | ✓ | 要发布的节点的UUID |
workspaceName | string | ✓ | 源工作区 |
responseProperties | array | 每个节点的字段(默认值: identifier 仅) |
______________________________________________________________________
upload_asset
从URL或本地绝对路径将文件导入Neos媒体库。
安全说明: 本地路径访问仅限于通过配置的目录localImportBasePath在Settings.yaml(默认值:Data/MCP-Import).该目录外的文件将被拒绝。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
url | string | ✓ | URL或绝对本地路径(例如。 /var/www/html/images/file.jpg) |
filename | string | 原始文件名--使用本地路径时需要 | |
title | string | 媒体库中资源的标题/标签 | |
tag | string | 要分配的标记(如果不存在则创建) |
______________________________________________________________________
responseProperties——最小化代币成本
所有工具归还 只有 identifier 默认情况下.使用 responseProperties 请求额外的字段——保持这一最小值会显著减少人工智能上下文的使用。
可用值:
- 节点属性:在节点类型上定义的任何属性名称,例如。
"title","releaseDate","uriPathSegment" - 元字段:
"nodeType","label","name","path","workspace","hidden"
示例:
// Search: request title and date for identification
"responseProperties": ["title", "releaseDate"]
// After write operations: omit responseProperties entirely — only identifier is needed______________________________________________________________________
建筑
McpController
└── McpHandler JSON-RPC dispatcher
└── Tool/* One class per operation (Flow Singletons)
└── NodeSerializer Shared node serialization- 编写工具 绕过Flow的授权
SecurityContext::withoutAuthorizationChecks() - 资产处置: UUID字符串会自动解析为资产对象(
EntityManager::find(Asset::class, $uuid)) - 日期时间分辨率: ISO-8601字符串会自动转换为
DateTime物体 - ElasticSearchQueryBuilder 是原型作用域--始终通过以下方式实例化
$objectManager->get()每次调用一个新实例
______________________________________________________________________
维护者
此软件包由 Neos经纪公司考夫曼数字.\ 请随时将您的问题或请求发送至 support@kaufmann.digital
欢迎问题和拉取请求!
安装或配置时卡住了吗?你错过了什么吗?你发现了一个bug?\ 没问题,只需创建一个问题或打开一个pull请求。我们会尽快查看。
许可证
根据GPL-3许可,见 许可证
