Salesforce MCP服务器

一个桥接MCP客户端与Salesforce REST API的服务器,提供灵活的配置驱动方法集成AI助手与Salesforce数据和操作。

  • by oxrinz
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 oxrinz/sf-mcp

使用说明

sf-mcp 可以翻译为“软件功能-多通道处理”或根据具体上下文调整为更贴切的表述,但直接翻译“sf-mcp”本身并无固定含义,需结合其应用领域来解释。在这里,“sf”可能代表“software function”(软件功能),“mcp”可能代表“multi-channel processing”(多通道处理)或其他相关概念,具体需依据实际应用场景来确定

一个Salesforce MCP(模型上下文协议)服务器,用于连接MCP客户端与Salesforce REST API。

此应用程序旨在用于试验Salesforce和LLM客户端。 它提供了一种灵活、基于配置的方法,用于将人工智能助手与Salesforce的数据和操作进行集成。

注: 这个应用程序完全由克劳德(Anthropic的人工智能助手)编写。

你可以在开发者实例上尝试示例提示,比如:

  • 检查我的客户,如果有联系电话以000结尾的,就使用Salesforce创建通用任务工具为我创建一个任务,截止日期设为下周五

特点/特性

  • OAuth 2.0 认证使用OAuth 2.0网页流与Salesforce进行安全认证
  • 动态工具加载工具从JSON配置文件中动态加载
  • 灵活配置通过JSON定义自定义工具、提示、资源和指令
  • 变量替换支持 ${variable} URL、头部、查询参数和请求体中的语法
  • 自动令牌刷新OAuth令牌在到期时会自动刷新
  • 基于文件的身体模板请求体可以定义在单独的JSON文件中,以便更好地组织

能力

可用工具

sf-mcp服务器提供了多个内置工具,用于与Salesforce进行交互:

查询与数据检索

salesforce-query

  • 使用SOQL(Salesforce对象查询语言)查询Salesforce记录
  • 支持带有过滤器、连接和聚合的复杂查询
  • 返回带有元数据的分页结果
  • 示例: SELECT Id, Name, Email FROM Contact WHERE LastName = 'Smith'

salesforce-query-more

  • 从之前的查询中检索更多批次的记录
  • 当初始查询结果超过批次大小限制时使用
  • 需要 nextRecordsUrl 从之前的查询回复中

salesforce-describe

  • 获取有关Salesforce对象(sObjects)的详细元数据
  • 返回字段定义、数据类型、关系以及权限
  • 在执行操作之前,理解数据模型至关重要
  • 示例:描述Account对象以查看所有可用字段

任务管理

salesforce-create-task

  • 使用简化界面创建任务
  • 参数:
    • subject任务主题/标题
    • assignedTo分配任务的用户或组ID
    • dueDate截止日期,格式为YYYY-MM-DD
    • forRecordId(可选)相关记录ID
  • 自动设置标准任务字段

salesforce-create-generic-task

  • 创建任务时,对所有任务对象字段拥有完全控制权
  • 接受符合Salesforce任务对象架构的JSON主体
  • 支持自定义字段和高级任务配置
  • 示例字段: Subject, OwnerId, ActivityDate, Priority, Status, Description, WhatId, WhoId

指令系统

instructions

  • 检索与上下文相关的指令和指南
  • 支持基于标签的过滤功能,适用于不同领域(账户、客户、联系人)
  • 返回相关的业务规则、数据模型规范和最佳实践
  • 确保AI助手遵循您组织的Salesforce规范至关重要

支持的操作

服务器可以通过自定义工具定义来扩展,以支持任何Salesforce REST API操作:

  • CRUD 操作创建、读取、更新和删除记录
  • 批量操作高效处理大型数据集
  • 搜索使用SOSL在多个对象中执行文本搜索
  • 元数据操作查询并修改Salesforce配置
  • 复合请求在一个API调用中执行多个操作
  • **自定义Apex REST(端点)**调用自定义的REST端点

数据访问模式

  • 实时查询执行SOQL查询以检索当前数据
  • 字段级安全尊重Salesforce的字段级和对象级权限
  • 关系导航使用父子关系和查找关系查询相关记录
  • 自定义对象全面支持自定义对象和字段
  • 标准对象访问所有标准的Salesforce对象(账户、联系人、潜在客户、商机、案例、任务等)

认证与安全

  • 安全的OAuth 2.0网页流程认证
  • 本地存储的令牌,自动刷新
  • 支持生产和沙盒环境
  • 会话管理,包括处理令牌过期

安装

先决条件

  • Go 1.21 或更高版本
  • 一个具有API访问权限的Salesforce账户
  • 带有OAuth凭据的Salesforce连接应用

从源代码构建

go build -o sf-mcp cmd/sf-mcp/main.go

配置

目录结构

服务器需要一个主目录(默认:当前目录),其中包含:

meta/
├── server.json           # MCP server metadata
├── tools/               # Tool definitions
│   └── *.json
├── prompts/             # Prompt definitions
│   └── *.json
├── resources/           # Resource definitions
│   └── *.json
└── instructions/        # Instruction definitions
    └── *.json
config.json              # Salesforce OAuth credentials

config.json(配置文件)

创建一个 config.json 在你家目录中的文件:

{
  "clientId": "your-salesforce-connected-app-client-id",
  "redirectUri": "http://localhost:8080/callback"
}

meta/server.json 翻译为中文是:元数据/服务器配置文件.json

