mcpField
A
aep

aep

本地服务
github.com商业与营销09 周前更新

关于 aep

aep 是面向 Adobe Experience Platform、Journey Optimizer 和 Customer Journey Analytics 的可自托管 MCP 服务,适用于管理 Adobe 数据工作流的 Agent。它提供读写工具,并通过沙箱感知防护控制写入。

主要功能

  1. 01涵盖 14 类的 61 个工具
  2. 02AEP 读写操作
  3. 03架构、数据集与批次工作流
  4. 04受众创建与激活
  5. 05隐私和数据生命周期管理
  6. 06沙箱感知的写入防护

适用场景

  1. 01创建架构和数据集并摄取批次
  2. 02构建受众并在目标位置激活
  3. 03提交并跟踪数据擦除请求
  4. 04查看 Journey Optimizer 营销活动和 CJA 数据

MCP 相关

通过 stdio 向 MCP 客户端提供 61 个工具,并使用 OAuth Server-to-Server 凭据访问 Adobe API。写入权限需单独启用,并依据沙箱类型和配置模式进行防护。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"com-focusgts-aep": {
"command": "npx",
"args": [
"-y",
"@focusgts/aep-mcp-server"
],
"env": {
"AEP_CLIENT_ID": "<AEP_CLIENT_ID>",
"AEP_CLIENT_SECRET": "<AEP_CLIENT_SECRET>",
"AEP_ORG_ID": "<AEP_ORG_ID>",
"AEP_SANDBOX_NAME": "<AEP_SANDBOX_NAME>",
"AEP_MODE": "<AEP_MODE>",
"LOG_LEVEL": "<LOG_LEVEL>"
}
}
}
}
启动命令npx -y @focusgts/aep-mcp-server
需要配置的环境变量
AEP_CLIENT_IDAdobe I/O client ID from an OAuth Server-to-Server credential in the Adobe Developer Console.
AEP_CLIENT_SECRET密钥Adobe I/O client secret paired with AEP_CLIENT_ID.
AEP_ORG_IDAdobe IMS organization ID, in the form xxxxxxxxx@AdobeOrg.
AEP_SANDBOX_NAMEAEP sandbox to scope every call to. Defaults to 'prod'. Use a development sandbox to enable write operations.
AEP_MODEWrite posture: 'read-only' (no mutation anywhere), 'safe' (default — writes only in sandboxes Adobe classifies as development), or 'production' (writes anywhere). Reads are never restricted.
LOG_LEVELPino log level. Logs go to stderr; stdout is reserved for the MCP JSON-RPC stream.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@focusgts/aep-mcp-server0.11.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

AEP MCP 服务

npm installs MCP Registry tests license

Adobe 的 MCP 能让你的 Agent 读取 Experience Platform。这个服务还能让它动手操作。

涵盖 14 个类别的 61 个工具。全面支持读取和写入。可自托管,采用 Apache-2.0 许可,无需邀请。 通过一个 OAuth 凭据,即可使用 Experience Platform、Journey Optimizer 和 Customer Journey Analytics。

摄取一批数据 → 组合一个架构 → 激活一个受众 → 履行一项删除请求。 每项变更都受一个默认拒绝的写入保护机制控制,它会向 Adobe 查询当前沙盒的类型。

询问你的 Agent


⚡ 三行搞定

claude mcp add aep \
  -e AEP_CLIENT_ID=... -e AEP_CLIENT_SECRET=... \
  -e AEP_ORG_ID=...@AdobeOrg -e AEP_SANDBOX_NAME=your-dev-sandbox \
  -- npx -y @focusgts/aep-mcp-server

然后直接向你的 Agent 提出要求:

“创建一个包含 Demographic Details 字段组的架构,然后基于它创建一个数据集。” “摄取这个 NDJSON 文件,并告诉我数据批次何时到达。” “创建一个受众,包含本季度购买过两次的客户,并将其激活。” “删除此电子邮件地址对应的所有记录——先进行试运行。”

