数据云代码MCP服务

一个基于Salesforce Data Cloud的MCP服务器,提供搜索和执行功能,用于通过JavaScript代码动态探索和执行Data Cloud API操作。

  • by dsouzaAnush
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 dsouzaAnush/datacloud-code-mcp

使用说明

数据云代码MCP

Salesforce数据云(Data360)MCP服务器使用 Cloudflare代码模式 模式:两个工具(search + execute),每个都采用一个JavaScript异步箭头函数,无论API表面大小如何,都有一个固定的约1吨的工具足迹。

运作原理

该服务器没有公开数百个端点级工具,而是为代理提供了一个稳定的两步循环:

  1. search --代理编写JavaScript来过滤OpenAPI规范并发现数据云端点。
  2. execute --代理编写JavaScript调用 salesforce.request() 以进行经过身份验证的API请求。

这两个工具都在 node:vm 带有受限全局变量的沙盒。完整的OpenAPI规范从未进入模型上下文——代理通过编程方式对其进行探索 search().

覆盖范围

约185个API系列的数据云操作:

家庭 示例
查询 SQL查询(v1/v2/v3)、配置文件、见解、数据图
DMO/水 数据模型对象和数据湖对象的CRUD
映射 DMO字段映射、批量映射、标准映射
数据流 列出、创建、更新、删除、触发运行
连接器 列表类型、元数据、CRUD连接、测试
计算洞察 CRUD、运行、验证、启用/禁用
片段 CRUD、发布、成员、重叠分析
身份解析 CRUD规则集、发布、运行、匹配历史记录
激活 CRUD激活+目标、同步、历史
数据转换 CRUD、运行、验证、计划
语义数据模型 模型、对象、维度、度量、指标、关系、查询
数据空间 CRUD空间、成员管理
数据工具包 列表、清单、部署、取消部署、组件状态
GDPR 数据保护 访问权、批量读取权、擦除请求权
搜索索引 CRUD,混合全文查询
事件驱动 单次和批量a360事件发布
数据操作 CRUD操作+目标

快速开始

npm install
npm run build
npm test        # 27 tests across 5 suites

身份验证选项

选项1:直接访问令牌(与d360 mcp服务器的环境变量相同)

CDP_ACCESS_TOKEN=<token> CDP_INSTANCE_URL=<url> npm run dev

选项2:OAuth客户端凭据

CDP_CLIENT_ID=<id> CDP_CLIENT_SECRET=<secret> CDP_LOGIN_URL=https://login.salesforce.com npm run dev

选项3:OAuth web流

  1. 集 SALESFORCE_OAUTH_CLIENT_ID, SALESFORCE_OAUTH_CLIENT_SECRET, SALESFORCE_OAUTH_REDIRECT_URI 在 .env.
  2. 启动服务器: npm run dev
  3. 打开 /oauth/start?user_id=default 并完成登录。

选项4:来自CLI的种子令牌

npm run seed:token     # reads sf CLI auth or env vars
TOKEN_STORE_PATH=./data/tokens.integration.json \
TOKEN_ENCRYPTION_KEY_BASE64='<from seed>' npm run dev

运行服务器

PORT=3000 HOST=127.0.0.1 npm run dev
curl -sS http://127.0.0.1:3000/healthz

冒烟测试

MCP_URL=http://127.0.0.1:3000/mcp USER_ID=default npm run smoke:mcp

示例通话

搜索:按标签查找端点

{
  "name": "search",
  "arguments": {
    "code": "async () => {\n  const results = [];\n  for (const [path, methods] of Object.entries(spec.paths)) {\n    for (const [method, op] of Object.entries(methods)) {\n      if (op.tags?.some(t => t.toLowerCase().includes('segment'))) {\n        results.push({ method: method.toUpperCase(), path, summary: op.summary });\n      }\n    }\n  }\n  return results;\n}"
  }
}

搜索:检查端点架构

