@debugg-ai/debugg-ai-mcp 3.0.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/tools/annotations.js +33 -0
- package/dist/tools/environment.js +2 -0
- package/dist/tools/executions.js +2 -0
- package/dist/tools/probePage.js +2 -0
- package/dist/tools/project.js +2 -0
- package/dist/tools/testCase.js +2 -0
- package/dist/tools/testPageChanges.js +2 -0
- package/dist/tools/testSuite.js +2 -0
- package/dist/tools/triggerCrawl.js +2 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,22 @@ All notable changes to the DebuggAI MCP project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [3.1.0]
|
|
9
|
+
|
|
10
|
+
### Added — Tool annotations (behavioral hints for clients)
|
|
11
|
+
|
|
12
|
+
Every tool now declares MCP [tool annotations](https://modelcontextprotocol.io/specification/2025-06-18/server/tools)
|
|
13
|
+
so clients can reason about a tool before calling it (e.g. confirm-gate
|
|
14
|
+
destructive ops, fast-path read-only ones):
|
|
15
|
+
|
|
16
|
+
- `environment`, `test_suite`, `test_case` → `destructiveHint: true` (expose a delete action)
|
|
17
|
+
- `executions`, `probe_page` → `readOnlyHint: true`
|
|
18
|
+
- `project`, `check_app_in_browser`, `trigger_crawl` → write but non-destructive
|
|
19
|
+
- all tools → `openWorldHint: true` (they reach the DebuggAI backend / live web)
|
|
20
|
+
|
|
21
|
+
Annotations are advisory; deletes are still enforced server-side via the existing
|
|
22
|
+
confirmation gate. Presets live in `tools/annotations.ts`.
|
|
23
|
+
|
|
8
24
|
## [3.0.1]
|
|
9
25
|
|
|
10
26
|
### Fixed — 5 action tools were invisible in Claude Code (and any Anthropic-API client)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool annotation presets (epic p7gft).
|
|
3
|
+
*
|
|
4
|
+
* Annotations are *hints* (MCP 2025-03-26+) that let clients reason about a tool
|
|
5
|
+
* before calling it — e.g. confirm-gate destructive tools, fast-path read-only
|
|
6
|
+
* ones. They are advisory; the server still enforces real safety (deletes also
|
|
7
|
+
* require confirmation via confirmDestructive.ts).
|
|
8
|
+
*
|
|
9
|
+
* Every DebuggAI tool talks to the backend and/or the open web, so
|
|
10
|
+
* `openWorldHint` is true everywhere. `readOnlyHint`/`destructiveHint` reflect a
|
|
11
|
+
* tool's MOST powerful action — the action tools mix reads and writes under one
|
|
12
|
+
* name, so the annotation is the conservative worst case:
|
|
13
|
+
* - READ_ONLY : only get/list/probe — never mutates backend state
|
|
14
|
+
* - WRITES : can create/update/run (not read-only) but cannot delete
|
|
15
|
+
* - DESTRUCTIVE : exposes a delete action (irreversible) — clients should confirm
|
|
16
|
+
*
|
|
17
|
+
* Per the spec, `destructiveHint`/`idempotentHint` are only meaningful when
|
|
18
|
+
* `readOnlyHint` is false, so READ_ONLY omits them.
|
|
19
|
+
*/
|
|
20
|
+
export const READ_ONLY = {
|
|
21
|
+
readOnlyHint: true,
|
|
22
|
+
openWorldHint: true,
|
|
23
|
+
};
|
|
24
|
+
export const WRITES = {
|
|
25
|
+
readOnlyHint: false,
|
|
26
|
+
destructiveHint: false,
|
|
27
|
+
openWorldHint: true,
|
|
28
|
+
};
|
|
29
|
+
export const DESTRUCTIVE = {
|
|
30
|
+
readOnlyHint: false,
|
|
31
|
+
destructiveHint: true,
|
|
32
|
+
openWorldHint: true,
|
|
33
|
+
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EnvironmentInputSchema } from '../types/index.js';
|
|
2
2
|
import { environmentHandler } from '../handlers/environmentHandler.js';
|
|
3
|
+
import { DESTRUCTIVE } from './annotations.js';
|
|
3
4
|
const CRED_ITEM = {
|
|
4
5
|
type: 'object',
|
|
5
6
|
properties: {
|
|
@@ -18,6 +19,7 @@ export function buildEnvironmentTool() {
|
|
|
18
19
|
return {
|
|
19
20
|
name: 'environment',
|
|
20
21
|
title: 'Environment',
|
|
22
|
+
annotations: DESTRUCTIVE,
|
|
21
23
|
description: DESCRIPTION,
|
|
22
24
|
inputSchema: {
|
|
23
25
|
type: 'object',
|
package/dist/tools/executions.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ExecutionsInputSchema } from '../types/index.js';
|
|
2
2
|
import { executionsHandler } from '../handlers/executionsHandler.js';
|
|
3
|
+
import { READ_ONLY } from './annotations.js';
|
|
3
4
|
const DESCRIPTION = `Look up workflow executions (history of check_app_in_browser, trigger_crawl, and test-suite runs). Pass an "action":
|
|
4
5
|
- "get" {uuid} → one execution with FULL detail (nodeExecutions, state, errorInfo) + any screenshot/gif artifacts.
|
|
5
6
|
- "list" {projectUuid?, status?, page?, pageSize?} → paginated execution summaries. status ∈ completed|running|failed|cancelled|pending.
|
|
@@ -9,6 +10,7 @@ export function buildExecutionsTool() {
|
|
|
9
10
|
return {
|
|
10
11
|
name: 'executions',
|
|
11
12
|
title: 'Workflow Executions',
|
|
13
|
+
annotations: READ_ONLY,
|
|
12
14
|
description: DESCRIPTION,
|
|
13
15
|
inputSchema: {
|
|
14
16
|
type: 'object',
|
package/dist/tools/probePage.js
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { ProbePageInputSchema } from '../types/index.js';
|
|
13
13
|
import { probePageHandler } from '../handlers/probePageHandler.js';
|
|
14
|
+
import { READ_ONLY } from './annotations.js';
|
|
14
15
|
const DESCRIPTION = `Probe one or more URLs and return their rendered state — screenshot, page metadata (title/finalUrl/statusCode/loadTimeMs), structured console errors, and per-URL network summary (refetch loops collapse into one row by origin+pathname).
|
|
15
16
|
|
|
16
17
|
WHEN TO USE: "did I just break /settings?" / "smoke-test these 5 routes after my refactor" / "what's actually rendering at /dashboard?" — fast (<10s for 1 URL, <25s for 20), no LLM cost, no agent loop.
|
|
@@ -45,6 +46,7 @@ export function buildProbePageTool() {
|
|
|
45
46
|
return {
|
|
46
47
|
name: 'probe_page',
|
|
47
48
|
title: 'Probe Page',
|
|
49
|
+
annotations: READ_ONLY,
|
|
48
50
|
description: DESCRIPTION,
|
|
49
51
|
inputSchema: {
|
|
50
52
|
type: 'object',
|
package/dist/tools/project.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ProjectInputSchema } from '../types/index.js';
|
|
2
2
|
import { projectHandler } from '../handlers/projectHandler.js';
|
|
3
|
+
import { WRITES } from './annotations.js';
|
|
3
4
|
const DESCRIPTION = `Manage DebuggAI projects. Pass an "action":
|
|
4
5
|
- "get" {uuid} → one project with full detail.
|
|
5
6
|
- "list" {q?, page?, pageSize?} → paginated project summaries.
|
|
@@ -10,6 +11,7 @@ export function buildProjectTool() {
|
|
|
10
11
|
return {
|
|
11
12
|
name: 'project',
|
|
12
13
|
title: 'Project',
|
|
14
|
+
annotations: WRITES,
|
|
13
15
|
description: DESCRIPTION,
|
|
14
16
|
inputSchema: {
|
|
15
17
|
type: 'object',
|
package/dist/tools/testCase.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { TestCaseInputSchema } from '../types/index.js';
|
|
2
2
|
import { testCaseHandler } from '../handlers/testCaseHandler.js';
|
|
3
|
+
import { DESTRUCTIVE } from './annotations.js';
|
|
3
4
|
const DESCRIPTION = `Manage individual test cases within a suite. Pass an "action":
|
|
4
5
|
- "create" {name, description, agentTaskDescription, suiteUuid|(suiteName+project), relativeUrl?, maxSteps?} → add a test case (NOT auto-run).
|
|
5
6
|
- "update" {testUuid, name?, description?, agentTaskDescription?} → patch a test case.
|
|
@@ -8,6 +9,7 @@ export function buildTestCaseTool() {
|
|
|
8
9
|
return {
|
|
9
10
|
name: 'test_case',
|
|
10
11
|
title: 'Test Case',
|
|
12
|
+
annotations: DESTRUCTIVE,
|
|
11
13
|
description: DESCRIPTION,
|
|
12
14
|
inputSchema: {
|
|
13
15
|
type: 'object',
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { TestPageChangesInputSchema } from '../types/index.js';
|
|
7
7
|
import { testPageChangesHandler } from '../handlers/testPageChangesHandler.js';
|
|
8
|
+
import { WRITES } from './annotations.js';
|
|
8
9
|
const BASE_DESCRIPTION = `Give an AI agent eyes on a live website or app. The agent browses it, interacts with it, and tells you whether a given task or check passed. Works on localhost or any URL. Use for visual QA, flow validation, regression checks, or anything that needs a real browser to verify.
|
|
9
10
|
|
|
10
11
|
LOCALHOST SUPPORT: Pass any localhost URL (e.g. http://localhost:3000) and it Just Works. A secure tunnel is automatically created so the remote browser can reach your local dev server — no manual ngrok setup, no port forwarding, no config.
|
|
@@ -43,6 +44,7 @@ export function buildTestPageChangesTool(ctx) {
|
|
|
43
44
|
return {
|
|
44
45
|
name: "check_app_in_browser",
|
|
45
46
|
title: "Run E2E Browser Test",
|
|
47
|
+
annotations: WRITES,
|
|
46
48
|
description: buildToolDescription(ctx),
|
|
47
49
|
inputSchema: {
|
|
48
50
|
type: "object",
|
package/dist/tools/testSuite.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { TestSuiteInputSchema } from '../types/index.js';
|
|
2
2
|
import { testSuiteHandler } from '../handlers/testSuiteHandler.js';
|
|
3
|
+
import { DESTRUCTIVE } from './annotations.js';
|
|
3
4
|
const DESCRIPTION = `Manage and run test suites. Identify a suite by suiteUuid, or suiteName + a project identifier (projectUuid|projectName). Pass an "action":
|
|
4
5
|
- "list" {projectUuid|projectName, search?, page?, pageSize?} → paginated suites with status/pass-rate.
|
|
5
6
|
- "create" {name, description, projectUuid|projectName} → create a suite.
|
|
@@ -18,6 +19,7 @@ export function buildTestSuiteTool() {
|
|
|
18
19
|
return {
|
|
19
20
|
name: 'test_suite',
|
|
20
21
|
title: 'Test Suite',
|
|
22
|
+
annotations: DESTRUCTIVE,
|
|
21
23
|
description: DESCRIPTION,
|
|
22
24
|
inputSchema: {
|
|
23
25
|
type: 'object',
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { TriggerCrawlInputSchema } from '../types/index.js';
|
|
7
7
|
import { triggerCrawlHandler } from '../handlers/triggerCrawlHandler.js';
|
|
8
|
+
import { WRITES } from './annotations.js';
|
|
8
9
|
const BASE_DESCRIPTION = `Trigger a browser-agent crawl of a web app to build the project's knowledge graph. The crawl systematically explores pages, UI states, and navigation flows, then populates the backend's knowledge graph so future evaluations and tests have context about the app.
|
|
9
10
|
|
|
10
11
|
LOCALHOST SUPPORT: Pass any localhost URL (e.g. http://localhost:3000) and it Just Works. A secure tunnel is automatically created so the remote browser can reach your local dev server.
|
|
@@ -39,6 +40,7 @@ export function buildTriggerCrawlTool(ctx) {
|
|
|
39
40
|
return {
|
|
40
41
|
name: 'trigger_crawl',
|
|
41
42
|
title: 'Trigger App Crawl',
|
|
43
|
+
annotations: WRITES,
|
|
42
44
|
description: buildTriggerCrawlDescription(ctx),
|
|
43
45
|
inputSchema: {
|
|
44
46
|
type: 'object',
|