除非你主动启用写入功能,否则写入操作默认关闭;而 safe 模式只会在 Adobe 判定为开发环境的沙盒中解锁写入功能。

与众不同的工作循环
flowchart LR
  A["📐 Compose<br/>schema from field groups"] --> B["🗂️ Create<br/>dataset"]
  B --> C["📥 Ingest<br/>batch · upload · complete"]
  C --> D["🎯 Activate<br/>segment → destination"]
  D --> E["🧹 Govern<br/>erasure · expiration · quota"]
  E -. "re-audit the tenant" .-> A

Adobe 的第一方网关可以告诉你 Experience Platform 租户中有什么,但无法创建数据集、写入数据批次、激活受众或提交删除请求。这个服务可以做到这些,并且所有操作都受默认拒绝的保护机制控制。


🧠 工作原理

flowchart LR
  A["AI agent<br/>(Claude · Cursor · Copilot)"] -- MCP / stdio --> B["aep-mcp-server<br/>61 tools"]
  B --> W{{"write guard<br/>fail-closed"}}
  W --> C["Schema Registry · Catalog<br/>Ingestion · Lifecycle · Privacy"]
  C --> F["Your AEP sandbox<br/>platform.adobe.io"]
  B --> J["Journey Optimizer<br/>read-only"]
  J --> K["ajo campaigns"]
  B --> Q["Customer Journey Analytics<br/>read-only, no sandbox"]
  Q --> L["cja.adobe.io"]

Agent 调用工具;服务通过 OAuth Server-to-Server 与 Adobe 的实时 API 通信。写入保护机制位于 HTTP 客户端中,而非每个工具内部,因此所有 61 个工具都受其保护,不会有任何工具遗漏。被拦截的调用绝不会到达 Adobe。


🛡️ 默认安全

三种安全模式。任何模式下都不会限制读取。

AEP_MODE允许写入适用场景
read-only在任何沙盒中都不允许将服务交给他人,让其探索你不希望被改动的环境
safe (默认)仅限 Adobe 将沙盒归类为 development 的情况进行评估,或让 Agent 工作,同时避免危及生产环境
production任何地方,包括生产环境你自行管理变更控制,并且不希望服务擅自做出判断

safe 如何判定——以及为何不看沙盒名称。 生产沙盒可以有任意名称,而名为 prod 的沙盒也可能不是生产环境。只有 Sandbox Management API 中 Adobe 提供的 type 字段才是判定依据。

默认拒绝。 如果无法确定类型——凭据无法读取沙盒元数据、API 出错,或启动尚未完成——就会禁止写入。凭据不能因为能力更弱而获得写入权限。无法识别的 AEP_MODE 会回退到 safe,因此拼写错误绝不会授予生产环境写入权限。

如果沙盒名称正好是 prod,则无条件拒绝操作,并且会在解析模式之前进行拒绝——因此 AEP_MODE=production 也无法解除限制。仅当你的沙盒确实名为 prod 时,才使用 AEP_I_UNDERSTAND_THIS_WRITES_TO_PROD=true 覆盖限制。这种推断有意采用不对称设计:信任名称来允许写入并不安全,信任名称来拒绝写入则是安全的,因为最坏情况只是拒绝操作,而你可以主动覆盖。

默认完全禁用变更操作,除非设置了 AEP_ALLOW_MUTATIONS=true。这与 AEP_MODE 分开设置是有意为之:选择一种写入模式,不应该同时意味着“是的,你可以修改我的数据”。

启动时始终会显示当前启用的安全模式:

SAFE MODE — sandbox is a development sandbox, so writes are ENABLED.
SAFE MODE — sandbox is PRODUCTION, so writes are BLOCKED. Reads work normally.
SAFE MODE — sandbox type could not be confirmed, so writes are BLOCKED (fail-closed).
READ-ONLY MODE — no write, update, or delete will be performed in any sandbox.
PRODUCTION MODE — writes permitted against ANY sandbox, including production.
按工具设置确认门槛

