UI UX Pro Max:AI 设计智能与前端实现 - Openclaw Skills
2026-08-16 3451331
2026-08-16 0
Salesforce 技能使开发人员和 AI 代理能够直接与 Salesforce REST API 交互,而无需繁琐的手动 OAuth 生命周期管理。通过利用 Openclaw Skills 框架,此集成提供了一个安全网关,可自动处理令牌注入和实例路由。它允许与核心 CRM 实体(包括客户、联系人、潜在客户和机会)进行深度交互。
此技能专为高性能 CRM 操作而设计,支持从简单的单条记录 CRUD 操作到复杂的批量处理和 SOQL 查询的一切。它充当您的本地开发环境与 Salesforce 云之间的桥梁,确保您的代理能够以极简的配置读取、写入和搜索客户数据。
下载入口:https://github.com/openclaw/skills/tree/main/skills/byungkyu/salesforce-api
从源直接安装技能的最快方式。
npx clawhub@latest install salesforce-api
将技能文件夹复制到以下位置之一
全局模式~/.openclaw/skills/
工作区
/skills/
优先级:工作区 > 本地 > 内置
将此提示词复制到 OpenClaw 即可自动安装。
请帮我使用 Clawhub 安装 salesforce-api。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。
要使用 Openclaw Skills 将此技能集成到您的工作流程中,请按照以下安装步骤操作:
export MATON_API_KEY="YOUR_API_KEY"
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'salesforce'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
该技能与标准 Salesforce sObject 交互并以 JSON 格式返回数据。以下是支持的主要对象:
| 对象 | 描述 | 关键字段 |
|---|---|---|
| Account | 业务实体 | Name, Industry, Type |
| Contact | 个人 | FirstName, LastName, Email |
| Lead | 潜在客户 | Company, Status, Rating |
| Opportunity | 销售交易 | Amount, StageName, CloseDate |
| Case | 支持问题 | CaseNumber, Subject, Status |
| Task | 待办事项 | ActivityDate, Description, Priority |
name: salesforce
description: |
Salesforce CRM API integration with managed OAuth. Query records with SOQL, manage sObjects (Contacts, Accounts, Leads, Opportunities), and perform batch operations. Use this skill when users want to interact with Salesforce data. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
compatibility: Requires network access and valid Maton API key
metadata:
author: maton
version: "1.0"
clawdbot:
emoji: ??
requires:
env:
- MATON_API_KEY
Access the Salesforce REST API with managed OAuth authentication. Query records using SOQL, manage sObjects, and perform CRUD operations on your Salesforce data.
# Query contacts
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/salesforce/services/data/v59.0/query?q=SELECT+Id,Name,Email+FROM+Contact+LIMIT+10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://gateway.maton.ai/salesforce/{native-api-path}
Replace {native-api-path} with the actual Salesforce REST API endpoint path. The gateway proxies requests to {instance}.salesforce.com (automatically replaced with your connection config) and injects your access token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your Salesforce OAuth connections at https://ctrl.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=salesforce&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'salesforce'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "salesforce",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple Salesforce connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/salesforce/services/data/v59.0/sobjects')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If omitted, the gateway uses the default (oldest) active connection.
GET /salesforce/services/data/v59.0/query?q=SELECT+Id,Name+FROM+Contact+LIMIT+10
Complex query:
GET /salesforce/services/data/v59.0/query?q=SELECT+Id,Name,Email+FROM+Contact+WHERE+Email+LIKE+'%example.com'+ORDER+BY+CreatedDate+DESC
GET /salesforce/services/data/v59.0/sobjects/{objectType}/{recordId}
Example:
GET /salesforce/services/data/v59.0/sobjects/Contact/003XXXXXXXXXXXXXXX
POST /salesforce/services/data/v59.0/sobjects/{objectType}
Content-Type: application/json
{
"FirstName": "John",
"LastName": "Doe",
"Email": "[email protected]"
}
PATCH /salesforce/services/data/v59.0/sobjects/{objectType}/{recordId}
Content-Type: application/json
{
"Phone": "+1234567890"
}
DELETE /salesforce/services/data/v59.0/sobjects/{objectType}/{recordId}
GET /salesforce/services/data/v59.0/sobjects/{objectType}/describe
GET /salesforce/services/data/v59.0/sobjects
GET /salesforce/services/data/v59.0/search?q=FIND+{searchTerm}+IN+ALL+FIELDS+RETURNING+Contact(Id,Name)
POST /salesforce/services/data/v59.0/composite
Content-Type: application/json
{
"compositeRequest": [
{
"method": "GET",
"url": "/services/data/v59.0/sobjects/Contact/003XXXXXXX",
"referenceId": "contact1"
},
{
"method": "GET",
"url": "/services/data/v59.0/sobjects/Account/001XXXXXXX",
"referenceId": "account1"
}
]
}
POST /salesforce/services/data/v59.0/composite/batch
Content-Type: application/json
{
"batchRequests": [
{"method": "GET", "url": "v59.0/sobjects/Contact/003XXXXXXX"},
{"method": "GET", "url": "v59.0/sobjects/Account/001XXXXXXX"}
]
}
POST /salesforce/services/data/v59.0/composite/sobjects
Content-Type: application/json
{
"allOrNone": true,
"records": [
{"attributes": {"type": "Contact"}, "FirstName": "John", "LastName": "Doe"},
{"attributes": {"type": "Contact"}, "FirstName": "Jane", "LastName": "Smith"}
]
}
DELETE /salesforce/services/data/v59.0/composite/sobjects?ids=003XXXXX,003YYYYY&allOrNone=true
GET /salesforce/services/data/v59.0/sobjects/{objectType}/updated/?start=2026-01-30T00:00:00Z&end=2026-02-01T00:00:00Z
GET /salesforce/services/data/v59.0/sobjects/{objectType}/deleted/?start=2026-01-30T00:00:00Z&end=2026-02-01T00:00:00Z
GET /salesforce/services/data/v59.0/limits
GET /salesforce/services/data/
Account - Companies/OrganizationsContact - People associated with accountsLead - Potential customersOpportunity - Sales dealsCase - Support casesTask - To-do itemsEvent - Calendar eventsconst response = await fetch(
'https://gateway.maton.ai/salesforce/services/data/v59.0/query?q=SELECT+Id,Name+FROM+Contact+LIMIT+5',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
import os
import requests
response = requests.get(
'https://gateway.maton.ai/salesforce/services/data/v59.0/query',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'q': 'SELECT Id,Name FROM Contact LIMIT 5'}
)
+)YYYY-MM-DDTHH:MM:SSZallOrNone: true in batch operations for atomic transactionscurl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.| Status | Meaning |
|---|---|
| 400 | Missing Salesforce connection |
| 401 | Invalid or missing Maton API key |
| 429 | Rate limited (10 req/sec per account) |
| 4xx/5xx | Passthrough error from Salesforce API |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
salesforce. For example:https://gateway.maton.ai/salesforce/services/data/v59.0/queryhttps://gateway.maton.ai/services/data/v59.0/query