使用说明
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分配任务的用户或组IDdueDate截止日期,格式为YYYY-MM-DDforRecordId(可选)相关记录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上提交一个议题。