写入操作并非一律设有门槛——一律设门槛会让 Agent 无法使用。门槛设在不可逆且影响范围广的操作上,并且每项检查都在任何网络调用之前进行:

工具门槛
aep_create_record_deletedryRun 默认为 true。实际提交需要 confirm: "DELETE RECORDS <datasetId> <identityDigest>"——绑定到数据集以及精确身份集合的 SHA-256 摘要,因此确认信息无法用于其他删除操作。拒绝ALL 和多数据集目标。
aep_delete_segmentconfirm: "DELETE SEGMENT <segmentId>"——直到 0.9.1,区段都只能创建,无法删除,因此 Agent 创建的每个区段都是永久的
aep_delete_datasetconfirm: "DELETE DATASET <id>";如果数据集为 Profile 提供数据,则升级为 "DELETE PROFILE-ENABLED DATASET <id>"
aep_complete_batchconfirm: "COMPLETE BATCH <batchId>"——数据摄取的不可逆节点
aep_revert_batchconfirm: "REVERT BATCH <batchId>"
aep_create_dataset_expirationconfirm: "CREATE DATASET EXPIRATION <datasetId>"——dryRun: true 时除外
aep_update_dataset_expirationconfirm: "UPDATE DATASET EXPIRATION <ttlId>"
aep_cancel_dataset_expirationconfirm: "CANCEL DATASET EXPIRATION <ttlId>"
aep_delete_profileconfirm: "I understand this is irreversible" (已弃用——建议使用 Data Hygiene)

确认信息会注明目标。 带有数据集 ID 的短语——对于记录删除,还会带上身份信息的哈希——无法从一次调用复制到另一次调用。通用的 "I understand this is irreversible" 只需输入一次,就能批准任何删除操作。

身份值绝不会离开进程。 aep_create_record_delete 返回计数、命名空间名称和摘要——绝不会返回你传入的电子邮件地址或设备 ID。记录删除请求本质上是一份真实人员名单;会回显这些信息的工具,会将它们复制到触及的每份对话记录和日志中。

批次创建和文件上传有意不设门槛:这些写入是增量式的,且可恢复。多余的批次可以不完成;已写入的数据则可通过 Data Hygiene 工具移除。

工具注解

每个工具都带有 MCP 注解——readOnlyHint、destructiveHint、idempotentHint、openWorldHint——这些注解与构建工具描述的元数据来自同一来源,因此两者不会出现偏差。

数量
readOnlyHint: true39
destructiveHint: true8
未注解0

这些是面向客户端的提示,并非强制措施——上方的防护机制才负责执行。它们的价值在于,Claude Desktop 这样的客户端会使用 destructiveHint 来判断何时应暂停并询问人工。没有这些提示时,aep_delete_profile 看起来就和 aep_list_schemas 一样。测试会精确断言破坏性工具列表,因此新增第九个工具是有意为之,而非疏忽。


🛠️ 61 个工具

所有工具都使用 aep_ 前缀和 verb_noun 命名。🔒 表示会更改状态 · 🔥 表示具有破坏性。

数据建模与摄取

架构(4 个)

  • list_schemas
  • get_schema
  • create_schema 🔒
  • update_schema 🔒

数据集(4 个)

  • list_datasets
  • get_dataset
  • create_dataset 🔒
  • delete_dataset 🔥

摄取(7 个)

  • create_batch 🔒
  • upload_batch_file 🔒
  • complete_batch 🔥
  • get_batch_status
  • list_batches
  • abort_batch 🔥
  • revert_batch 🔥

来源(2 个)

  • list_sources
  • list_dataflows

查询服务(3 个)

  • run_query 🔒
  • get_query_status
  • list_queries
### 用户画像、受众群体与激活

身份(2)

  • list_identity_namespaces
  • get_identity_graph

用户画像(4)

  • get_profile
  • get_profile_by_identity
  • preview_profile
  • delete_profile 🔥

细分群体(5)

  • list_segments
  • get_segment
  • create_segment 🔒
  • estimate_segment_size
  • delete_segment 🔥

