REST 接口来源
把任何提供 HTTP 接口的服务接成来源,选好认证方式并用测试端点确认连得通。
接口来源如何工作
接口来源把一个 HTTP 服务变成 Agent 可以直接调用的工具。只要服务有接口,配好基地址和凭据就能接入,不需要对方额外提供 MCP 服务。
配置完成后,工作台会生成一个通用的 HTTP 请求工具:Agent 自己决定方法、路径、查询参数和请求体,认证信息由工作台统一附带,你不用在每次对话里重复交代。
baseUrl 决定工具请求路径的拼接起点;它不是文件或网络沙箱。访问范围还取决于服务方账号权限、令牌 scope 和来源权限规则。
配置
接口来源通过来源目录里的 config.json 声明。type 固定为 api,其余字段决定请求打向哪里、用什么方式认证,以及如何校验连接。
来源目录里的其余文件与接口来源同样配合使用:说明文件用来告诉 Agent 这个接口该怎么调,权限文件用来限定只读模式下允许的请求方法与路径。
| 字段 | 必填 | 说明 |
|---|---|---|
id / slug / enabled / provider | 是 | 唯一来源 ID、目录标识、启用布尔值及服务商;与 name、type 一起保存。 |
type | 是 | 固定为 api,表示接口来源。 |
name | 是 | 来源列表中显示的名称。 |
tagline | 否 | 一句话用途说明,帮助在列表里分辨。 |
icon | 否 | 图标地址、emoji 或本地文件。 |
api.baseUrl | 是 | 所有请求的基地址,末尾保留斜杠。 |
api.testEndpoint | 否 | 用于校验连接的请求配置,见下节。 |
api.authType | 是 | 认证方式,取值见认证方式一节。 |
api.headerName | 否 | header 方式使用的请求头名称。 |
api.headerNames | 否 | 多请求头方式使用的名称数组。 |
api.queryParam | 否 | query 方式使用的查询参数名。 |
api.authScheme | 否 | bearer 方式的前缀,默认 Bearer。 |
api.renewEndpoint | 否 | 令牌续期配置,用于非 OAuth 的 bearer 接口。 |
api.oauth | 显式 OAuth 时必填 | authorizationUrl、tokenUrl、clientId,以及可选 clientSecret、scopes、audience、extraParams;省略整个 oauth 块时尝试自动发现。 |
{ "id": "github-api-docs-example", "name": "GitHub API", "slug": "github-api", "enabled": true, "provider": "github-api", "type": "api", "api": { "baseUrl": "https://api.github.com/", "authType": "bearer", "defaultHeaders": { "Accept": "application/vnd.github+json" }, "testEndpoint": { "method": "GET", "path": "user" } } }
认证方式
认证方式决定凭据以什么形式出现在请求里。绝大多数现代服务使用 bearer 令牌,老接口多用自定义请求头或查询参数,也有服务只认用户名加口令。
需要同时提供多组凭据时,用多请求头方式:每个名称会对应一个独立的输入项,所有请求头会一起带进每一次请求。
| 方式 | 适用场景 | 请求中如何携带 |
|---|---|---|
| bearer | 绝大多数现代接口的访问令牌 | Authorization: Bearer <令牌> |
| header | 使用自定义请求头的接口 | 自定义请求头,例如 X-API-Key: <令牌> |
| query | 把凭据放在查询参数里的接口 | 查询参数,例如 ?api_key=<令牌> |
| basic | 用户名加口令的接口 | Authorization: Basic <base64 编码> |
| none | 完全公开的接口 | 不携带任何凭据 |
| oauth | 标准 OAuth 2.0 服务 | 桌面发起授权与回调,取得访问令牌后由工具按 Bearer 注入 |
{ "api": { "baseUrl": "https://api.example.com/v1/", "authType": "header", "headerName": "X-API-Key" } }
通用 OAuth:自动发现与显式端点
对 provider 不是 google、microsoft 或 slack 的 API,设置 api.authType: oauth。没有 api.oauth 时,运行时从 baseUrl 尝试 RFC 9728 受保护资源元数据、RFC 8414 授权服务元数据及动态客户端注册;这要求服务实际发布这些能力。
服务不支持发现时,在 api.oauth 明确指定授权端点、令牌端点、客户端 ID 和范围。下面是 GitHub 自建 OAuth App 的完整示例;Client ID/Secret 必须替换为你自己的注册值,并选择所需的最小 scope。
- 在服务商后台注册你自己的 OAuth 应用。桌面来源授权使用 http://localhost:{本次端口}/callback,监听从 6477 起选择空闲端口。注册规则必须允许该回调;不要使用 Craft 托管地址或假定 8914 固定可用。
- 保存配置后,请 Agent 调用 source_oauth_trigger({"sourceSlug":"github-oauth"}),在浏览器核对账号与范围并同意;保留发起授权的桌面应用以接收 code 和校验 state。
- 应用使用 PKCE 交换令牌,成功后保存访问令牌及服务返回的刷新令牌。再运行 source_test({"sourceSlug":"github-oauth"}),实际 GET user 核对身份。
- 测试刷新需等令牌到期或按供应商允许的方式验证;没有 refresh_token 的服务不能承诺自动续期。失败先查 redirect_uri、clientSecret、scope、离线授权与服务错误。
| api.oauth 字段 | 含义 |
|---|---|
| authorizationUrl / tokenUrl | 必填,分别是授权页与 code/refresh 令牌端点,使用完整 HTTPS URL。 |
| clientId / clientSecret | clientId 必填;机密客户端还需 secret,公共 PKCE 客户端可省略 secret。 |
| scopes | 字符串数组;以服务支持的实际范围为准。 |
| audience / extraParams | 服务要求的 audience,以及授权 URL 的额外参数,例如离线授权提示。 |
{ "id": "github-oauth-docs-example", "name": "GitHub OAuth", "slug": "github-oauth", "enabled": true, "provider": "github-oauth", "type": "api", "api": { "baseUrl": "https://api.github.com/", "authType": "oauth", "oauth": { "authorizationUrl": "https://github.com/login/oauth/authorize", "tokenUrl": "https://github.com/login/oauth/access_token", "clientId": "REPLACE_WITH_REGISTERED_CLIENT_ID", "clientSecret": "REPLACE_WITH_REGISTERED_CLIENT_SECRET", "scopes": [ "read:user" ] }, "testEndpoint": { "method": "GET", "path": "user" } } }
测试端点
测试端点用来确认这个来源真的连得上。校验时工作台会请求这个地址,一次性验证基地址可达、凭据有效、服务响应正常。
testEndpoint 支持 method(GET 或 POST)、path,以及可选 body 和 headers;查询参数写进 path。选择无副作用且确实要求同一凭据的接口。
| 接口类型 | 测试端点 | 说明 |
|---|---|---|
| 健康检查 | health | 响应最快,但可能不校验凭据。 |
| 用户信息 | me、user | 同时验证凭据与账号可见范围。 |
| 状态查询 | status、ping | 适合响应体积很小的服务。 |
| 带上限的列表 | items?limit=1 | 用最小数据量验证凭据。 |
令牌续期
有些服务不提供标准 OAuth,却有自己的令牌刷新接口。这类接口来源可以配置续期端点:令牌即将过期时,工作台自动调用它换取新令牌,不需要人工重新认证。
续期请求默认把当前令牌放在 Authorization 请求头里;如果配置了请求体,字符串里的 {{token}} 会被替换成当前令牌,嵌套对象同样生效。
| 字段 | 必填 | 默认值 | 说明 |
|---|---|---|---|
path | 是 | — | 续期地址,相对基地址或完整地址。 |
method | 否 | POST | 请求方法,GET 或 POST。 |
body | 否 | — | 请求体,{{token}} 会被替换成当前令牌。 |
headers | 否 | — | 附加请求头,同样支持 {{token}}。 |
tokenField | 否 | access_token | 响应中新令牌所在的字段名。 |
expiresInField | 否 | expires_in | 响应中有效期(秒)所在的字段名。 |
fallbackTtlSecs | 否 | — | 响应未给有效期时使用的兜底时长。 |
{ "api": { "baseUrl": "https://api.example.com/v1/", "authType": "bearer", "renewEndpoint": { "path": "auth/refresh", "method": "POST", "tokenField": "access_token" } } }
为什么用接口来源
接口来源的价值在于覆盖面:只要对方有 HTTP 接口,就不需要对方配合改造。内部系统、自建服务和只提供文档的服务都能用同样一套方式接进来。
配置成本也很低。填好基地址、选一种认证方式、给一个测试端点,通常几分钟就能完成,剩下的请求细节交给 Agent 现场决定。
- 通用兼容:任何提供 REST 接口的服务都能接入,不要求对方发布额外组件。
- 配置简单:基地址加认证信息就是最小配置,其余参数按需补充。
- 请求灵活:方法、路径、查询参数与请求体都可以由 Agent 按接口文档决定。
- 凭据集中保管:访问凭据保存在专门的凭据存储里,不写进来源配置文件。
MCP 与接口来源对比
两种来源解决的问题重叠,选择标准很实际:有现成 MCP 服务就用 MCP,只有 HTTP 接口就用接口来源,需要任意 HTTP 访问时也用接口来源。
两者可以并存。先用 MCP 覆盖需要细粒度工具的服务,再用接口来源补上只有 HTTP 接口的系统,按分工配置比强行统一更省事。
| 维度 | MCP 来源 | 接口来源 |
|---|---|---|
| 准备方式 | 需要 MCP 服务地址 | 基地址加认证配置 |
| 工具形态 | 服务预先定义好的工具 | 一个通用的 HTTP 请求工具 |
| 认证方式 | OAuth / bearer / none | OAuth / bearer / header / query / basic / none |
| 适合场景 | 已提供 MCP 服务的系统 | 任何提供 REST 接口的服务 |
实用示例
API 工具接受 {"path":"相对路径","method":"GET","params":{}}。GET 的 params 编码为查询参数;POST/PUT/PATCH 的 params 默认是 JSON 请求体。认证由来源注入。
需要表单或原始内容时,把字符串放在 params._rawBody,用 params._contentType 指定 MIME。按下面的服务配方设置认证,先调用不会发送消息的测试入口,再检查实际业务权限。
- 基地址带版本号时把版本写进基地址,例如
https://api.example.com/v1/。 - 多租户服务把租户写进基地址,例如
https://your-tenant.api.example.com/。 - 自建或内网服务同样可用,但要确认运行环境能访问该地址。
- 需要发送非 JSON 内容时用
_rawBody传原始文本,用_contentType指定内容类型。 - 校验失败先查基地址与凭据,再查测试端点路径是否写对。
- 请求报错时对照接口文档确认参数、路径与请求体格式,并留意限流或额度问题。
| 模式 | 示例 | 说明 |
|---|---|---|
| 用户或账号信息 | /user、/me | 验证凭据并返回账号信息。 |
| 健康检查 | /health、/ping | 响应快,但可能不校验凭据。 |
| 带上限的列表 | /items?limit=1 | 用最小数据量验证凭据。 |
{ "path": "repos/OWNER/REPO/issues", "method": "GET", "params": { "state": "open", "per_page": 5 } }
GitHub REST
基地址 https://api.github.com/;选择 bearer,在专用凭据框输入限定仓库和权限的 PAT,testEndpoint 为 GET user。无需把 gh 的认证复制出来;已登录 gh 时可直接使用 CLI,详见来源清单。
- 运行 source_test({"sourceSlug":"github-api"}),核对返回账号。
- 先 GET repos/{owner}/{repo}/issues?state=open&per_page=5,记录 owner/repo 与分页;创建 issue 使用 POST 同一路径,body 的 title 必填,须单独获准。
OpenAI API
使用 OpenAI 项目 API Key,authType 为 bearer。先用 GET models 检查 Key 可见的模型;它不验证生成额度或某个具体模型的推理请求。
{ "id": "openai-api-docs-example", "name": "OpenAI API", "slug": "openai-api", "enabled": true, "provider": "openai-api", "type": "api", "api": { "baseUrl": "https://api.openai.com/v1/", "authType": "bearer", "testEndpoint": { "method": "GET", "path": "models" } } }
Stripe
Stripe 支持 HTTP Basic:用户名为 Secret/Restricted API Key,密码为空。请 Agent 用 source_credential_prompt({"sourceSlug":"stripe","mode":"basic","passwordRequired":false}) 收集;示例优先使用测试模式及限制读取权限的 Key。
- GET balance 核对 livemode 和币种。创建资源等表单请求需 _rawBody 与 application/x-www-form-urlencoded;不要默认发送 JSON。
{ "id": "stripe-docs-example", "name": "Stripe", "slug": "stripe", "enabled": true, "provider": "stripe", "type": "api", "api": { "baseUrl": "https://api.stripe.com/v1/", "authType": "basic", "testEndpoint": { "method": "GET", "path": "balance" } } }
SendGrid
SendGrid v3 使用 API Key 的 Bearer 认证。testEndpoint 选择你已授予的只读入口,例如 GET user/profile;只有 Mail Send 权限的 Key 可能没有读取 profile 权限,应按服务文档选择测试,不为通过测试扩大权限。
- 发送入口为 POST mail/send,JSON body 需要 personalizations、from、subject 和 content。先核对已验证的发件身份、收件人和正文,连接测试不发送邮件。
{ "id": "sendgrid-docs-example", "name": "SendGrid", "slug": "sendgrid", "enabled": true, "provider": "sendgrid", "type": "api", "api": { "baseUrl": "https://api.sendgrid.com/v3/", "authType": "bearer", "testEndpoint": { "method": "GET", "path": "user/profile" } } }
Twilio
Twilio 使用 Basic。生产推荐 API Key SID / API Key Secret;本机测试也可用 Account SID / Auth Token。这两种凭据对不能混用;账号资源路径仍用 Account SID。
- 用专用用户名/密码框保存凭据,再测试账号读取。发送短信为 POST Accounts/{AccountSid}/Messages.json,params 示例为 {"_rawBody":"To=%2B15550000001&From=%2B15550000002&Body=Example","_contentType":"application/x-www-form-urlencoded"};号码仅为格式示意,不执行发送。
{ "id": "twilio-docs-example", "name": "Twilio", "slug": "twilio", "enabled": true, "provider": "twilio", "type": "api", "api": { "baseUrl": "https://api.twilio.com/2010-04-01/", "authType": "basic", "testEndpoint": { "method": "GET", "path": "Accounts/REPLACE_WITH_ACCOUNT_SID.json" } } }