mastro-hq/mastro-connect

GitHub: mastro-hq/mastro-connect

通过捕获浏览器会话将没有官方 API 的 Web 应用转化为标准 CLI 命令,让 AI agent 能从终端直接驱动这些平台。

Stars: 1 | Forks: 0

# mastro · connect **用于 Web 应用的非官方连接器 —— 让 agent(和你)能从终端驱动它们。** ``` mastro login depop mastro depop search "carhartt jacket" --conditions used_good --sizes M --json ``` [概念](#the-idea) · [快速开始](#quickstart) · [工作原理](#how-it-works) · [Agent 技能](#agent-skills) · [添加连接器](#adding-a-connector) · [文档](#documentation) · [道德规范](#ethics--scope) [![License: MIT](https://img.shields.io/badge/License-MIT-black.svg)](LICENSE) ![Bun](https://img.shields.io/badge/runtime-Bun-black) ![OpenAPI 3.1](https://img.shields.io/badge/spec-OpenAPI%203.1-black)
## 核心理念 大多数实用的 Web 应用没有官方 API —— 或者它们现有的 API 速度更慢、 限制更多,或者缺少你需要的功能。但你已经在浏览器中登录了 该应用。**mastro 会将该会话转化为真正的 API。** 它做三件事: 1. **捕获**你现有的浏览器会话,通过一个小型 Chrome 扩展程序(无需 输入密码,无需抓取 —— 它只读取你的浏览器已持有的认证信息)。 2. **存储**仅重放请求所需的最小凭证。 3. **重放**该会话以对抗应用自身的(逆向工程的)API,并 将每个 endpoint 暴露为干净的 CLI 命令 —— JSON 输入,JSON 输出,为 agent 准备就绪。 核心特性:**添加连接器是数据操作,而非编写代码。** 你将 应用的 API 描述为标准的 **OpenAPI 3.1 文档**(加上一些 `x-mastro-*` 扩展用于表达 OpenAPI 无法描述的内容),将其放入 `providers/` 中, 相同的轨道会处理登录、命令分发、过滤器、分页,甚至 多步骤工作流。无需为每个连接器编写代码。 ``` mastro login depop # capture your Depop session via the browser mastro depop search "polo sweater" --sizes M --conditions used_good --json mastro depop list --photo a.jpg --brand nike --type tshirts ... --dry-run mastro depop me ``` ## 快速开始 ### 前置条件 - [Bun](https://bun.sh) ≥ 1.1(运行时;如果缺少它,启动器会提示你) - Google Chrome(用于捕获扩展程序) ### 1. 安装 ``` npm install -g mastro-connect # puts `mastro` on your PATH mastro --help ``` 或者零安装:在每个命令前加上 `npx -y mastro-connect` 而不是 `mastro`。正在开发 mastro 本身?克隆仓库,`bun install`,并使用 `bun run mastro …`。 ### 2. 加载捕获扩展程序(仅一次) ``` mastro extension install ``` 这会将打包的扩展程序复制到 `~/.mastro/extension` 并引导你 完成 `chrome://extensions` → **开发者模式** → **加载已解压的扩展程序**。固定 **mastro · connect** —— 随时点击其图标以查看捕获状态。(从 仓库检出中,你可以直接加载 [`extension/`](extension) 文件夹。) ### 3. 登录到连接器 确保你已在 Chrome 中登录到目标应用,然后: ``` mastro login depop ``` 会打开一个 localhost 标签页,接着是该应用的标签页。扩展程序会读取你的会话并 将其传回;mastro 会验证并将其存储在 `~/.mastro/` 下。通过以下命令确认: ``` mastro status ``` ### 4. 使用它 ``` mastro depop --help # list the connector's commands mastro depop search "vintage levis" --json # call one ``` 就是这样。使用 `--json` 获取机器可读的输出(非常适合 agent/脚本)。 ## 工作原理 ``` ┌──────────┐ login ┌──────────────┐ manifest ┌────────────────┐ │ mastro │──────────▶ │ Auth Broker │────────────▶ │ Chrome ext │ │ CLI │ │ + Receiver │ ◀──capture── │ (MV3, generic)│ └────┬─────┘ └──────┬───────┘ bundle └───────┬────────┘ │ │ │ observes │ ▼ ▼ │ ┌──────────────┐ ┌────────────────┐ └────────────────▶ │ Mastro SDK │ │ target SaaS │ │ • auth load │ │ (depop.com) │ │ • replay │◀──────────────┤ │ │ • workflows │ browser-proxy └────────────────┘ └──────┬───────┘ (past Cloudflare) │ reads ┌──────▼────────┐ │ providers/