目标位置(3)

  • list_destinations
  • create_destination_connection 🔒
  • activate_segment 🔒
治理 — 隐私、生命周期与事件路由

隐私服务(6)

  • create_privacy_job 🔒
  • get_privacy_job
  • list_privacy_jobs
  • cancel_privacy_job 🔒
  • get_privacy_job_results
  • list_privacy_namespaces

数据清理(9)

  • create_record_delete 🔥
  • get_work_order_status
  • list_work_orders
  • get_data_lifecycle_quota
  • create_dataset_expiration 🔥
  • get_dataset_expiration
  • list_dataset_expirations
  • update_dataset_expiration 🔥
  • cancel_dataset_expiration 🔥

由此解锁的工作流

端到端摄取数据 — create_schema → create_dataset → create_batch → upload_batch_file → complete_batch → get_batch_status

构建并激活受众群体 — create_segment → estimate_segment_size → list_destinations → create_destination_connection → activate_segment

处理删除请求 — get_profile_by_identity → create_record_delete → get_work_order_status

按计划停用数据 — create_dataset_expiration → list_dataset_expirations → update_dataset_expiration → cancel_dataset_expiration

每个工具实际在实时租户上运行过的内容,记录在 docs/VALIDATION-MATRIX.md 中——包括那些有文档且经过模拟、但刻意从未执行的接口,以及原因。

Adobe Journey Optimizer(2)

AJO 是单独授权的独立 Adobe 产品——因此使用 ajo_ 前缀,让授权失败一目了然。

营销活动

  • ajo_list_campaigns
  • ajo_get_campaign

营销活动是我们租户上唯一可访问的 AJO 接口。Journeys、消息、渠道接口、内容模板、片段、优惠和决策都会返回 HTML 404——网关没有这些路由——因此我们刻意不予实现。

刻意不提供写入操作。相关路由确实存在,但对于一个会向真实用户发送消息的产品,发布未经验证的写入路径并不值得。


📊 AEC-Bench — 你的 Agent 真能正常工作吗?

这个领域里的每个 MCP 服务都用工具数量来描述。它衡量的是覆盖面,而非能力:五十个工具全都返回 404,得分也高于十个能正常工作的工具。

bench/ 是一个 Agent 基准测试,用来衡量另一件事——给定一项真实任务和一个实时租户,Agent 能否完成任务?你又能证明这一点吗?

npm run bench          # tier 1, read-only, safe on any tenant
npm run bench:write    # tier 2, creates and removes what it creates
基于 Adobe 执行的断言“创建细分群体”任务的评分依据是 GET 请求能否找到该群体,而不是创建调用自身的成功标志。自我报告的写入结果并非证据。
清理也纳入评分完成目标却留下孤立对象,不算通过。会弄脏租户的基准测试只能诚实地运行一次。
第 1 级可安全用于生产仅 GET。没人敢运行的基准测试毫无衡量意义。

当前结果:第 1 级 5/5,第 2 级 2/2,零残留。 第 3 级(不可逆)已定义,但刻意留空——其任务不可取消,可能耗时 30 天;运行基准测试并不是执行这类任务的好理由。

对于我们尚未构建支持的任务,我们预计得分会很低。这正是设计初衷。

📈 客户旅程分析(10)

现在,一个 OAuth 凭据即可用于三项 Adobe 服务。 将 Customer Journey Analytics API 添加到拥有 AEP_CLIENT_ID 的同一个 Developer Console 项目中,cja_* 工具便会启用——无需第二个密钥,也无需单独认证。

发现

  • cja_list_companies
  • cja_list_connections
  • cja_get_connection
  • cja_list_data_views
  • cja_get_data_view

报告

  • cja_list_dimensions
  • cja_list_metrics
  • cja_list_segments
  • cja_list_calculated_metrics
  • cja_run_report
AEP 沙盒和 CJA 公司并非一回事
AEPCJA
主机platform.adobe.iocja.adobe.io
作用域单位沙盒(AEP_SANDBOX_NAME)全局公司 ID——或 IMS 组织
请求头x-sandbox-namex-proxy-global-company-id(可选——见下文)
是否映射到另一方?否。 CJA 连接或数据视图与任何 AEP 沙盒都不存在一对一关系。

