@gjsify/devtools-mcp 0.13.2 → 0.15.1
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/lib/esm/profiles/cdp.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../_virtual/_rolldown/runtime.js";import e from"@girs/glib-2.0";import{z as t}from"zod";
|
|
1
|
+
import"../_virtual/_rolldown/runtime.js";import e from"@girs/glib-2.0";import{z as t}from"zod";const strv=t=>e.Variant.new_string(t),n={instance:t.string().optional().describe(`App instance label; omit for the default app`)},r=new Set([`Runtime.evaluate`,`Runtime.callFunctionOn`,`Runtime.getProperties`,`Runtime.getPreview`,`DOM.getDocument`,`DOM.querySelector`,`DOM.querySelectorAll`,`DOM.getOuterHTML`,`DOM.setAttributeValue`,`CSS.getComputedStyleForNode`,`CSS.getMatchedStylesForNode`,`Debugger.setBreakpoint`,`Debugger.setPauseOnExceptions`]);async function loadDevtoolsCdp(){try{return await import(`@gjsify/devtools-cdp`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`The CDP devtools profile requires the optional peer dependency \`@gjsify/devtools-cdp\` (Tier 3, experimental). Add it to your app to use \`gjsify debug --profile cdp\` / \`cdpProfile\` / \`registerCdpTools\`. (import failed: ${t})`)}}function zodForParam(e,n){if(n&&n.length>0)return t.enum(n);switch(e){case`string`:return t.string();case`number`:return t.number();case`boolean`:return t.boolean();case`array`:return t.array(t.unknown());case`object`:return t.record(t.string(),t.unknown());default:return t.unknown()}}async function cdpSend(t,n,r,i){let[a]=(await t.client.control(n,`CdpSend`,e.Variant.new_tuple([strv(r),strv(JSON.stringify(i))]),`(s)`)).recursiveUnpack();return a}function registerCoreCdpTools(r){let{server:i,client:a,ok:o,dbusError:s}=r;i.registerTool(`cdp_send`,{description:'Send any WebKit Remote Inspector command `Domain.command` (e.g. "Page.reload", "Network.enable") with optional params, and return its result JSON. The universal fallback for commands without a curated tool. Requires a prior cdp_connect.',inputSchema:t.object({method:t.string().describe(`Protocol method, e.g. "Runtime.evaluate".`),params:t.record(t.string(),t.unknown()).optional(),...n})},async({method:e,params:t,instance:n})=>{try{return o(await cdpSend(r,n,e,t??{}))}catch(e){return s(e,n)}}),i.registerTool(`cdp_discover_targets`,{description:`List the inspectable targets (web-page / service-worker / …) on the inspector server.`,inputSchema:t.object({...n})},async({instance:e})=>{try{return o(await a.jsonCall(e,`CdpDiscoverTargets`))}catch(t){return s(t,e)}}),i.registerTool(`cdp_connect`,{description:`Connect to an inspector target (defaults to the first web-page) and auto-enable the Inspector / Runtime / DOM / Console domains. Call before cdp_send / the curated tools.`,inputSchema:t.object({target:t.record(t.string(),t.unknown()).optional().describe(`Optional target selector, e.g. {targetId} or {wsUrl}; omit for the first web-page.`),...n})},async({target:t,instance:n})=>{try{let[i]=(await a.control(n,`CdpConnect`,e.Variant.new_tuple([strv(t?JSON.stringify(t):``)]),`(b)`)).recursiveUnpack();return i?o(`Connected to inspector target.`):r.fail(`No inspectable target found.`)}catch(e){return s(e,n)}}),i.registerTool(`cdp_drain_events`,{description:`Return + clear the buffered protocol events (console messages, DOM mutations, …).`,inputSchema:t.object({...n})},async({instance:e})=>{try{return o(await a.jsonCall(e,`CdpDrainEvents`))}catch(t){return s(t,e)}})}async function registerCuratedCdpTools(e){let{server:i,ok:a,dbusError:o}=e,{PROTOCOL_SPEC:s,generateCdpTools:c}=await loadDevtoolsCdp(),l=c(s,{include:(e,t)=>r.has(`${e}.${t}`)});for(let r of l){let s={};for(let e of r.parameters){let t=zodForParam(e.jsType,e.enum),n=e.description?t.describe(e.description):t;s[e.name]=e.optional?n.optional():n}i.registerTool(r.name,{description:r.description??r.method,inputSchema:t.object({...s,...n})},async t=>{let n=t.instance;try{let i={};for(let e of r.parameters)t[e.name]!==void 0&&(i[e.name]=t[e.name]);return a(await cdpSend(e,n,r.method,i))}catch(e){return o(e,n)}})}}async function registerCdpTools(e){registerCoreCdpTools(e),await registerCuratedCdpTools(e)}function cdpProfile(e){return{name:`gjsify-cdp-devtools`,version:`0.11.0`,busNameBase:e,registerTools:registerCdpTools}}export{cdpProfile,registerCdpTools};
|
package/lib/esm/run-server.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./_virtual/_rolldown/runtime.js";import{DbusDevtoolsClient as e}from"./dbus-client.js";import{fail as t,ok as n}from"./tool-result.js";import{dbusError as r}from"./error-map.js";import{registerGenericTools as i}from"./generic-tools.js";import{GjsStdioTransport as a}from"./stdio-transport.js";import o from"@girs/glib-2.0";import{McpServer as s}from"@modelcontextprotocol/sdk/server/mcp.js";async function runDevtoolsMcp(c){let l=new e(c.busNameBase),u=new s({name:c.name,version:c.version}),d={server:u,client:l,ok:n,fail:t,dbusError:(e,t)=>r(e,l.resolve(t))};i(d,c.genericTools??`all`),c.registerTools?.(d);let f=o.MainLoop.new(null,!1),p=new a(()=>f.quit());u.connect(p).then(()=>console.error(`[gjsify-devtools-mcp] ${c.name} on stdio (DBus base: ${c.busNameBase})`),e=>{console.error(`[gjsify-devtools-mcp] failed to connect:`,e),f.quit()}),f.run()}export{runDevtoolsMcp};
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{DbusDevtoolsClient as e}from"./dbus-client.js";import{fail as t,ok as n}from"./tool-result.js";import{dbusError as r}from"./error-map.js";import{registerGenericTools as i}from"./generic-tools.js";import{GjsStdioTransport as a}from"./stdio-transport.js";import o from"@girs/glib-2.0";import{McpServer as s}from"@modelcontextprotocol/sdk/server/mcp.js";async function runDevtoolsMcp(c){let l=new e(c.busNameBase),u=new s({name:c.name,version:c.version}),d={server:u,client:l,ok:n,fail:t,dbusError:(e,t)=>r(e,l.resolve(t))};i(d,c.genericTools??`all`),Promise.resolve(c.registerTools?.(d)).catch(e=>console.error(`[gjsify-devtools-mcp] tool registration failed:`,e));let f=o.MainLoop.new(null,!1),p=new a(()=>f.quit());u.connect(p).then(()=>console.error(`[gjsify-devtools-mcp] ${c.name} on stdio (DBus base: ${c.busNameBase})`),e=>{console.error(`[gjsify-devtools-mcp] failed to connect:`,e),f.quit()}),f.run()}export{runDevtoolsMcp};
|
package/lib/types/profile.d.ts
CHANGED
|
@@ -21,6 +21,11 @@ export interface DevtoolsToolProfile {
|
|
|
21
21
|
readonly busNameBase: string;
|
|
22
22
|
/** Which generic tools to register. Default: `'all'`. */
|
|
23
23
|
readonly genericTools?: GenericToolName[] | 'all';
|
|
24
|
-
/**
|
|
25
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Register app-specific tools on top of the generic ones. May be async —
|
|
26
|
+
* a profile that lazily loads an optional peer (e.g. the CDP profile) returns
|
|
27
|
+
* a promise; `runDevtoolsMcp` fires it and `.catch()`es it rather than
|
|
28
|
+
* awaiting (awaiting before `loop.run()` breaks the nested GJS main loop).
|
|
29
|
+
*/
|
|
30
|
+
readonly registerTools?: (ctx: McpToolContext) => void | Promise<void>;
|
|
26
31
|
}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { DevtoolsToolProfile, McpToolContext } from '../profile.js';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Register all CDP tools: the sync transport tools first (so they exist even if
|
|
4
|
+
* the optional peer is missing), then the curated typed tools which lazily load
|
|
5
|
+
* `@gjsify/devtools-cdp`. Async because the curated set needs the peer; callers
|
|
6
|
+
* that fire-and-forget it (e.g. `runDevtoolsMcp`) must `.catch()` the rejection
|
|
7
|
+
* so a missing peer surfaces cleanly instead of as an unhandled rejection.
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerCdpTools(ctx: McpToolContext): Promise<void>;
|
|
3
10
|
/** Tool profile for a @gjsify/devtools-cdp-enabled app. */
|
|
4
11
|
export declare function cdpProfile(busNameBase: string): DevtoolsToolProfile;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gjsify/devtools-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.1",
|
|
4
4
|
"description": "MCP↔devtools bridge for GJS apps — exposes a running app's org.gjsify.Devtools control plane (DBus) to an AI agent as MCP tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "lib/esm/index.js",
|
|
@@ -39,14 +39,22 @@
|
|
|
39
39
|
"@girs/gjs": "4.0.4",
|
|
40
40
|
"@girs/glib-2.0": "2.88.0-4.0.4",
|
|
41
41
|
"@girs/soup-3.0": "3.6.6-4.0.4",
|
|
42
|
-
"@gjsify/devtools-
|
|
43
|
-
"@gjsify/devtools-protocol": "^0.13.2",
|
|
42
|
+
"@gjsify/devtools-protocol": "^0.15.1",
|
|
44
43
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
45
44
|
"zod": "^4.4.3"
|
|
46
45
|
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"@gjsify/devtools-cdp": "^0.15.1"
|
|
48
|
+
},
|
|
49
|
+
"peerDependenciesMeta": {
|
|
50
|
+
"@gjsify/devtools-cdp": {
|
|
51
|
+
"optional": true
|
|
52
|
+
}
|
|
53
|
+
},
|
|
47
54
|
"devDependencies": {
|
|
48
|
-
"@gjsify/cli": "^0.
|
|
49
|
-
"@gjsify/
|
|
55
|
+
"@gjsify/cli": "^0.15.1",
|
|
56
|
+
"@gjsify/devtools-cdp": "^0.15.1",
|
|
57
|
+
"@gjsify/unit": "^0.15.1",
|
|
50
58
|
"@types/node": "^25.9.2",
|
|
51
59
|
"typescript": "^6.0.3"
|
|
52
60
|
},
|
|
@@ -56,7 +64,8 @@
|
|
|
56
64
|
"node": "none",
|
|
57
65
|
"browser": "none",
|
|
58
66
|
"nativescript": "none"
|
|
59
|
-
}
|
|
67
|
+
},
|
|
68
|
+
"tier": 2
|
|
60
69
|
},
|
|
61
70
|
"license": "MIT",
|
|
62
71
|
"repository": {
|