跳到主要内容
ZeroWorks

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。

  1. 在服务商后台注册你自己的 OAuth 应用。桌面来源授权使用 http://localhost:{本次端口}/callback,监听从 6477 起选择空闲端口。注册规则必须允许该回调;不要使用 Craft 托管地址或假定 8914 固定可用。
  2. 保存配置后,请 Agent 调用 source_oauth_trigger({"sourceSlug":"github-oauth"}),在浏览器核对账号与范围并同意;保留发起授权的桌面应用以接收 code 和校验 state。
  3. 应用使用 PKCE 交换令牌,成功后保存访问令牌及服务返回的刷新令牌。再运行 source_test({"sourceSlug":"github-oauth"}),实际 GET user 核对身份。
  4. 测试刷新需等令牌到期或按供应商允许的方式验证;没有 refresh_token 的服务不能承诺自动续期。失败先查 redirect_uri、clientSecret、scope、离线授权与服务错误。
api.oauth 字段含义
authorizationUrl / tokenUrl必填,分别是授权页与 code/refresh 令牌端点,使用完整 HTTPS URL。
clientId / clientSecretclientId 必填;机密客户端还需 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 / noneOAuth / 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,详见来源清单。

  1. 运行 source_test({"sourceSlug":"github-api"}),核对返回账号。
  2. 先 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" } } }