关于 🧪 Official MCP Server for Debugg AI
Debugg AI 官方 MCP 服务提供基于 AI 代理的浏览器端到端测试。用户指定 URL 或 localhost 地址并描述测试内容,代理会浏览应用并返回通过或失败结果及截图,适合希望免配置自动化测试的开发团队。
主要功能
- 01check_app_in_browser 运行 AI 浏览器代理测试
- 02probe_page 无 LLM 的批量页面探测
- 03localhost 地址通过 Caddy 隧道自动访问
- 04返回 HAR、控制台日志与截图等会话产物
- 05项目、环境、测试套件等实体管理工具
适用场景
- 01对本地开发中的应用执行单项功能检查
- 02在每个 PR 中批量检查多个路由是否正常加载
- 03验证需要登录的流程并核对所用账号身份
MCP 相关
该项目是一个 MCP 服务,向 MCP 客户端暴露 8 个工具,包括浏览器测试与项目、环境、测试套件等管理工具,需要 DEBUGGAI_API_KEY 进行认证。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @debugg-ai/debugg-ai-mcpDEBUGGAI_API_KEY密钥TEST_USERNAME_EMAILTEST_USER_PASSWORD密钥MCP_REQUEST_TIMEOUT_RESET_ON_PROGRESSDEBUGGAI_LOCAL_PORTDEBUGGAI_LOCAL_REPO_NAMEDEBUGGAI_LOCAL_BRANCH_NAMEDEBUGGAI_LOCAL_REPO_PATHDEBUGGAI_LOCAL_FILE_PATH本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
8收录的工具列表 · 更新于 3 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| description | string | 是 | 要测试或评估内容的自然语言描述(例如,'登录表单是否会验证空字段?'或'导航到主页并确认主视觉区域已加载') |
| url | string | 是 | 要导航到的 URL。可以是任何公共 URL(https://example.com),也可以是 localhost/本地开发服务器 URL。对于 localhost URL,系统会自动创建安全隧道——只需确保开发服务器正在该端口上运行。 |
| environmentId | string | 否 | 用于此测试的特定环境的 UUID。请参阅上方工具描述中的可用环境。 |
| credentialId | string | 否 | 用于登录的特定凭据的 UUID。请参阅上方工具描述中的可用凭据。 |
| credentialRole | string | 否 | 从解析出的环境中按角色选择凭据(例如 'admin'、'guest') |
| username | string | 否 | 目标应用中真实存在的账号邮箱。切勿编造或猜测凭据——请使用上方列出的可用凭据,或询问用户。浏览器 Agent 会在登录表单中输入此邮箱。对于本次运行中的每次登录,它都优先于环境默认凭据。 |
| password | string | 否 | 上方用户名对应的真实密码。切勿猜测或使用占位密码——请使用上方列表中的凭据,或询问用户。 |
| loginCredentials | array | 否 | Agent 在任务期间遇到登录表单时可登录的账号——不仅限于首次登录。适用于在任务中途进行身份验证的流程,例如设置密码后被重定向到登录页,再使用刚配置的账号登录。仅在 `description` 中写明凭据并不足够:请在此处传递,Agent 才会严格使用这些值。覆盖环境默认凭据。 |
| useEnvironmentCredentials | boolean | 否 | 默认值为 true。设为 false 可禁止 Agent 自动填入环境中存储的凭据——它只会使用本次调用指定的账号登录(username/password、credentialId、credentialRole、loginCredentials 或 auth.username),否则不登录。当运行必须验证特定账号的体验,且静默回退到默认测试用户会导致结果无效时,请使用此选项。 |
| freshSession | boolean | 否 | 默认值为 false。设为 true 可强制执行真实登录,而不是复用后端按账号保留的热会话。适用于检查登录流程本身、怀疑存储的会话已过期,或应用中在不同用户身份间切换的唯一方式是注销。会多花费一次登录;运行结束后会重新捕获会话,因此后续运行仍会很快。 |
| repoName | string | 否 | GitHub 仓库名称(例如 'my-org/my-repo')。会从当前 Git 仓库自动检测;只有在要针对当前项目以外的项目运行时才需要提供。 |
| auth | object | 否 | 可选的身份验证前置条件,适用于“先登录,再深度导航”的检查。将 precondition:'login' 设为先进行身份验证,然后进入 deepUrl。使用此选项,而不要寄希望于 Agent 在登录拦截页自行登录。在此处传递 username/password 可固定身份验证所用的账号;省略则使用环境默认凭据。 |
| auth.environmentId | string | 否 | 用于登录的凭据所属环境的 UUID。请参阅上方工具说明中的可用环境。 |
| auth.username | string | 否 | 用于满足登录前置条件的账户。此值会覆盖环境的默认凭据。 |
| auth.password | string | 否 | auth.username 对应的密码。 |
| auth.precondition | enum | 否 | 'login' = 评估前进行身份验证;'none'(默认)= 不设置登录前置条件。login | none |
| auth.entryUrl | string | 否 | 可选的登录页面 URL,用于进行身份验证。 |
| auth.deepUrl | string | 否 | 登录后要导航到并进行评估的可选 URL(例如,深层设置页面)。如果省略,则回退到 `url`。 |
详细介绍
Debugg AI — MCP 服务
通过 Model Context Protocol 进行 AI 驱动的浏览器测试。指定任意 URL(或 localhost),并描述要测试的内容——AI Agent 会浏览你的应用,并返回通过/失败结果及截图。
设置
需要 Node.js 20.20.0 或更高版本(来自 posthog-node@^5.26.0 的传递性要求)。
测试 http://localhost:... URL 需要 caddy 二进制文件——check_app_in_browser、
probe_page 和 trigger_crawl 会通过本地 Caddy 反向代理,为 localhost 目标建立隧道。
该二进制文件会自动安装:@radically-straightforward/caddy npm 依赖会在 npm install/npx 期间为你的平台下载一个固定版本的 Caddy——通常情况下无需自行安装。它现在是此软件包唯一会下载的二进制文件;隧道客户端本身使用纯 TypeScript 编写——它取代了会获取 ngrok agent 的 ngrok 软件包。
如果下载未运行(例如使用 npm install --ignore-scripts,或在离线/隔离网络环境中安装),请将 CADDY_BIN 指向你自行安装的版本(brew install caddy / apt install caddy / 参见
caddyserver.com/docs/install)——首次调用 localhost URL 时,如果缺少该文件,会明确报错,而不会静默挂起。公共 URL 调用、所有非浏览器工具,以及 test_suite {action:"run"}(它使用专用隧道,完全绕过 Caddy)无论如何都不需要它。
在 debugg.ai 获取 API 密钥,然后将以下内容添加到 MCP 客户端配置中:
{
"mcpServers": {
"debugg-ai": {
"command": "npx",
"args": ["-y", "@debugg-ai/debugg-ai-mcp"],
"env": {
"DEBUGGAI_API_KEY": "your_api_key_here"
}
}
}
}
也可以使用 Docker:
docker run -i --rm --init -e DEBUGGAI_API_KEY=your_api_key quinnosha/debugg-ai-mcp
原则上,Dockerfile 中的 npm install 步骤会像本地安装一样自动获取 caddy——但截至本文撰写时,Dockerfile 未 COPY 构建现在所需的几个目录(handlers、tools、types、config),并且仍引用一个已不存在的 tunnels/ 目录,因此全新构建很可能会在此问题产生影响之前失败。这是一个既存缺陷,与 Caddy 无关。无论如何,目前已发布的 quinnosha/debugg-ai-mcp 镜像都早于 Caddy 依赖——在该镜像中调用 check_app_in_browser/probe_page/trigger_crawl 测试 localhost URL 时会因 CaddyBinaryNotFoundError 失败,直到修复 Dockerfile 后重新构建并发布,或通过其他方式将 CADDY_BIN 指向镜像中预先安装的版本。公共 URL 调用、非浏览器工具,以及 test_suite {action:"run"} 均不受影响。
工具
该服务提供 8 个工具:三个浏览器工具,以及每个受管理实体各一个基于操作的工具。主要工具是 check_app_in_browser(完整 AI Agent)和 probe_page(轻量级、无需大模型的页面探测工具)。其余工具——project、environment、test_suite、test_case、executions——都接受一个用于选择操作的 action 区分参数(例如 {"action":"list"})。破坏性 delete 操作需要确认(在支持的情况下会显示询问提示,否则需设置 confirm: true)。
浏览器
check_app_in_browser
使用 AI 浏览器 Agent 测试你的应用。Agent 会进行导航和交互,并通过截图反馈结果。localhost URL 会自动通过 debugg 隧道服务器进行隧道转发。
| Parameter | Type | Description |
|---|---|---|
description | string 必填 | 要测试的内容(自然语言) |
url | string 必填 | 目标 URL — http://localhost:3000 会自动进行隧道转发 |
environmentId | string | 特定环境的 UUID |
credentialId | string | 特定凭证的 UUID |
credentialRole | string | 按角色选择凭证(例如 admin、guest) |
username | string | 登录用户名(临时使用,不会持久保存) |
password | string | 登录密码(临时使用,不会持久保存) |
loginCredentials | array | Agent 在任务过程中遇到登录时使用的账号 — [{username, password, label?}] |
useEnvironmentCredentials | boolean | 默认为 true。false 表示禁止自动填入环境中存储的凭证;若未指定账号,则表示完全不要登录 |
freshSession | boolean | 默认为 false。true 表示强制重新登录,而不是复用该账号的有效会话 |
auth | object | 身份验证前置条件 — {precondition, entryUrl, deepUrl, environmentId, username, password} |
repoName | string | 覆盖自动检测到的 git 仓库名称(例如 my-org/my-repo) |
每次调用只执行一项专注的检查。Agent 的内部预算约为 25 步;较大的测试套件请拆分为多次调用。
凭证:通过参数传入,而不是写在描述中
只在 description 中提到账户,不会让 Agent 使用该账户 — 它会回退到环境中存储的凭证,而应用拒绝错误账户时,结果看起来会像是应用故障。你通过参数传入的任何内容,都会覆盖本次运行中每一次登录的环境默认值,而不仅仅是第一次:
username/password(或credentialId/credentialRole)— 本次运行使用的身份。auth.username/auth.password— 同时使用auth.precondition: "login"时,指定前置条件登录所用的账号。loginCredentials— Agent 在任务中途到达登录表单时使用的账号。适用于这类流程:设置密码 → 被重定向到登录页面 → 使用刚创建的账号登录;如果拆分为多次调用,浏览器状态就会丢失。
如果默认测试用户的凭证被静默回退使用会导致检查无效,请设置 useEnvironmentCredentials: false。
跨域 SSO? 运行只会在应用自身主机及其子域名上输入凭证;如果登录页面位于其他域名,则会因 offscope_host 被拒绝。请将身份提供商的主机添加到环境的 authorizedCredentialHosts 中(参见 environment)。
检查完全不需要登录的页面? 设置 useEnvironmentCredentials: false,并且不要指定任何账号。其含义正如字面所示 — 不要登录 — 运行会完全跳过身份验证,而不是寻找登录表单。适用于公共页面、营销网站、文档以及任何无需身份验证的内容。这样也更快:在默认的 auto 模式下,Agent 会跟随你页面上的“登录”链接,然后尝试使用环境中存储的账号,之后才开始评估页面。
会话复用:为什么检查可能报告“没有登录表单”
每次运行都不会重新登录。验证登录后,后端会捕获该账户的会话,并在同一身份的下次运行时恢复该会话,从而完全跳过登录——这就是为什么检查可能会合理地返回 submitted: false 且没有登录表单:账户已经登录。恢复会话的运行会在 logins 中报告自身,且 reason: "restored_session",因此你可以将其与确实未找到表单的运行区分开来。
会话按账户进行区分,因此指定不同账户绝不会复用其他人的会话。绕过复用有两种方式:
- 在单次调用中设置
freshSession: true— 本次实际登录,然后重新捕获会话。适用于你要检查的正是登录流程、怀疑存储的会话已过期,或应用中切换身份的唯一方式是登出的情况。 environment工具,action: "clearSessions"— 使存储的会话失效,让后续运行重新登录。可使用username/credentialId缩小范围;清除未限定范围的会话需要确认,因为该环境中的每个账户都将重新进行身份验证。
使用 action: "sessions" 查看环境当前保存了哪些会话,以及每个会话是否会被复用。
结果会报告实际使用的身份,因此使用了错误身份时会明确显示,而不会伪装成应用故障:
"logins": [
{ "username": "[email protected]", "source": "task", "submitted": true, "authenticated": true },
{ "username": "[email protected]", "source": "env_default", "submitted": false, "authenticated": false,
"reason": "offscope_host", "detail": "refused to enter credentials on auth.idp.example: not part of this run's scope …" }
],
"credentialWarning": {
"requested": "[email protected]",
"used": ["[email protected]"]
}
source 为 task | explicit | credential_id(你指定的账户)或 env | env_default(环境中存储的账户)。只有在确实输入并提交了凭据时,submitted 才为 true;reason 会说明发生了什么(例如 offscope_host、restored_session),如果存在 detail,则会以易读的方式解释原因——对于 offscope_host 拒绝,它会指出主机以及如何授权该主机。只有当你指定了账户,且实际提交的是环境默认的另一个账户时,才会出现 credentialWarning——登录被拒绝或跳过时绝不会出现。指定的账户无法解析,且运行拒绝改用其他账户时,会出现 loginError。
每次成功运行都会在截图旁返回一个 browserSession 区块,其中包含捕获的 HAR(完整网络跟踪)和控制台日志(每条 JS 控制台消息)的预签名 S3 URL。你可以用它们检测重新获取循环、水合错误以及其他通过类型检查和单元测试的运行时问题:
"browserSession": {
"harUrl": "https://...session_18139.har?X-Amz-...",
"consoleLogUrl": "https://...session_18139_console.json?X-Amz-...",
"recordingUrl": "https://...session_18139_recording.webm?X-Amz-...",
"harStatus": "downloaded",
"consoleLogStatus": "downloaded",
"harRedactionStatus": "redacted",
"consoleLogRedactionStatus": "redacted"
}
这些 URL 是短时有效的预签名 S3 URL — 重新获取父级执行记录 executions {action:"get", uuid} 即可续期。harStatus / consoleLogStatus 用于区分 'downloaded'(可通过 URL 获取)、'not_available'(页面未输出任何内容)和 'failed'(捕获失败)。在新运行中,URL 通常为 null,因为捕获内容会在 Agent 完成后异步上传 — 轮询 executions {action:"get", uuid: executionId},直到状态变为 'downloaded'。在持久化这些制品之前,服务器端会清除 Authorization / Cookie / token/secret/api_key 标头。
trigger_crawl
触发服务器端浏览器 Agent 执行爬取,以填充项目的知识图谱。本地 URL 会自动建立隧道。返回 {executionId, status, targetUrl, durationMs, outcome?, crawlSummary?, knowledgeGraph?, browserSession?};成功导入时,knowledgeGraph.skipped === false。crawlSummary 和 knowledgeGraph 仅包含后端爬取 / 导入节点报告的键——缺失的计数不会出现,也不会填入 0。已完成的爬取也会包含 browserSession 区块(HAR 和控制台日志 URL,格式同上)。
probe_page
轻量级、无需大模型的批量页面探测。 传入 1-20 个 URL;每个页面都会导航并等待内容稳定(DOM 停止变化,且有时限——绝不会等待网络静默,因为运行中的应用永远不会达到该状态),然后返回渲染状态——截图、页面元数据、结构化控制台错误和网络摘要。没有 Agent 循环,没有大模型开销,也没有场景断言。可用于检查“我刚才是不是把 /settings 弄坏了?”,重构后的多路由冒烟测试、每个 PR 的 CI 扫描,以及快速检查服务是否正常;对于这些场景,check_app_in_browser 的 60-150 秒 Agent 循环显得过于繁重。
| 参数 | 类型 | 描述 |
|---|---|---|
targets | array 必填 | 1-20 个条目:[{url, waitForSelector?, waitForLoadState?, timeoutMs?}] |
targets[].url | string 必填 | 公开 URL 或 localhost(自动建立隧道) |
targets[].waitForLoadState | enum | 'domcontentloaded'(默认值,另外会等待内容稳定,且有时限)/ 'load'(也会等待第三方嵌入内容)/ 'networkidle'(接受此值,但不会实际发出等待——运行中网站的网络不会进入空闲状态) |
targets[].waitForSelector | string | 可选 CSS 选择器,导航后等待该选择器出现 |
targets[].timeoutMs | number | 每个 URL 的超时时间,1000-30000(默认 10000) |
includeHtml | boolean | 在每个结果中返回原始 HTML(默认 false) |
captureScreenshots | boolean | 为每个目标返回一张 PNG(默认 true) |
批次中的所有目标共用一个会话隧道,但只有同端口(或全部为公开 URL)的批次才会共用一次后端执行——一次调用探测同一端口上的 5 个 URL,速度远快于并行调用 5 次、每次探测一个 URL。包含多个本地端口的批次会按端口组拆分为多个依次进行的后端执行(仍然只需一次调用,results[] 也会按原始顺序合并,但会产生 N 次后端往返,而不是一次——速度较慢,但不会被拒绝)。每个 URL 的 error 字段可确保批次具有容错能力:单个目标失败不会导致其他目标也失败。
networkSummary 的聚合键是 origin + pathname——反复获取同一端点的循环(例如 ?n=0..4 不断请求同一端点)会合并为一个条目并显示请求次数,因此 /api/poll 显示 count: 47 就是用户最初要求的、可供采取行动的“无限重复获取循环”信号。
性能预算:1 个 URL 不超过 10 秒,20 个 URL 不超过 25 秒。访问 localhost 上已关闭的端口时,会在 2 秒内返回 LocalServerUnreachable,不会消耗工作流执行次数。
project
| 操作 | 参数 | 结果 |
|---|---|---|
get | {uuid} | 精选的项目详情 |
list | {q?, page?, pageSize?} | 分页摘要 |
create | {name, platform, (teamUuid|teamName), (repoUuid|repoName)} | 已创建的项目 |
团队和仓库可通过 uuid 或名称解析(不区分大小写的精确匹配;无匹配项时返回 NotFound,匹配多项时返回 AmbiguousMatch)。没有 update/delete——请在 DebuggAI Web 应用中重命名或删除项目。
environment
| 操作 | 参数 | 结果 |
|---|---|---|
get | {uuid, projectUuid?} | 环境,凭据内联(绝不返回密码) |
list | {projectUuid?, q?, page?, pageSize?} | 分页环境列表,每个环境都包含凭据数组 |
create | {name, url, description?, projectUuid?, credentials?, authorizedCredentialHosts?} | 已创建的环境(可选地预置凭据) |
update | {uuid, name?, url?, description?, addCredentials?, updateCredentials?, removeCredentialIds?, authorizedCredentialHosts?} | 已更新的环境;凭据操作按 删除 → 更新 → 添加 的顺序执行 |
delete | {uuid, projectUuid?, confirm?} | 删除环境(级联删除凭据)——需要确认 |
sessions | {uuid, username?, credentialId?} | 环境持有的已捕获登录会话,按账户列出,每个会话都有自己的 isUsable |
clearSessions | {uuid, username?, credentialId?, confirm?} | 使这些会话失效,以便下次运行时实际登录——未限定范围的清除需要确认 |
省略 projectUuid 时,会根据 git 仓库自动解析。单个凭据的失败会显示在 credentialWarnings[] 中,不会阻止环境操作。
authorizedCredentialHosts 列出运行时除了应用自身主机之外,还可以向其提供此环境凭据的主机——对于跨域 SSO,请在此处添加 IdP 主机(例如 ["auth.example.com"])。只能填写裸主机名:不能包含协议、路径、端口或通配符(应用主机的子域名已在适用范围内)。update 会替换此列表;[] 会清空列表。服务器支持时,get/list 会返回该列表。响应会回显已保存的列表;如果服务器未持久化该列表(较旧的服务器会忽略此字段),结果会包含 authorizedCredentialHostsWarning: {requested, returned},而不是静默地显示成功。
sessions / clearSessions 用于管理后端复用的已认证热会话,以跳过登录(请参阅会话复用:为何检查可能报告没有登录表单)。绝不返回会话内容——会话 Cookie 是持有者凭据。clearSessions 会将会话标记为失效,而不是删除记录,因此会立即停止复用,同时保留可供读取的捕获历史。
test_suite
| 操作 | 参数 | 结果 |
|---|---|---|
list | {projectUuid|projectName, search?, page?, pageSize?} | 分页测试套件列表,包含状态和通过率 |
create | {name, description, projectUuid|projectName} | 已创建的测试套件 |
run | {suiteUuid|(suiteName+project), targetUrl?} | 异步触发所有测试 |
results | {suiteUuid|(suiteName+project)} | 测试套件及各测试结果 |
delete | {suiteUuid|(suiteName+project), confirm?} | 软删除——需要确认 |
test_case
| 操作 | 参数 | 结果 |
|---|---|---|
create | {name, description, agentTaskDescription, suiteUuid|(suiteName+project), relativeUrl?, maxSteps?} | 已创建的测试用例(不会自动运行) |
update | {testUuid, name?, description?, agentTaskDescription?} | 已更新的测试用例 |
delete | {testUuid, confirm?} | 软删除——需要确认 |
executions
| 操作 | 参数 | 结果 |
|---|---|---|
get | {uuid} | 完整详情(nodeExecutions + 状态 + errorInfo)以及截图/GIF 产物 |
list | {status?, projectUuid?, page?, pageSize?} | 分页摘要 |
后端返回 404 时,会以 isError: true 和 {error: 'NotFound', message, uuid} 的形式显示。凭据始终以不包含密码的形式返回。
分页
每个 list 响应都是分页的。响应结构:
{
"pageInfo": { "page": 1, "pageSize": 20, "totalCount": 47, "totalPages": 3, "hasMore": true },
"<items>": [ ... ]
}
可传入可选的 page(从 1 开始,默认值为 1)和 pageSize(默认值为 20,最大值为 200;超出上限的值会被限制)。响应绝不会静默截断。
get 会以单数名称返回一个对象——{project}、{execution}、{project, environment}——不包含 pageInfo。
资源
除了工具,服务还会将只读实体作为 MCP 资源公开, 以便客户端浏览并通过 @ 提及它们作为上下文:
| URI | 内容 |
|---|---|
debugg-ai://projects | 所有项目(第一页) |
debugg-ai://environments | 自动检测到的项目的环境 |
debugg-ai://executions | 最近的执行记录(第一页) |
debugg-ai://project/{uuid} | 单个项目的完整详情 |
debugg-ai://environment/{uuid} | 单个环境(凭据内联显示,密码已隐藏) |
debugg-ai://execution/{uuid} | 单次执行的完整节点详情 + 工件链接 |
读取操作会分发到与 project / environment /
executions 工具相同的处理程序,因此数据和身份验证完全相同。资源是附加功能 —
不支持资源的客户端仍可继续使用这些工具。
安全不变量
- 密码只能写入。它们绝不会出现在任何工具的任何响应正文中。
- 所有浏览器 Agent 响应中都会剔除隧道 URL(
*.tunnel.debugg.ai,以及历史运行仍会引用的已弃用*.ngrok.debugg.ai),包括 Agent 编写的文本。 - 后端返回的 404 会以
isError: true和{error: 'NotFound', ...}的形式呈现,绝不会作为抛出的异常。 - 缺少
DEBUGGAI_API_KEY时,首次调用会返回结构化工具错误 — 服务仍会正常注册并列出工具。
迁移到 v6.0.0(后端判定,不包含 MCP 编写的文本)
运行判定为 pass | fail | error,后端的 reason 会原样传递。未尝试测试的运行会显示
outcome: null、skipped: true、skipReason。
| 已移除 | 替代项 |
|---|---|
success | outcome |
failureCategory | outcome + reason |
stepsTaken / stepsBudget / stepsRemaining | budget: {maxSteps, usedSteps} |
failedNode | errorInfo |
get → projects[0] / executions[0] / environments[0] + pageInfo + filter | {project} / {execution} / {project, environment} |
警告和结果中的 message / note | 仅结构化字段 |
完整列表:CHANGELOG.md 6.0.0。
迁移到 v3.0.0(基于操作的工具)
v3 将 20 个按动词划分的工具整合为 8 个基于操作的工具。旧工具 → 新 tool {action}:
| 已移除 | 替代项 |
|---|---|
search_projects | project {action:"get"} / project {action:"list"} |
create_project | project {action:"create"} |
update_project、delete_project | 已移除 — 请使用 DebuggAI Web 应用 |
search_environments | environment {action:"get"} / {action:"list"} |
create_environment / update_environment / delete_environment | environment {action:"create"|"update"|"delete"} |
create_test_suite / search_test_suites / run_test_suite / get_test_suite_results / delete_test_suite | test_suite {action:"create"|"list"|"run"|"results"|"delete"} |
create_test_case / update_test_case / delete_test_case | test_case {action:"create"|"update"|"delete"} |
search_executions | executions {action:"get"|"list"} |
trigger_crawl 的 headless 参数 | 已移除 — 始终以无头模式运行 |
现在,delete 操作需要确认(通过征询提示词,或设置 confirm: true)。客户端在 MCP 重启后即可使用新的工具集。
从 v1.x 迁移(v2.0.0 中的破坏性变更)
v2 将 22 个工具精简为 11 个。旧工具 → 新工具映射:
| 已移除 | 替代项 |
|---|---|
list_projects, get_project | search_projects(uuid 模式与筛选模式) |
list_environments, get_environment | search_environments |
list_credentials, get_credential | search_environments — 凭据内嵌于每个环境中 |
create_credential | 使用 create_environment({credentials: [...]}) 创建,或使用 update_environment({addCredentials: [...]}) |
update_credential | update_environment({updateCredentials: [{uuid, ...patch}]}) |
delete_credential | update_environment({removeCredentialIds: [uuid]}) |
list_teams, list_repos | create_project({teamName, repoName}) — 名称解析并处理歧义 |
list_executions, get_execution | search_executions |
cancel_execution | 已移除 — 后端会自动关闭运行中的实例 |
响应结构变更:列表响应中的独立 count 字段已移除 — 请使用 pageInfo.totalCount。
配置
| 环境变量 | 必需 | 用途 |
|---|---|---|
DEBUGGAI_API_KEY | 是 | 后端 API 密钥。别名:DEBUGGAI_API_TOKEN、DEBUGGAI_JWT_TOKEN。 |
DEBUGGAI_API_URL | 否 | 后端基础 URL。默认为 https://api.debugg.ai。 |
DEBUGGAI_TOKEN_TYPE | 否 | token(默认)或 bearer。 |
DEBUGGAI_EVAL_TEMPLATE | 否 | 覆盖 check_app_in_browser 要调用的 App Evaluation 工作流 slug。默认为 flow/e2es/app-eval。调用会固定使用此 slug,因此后端模板重命名不会导致其失效。 |
LOG_LEVEL | 否 | error / warn / info(默认)/ debug。 |
POSTHOG_API_KEY | 否 | 覆盖内嵌的遥测项目密钥(例如私有分叉)。 |
DEBUGGAI_TELEMETRY_DISABLED | 否 | 设置为 1 / true / yes / on 可完全停用遥测。 |
DEBUGGAI_API_KEY=your_api_key
远程 / HTTP 传输(可选)
默认情况下,服务通过 stdio(本地 npx)通信。也可以通过 无状态 Streamable HTTP + OAuth,将其作为托管的多用户远程 MCP 运行:
DEBUGGAI_MCP_TRANSPORT=http PORT=3000 DEBUGGAI_TOKEN_TYPE=bearer npx -y @debugg-ai/debugg-ai-mcp@latest
它是一个 OAuth Resource Server:每个 POST /mcp 都需要
Authorization: Bearer <token>;缺少或无效的令牌会收到 401,其中的
WWW-Authenticate 指向 RFC 9728 元数据,客户端则会针对公布的授权服务器执行 OAuth
流程。Bearer 令牌的作用范围限定于单个请求——api.debugg.ai 会验证该令牌。
| 端点 | 用途 |
|---|---|
POST /mcp | MCP Streamable HTTP(受 bearer 令牌保护) |
GET /.well-known/oauth-protected-resource | RFC 9728 元数据(授权服务器发现) |
GET /health | 负载均衡器 / ECS 健康检查 |
| 环境变量 | 默认值 | 用途 |
|---|---|---|
DEBUGGAI_MCP_TRANSPORT | stdio | 设为 http 以使用远程传输 |
PORT | 3000 | HTTP 监听端口 |
DEBUGGAI_MCP_PUBLIC_URL | https://mcp.debugg.ai | 此服务的公开资源 URL(RFC 9728 resource) |
DEBUGGAI_OAUTH_ISSUER | https://auth.debugg.ai | 向客户端公布的授权服务器 |
DEBUGGAI_TOKEN_TYPE | token | 设为 bearer,让 OAuth 令牌以 Authorization: Bearer 的形式转发 |
stdio 安装无需设置这些变量。
多副本部署(上线前的通过/不通过检查): 隧道状态(会话隧道、
其 Caddy 实例及其端口路由锁)保存在进程内,并按调用方通过 bearer 令牌的哈希进行区分——没有跨进程协调。通过普通
轮询负载均衡器运行多个副本,意味着同一调用方的请求可能落到不同副本上,导致每个命中的副本都创建一个隧道,而不是整个会话共用一个隧道(隧道数量最多不超过
副本数,并会通过现有的 55 分钟空闲自动关闭机制自行恢复——这绝不会导致跨会话正确性问题,因为单个工具调用在整个执行期间始终会落在同一个副本上)。若要在多副本 HTTP 部署中实现预期的“每个会话一个隧道”,请在负载均衡器上配置会话粘性路由(粘性路由 / 一致性哈希,使用与 getSessionKey() 派生相同的标识——实际中即调用方的 Authorization bearer 令牌)。如果未配置,请参阅
docs/local-tunnel-multiplexer-architecture-2026-07-31.md §2.1,了解完整的原因说明和如实说明的降级方案。
遥测
MCP 服务默认启用遥测——内置只写的 PostHog 项目密钥(phc_*),方便团队观察整个安装群体中的缓存命中率、轮询频率、隧道可靠性和其他运行指标。捕获的事件:
| 事件 | 触发时机 |
|---|---|
tool.executed / tool.failed | 每次工具调用 |
workflow.executed | 每次浏览器 Agent 执行(包含 pollCount、durationMs、finalIntervalMs) |
tunnel.provisioned / tunnel.provision_retry / tunnel.stopped | 每次隧道生命周期事件 |
template.lookup / project.lookup | 缓存命中/未命中;冷调用时包含 durationMs |
隐私措施:
- 唯一 ID 为
SHA-256(api_key).slice(0, 16)——绝不使用原始密钥,也不包含个人身份信息。 - 按照 PostHog 的惯例,
phc_*密钥是只写的;可安全地嵌入源代码。 - 设置
DEBUGGAI_TELEMETRY_DISABLED=1即可完全选择退出(会解析为空操作提供程序;不会有任何事件离开进程)。
启动时会记录当前模式:
Telemetry enabled (PostHog, DebuggAI default project). Set DEBUGGAI_TELEMETRY_DISABLED=1 to opt out.
Telemetry enabled (PostHog, custom POSTHOG_API_KEY)
Telemetry disabled (DEBUGGAI_TELEMETRY_DISABLED is set)
本地开发
npm install
npm run build
npm run test:e2e # real end-to-end evals against the backend
评估套件会将构建好的 MCP 服务作为子进程启动,使用真实后端测试每个工具,并将各流程的产物写入 scripts/evals/artifacts/<timestamp>/。各个场景见 scripts/evals/flows/。
MCP 注册:debugg-ai-local 与 debugg-ai
此仓库提供了一个 .mcp.json,用于注册名为 debugg-ai-local 的项目级服务,指向 node dist/index.js——刚构建的本地代码。只有当 Claude Code 的工作目录为此仓库时,它才会激活。
其他项目应使用从已发布的 npm 包获取的用户级 debugg-ai 注册:
npm run mcp:global # registers debugg-ai in ~/.claude.json to npx -y @debugg-ai/debugg-ai-mcp
在此处修改代码后,运行 npm run mcp:local(该命令只会重新构建),这样下次调用 debugg-ai-local 时就会使用你的更改。
链接
Apache-2.0 许可证 © 2025 DebuggAI
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。