{
  "name": "salesforce-mcp",
  "title": "Salesforce MCP Server",
  "version": "1.0.0",
  "instructions": "MCP server for Salesforce REST API"
}

工具定义

在(相应位置)创建工具定义 meta/tools/示例(meta/tools/query.json):

{
  "name": "salesforce-query",
  "description": "Query Salesforce records using SOQL",
  "method": "GET",
  "url": "/services/data/v64.0/query",
  "properties": [
    {
      "name": "query",
      "type": "string",
      "description": "Salesforce SOQL query string",
      "required": true
    }
  ],
  "parameters": [
    {
      "name": "q",
      "value": "${query}"
    }
  ]
}

请求体

工具定义支持两种指定请求体的方式:

选项1:内联主体

使用 body 字段,其值为字符串(支持 ${variable} (替换):

{
  "name": "create-account",
  "description": "Create a new account",
  "method": "POST",
  "url": "/services/data/v64.0/sobjects/Account",
  "body": "{\"Name\": \"${accountName}\"}",
  "properties": [
    {
      "name": "accountName",
      "type": "string",
      "description": "Account name",
      "required": true
    }
  ]
}

选项2:基于文件的主体

使用 bodyUri 引用外部JSON文件的字段:

{
  "name": "create-account",
  "description": "Create a new account",
  "method": "POST",
  "url": "/services/data/v64.0/sobjects/Account",
  "bodyUri": "file://create-account-body.json",
  "properties": [
    {
      "name": "accountName",
      "type": "string",
      "description": "Account name",
      "required": true
    }
  ]
}

并创造 meta/tools/create-account-body.json:

{
  "Name": "${accountName}"
}

注: 如果两者都 body 和 bodyUri 被指定, bodyUri 具有优先权。

指令定义

在(系统/程序中)创建指令定义 meta/instructions/示例:

{
  "name": "my-salesforce",
  "description": "Instructions for Salesforce data models and processes",
  "properties": [
    {
      "name": "tags",
      "type": "string",
      "description": "space separated list of tags",
      "required": false
    }
  ],
  "sources": [
    {
      "name": "general-instructions",
      "description": "General instructions",
      "tags": "",
      "mimeType": "text/plain",
      "uri": "file://general-instructions.txt"
    },
    {
      "name": "account-management",
      "description": "Account related instructions",
      "tags": "account",
      "mimeType": "text/plain",
      "uri": "file://account-management.txt"
    }
  ]
}

使用方法

首次设置

登录Salesforce以获取OAuth令牌:

./sf-mcp login
# Or for sandbox:
./sf-mcp login test.salesforce.com

这将打开您的浏览器以进行OAuth认证,并保存令牌到 ~/.tokens.json。

启动MCP服务器

./sf-mcp

或者指定一个自定义的主目录:

./sf-mcp -home /path/to/config

服务器运行在stdio传输层上,并通过MCP协议进行通信。

示例用例

查询记录

"Find all active customers in the electronics industry"
→ Uses salesforce-query to execute: SELECT Id, Name FROM Account WHERE Industry = 'Electronics' AND Active__c = true

创建任务

"Create a follow-up task for next Friday assigned to me"
→ Uses salesforce-create-task with appropriate parameters

检查数据模型

"What fields are available on the Contact object?"
→ Uses salesforce-describe to retrieve Contact metadata

复杂的工作流程

"Find all opportunities closing this month, create a task for each one assigned to the owner"
→ Combines salesforce-query and salesforce-create-generic-task

建筑

核心组件

  • MCP服务器 (internal/mcp/server.go): 使用stdio传输实现MCP协议
  • Salesforce 连接 (internal/sf/): 管理HTTP请求、OAuth令牌和自动刷新
  • 元数据系统 (internal/meta/): 加载并验证工具/提示/资源/指令定义
  • 工具注册表 (internal/mcp/tools.go): 注册工具并处理调用

变量替换

服务器支持 ${variable} 语法结构在:

  • 网址(URLs)
  • 标题(或头部信息)
  • 查询参数
  • 请求体(包括内联和基于文件的)

变量被工具调用参数中的值所替换。

发展

项目结构

sf-mcp/
├── cmd/sf-mcp/          # Main application entry point
├── internal/
│   ├── mcp/             # MCP server implementation
│   ├── meta/            # Metadata loading and validation
│   ├── sf/              # Salesforce connection and OAuth
│   └── services/        # Configuration services
├── meta/                # Default configuration files
└── web/                 # Frontend (Svelte)

许可证

麻省理工学院许可证

版权所有 (c) 2025

特此免费授予任何获得本副本的人员以下许可: 此软件及其相关文档文件(以下简称“软件”)的使用,以进行处理 在软件中不受限制,包括但不限于以下权利 使用、复制、修改、合并、发布、分发、再许可和/或销售 软件的副本,并允许那些获得软件的人 经授权可如此行事,但需遵守以下条件:

上述版权声明和本许可声明应包含在所有(作品/文件/内容等)中 软件的副本或大部分内容。

该软件按“原样”提供,不附带任何形式的明示或暗示保证 暗示的,包括但不限于对适销性(或商品质量保证)的担保, 特定用途的适用性和无侵权性。在任何情况下 作者或版权所有者不对任何索赔、损害或其他责任负责 因合同、侵权或其他原因而产生的责任, 因软件本身、使用软件或与软件相关的其他交易而产生 软件。

做出贡献

欢迎贡献!请随时提交拉取请求。

支持

对于问题和疑问,请在GitHub上提交一个议题。