CJA 客户端绝不会发送 x-sandbox-name。 CJA 没有沙盒概念,附加该请求头充其量毫无意义,在跟踪记录中还会造成误导。

公司发现,以及为什么可能无法成功

Adobe 文档中所述的发现端点是 GET https://analytics.adobe.io/discovery/me。该主机属于 Adobe Analytics——这是与 CJA 不同的产品。 拥有 CJA 权限但没有 Analytics 权限的凭据会在此处收到 403003 Api Key is invalid:密钥本身没有问题,只是没有 Analytics 权限。CJA 没有自己的发现功能。

实际上,这不会造成任何阻碍:CJA 仅凭 x-gw-ims-org-id 就能响应所有资源,因此公司 ID 是可选的。

# Optional. Omit it and CJA scopes by IMS org, which is what works by default.
CJA_GLOBAL_COMPANY_ID=your-global-company-id

cja_list_companies 会报告当前使用的上下文,以及发现功能是否可用。如果发现结果返回多个公司且未设置覆盖项,它会拒绝选择——静默选择第一个会导致后续所有报告都指向错误的公司。

运行探测和实时测试
node scripts/probe-cja.mjs --env .env          # read-only, sanitized output
CJA_LIVE_TESTS=1 npm test -- tests/integration/cja-live.test.ts

除非设置 CJA_LIVE_TESTS=1,否则实时测试会跳过,因此 npm test 始终可在隔离环境中运行。这些测试是只读的,绝不会输出凭据或完整的 Adobe 响应。

如实说明当前限制
  • 没有修改工具。 此部分按设计仅提供只读功能。
  • 仅有 CJA 权限的凭据无法使用发现功能,如上所述。这不是工具的缺陷。
  • cja_get_connection 未经验证——验证租户没有任何连接,也绝不会伪造 ID 来制造通过的结果。
  • 维度和指标的分页不起作用。 CJA 会将它们包装在一个看似支持分页的 content 信封中,但 limit 和 page 会被忽略——已通过实时验证,无论如何都会返回全部 38 个维度。search、limit 和 offset 由客户端应用,输出中也会说明这一点。

🥊 与 Adobe 第一方 Experience Platform 工具对比

Adobe 通过 CX Coworker Gateway 提供第一方工具。这是一款真正不错的产品,如果你只需要询问有关租户的问题,就使用它。

Adobe AEP 工具(CX Coworker Gateway)@focusgts/aep-mcp-server
操作只读(search_*)完整 CRUD(读取 + 写入)
工具数量861
访问权限仅限邀请 + 组织启用npm install — 任何拥有 API 凭据的组织均可使用
批量摄取不提供7 个工具
配置文件 / Identity未涵盖6 个工具
Privacy Service未涵盖6 个工具
Data Lifecycle未涵盖9 个工具
传输方式Adobe 托管的网关stdio(本地运行,可与其他 MCP 组合使用)
数据路径查询会经由 Adobe 网关完全在你自己的 VPC 中运行
许可证专有Apache 2.0
错误响应—结构化的 AEP_{status} 代码

关于 Journey Optimizer 和 CJA: Adobe 为两者分别提供了第一方 MCP 服务,因此上表有意不声称它们“未涵盖”——那样说是不准确的。该服务的新增价值在于,一个凭据即可覆盖这三者,并且提供 Adobe 网关不支持的 AEP 写入路径。这里的 AJO 和 CJA 工具为只读。

受众和目标位置也有提供,但位于同一网关上独立的 Real-Time CDP 工具集中;而且 Adobe 明确表示,该处同样不支持创建、激活、更新或删除受众、目标位置和数据流。整个网关都遵循只读限制。

两者互为补充,而非竞争关系:将 Adobe 网关用于受治理的读取操作,将此服务用于写入。

