@visual-layer/mcp-server 1.0.0 → 1.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.
@@ -0,0 +1,35 @@
1
+ import type { Bbox } from '@visual-layer/core';
2
+ export interface DiffOptions {
3
+ /** Per-channel abs difference (0-255) above which a pixel counts as changed. Default 30. */
4
+ pixelTolerance?: number;
5
+ /** Fraction of scanned pixels changed above which `changed` is true. Default 0.005 (0.5%). */
6
+ changeThreshold?: number;
7
+ /** Viewport-space bbox to restrict the scan to (e.g. the clicked element). Omit = full image. */
8
+ region?: Bbox;
9
+ /** Viewport the region bbox is in. Required when region is set. */
10
+ viewport?: {
11
+ width: number;
12
+ height: number;
13
+ };
14
+ }
15
+ export interface DiffResult {
16
+ changed: boolean;
17
+ /** Fraction of scanned pixels that differ, in [0, 1]. */
18
+ changeRatio: number;
19
+ differingPixels: number;
20
+ totalPixels: number;
21
+ /** The screenshot-space region actually scanned, when a region was given. */
22
+ region?: {
23
+ x: number;
24
+ y: number;
25
+ width: number;
26
+ height: number;
27
+ scale: number;
28
+ };
29
+ }
30
+ /**
31
+ * Decode before/after to raw RGB, force after to before's dimensions, and count
32
+ * pixels differing beyond pixelTolerance within the scan window (region or full).
33
+ */
34
+ export declare function diffScreenshots(before: Buffer, after: Buffer, opts?: DiffOptions): Promise<DiffResult>;
35
+ //# sourceMappingURL=perceptual-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perceptual-diff.d.ts","sourceRoot":"","sources":["../src/perceptual-diff.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,4FAA4F;IAC5F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8FAA8F;IAC9F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iGAAiG;IACjG,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,mEAAmE;IACnE,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,MAAM,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACjF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,CA6DrB"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Perceptual screenshot diff — region-aware pixel comparison of two ingested
3
+ * screenshots. Replaces the coarse sha256-identity check in verify_action with
4
+ * an actual pixel diff, optionally scoped to the clicked element's bbox so a
5
+ * small visual change is not drowned out by an unrelated full-page animation.
6
+ *
7
+ * ponytail: per-pixel threshold scan over raw RGB. O(W*H) per call, fine for
8
+ * viewport-sized PNGs. Upgrade to block-hash / pHash if very large screenshots
9
+ * or repeated calls show measurable cost.
10
+ */
11
+ import sharp from 'sharp';
12
+ /**
13
+ * Decode before/after to raw RGB, force after to before's dimensions, and count
14
+ * pixels differing beyond pixelTolerance within the scan window (region or full).
15
+ */
16
+ export async function diffScreenshots(before, after, opts = {}) {
17
+ const pixelTol = opts.pixelTolerance ?? 30;
18
+ const changeThreshold = opts.changeThreshold ?? 0.005;
19
+ const beforeImg = await sharp(before).removeAlpha().raw().toBuffer({ resolveWithObject: true });
20
+ const W = beforeImg.info.width;
21
+ const H = beforeImg.info.height;
22
+ const ch = beforeImg.info.channels;
23
+ // Force after to identical dimensions/channels — before/after come from the
24
+ // same viewport, but JPEG re-encode or a 1px scroll can shift size by 1.
25
+ const afterImg = await sharp(after)
26
+ .removeAlpha()
27
+ .resize(W, H, { fit: 'fill' })
28
+ .raw()
29
+ .toBuffer({ resolveWithObject: true });
30
+ let x0 = 0;
31
+ let y0 = 0;
32
+ let x1 = W;
33
+ let y1 = H;
34
+ let region;
35
+ if (opts.region && opts.viewport && opts.viewport.width > 0 && opts.viewport.height > 0) {
36
+ const sx = W / opts.viewport.width;
37
+ const sy = H / opts.viewport.height;
38
+ const s = Math.min(sx, sy);
39
+ const [bx, by, bw, bh] = opts.region;
40
+ x0 = clamp(Math.floor(bx * s), 0, W);
41
+ y0 = clamp(Math.floor(by * s), 0, H);
42
+ x1 = clamp(Math.ceil((bx + bw) * s), 0, W);
43
+ y1 = clamp(Math.ceil((by + bh) * s), 0, H);
44
+ region = { x: x0, y: y0, width: x1 - x0, height: y1 - y0, scale: s };
45
+ }
46
+ const a = beforeImg.data;
47
+ const b = afterImg.data;
48
+ let differing = 0;
49
+ let total = 0;
50
+ for (let y = y0; y < y1; y++) {
51
+ for (let x = x0; x < x1; x++) {
52
+ const i = (y * W + x) * ch;
53
+ for (let c = 0; c < ch; c++) {
54
+ if (Math.abs(a[i + c] - b[i + c]) > pixelTol) {
55
+ differing++;
56
+ break;
57
+ }
58
+ }
59
+ total++;
60
+ }
61
+ }
62
+ if (total === 0)
63
+ total = 1;
64
+ const changeRatio = differing / total;
65
+ return {
66
+ changed: changeRatio > changeThreshold,
67
+ changeRatio,
68
+ differingPixels: differing,
69
+ totalPixels: total,
70
+ region,
71
+ };
72
+ }
73
+ function clamp(v, min, max) {
74
+ return v < min ? min : v > max ? max : v;
75
+ }
76
+ //# sourceMappingURL=perceptual-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perceptual-diff.js","sourceRoot":"","sources":["../src/perceptual-diff.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE,OAAO,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAC;AAE5D,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAsMtG"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBpE,OAAO,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAC;AAG5D,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAiWtG"}
package/dist/server.js CHANGED
@@ -1,15 +1,18 @@
1
1
  /**
2
- * MCP stdio server. Exposes 7 VisualLayer tools usable from Claude Code and Codex.
2
+ * MCP stdio server. Exposes 9 VisualLayer tools usable from Claude Code and Codex.
3
3
  * Wraps core/figma-rest/grounding; contains no business logic of its own.
4
4
  *
5
5
  * Logs MUST go to stderr (§18.3) — stdout is the JSON-RPC transport.
6
6
  */