{
  "name": "search",
  "arguments": {
    "code": "async () => {\n  const op = spec.paths['/services/data/v64.0/ssot/query-sql']?.post;\n  return { summary: op?.summary, requestBody: op?.requestBody };\n}"
  }
}

执行:运行SQL查询

{
  "name": "execute",
  "arguments": {
    "code": "async () => {\n  return await salesforce.request({\n    method: 'POST',\n    path: '/services/data/v64.0/ssot/query-sql',\n    body: { sql: 'SELECT FirstName__c FROM UnifiedIndividual__dlm LIMIT 5' }\n  });\n}"
  }
}

执行:链接多个调用

{
  "name": "execute",
  "arguments": {
    "code": "async () => {\n  const list = await salesforce.request({ method: 'GET', path: '/services/data/v64.0/ssot/segments' });\n  const first = list.body?.data?.[0];\n  if (!first) return { message: 'No segments' };\n  return await salesforce.request({ method: 'GET', path: '/services/data/v64.0/ssot/segments/' + first.id });\n}"
  }
}

MCP客户端集成

{
  "mcpServers": {
    "datacloud-code-mcp": {
      "transport": "streamable_http",
      "url": "http://127.0.0.1:3000/mcp",
      "headers": { "x-user-id": "default" }
    }
  }
}

安全模型

  • 诱变方法(POST, PATCH, PUT, DELETE)除非被阻止 ALLOW_WRITES=true.
  • salesforce.request() 只允许出站HTTP到经过身份验证的实例的主机名+ *.salesforce.com + *.force.com.
  • 敏感的标头/正文键在工具输出中被编辑。
  • 用户代码在 node:vm 沙盒没有 require, process, global,或文件系统访问。
  • 沙盒强制执行 SANDBOX_TIMEOUT_MS (默认15秒)以防止执行失控。

部署到Heroku

heroku create
heroku config:set TOKEN_ENCRYPTION_KEY_BASE64=$(node -e "console.log(require('crypto').randomBytes(32).toString('base64'))")
heroku config:set ALLOW_WRITES=false
heroku config:set CDP_ACCESS_TOKEN=<token> CDP_INSTANCE_URL=<url>
git push heroku main

然后将您的MCP客户端指向 https://<app>.herokuapp.com/mcp.

配置

看 .env.example 对于所有可用的环境变量。

项目布局

src/
  index.ts              HTTP server + MCP session management
  mcp-server.ts         Tool registration (search, execute, auth_status)
  config.ts             Zod-parsed environment config
  types.ts              Shared TypeScript interfaces
  logger.ts             Pino logger
  auth/
    oauth-service.ts    Salesforce OAuth web flow + token exchange
    auth-modes.ts       Strategy resolver (direct/client-cred/password/oauth)
    token-store.ts      AES-256-GCM encrypted token persistence
  schema/
    datacloud-schema-service.ts   Catalog loader, merger, $ref resolver
    catalog.ts                    OpenAPI → PlatformOperation parser
    spec-processor.ts             $ref resolution + spec processing (Cloudflare pattern)
    bundled-spec.ts               Resolve bundled YAML paths
    data360-api.bundled.yaml      Base OpenAPI spec (~35 endpoints)
    d360-extras.yaml              Extended endpoints (~150 more operations)
  sandbox/
    runner.ts           node:vm sandbox executor
    sf-client.ts        salesforce.request() injectable client
    safe-fetch.ts       Hostname-allow-listed fetch wrapper
    truncate.ts         Response truncation
  execute/
    datacloud-executor.ts   Legacy structured executor (kept for reference)
    redaction.ts            Body/header redaction helpers
    http-policy.ts          Retry + read-cache helpers
  safety/
    write-confirmation.ts   HMAC write tokens (used by legacy executor)
  search/
    search-index.ts         BM25 search index (kept for potential reuse)
  utils/
    crypto.ts               AES-256-GCM encrypt/decrypt
    headers.ts              Header value resolver
tests/                      Vitest test suites
scripts/                    Smoke test + token seed scripts
docs/                       Reference docs (Data Cloud guide, Postman)

参考文献