Adobe 的数据摘自其 Experience Platform 工具页面(最后更新于 2026 年 7 月 17 日):search_datasets、search_class_relations、search_data_access、search_data_lake、search_dule、search_query_service、search_audit、search_allowed_ip_ranges。这是一个 Beta 版本,后续会有变化——请查看其文档以了解当前数据。读写权限的差异才是长期存在的区别,而非数量。


🔌 将其添加到你的工具中

Claude Code — 一条命令
claude mcp add aep \
  -e AEP_CLIENT_ID=... -e AEP_CLIENT_SECRET=... \
  -e AEP_ORG_ID=...@AdobeOrg -e AEP_SANDBOX_NAME=your-dev-sandbox \
  -- npx -y @focusgts/aep-mcp-server
Claude Desktop — claude_desktop_config.json

~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):

{
  "mcpServers": {
    "aep": {
      "command": "npx",
      "args": ["-y", "@focusgts/aep-mcp-server"],
      "env": {
        "AEP_CLIENT_ID": "...",
        "AEP_CLIENT_SECRET": "...",
        "AEP_ORG_ID": "...@AdobeOrg",
        "AEP_SANDBOX_NAME": "your-dev-sandbox"
      }
    }
  }
}
Cursor — .cursor/mcp.json
{
  "mcpServers": {
    "aep": {
      "command": "npx",
      "args": ["-y", "@focusgts/aep-mcp-server"],
      "env": {
        "AEP_CLIENT_ID": "...",
        "AEP_CLIENT_SECRET": "...",
        "AEP_ORG_ID": "...@AdobeOrg",
        "AEP_SANDBOX_NAME": "your-dev-sandbox"
      }
    }
  }
}
VS Code(GitHub Copilot) — .vscode/mcp.json
{
  "servers": {
    "aep": {
      "command": "npx",
      "args": ["-y", "@focusgts/aep-mcp-server"],
      "env": {
        "AEP_CLIENT_ID": "...",
        "AEP_CLIENT_SECRET": "...",
        "AEP_ORG_ID": "...@AdobeOrg",
        "AEP_SANDBOX_NAME": "your-dev-sandbox"
      }
    }
  }
}

🔐 凭据

前往 developer.adobe.com/console 获取:创建项目 → 添加 Experience Platform API → OAuth Server-to-Server。