7
7
  import { z } from 'zod';
8
8
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ import { createHash } from 'node:crypto';
10
+ import { readFile as readFileBuffer } from 'node:fs/promises';
9
11
  import { snapshotToScreenGraph, structuredError, ErrorCodes, } from '@visual-layer/core';
10
- import { groundInstruction, compareGraphs, evalGrounding } from '@visual-layer/grounding';
12
+ import { groundInstruction, gateGrounding, buildConsensus, compareGraphs, evalGrounding, } from '@visual-layer/grounding';
11
13
  import { HttpFigmaClient, MockFigmaClient, captureFigma } from '@visual-layer/figma-rest';
12
14
  import { ServerState } from './state.js';
15
+ import { diffScreenshots } from './perceptual-diff.js';
13
16
  export const MCP_SERVER_VERSION = '0.1.0';
14
17
  export function createServer(opts = {}) {
15
18
  const state = opts.state ?? new ServerState();
@@ -18,7 +21,7 @@ export function createServer(opts = {}) {
18
21
  error: structuredError(code, message, { tracePath: runId ? `.visual-layer/artifacts/${runId}/trace.json` : undefined }),
19
22
  });
20
23
  /* 1. capture_browser */
21
- server.tool('capture_browser', 'Normalize a chrome-devtools-mcp take_snapshot payload into a persisted ScreenGraph.', {
24
+ server.tool('capture_browser', 'Normalize a chrome-devtools-mcp take_snapshot payload into a persisted ScreenGraph. Pass screenshotPath (a file path from chrome-devtools take_screenshot) + screenshotArtifact metadata to ingest the screenshot bytes so get_artifact can resolve it.', {
22
25
  snapshot: z.record(z.string(), z.unknown()),
23
26
  screenshotArtifact: z
24
27
  .object({
@@ -29,6 +32,10 @@ export function createServer(opts = {}) {
29
32
  mimeType: z.enum(['image/png', 'image/jpeg']),
30
33
  })
31
34
  .optional(),
35
+ screenshotPath: z
36
+ .string()
37
+ .optional()
38
+ .describe('Filesystem path to the screenshot file (e.g. from chrome-devtools take_screenshot --filePath). Requires screenshotArtifact metadata; bytes are ingested into the store so get_artifact resolves.'),
32
39
  viewport: z.object({ width: z.number(), height: z.number(), dpr: z.number().optional(), url: z.string().optional() }).optional(),
33
40
  }, async (args) => {
34
41
  try {
@@ -37,6 +44,19 @@ export function createServer(opts = {}) {
37
44
  screenshot: args.screenshotArtifact,
38
45
  });
39
46
  const stored = await state.capture(graph);
47
+ // Ingest screenshot bytes so get_artifact can resolve the reference.
48
+ // Without this the screenshotArtifact is ref-only metadata and get_artifact 404s.
49
+ if (args.screenshotPath) {
50
+ if (!args.screenshotArtifact) {
51
+ return err(ErrorCodes.snapshot_missing_fields, 'screenshotPath requires screenshotArtifact metadata (artifactId + mimeType + width + height)');
52
+ }
53
+ const buf = await readFileBuffer(args.screenshotPath);
54
+ await state.store.write(stored.runId, args.screenshotArtifact.artifactId, 'screenshot', new Uint8Array(buf), {
55
+ mimeType: args.screenshotArtifact.mimeType,
56
+ sha256: createHash('sha256').update(buf).digest('hex'),
57
+ });
58
+ stored.trace.info('capture_browser', { screenshotIngested: args.screenshotArtifact.artifactId });
59
+ }
40
60
  stored.trace.info('capture_browser', { interactables: graph.interactables.length });
41
61
  await stored.trace.flush(state.store);
42
62
  return state.respond({
@@ -76,15 +96,136 @@ export function createServer(opts = {}) {
76
96
  }
77
97
  });
78
98
  /* 3. ground_instruction */
79
- server.tool('ground_instruction', 'Rank interactables in a ScreenGraph against a natural-language instruction. Returns top-K candidates with score breakdown.', {
99
+ server.tool('ground_instruction', 'Rank interactables in a ScreenGraph against a natural-language instruction. Returns top-K candidates + a gate verdict. verdict.status: "accepted" (safe to act), "needs_visual_confirm" (structure ambiguous — look at the screenshot, then call confirm_grounding), "rejected" (no viable candidate). This gate is how accuracy approaches 100%: actions only fire when structure is confident or vision confirms it.', {
80
100
  screenGraphId: z.string().min(1),
81
101
  instruction: z.string().min(1),
82
102
  topK: z.number().int().positive().max(50).optional(),
103
+ gate: z
104
+ .object({
105
+ acceptConfidence: z.number().min(0).max(1).optional(),
106
+ minGap: z.number().min(0).max(1).optional(),
107
+ rejectConfidence: z.number().min(0).max(1).optional(),
108
+ })
109
+ .optional()
110
+ .describe('Gate thresholds. Defaults: acceptConfidence 0.85, minGap 0.2, rejectConfidence 0.3.'),
83
111
  }, async (args) => {
84
112
  try {
85
- const { graph, runId } = state.get(args.screenGraphId);
113
+ const { graph } = state.get(args.screenGraphId);
86
114
  const result = groundInstruction(graph, args.instruction, { topK: args.topK ?? 5 });
87
- return state.respond(result, []);
115
+ const verdict = gateGrounding(result, graph, (args.gate ?? {}));
116
+ return state.respond({
117
+ candidates: result.candidates,
118
+ verdict,
119
+ screenshot: graph.screenshot ?? null,
120
+ }, result.warnings);
121
+ }
122
+ catch (e) {
123
+ return err(toCode(e), msg(e));
124
+ }
125
+ });
126
+ /* 3b. confirm_grounding — vision second-opinion (the agent IS the VLM) */
127
+ server.tool('confirm_grounding', 'Vision second-opinion on an ambiguous grounding verdict. Call ONLY after ground_instruction returned verdict.status "needs_visual_confirm". Re-runs the gate with the same instruction and applies your visual verdict. Pass confirmed=true + the interactableId you see is the right target (use the bbox from the candidates); confirmed=false to block. Returns consensus.status: "act" (proceed) or "blocked".', {
128
+ screenGraphId: z.string().min(1),
129
+ instruction: z.string().min(1),
130
+ confirmed: z.boolean(),
131
+ interactableId: z.string().optional().describe('The interactable id vision confirms. Required when confirmed=true.'),
132
+ reason: z.string().optional(),
133
+ gate: z
134
+ .object({
135
+ acceptConfidence: z.number().min(0).max(1).optional(),
136
+ minGap: z.number().min(0).max(1).optional(),
137
+ rejectConfidence: z.number().min(0).max(1).optional(),
138
+ })
139
+ .optional(),
140
+ }, async (args) => {
141
+ try {
142
+ const { graph, trace } = state.get(args.screenGraphId);
143
+ const result = groundInstruction(graph, args.instruction, { topK: 5 });
144
+ const verdict = gateGrounding(result, graph, (args.gate ?? {}));
145
+ if (verdict.status === 'accepted') {
146
+ // Structure already confident — vision not needed, but harmless.
147
+ trace.info('confirm_grounding', { note: 'structure already accepted, vision verdict ignored' });
148
+ }
149
+ if (args.confirmed && !args.interactableId) {
150
+ return err(ErrorCodes.snapshot_missing_fields, 'confirmed=true requires interactableId');
151
+ }
152
+ const visual = {
153
+ confirmed: args.confirmed,
154
+ interactableId: args.interactableId,
155
+ reason: args.reason,
156
+ };
157
+ const consensus = buildConsensus(verdict, visual);
158
+ trace.info('confirm_grounding', {
159
+ gateStatus: verdict.status,
160
+ visualConfirmed: args.confirmed,
161
+ consensus: consensus.status,
162
+ interactableId: consensus.interactableId,
163
+ });
164
+ await trace.flush(state.store);
165
+ return state.respond({
166
+ consensus,
167
+ verdict,
168
+ screenshot: graph.screenshot ?? null,
169
+ });
170
+ }
171
+ catch (e) {
172
+ return err(toCode(e), msg(e));
173
+ }
174
+ });
175
+ /* 3c. verify_action — did the action take effect? (perceptual before/after diff) */
176
+ server.tool('verify_action', 'Confirm an action took visible effect via a perceptual pixel diff of before/after screenshots ingested through capture_browser. Pass interactableId to scope the diff to the clicked element bbox (recommended — isolates the change from page-wide noise). Returns changed=true iff the changed-pixel ratio exceeds threshold (default 0.5%). changed=false means no visible state change — the action likely missed or was a no-op.', {
177
+ screenGraphId: z.string().min(1),
178
+ beforeArtifactId: z.string().min(1),
179
+ afterArtifactId: z.string().min(1),
180
+ interactableId: z
181
+ .string()
182
+ .optional()
183
+ .describe('The clicked interactable. When set, the diff scans only its bbox region.'),
184
+ pixelTolerance: z.number().min(0).max(255).optional().describe('Per-channel diff (0-255) to count as changed. Default 30.'),
185
+ changeThreshold: z.number().min(0).max(1).optional().describe('Changed-pixel fraction for changed=true. Default 0.005 (0.5%).'),
186
+ }, async (args) => {
187
+ try {
188
+ const { graph, runId, trace } = state.get(args.screenGraphId);
189
+ const before = await state.store.lookup(runId, args.beforeArtifactId);
190
+ const after = await state.store.lookup(runId, args.afterArtifactId);
191
+ if (!before)
192
+ return err('artifact_not_found', `before artifact ${args.beforeArtifactId} not in run ${runId}`, runId);
193
+ if (!after)
194
+ return err('artifact_not_found', `after artifact ${args.afterArtifactId} not in run ${runId}`, runId);
195
+ const beforeBuf = await state.store.read(runId, args.beforeArtifactId, before.filename);
196
+ const afterBuf = await state.store.read(runId, args.afterArtifactId, after.filename);
197
+ let region = null;
198
+ if (args.interactableId) {
199
+ const inter = graph.interactables.find((i) => i.id === args.interactableId);
200
+ if (!inter)
201
+ return err('element_not_found', `interactable ${args.interactableId} not in graph`);
202
+ region = pickRegion(inter.bbox, graph.viewport);
203
+ }
204
+ const diff = await diffScreenshots(beforeBuf, afterBuf, {
205
+ pixelTolerance: args.pixelTolerance,
206
+ changeThreshold: args.changeThreshold,
207
+ region: region?.bbox,
208
+ viewport: region?.viewport,
209
+ });
210
+ trace.info('verify_action', {
211
+ changed: diff.changed,
212
+ changeRatio: Number(diff.changeRatio.toFixed(4)),
213
+ differingPixels: diff.differingPixels,
214
+ scoped: !!region,
215
+ });
216
+ await trace.flush(state.store);
217
+ return state.respond({
218
+ changed: diff.changed,
219
+ changeRatio: diff.changeRatio,
220
+ differingPixels: diff.differingPixels,
221
+ totalPixels: diff.totalPixels,
222
+ region: diff.region ?? null,
223
+ reason: diff.changed
224
+ ? `pixel change ${(diff.changeRatio * 100).toFixed(2)}% of scanned region`
225
+ : 'no perceptible pixel change — action likely had no visible effect',
226
+ before: { sha256: before.sha256 ?? '', byteSize: before.byteSize, mimeType: before.mimeType },
227
+ after: { sha256: after.sha256 ?? '', byteSize: after.byteSize, mimeType: after.mimeType },
228
+ });
88
229
  }
89
230
  catch (e) {
90
231
  return err(toCode(e), msg(e));
@@ -183,6 +324,16 @@ function toCode(e) {
183
324
  function msg(e) {
184
325
  return e instanceof Error ? e.message : String(e);
185
326
  }
327
+ /**
328
+ * Map a viewport-space bbox to a screenshot-space scan region. Returns null
329
+ * when no viewport is set on the graph — caller then falls back to a full-image
330
+ * diff instead of a scoped one.
331
+ */
332
+ function pickRegion(bbox, viewport) {
333
+ if (!viewport || !viewport.width || !viewport.height)
334
+ return null;
335
+ return { bbox, viewport: { width: viewport.width, height: viewport.height } };
336
+ }
186
337
  async function readFile(p) {
187
338
  const { readFile: rf } = await import('node:fs/promises');
188
339
  return rf(p, 'utf8');
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visual-layer/mcp-server",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "MCP stdio server exposing VisualLayer tools (Claude Code + Codex)",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -28,10 +28,11 @@
28
28
  ],
29
29
  "dependencies": {
30
30
  "@modelcontextprotocol/sdk": "^1.0.4",
31
+ "sharp": "^0.33.5",
31
32
  "zod": "^3.23.8",
32
- "@visual-layer/core": "1.0.0",
33
- "@visual-layer/grounding": "1.0.0",
34
- "@visual-layer/figma-rest": "1.0.0"
33
+ "@visual-layer/core": "1.0.1",
34
+ "@visual-layer/figma-rest": "1.0.1",
35
+ "@visual-layer/grounding": "1.1.0"
35
36
  },
36
37
  "scripts": {
37
38
  "build": "tsc -b",