│ openapi.yaml + auth.manifest.json └───────────────┘ ``` 设计理念: ### 四个关键组件 #### 1. 捕获扩展程序 —— [`extension/`](extension) 一个**通用的** MV3 Chrome 扩展程序。它没有针对特定连接器的代码:它只会解析 CLI 传给它的 `auth.manifest.json`。在执行 `mastro login` 期间,它会观察 目标标签页(通过 `chrome.cookies` 获取 cookie,通过 `webRequest` 获取 header,通过注入的页面桥接获取页面 fetch/XHR),根据 manifest 中的声明式规则判断何时捕获完成,序列化最小的凭证包,并将其 传回给 loopback receiver。点击其工具栏图标可查看实时状态。 它只会观察与活跃捕获会话相关的标签页;绝不会触碰 普通的浏览行为,且会话仅存在于内存中并很快过期。 #### 2. 核心 —— [`@mastro/core`](packages/core) 引擎。**broker** 运行捕获会话:它建立一个 localhost **receiver**,打开浏览器,等待凭证包,验证它,并通过 **credential store**(位于 `~/.mastro/` 的文件存储, 模式为 `0600`;该接口可插拔以支持 keychain/secret-manager 后端)写入最小凭证。它 还加载并验证每个 provider 的 **OpenAPI spec**。 #### 3. SDK —— [`@mastro/sdk`](packages/sdk) 重放层。给定一个已登录的连接器,它会根据 OpenAPI 操作和你的 CLI flag(query/path/body 参数,数组 `style`/`explode`, enum,默认值)构建请求,应用 `x-mastro-auth` 绑定(header、cookie、 每个请求的 `${uuid}` 值),针对应用的 分类 endpoint 解析动态过滤值(已缓存),通过正确的 **transport** 运行请求,并 映射响应。它还运行多步骤的 **workflow**。 #### 4. CLI —— [`@mastro/cli`](packages/cli) `mastro` 二进制程序。内置动词(`login`、`logout`、`status`、`providers`) 加上**根据 OpenAPI 操作生成的特定于 provider 的命令**。Flag 来自 操作的参数;它们的允许值来自 `schema.enum`; 帮助是自动生成的。CLI 是规范的一个轻量级、忠实的投影。 ## 为什么使用 OpenAPI(以及 `x-mastro-*` 扩展) 连接器的 API 被描述为一个**有效的 OpenAPI 3.1 文档**。标准的 工具链会对其进行验证和代码生成 —— `providers/depop/openapi.yaml` 可以 顺利通过 `redocly lint`。 OpenAPI 原生涵盖了每个 API 共有的接口:path、method、 多选字段(`enum`)、可重复参数(`array` + `style`/`explode`), 以及认证清单。它真正**无法**表达的三件事 —— 而这些 正是逆向工程的部分 —— 存在于规范合法的 `x-mastro-*` 扩展中 (合规的验证器会忽略未知的 `x-` 键,因此该文档仍然是有效的 OpenAPI): | 扩展 | 解决的问题 | | --- | --- | | `x-mastro-auth` | 捕获的凭证如何变成活跃请求:header/cookie 模板和**每次请求生成的值**(`${uuid}`、`${now}`)。 | | `x-mastro-resolve` | **动态 enum**,其有效值来自另一个 endpoint 的响应,或打包的参考数据(例如 Depop 的尺码/品牌分类)。 | | `x-mastro-replay` | OpenAPI 未建模的 transport 调优:浏览器模拟/浏览器代理、重试和重新捕获状态码、速率限制。 | | `x-mastro-workflow` | 不属于单个请求的多步骤有状态流程(上传 → 轮询 → 创建)。 | | `x-mastro-command` / `-result` / `-hidden` | CLI 投影:子命令名称、要打印的响应路径、隐藏仅元数据的 endpoint。 | 请参阅 [`docs/AUTHORING.md`](docs/AUTHORING.md) 获取完整参考。 ## 显著功能 这些是框架的通用功能,而不是 Depop 特有的技巧 —— 每个 连接器都可以免费获得它们。 ### 突破机器人防护 —— 浏览器代理 一些网站(如 Depop)位于 Cloudflare **托管挑战**(即“请稍候”的 JS 插页)之后。仅靠 TLS 模拟无法解决它。因此,当 provider 设置了 `x-mastro-replay.via_browser` 时,mastro 会在你**已经登录的浏览器标签页内**运行请求 —— Cloudflare 已经信任该标签页 —— 并将 JSON 传回。无需无头浏览器,无需挑战解决服务;它_本身就是_一个真实的 浏览器。 → [`docs/BROWSER-PROXY.md`](docs/BROWSER-PROXY.md) ### 人性化的过滤器 —— 分类解析 一个 flag 可以接受传输的 id _或_ 人类可读的标签,并根据应用 自身的过滤器元数据 endpoint(获取一次,缓存在 `~/.mastro/cache/` 下)或 打包的 JSON 文件进行解析。因此,`--sizes M` 会自动变成正确的内部 id, 并且 `mastro depop search --help` 会显示真实的、最新的选项。 ### 多步骤流程 —— workflow 一个命令可以是包含在它们之间流动的数据的声明式步骤序列 (带有索引配对的 `foreach`、`poll` 直到完成、二进制上传、按步骤 transport、 纯转换步骤以及类型化/派生的 body 字段)。Depop 的“上架商品”是 上传每张照片 → 轮询直到处理完成 → 创建列表,完全在 OpenAPI 文档中表达。`--dry-run` 会在不发送任何内容的情况下打印出每个计划好的请求 body。 → [`docs/WORKFLOWS.md`](docs/WORKFLOWS.md) ## Agent 技能 每个连接器都附带 **agent 技能** —— `SKILL.md` 操作手册,用于教导 AI agent 何时以及如何驱动它(前置条件、`--json` 格式、速率限制、 诸如“在花钱之前先进行 dry-run”的安全规则)。它们位于 provider 定义中(`providers//skills//SKILL.md`),因此针对 API 偏移的修复和记录它的操作手册可以在同一个 PR 中提交。 ``` mastro skills list # what's available mastro skills add depop # install into ./.claude/skills (project) mastro skills add amazon/search --global # ~/.claude/skills (everywhere) mastro skills add depop --dir .agents/skills mastro skills update # refresh everything installed here ``` 每次安装还会植入根 `mastro` 技能 —— 每个 provider 技能所构建的会话模型 约定(login、`status --json`、退出代码)。 已安装的技能带有 `.mastro.json` 来源戳记,以便 `update` 知道 它拥有什么。 由于技能是公共 GitHub 仓库中标准格式的 `SKILL.md` 目录,因此通用的技能安装程序(例如 `npx skills add`)也可以获取它们 —— `mastro skills add` 只是一条已经了解你已安装 provider 的便捷路径。 当网站的变化速度快于 npm 包的更新时,可以直接从 GitHub 拉取连接器的最新 定义(spec + 技能): ``` mastro providers add depop # → ~/.mastro/providers/depop (pinned to a commit) mastro providers update # re-fetch everything you've added ``` 用户获取的 provider 会覆盖(shadow)打包的 provider,因此无需等待 发布即可应用修复。 ## 添加连接器 连接器是 `providers/` 下的一个文件夹,包含两个文件(加上文档)。**无需代码。** ``` providers// auth.manifest.json # what the extension captures in the browser openapi.yaml # the API surface — OpenAPI 3.1 + x-mastro-* extensions README.md # how it works, how it was reverse-engineered, drift notes reference/ # optional bundled lookup data (taxonomies) skills// # agent skills: SKILL.md (frontmatter: name, description) ``` 简短版本: 1. 登录应用,打开 DevTools → Network,执行你想自动化的操作。 2. 记录**认证工件**(cookie?bearer token?)、**base origin**、 **endpoint**(path、参数、header),以及它是否位于机器人防护之后。 3. 编写 `auth.manifest.json`(捕获规则)和 `openapi.yaml`(API,包含 用于 auth/replay/动态过滤器的 `x-mastro-*`)。 4. `mastro providers` 应该列出它;`mastro --help` 应该显示其 命令。使用任何 OpenAPI 验证器验证 spec。 完整演练:**[`docs/AUTHORING.md`](docs/AUTHORING.md)**。实践示例: **[`providers/depop`](providers/depop)**。 通过 `MASTRO_PROVIDERS=/path/to/dir` 将 mastro 指向仓库外的 provider。 ## 项目布局 ``` mastro-connect/ ├── packages/ │ ├── core/ @mastro/core — schemas, OpenAPI loader, registry, │ │ credential store, broker, receiver, proxy server │ ├── sdk/ @mastro/sdk — connector, transports, taxonomy resolver, │ │ workflow runner, templating │ └── cli/ @mastro/cli — the `mastro` binary ├── extension/ generic MV3 capture + browser-proxy runtime (plain JS, type-checked) ├── providers/ │ ├── depop/ first connector (search, me, list) + skills │ └── amazon/ search, detail, Buy Now order + skills ├── skills/ │ └── mastro/ the root agent skill (session model, conventions) ├── bin/ node launcher shim for npx/global installs └── docs/ AUTHORING · BROWSER-PROXY · WORKFLOWS ``` 全面采用 Bun + TypeScript(严格模式;扩展 JS 通过 `checkJs` 验证)。 从检出中,一切都直接在 Bun 上运行 —— 唯一的构建步骤是 `bun run build`,它将 CLI 打包到 `dist/` 中以用于 npm 包。 ``` bun test # run the test suite bun run typecheck # type-check everything (TS + extension) bun run mastro … # run the CLI from source ``` ## 文档 | 文档 | 涵盖内容 | | --- | --- | | [`docs/AUTHORING.md`](docs/AUTHORING.md) | 构建连接器:manifest + OpenAPI + `x-mastro-*` 参考。 | | [`docs/BROWSER-PROXY.md`](docs/BROWSER-PROXY.md) | 请求如何在真实的浏览器标签页内运行以击败托管挑战。 | | [`docs/WORKFLOWS.md`](docs/WORKFLOWS.md) | 多步骤流程:步骤、`foreach`、`poll`、dry-run。 | | [`extension/README.md`](extension/README.md) | 捕获扩展程序内部机制。 | | [`providers/depop/README.md`](providers/depop/README.md) | Depop 连接器,端到端。 | ## 道德与范围 mastro 专为合法的个人自动化而构建 —— 在_你_的授权下,驱动_你_已登录的 应用。 - 它****在当前用户已经控制的浏览器会话中运行。 它不会绕过授权或同意,也绝不会输入或存储 密码。 - 它只持久化重放所需的**最小**凭证,并以 严格的权限存储在本地;所有的 token 和 cookie 在所有日志中都会被脱敏。 - 在存在且合适的官方 API 的情况下,请优先使用官方 API。非官方 API 是带有 偏移检测的操作契约 —— 而不是稳定的保证,也不是 滥用服务的许可证。 - 尊重每个服务的服务条款和速率限制。你对 如何使用它负责。 ## 贡献 欢迎贡献 —— 尤其是新连接器。一个优秀的连接器 PR 包括经过验证的 `openapi.yaml`、`auth.manifest.json`、记录 逆向工程和偏移症状的 `README.md`,并且**不提交凭证或 未经脱敏的 HAR**(`.gitignore` 会保护明显的情况 —— 请仔细检查)。 在打开 PR 之前,请运行 `bun test` 和 `bun run typecheck`。 ## License [MIT](LICENSE) © Giulio Colleluori

标签:AI代理, MITM代理, OpenAPI, Web API, 云资产清单, 浏览器扩展, 自动化攻击, 逆向工程