变量必填描述
AEP_CLIENT_ID是Adobe I/O 客户端 ID
AEP_CLIENT_SECRET是Adobe I/O 客户端密钥
AEP_ORG_ID是IMS 组织 ID — 必须以 @AdobeOrg 结尾
AEP_SANDBOX_NAME是每次调用的目标沙盒。无默认值 — 见下文
AEP_ALLOW_MUTATIONS否设为 true 才允许任何写入操作。默认关闭
AEP_MODE否read-only · safe (默认) · production
AEP_I_UNDERSTAND_THIS_WRITES_TO_PROD否仅当你的沙盒名称确实为 prod 时设置
AEP_LOG_RESPONSE_BODIES否记录 Adobe 原始错误正文。默认关闭 — Adobe 会回显请求上下文,其中可能包含身份信息
LOG_LEVEL否Pino 日志级别(默认 info)
AEP_REQUEST_TIMEOUT_MS否单次请求超时时间(默认 30000)
AEP_MAX_RETRIES否遇到 429/5xx 时的重试次数(默认 3)
CJA_GLOBAL_COMPANY_ID否CJA 全局公司 ID。省略即可 — 对于此凭据形式,CJA 按 IMS 组织限定范围。仅在要强制指定 x-proxy-global-company-id 时设置
CJA_BASE_URL否覆盖 CJA 主机(默认 https://cja.adobe.io)
CJA_REQUEST_TIMEOUT_MS否CJA 单次请求超时时间(默认 30000)
CJA_MAX_RETRIES否CJA 遇到 429/5xx 时的重试次数(默认 3)
CJA_LIVE_TESTS否设为 1 以启用可选的实时 CJA 集成测试

AEP_SANDBOX_NAME 刻意不设默认值。 过去它会回退到 prod,这意味着配置文件漏掉一行时,所有请求(包括读取请求)都会在没有警告的情况下静默指向生产环境。不存在安全的默认值:在错误环境中读写数据之前,错误的猜测和正确的设置无法区分。允许显式设为 prod;这是一个明确且有意的选择,而且写入保护仍会拒绝在该环境中执行变更操作。

沙盒范围限定。 每个工具都会发送 x-sandbox-name,Query Service 会将其数据库推导为 <AEP_SANDBOX_NAME>:all。


🧾 许可权益

并非每个 Adobe 组织都为所有 AEP 产品购买了许可。工具返回 AEP_403 通常意味着缺少许可权益,而非凭据错误。

类别所需许可权益
架构 · 数据集 · 摄取AEP(基础)
身份AEP(基础)+ Identity Service
配置文件 · 区段 · 目标Real-Time CDP
来源AEP(基础)— 连接器可用性因 SKU 而异
Query ServiceAEP Query Service 附加组件
Privacy ServiceAdobe Privacy Service(单独销售)
Data HygieneAEP(基础)。Adobe 在此处没有记录 Data Distiller 门槛 — 本表的早期版本曾错误地声称存在此门槛。401 表示组织错误、沙盒错误或凭据配置文件错误,依次排查

🏗️ 架构

全程采用 TypeScript strict、@modelcontextprotocol/sdk + zod、stdio 传输,每个请求均无状态。

flowchart LR
  C["MCP client<br/>Claude · Cursor<br/>Copilot · ChatGPT"]
  T["aep-mcp-server<br/><b>61 tools</b><br/>14 categories"]
  G{{"write guard<br/>fail-closed"}}
  A1["Schema Registry<br/>· Catalog"]
  A2["Batch Ingestion"]
  A3["UPS · Segmentation<br/>· Destinations"]
  A4["Data Lifecycle<br/>· Privacy"]
  IMS[/"Adobe IMS<br/>OAuth S2S"/]

  C -- "stdio · JSON-RPC 2.0" --> T
  T -- "every call, no exceptions" --> G
  IMS -. "token cache · 401 re-auth" .-> T
  G -- "HTTPS · Bearer · x-sandbox-name" --> A1
  G --> A2
  G --> A3
  G --> A4

采用 OAuth Server-to-Server,配备去重令牌缓存、带 PII 脱敏的结构化 pino 日志、指数退避重试、401 自动重新认证、可用的游标分页、结构化 AEP_{status} 错误代码,以及优雅关闭生命周期。所有日志均输出到 stderr — stdout 专用于 MCP JSON-RPC 流。


🧪 开发

git clone https://github.com/Focus-GTS/aep-mcp-server.git
cd aep-mcp-server && npm install && npm run build && npm test
npm run dev          # tsx src/server.ts (hot-reload)
npm test             # vitest — 509 tests
npm run typecheck    # tsc --noEmit
npm run tools        # print the registered tool surface

npm run test:live 会针对真实 IMS 组织和沙盒运行只读冒烟测试,以端到端验证凭据、许可权益和沙盒范围限定。它不会调用任何破坏性工具,并要求 AEP_SANDBOX_NAME 指向非生产沙盒。


🧩 Focus GTS Adobe 套件的一部分

eds-mcp-serverAdobe Edge Delivery Services 的 MCP 服务 — 读取、审计、修复、发布和撤销网站更改
eds-content-ops-skills用于 EDS 内容运营的 AI 技能 — 首个合并到 Adobe 官方技能仓库 的第三方贡献
eds-ops用于自动评估网站并控制 PR 合并的 CLI + GitHub Action
EDS Score免费的浏览器版网站健康分析工具

由 Focus GTS 构建 — Adobe 银牌解决方案合作伙伴 · Apache-2.0
欢迎通过 Focus-GTS/aep-mcp-server 提交错误报告和 PR · [email protected]
与 Adobe Inc. 或 Anthropic, PBC 无关联,也未获得其认可。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。