Optimizely CMS 的 Model Context Protocol (MCP) 服务器,为AI助手提供对Optimizely的GraphQL API和内容管理API的全面访问。
当前版本: 2.0.0-beta 状态: 测试版 / 预发布
这是一个正在积极开发的版本,并且尚未成为候选发布版本。功能可能会发生变化,在生产使用前需要进行额外测试。
# 克隆仓库
git clone https://github.com/your-org/optimizely-mcp-server.git
cd optimizely-mcp-server
# 安装依赖
npm install
# 构建项目
npm run build
在项目根目录创建一个.env文件:
# 服务器配置
SERVER_NAME=optimizely-mcp-server
SERVER_VERSION=1.0.0
TRANSPORT=stdio
# Optimizely Graph配置
GRAPH_ENDPOINT=https://cg.optimizely.com/content/v2
GRAPH_AUTH_METHOD=single_key # 选项:single_key, hmac, basic, bearer, oidc
GRAPH_SINGLE_KEY=your-single-key
# 对于HMAC认证:
# GRAPH_APP_KEY=your-app-key
# GRAPH_SECRET_KEY=your-secret-key
# 内容管理API配置
CMA_BASE_URL=https://api.cms.optimizely.com/preview3
CMA_CLIENT_ID=your-client-id # 在CMS中从设置 > API密钥获取
CMA_CLIENT_SECRET=your-client-secret
CMA_GRANT_TYPE=client_credentials
CMA_TOKEN_ENDPOINT=https://api.cms.optimizely.com/oauth/token
CMA_IMPERSONATE_USER= # 可选:要模拟的用户邮箱(参见模拟部分)
# 可选配置
CACHE_TTL=300000 # 缓存TTL(毫秒,默认:5分钟)
LOG_LEVEL=info # 选项:debug, info, warn, error
MAX_RETRIES=3
TIMEOUT=30000
# 使用热重载运行
npm run dev
# 使用调试日志运行
LOG_LEVEL=debug npm run dev
# 构建并运行
npm run build
npm start
# 或直接运行
node dist/index.js
# 运行所有单元测试
npm test
# 运行带覆盖率的测试
npm run test:coverage
# 类型检查
npm run typecheck
# 代码检查
npm run lint
MCP服务器通过**标准输入输出(stdio)**通信,而不是HTTP端口:
在文本编辑器中打开配置文件:
%APPDATA%\Claude\claude_desktop_config.json~/Library/Application Support/Claude/claude_desktop_config.json~/.config/Claude/claude_desktop_config.json对于Windows,您可以快速打开它:
notepad %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"optimizely": {
"command": "node",
"args": ["%USERPROFILE%\\path\\to\\optimizely-mcp-server\\dist\\index.js"],
"env": {
"LOG_LEVEL": "error",
"GRAPH_ENDPOINT": "https://cg.optimizely.com/content/v2",
"GRAPH_AUTH_METHOD": "single_key",
"GRAPH_SINGLE_KEY": "your-key",
"CMA_BASE_URL": "https://api.cms.optimizely.com/preview3/experimental",
"CMA_CLIENT_ID": "your-client-id",
"CMA_CLIENT_SECRET": "your-client-secret",
"CMA_GRANT_TYPE": "client_credentials",
"CMA_TOKEN_ENDPOINT": "https://api.cms.optimizely.com/oauth/token",
"CMA_IMPERSONATE_USER": ""
}
}
}
}
在Windows的JSON中,必须使用双反斜杠(\)。如果文件夹路径中有空格,这仍然有效,因为每个参数都是单独的JSON字符串。
保存配置文件后:
在一个新的Claude对话中尝试:
如果服务器无法加载:
\\)npm run build)dist/index.js文件是否存在对于其他兼容MCP的客户端,使用stdio传输配置:
{
"name": "optimizely",
"transport": {
"type": "stdio",
"command": "node",
"args": ["/path/to/optimizely-mcp-server/dist/index.js"]
},
"env": {
// 如上所示的环境变量
}
}
这些工具使用Graph API动态发现您的CMS结构并检索内容,而无需硬编码假设。
help - 🚀 从这里开始!获取上下文感知的帮助并学习发现优先的工作流程
help({}),help({"topic": "workflow"})get - 🎯 统一工具 - 通过任何标识符在一次调用中获取内容
search → locate → retrieve工作流程get({"identifier": "/"}),get({"identifier": "Article 4"})discover - 动态查找内容类型和字段
discover({"target": "types"}),discover({"target": "fields", "contentType": "ArticlePage"})analyze - 内容类型的深度分析
analyze({"contentType": "ArticlePage"})search - 智能内容搜索,带有自动发现
get更好search({"query": "mcp", "contentTypes": ["ArticlePage"]})locate - 通过ID、键或路径查找特定内容
get更好locate({"identifier": "/news/article-1"})retrieve - 从内容管理API获取完整内容
get更好(使用更快的Graph API)get建议这样做或您需要CMA特定数据时使用retrieve({"identifier": "12345"})health-check - 检查API连接性和服务器健康状况get-config - 获取当前服务器配置(已清理)get-documentation - 按类别获取可用工具的文档这些工具使用内容管理API进行写操作和详细内容访问:
content_creation_wizard - 带有发现功能的交互式内容创建
content_creation_wizard({"step": "start"})content-test-api - 测试CMA连接和端点
content-test-api({})注意:retrieve工具(在核心工具中列出)也使用CMA来访问草稿内容和版本历史。
这些Graph API发现工具是新discover工具的重复项,并将在未来版本中被移除:
graph-introspection - 使用discover代替type-discover - 使用discover({"target": "types"})代替type-match - 使用discover代替content_type_analyzer - 使用analyze代替graph_discover_types - 使用discover({"target": "types"})代替graph_discover_fields - 使用discover({"target": "fields"})代替graph-query - 使用get或search代替与传统集成硬编码内容类型和字段名称不同,此MCP服务器:
服务器使用模式匹配和相似性评分来:
1. get({"identifier": "homepage"}) # 就这样!一次调用获取一切。
get工具会自动:
1. help({}) # 学习工作流程
2. discover({"target": "types"}) # 查找内容类型
3. discover({"target": "fields", "contentType": "..."}) # 获取字段
4. get({"identifier": "..."}) # 检索内容
1. discover({"target": "types"}) # 查找可用类型
2. analyze({"contentType": "ArticlePage"}) # 了解需求
3. content_creation_wizard({...}) # 在指导下创建
get工具完全支持Optimizely视觉构建器(以前称为视觉体验作曲家)页面:
_IExperience)识别视觉构建器页面视觉构建器组件有两种类型:
null或不存在get响应中{
"component": {
"_metadata": {
"types": ["Text", "_Component"],
"key": null // ← NULL = 内联
},
"Content": "欢迎文字" // ← 内容在这里
}
}
重要:不要尝试单独检索内联组件 - 内容已经提供!
get({"identifier": "component-key"})检索完整详情{
"component": {
"_metadata": {
"types": ["ArticleList", "_Component"],
"key": "f7e7f5c91e774884a8fca9c9ae56560c" // ← 有键
}
// 可能包括基本字段,使用get()获取完整内容
}
}
当处理视觉构建器页面时:
get({"identifier": "/"})检索页面get({"identifier": "key"})检索完整详情// 获取一个视觉构建器首页
get({"identifier": "/"})
// 返回包含内联内容的完整结构:
{
"content": {
"_metadata": { ... },
"composition": {
"nodes": [
{
"key": "grid-id",
"displayName": "欢迎部分",
"nodes": [
{
"component": {
"_metadata": {
"types": ["Text"],
"key": null // 内联 - 内容包含
},
"Content": "欢迎来到我们的网站"
}
},
{
"component": {
"_metadata": {
"types": ["ArticleList"],
"key": "f7e7f5c9..." // 引用 - 分别获取
}
}
}
]
}
]
}
}
}
get()调用使用content_creation_wizard或其他创建工具创建新内容后:
retrieve工具立即访问get和search工具使用Graph API,对于新创建的内容直到索引完成之前会返回“未找到”最佳实践:创建内容后,等待几分钟再尝试使用get或search检索。或者,使用直接查询CMA的retrieve工具,它没有索引延迟。
get/search搜索,必须先将其发布optimizely-mcp-server/
├── src/
│ ├── index.ts # 服务器入口点
│ ├── register.ts # 工具注册
│ ├── config.ts # 配置管理
│ ├── clients/ # API客户端
│ │ ├── graph-client.ts
│ │ └── cma-client.ts
│ ├── logic/ # 工具实现
│ │ ├── utility/
│ │ ├── graph/
│ │ └── content/
│