关于 Kurlo
Kurlo 是面向开发团队的开源 API 客户端,可将工作区以 YAML 保存在 Git 中。其 MCP 服务让 Agent 能运行请求、编写测试并查看失败原因,同时遮蔽模型可见的密钥。
主要功能
- 01运行带身份验证和测试的请求
- 02以 YAML 和 Git 管理工作区
- 03导入 Postman、OpenAPI 等格式
- 04浏览器 CORS 与 CSP 检查
- 05集合运行器和 CI 命令行工具
适用场景
- 01让 Agent 执行已保存的 API 请求
- 02在 CI 中运行请求和测试脚本
- 03复现浏览器中的 CORS 或 CSP 错误
MCP 相关
Kurlo MCP 服务向 MCP 客户端提供集合与环境查询、请求及集合运行、请求编辑和一次性调用等能力。密钥会发送至 API,但在模型可见内容中会被遮蔽。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Kurlo
可由 AI Agent 驱动的开源 Postman 替代品。
无需账户,无付费方案,无遥测。集合以 YAML 格式保存在你的 Git 仓库中。

为什么选择 Kurlo
- 适合任意规模的团队,完全免费。 没有需要升级的付费方案,也无需创建账户。团队可通过任何 Git 托管服务共享工作区,每个请求都是可读的 YAML 文件,并与 API 更改一起在同一个拉取请求中接受审查。
- 现有 Postman 集合仍可使用。 导入 Postman、Insomnia、Bruno、OpenAPI 或 HAR 文件。
pm.test、使用 chai 的pm.expect、pm.sendRequest和require('lodash')都会按原样运行。 - AI Agent 可以使用它。
kurlo mcp让 Claude Code、Cursor、Codex 和任何其他 MCP 客户端能够使用保存的请求及其身份验证和测试,编写新请求和测试,并说明上次调用失败的原因。密钥会发送到 API,但绝不会展示给模型。 - 预先了解浏览器会如何处理请求。 按浏览器的 CORS 和 CSP 规则发送请求,在用户遇到错误之前就发现问题。Postman、Insomnia 和 Bruno 都不支持此功能。
- 轻巧且原生。 使用 Go 和系统 WebView 构建,而非 Electron,因此 macOS 下载包仅 22.7 MB,Linux 下载包仅 12.0 MB。
| Kurlo | Postman | Insomnia | Bruno | |
|---|---|---|---|---|
| 免费方案 | ✅ 所有功能,团队规模不限 | 1 位用户 | 最多 3 位 Git Sync 用户 | 私有 Git 托管需要 Pro |
| 需要账户 | ✅ 不需要 | 集合需要 | Scratch Pad 之外需要 | 不需要 |
| 集合保存在你的 Git 仓库中 | ✅ | 桌面应用内置 Git | ✅ | ✅ |
Postman pm.* 脚本 | ✅ 按原样运行 | 原生支持 | 兼容层 | 转换为 bru.* |
| 模拟服务 | ✅ 本地运行,无上限 | 云端运行,需要账户 | 免费版每月 1,000 个请求 | ✅ 本地运行 |
| MCP | ✅ 客户端和服务端 | 客户端 | 客户端 | 社区服务 |
| 浏览器 CORS 和 CSP 检查 | ✅ | — | — | — |
根据供应商定价页面于 2026 年 10 月 15 日核对。详情和来源:与 Postman 对比、与 Insomnia 对比、与 Bruno 对比。
如果 Kurlo 为你节省了时间,点个 ⭐ 就能帮助其他人发现它。
下载
请从发布页面获取最新构建版本。
| 平台 | 安装包 |
|---|---|
| macOS(Apple Silicon + Intel) | .dmg |
| Windows 10/11(x64,arm64) | .exe(NSIS 安装程序)、.msix |
| Linux(x64) | .AppImage |
每个版本都附带 SHA256 校验和及 minisign 签名,应用内更新程序会拒绝任何未通过其中任一项检查的二进制文件。
命令行工具(用于 CI 的 kurlo run,以及用于 AI Agent 的 kurlo mcp)也可通过 npm 获取,包名为 @kurlo/cli,并提供适用于 x64 和 arm64 架构的 macOS、Linux 和 Windows 预构建二进制文件。无需安装桌面应用:
npx -y @kurlo/cli --version
使用指南、脚本参考和 YAML 工作区格式详见**文档站点**。
功能
请求
- 支持所有 HTTP 方法:GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS
- 查询参数、请求头、请求体(JSON、form-data、x-www-form-urlencoded、原始文本/XML/HTML、二进制文件)
- 导入 cURL — 将 curl 命令粘贴到 URL 字段,即可自动解析
- 批量编辑参数、请求头和表单字段 — 可将表格切换为
key: value文本区域,再切换回来 - 支持 GraphQL、Server-Sent Events、WebSocket、Socket.IO、gRPC 和 MCP 请求类型 — MCP 调用会发现服务端的工具、资源和提示词,根据工具的架构填入参数,并显示原始 JSON-RPC 交互
- 支持导入 Postman、Insomnia、Bruno/OpenCollection、OpenAPI/Swagger、HAR、cURL,以及完整数据备份
- 可通过链接或文件导入 OpenAPI/Swagger — 粘贴规范 URL 后,Kurlo 会获取规范并创建集合
- 支持导出 Postman、OpenAPI、OpenCollection 和完整数据备份
身份验证
- Bearer Token
- Basic Auth
- Digest Auth — 支持 MD5、SHA-256 和 SHA-512-256 及其
-sess变体,并支持qop=auth和auth-int - API Key — 可放在请求头或查询字符串中
- OAuth 2.0 — 支持 Client Credentials、Authorization Code(含 PKCE)、Password 和 Device Code 授权;支持通过浏览器环回登录、刷新令牌,以及每次发送前自动刷新令牌
- AWS Signature v4
- 客户端证书(双向 TLS),可按请求设置或从集合继承
- 支持按请求和集合设置默认值,并可继承
脚本 — 在沙箱化 JavaScript 中编写请求前脚本和测试脚本,并支持旧版 Tengo:
// pre-request: inject a header
pm.request.headers.set("X-Client", "kurlo")
// pre-request: rewrite and sign the body
pm.request.body.update(JSON.stringify({ ...pm.request.body.json(), nonce: pm.crypto.randomHex(8) }))
// test: assert status and shape
pm.test("status is 200", () => pm.response.to.have.status(200))
pm.test("has an id", () => pm.response.to.have.jsonSchema({ type: "object", required: ["id"] }))
require 会解析为 lodash、ajv、tv4、uuid、crypto-js 和 chai 的内置替代实现,因此导入的 Postman 脚本仍可正常运行。pm.sendRequest 可从脚本发起 HTTP 调用,pm.execution.skipRequest() 可跳过发送。
环境与变量
- 每个工作区可设置多个环境,单击即可切换
- 矩阵视图 — 每个变量占一行,每个环境占一列,可直接编辑
- URL、请求头、参数、请求体和身份验证字段均支持
{{variable}}模板语法 - 可通过测试脚本设置变量(
pm.variables.set、pm.environment.set) - 手动保存和自动保存模式均涵盖请求和环境编辑
工作区与集合
- 可为不同项目或客户端创建多个工作区
- 集合支持嵌套文件夹层级,并保留空文件夹
- 支持拖放整理
- 请求历史 — 每次发送单独占一页,并排显示请求和已存储的响应,可在编辑器中重新打开(保留 14 天,最多 1000 条)
- 集合运行器 — 支持顺序或并行运行、数据文件、迭代、HTML 报告,并保留每个集合最近一次运行记录
- 基于 Git 的 YAML 工作区,支持诊断、冲突处理工具和仅限本地的密钥
- CLI 运行器 —
npx -y @kurlo/cli run ./workspace --env CI可在 CI 中执行请求及其测试脚本,支持数据驱动迭代(--data)、美化、JSON 和 JUnit 报告器、变量导出,以及失败时返回非零退出码 AI Agent(MCP 服务)——Kurlo 二进制文件也是 Model Context Protocol 服务,因此 Claude Code、Codex、Cursor、Claude Desktop 或任何其他 MCP 客户端都可以列出你的集合和环境,运行已保存的请求和整个集合(包括它们的身份验证、脚本和测试),并使用你的{{variables}}发送一次性调用。它还能让工作区保持最新:添加和修改请求及其pm.*测试,将响应保存为示例并设置环境变量,使用与应用写入时相同的 YAML 格式,且绝不存储机密。它会读取你在应用中最近发送的请求,因此询问“为什么失败了?”不需要复制内容。机密值会发送到 API,但在模型看到的所有内容中都会屏蔽为[secret];你标记为受保护的环境则无法访问。一条命令即可为这台机器上的所有客户端完成设置:
npx -y @kurlo/cli mcp install --env Staging
添加 --project,即可改为写入仓库共享的 .mcp.json 和 .cursor/mcp.json,这样整个团队只需克隆仓库即可获得该服务。手动设置、工具和标志的说明见 MCP 服务指南。
响应示例——将任意响应保存为其请求下的命名示例:保存返回的状态码、标头和正文,以及生成该响应的请求。捕获时会遮盖机密,干净的正文会逐字节存储;导入和导出 Postman、OpenCollection、HAR 和 OpenAPI 时,也会保留这些示例。可以将响应与示例进行差异比较,而不是与上一次发送的响应比较。
Cookie——每个工作区都有独立的 Cookie 罐,并提供按域名编辑的功能;也可以按请求禁用。
- Cookie 同步:将 Kurlo 与仓库内的浏览器扩展(
apps/desktop/extension,支持 Chromium + Firefox)配对后,Kurlo 发送请求时使用的就是你当前在浏览器中已有的会话。仅限环回地址的桥接功能默认关闭,只有你手动开启后才会启用;你需要在 Kurlo 中匹配六位数代码以批准连接;双方都会强制执行按域名设置的允许列表。Cookie 只会单向传输:从浏览器传入 Kurlo。
模拟服务——在本地端口上通过 HTTP 提供集合中保存的示例,以便针对尚不存在的端点构建客户端。路由根据方法和示例的路径模板(/orders/:id)匹配;记录的查询参数可缩小响应示例的匹配范围;实时日志会显示客户端发送的请求以及响应所用的示例。仅限环回地址;任何来源的 CORS 预检请求都会得到响应。
响应查看器
- 带行号的语法高亮正文
- 支持大型响应的分页渲染(每页 512 KB,响应超过 10 MB 时启用)
- 全文搜索并可逐个跳转匹配项
- 将响应保存到文件、复制到剪贴板
- 标头表、测试结果、脚本日志——全部集中在一个面板中
- HTML、图像和 PDF 的预览标签页;检测到二进制正文时不会将其渲染为乱码
- 与上一个响应或已保存的示例进行差异比较
- 时间线显示连接详情和请求在线路上的实际内容,机密会被遮盖;每次重定向跳转单独显示为一个区块
- 提供 SSE、WebSocket、Socket.IO 和 gRPC 响应的实时面板
代码生成——将当前请求复制为可运行代码片段,支持以下 14 种目标:cURL、HTTPie、JavaScript fetch、Node.js fetch、Axios、Python requests、Go net/http、Java OkHttp、C# HttpClient、PHP cURL、Ruby Net::HTTP、Swift URLSession、Kotlin OkHttp 和 Rust reqwest。机密变量会保留为 {{name}} 占位符。
浏览器请求模拟——按照浏览器而非客户端的规则发送请求:添加 Origin 标头、执行 CORS 预检和响应检查,并强制执行 Content Security Policy,这样即使前端尚未编写,也能复现浏览器将如何处理请求。
按请求设置的选项:HTTP 版本(auto / 1.1 / 2)、SSL 验证、重定向策略(跟随、保留方法、保留身份验证)、Cookie 罐、超时、代理、URL 编码。
键盘优先:所有操作都可配置快捷键。命令面板(Cmd/Ctrl K)可查找请求并运行命令,快速发送(Cmd/Ctrl Enter)、聚焦 URL(Cmd/Ctrl L)、切换标签页(Cmd/Ctrl 1–8,9 切换到最后一个标签页)。Kurlo 在 macOS 上显示 Cmd,在 Windows 和 Linux 上显示 Ctrl。
深色和浅色主题,并提供多种内置变体。
本地优先存储——本地 Kurlo 配置文件及其中的密钥在静态存储时使用 AES-256-GCM 加密。密钥会在可用时存储于操作系统凭据库中,同时也会作为 0600 权限的恢复文件保存在 Kurlo 的应用数据目录中。由 Git 管理的工作区 YAML 文件有意保持为人类可读格式;密钥值会替换为本地占位符。
从源代码构建
先决条件
- Go 1.25+
- Node.js 22.12+
- Wails v2 —
go install github.com/wailsapp/wails/v2/cmd/wails@latest - macOS:Xcode 命令行工具
- Windows:NSIS(用于构建安装程序)和 Windows SDK(用于 MSIX 打包/签名工具)
- Linux:
libgtk-3-dev、libwebkit2gtk-4.1-dev
开发模式(前端热重载 + Go 后端):
git clone https://github.com/stormhop/kurlo
cd kurlo
npm install
make dev
为当前平台构建生产版本:
make build
所有平台(需要每个平台的工具链):
make build-all
运行完整检查套件——前端类型检查、单元测试、gofmt、go vet 和启用竞态检测的 Go 测试:
make check
查看 make help,了解所有可用目标。
项目布局
apps/desktop/ Wails v2 desktop application
apps/desktop/main.go Entry point, window config, native menus
apps/desktop/cmd/kurlo/ Headless CLI (run, mcp) published to npm as @kurlo/cli
apps/desktop/internal/
api/ HTTP executor, auth, request store, state
api/auth/ Bearer, Basic, Digest, API Key, OAuth2, AWS SigV4
model/ Shared Go types (request, response, auth config)
script/ JavaScript/Tengo scripting engines + pm.* API
apps/desktop/frontend/src/
App.svelte Root shell and layout
lib/stores/app.svelte.ts Composed app view-model
lib/stores/features/ Feature slices for requests, collections, Git, import/export, etc.
lib/components/ UI components
lib/backend.ts Wails bridge type definitions
apps/desktop/extension/ Cookie Sync browser extension (MV3 + Firefox event page)
apps/web/ Astro Starlight documentation site
npm/cli/ The @kurlo/cli npm launcher; scripts/build-npm-packages.mjs adds the binaries
schemas/ Public Git/YAML workspace JSON Schema
perf/ Generated performance fixtures (ignored by Git)
脚本 API 参考
默认情况下,脚本在沙盒化的 JavaScript 环境中运行;现有请求也可使用旧版 Tengo 引擎。导入、文件系统、进程和网络访问均已禁用。默认执行超时时间为 2 秒,可按请求配置,最长为 60 秒。
完整内容——每个方法、变量作用域优先级规则以及 Chai 风格的断言别名——请参阅脚本 API 参考。简要说明如下:
| 接口 | 涵盖内容 |
|---|---|
pm.request | url、method、set_url()、headers.get/set/unset、params.get/set |
pm.request.body | raw、mode、json()、update(),以及 urlencoded / formdata 字段列表 |
pm.response | code、status、responseTime、size、body()、json()、headers.get()——仅限测试脚本 |
pm.variables · pm.globals · pm.environment · pm.collectionVariables | get / set / unset / clear,区别仅在于它们读取和写入的作用域不同 |
pm.iterationData.get(key) | 数据驱动运行中当前数据行的值(只读) |
pm.info | requestName、eventName、iteration、iterationCount |
pm.cookies | 获取此请求的 Cookie jar 会发送的 Cookie 的 get / has / names |
pm.crypto · CryptoJS | MD5/SHA 摘要、HMAC、base64、randomHex()、uuid() |
pm.sendRequest(req, cb) | 通过常规请求引擎进行同步 HTTP 调用 |
pm.execution.skipRequest() | 在请求前脚本中调用时跳过发送——状态会报告为已跳过,而非失败 |
pm.test(name, fnOrResult) | 注册命名断言 |
pm.expect(value) | .equal · .contains · .exists · .has_key · …以及 .to.equal(v)、.to.include(v)、.to.have.property(k) |
pm.response.to.have.* | status(code)、header(name)、jsonBody(path?, value?)、jsonSchema(schema)(draft-07) |
pm.log(...values) | 输出到“脚本”面板 |
require 会解析 lodash、ajv、tv4、uuid、crypto-js 和 chai 的捆绑替代库。没有事件循环:setTimeout、async 和 await 均不可用,且 pm.sendRequest 的回调会立即运行。
贡献
欢迎提交 Bug 报告、功能请求和拉取请求。请先阅读 CONTRIBUTING.md——其中介绍了开发环境设置、CI 强制执行的要求,以及如何确定更改范围。所有参与者都应遵守行为准则。
发现安全问题?请不要公开提交 issue——请参阅 SECURITY.md,了解私下报告的方式。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。