@customaise/mcp 1.0.3 → 1.1.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/README.md +52 -10
- package/dist/extension-bridge.d.ts +6 -0
- package/dist/extension-bridge.d.ts.map +1 -1
- package/dist/extension-bridge.js +15 -1
- package/dist/extension-bridge.js.map +1 -1
- package/dist/index.js +98 -2
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +312 -34
- package/dist/server.js.map +1 -1
- package/package.json +7 -3
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @customaise/mcp
|
|
2
2
|
|
|
3
|
-
MCP server that connects AI coding agents to the [Customaise](https://customaise.com) Chrome extension for userscript management and browser automation.
|
|
3
|
+
MCP server that connects AI coding agents to the [Customaise](https://customaise.com) Chrome extension for userscript management, visual DOM targeting, and browser automation.
|
|
4
4
|
|
|
5
5
|
```
|
|
6
6
|
AI Agent ←(stdio)→ MCP Server ←(WebSocket)→ Customaise Extension
|
|
@@ -49,6 +49,18 @@ Install the [Customaise Chrome extension](https://customaise.com) and enable **M
|
|
|
49
49
|
}
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
+
**Kiro** (`.kiro/mcp.json`):
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"mcpServers": {
|
|
56
|
+
"customaise": {
|
|
57
|
+
"command": "npx",
|
|
58
|
+
"args": ["-y", "@customaise/mcp"]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
52
64
|
**Codex** (`~/.codex/config.toml`):
|
|
53
65
|
```toml
|
|
54
66
|
[mcp_servers.customaise]
|
|
@@ -69,9 +81,9 @@ args = ["-y", "@customaise/mcp"]
|
|
|
69
81
|
```
|
|
70
82
|
|
|
71
83
|
### 3. Done!
|
|
72
|
-
Your AI agent can now manage userscripts, inspect browser pages, and take screenshots — all through natural language.
|
|
84
|
+
Your AI agent can now manage userscripts, visually target DOM elements, inspect browser pages, and take screenshots — all through natural language.
|
|
73
85
|
|
|
74
|
-
## Available Tools (
|
|
86
|
+
## Available Tools (13)
|
|
75
87
|
|
|
76
88
|
### Script Lifecycle
|
|
77
89
|
| Tool | Description |
|
|
@@ -89,11 +101,16 @@ Your AI agent can now manage userscripts, inspect browser pages, and take screen
|
|
|
89
101
|
| `get_console_context` | Console logs, errors, and GM_log output |
|
|
90
102
|
| `list_tabs` | List all open browser tabs |
|
|
91
103
|
|
|
104
|
+
### Visual DOM Targeting
|
|
105
|
+
| Tool | Description |
|
|
106
|
+
|------|-------------|
|
|
107
|
+
| `get_selected_elements` | Get DOM elements the user has visually selected in the browser, with bulletproof selectors and screenshots |
|
|
108
|
+
|
|
92
109
|
### Testing & Verification
|
|
93
110
|
| Tool | Description |
|
|
94
111
|
|------|-------------|
|
|
95
112
|
| `reload_tab` | Reload a tab to re-inject scripts |
|
|
96
|
-
| `take_screenshot` | Capture a screenshot of the visible tab |
|
|
113
|
+
| `take_screenshot` | Capture a screenshot of the visible tab with optional element highlighting |
|
|
97
114
|
|
|
98
115
|
### UI Control
|
|
99
116
|
| Tool | Description |
|
|
@@ -105,15 +122,40 @@ Your AI agent can now manage userscripts, inspect browser pages, and take screen
|
|
|
105
122
|
|------|-------------|
|
|
106
123
|
| `sync_scripts` | Bulk export all scripts to a local directory |
|
|
107
124
|
|
|
125
|
+
## Visual DOM Selection
|
|
126
|
+
|
|
127
|
+
Users can visually select elements in the browser, and the extension automatically pushes context files to your workspace in real-time:
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
.customaise/dom-context/<script-name>/
|
|
131
|
+
├── element-name.dom.md # Selectors, element context, user comments
|
|
132
|
+
├── element-name.screenshot.png # Cropped screenshot of the selected element
|
|
133
|
+
└── ...
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
> [!NOTE]
|
|
137
|
+
> **Where are the files saved?**
|
|
138
|
+
> The MCP server writes the `.customaise` folder to its current working directory (usually your open project root in Cursor or Windsurf).
|
|
139
|
+
> If you are using a global IDE like Claude Desktop, it will default to your Home directory (`~/.customaise`). To force the files to save in a specific project folder, add the `CUSTOMAISE_WORKSPACE` environment variable to your MCP config:
|
|
140
|
+
>
|
|
141
|
+
> ```json
|
|
142
|
+
> "env": { "CUSTOMAISE_WORKSPACE": "/absolute/path/to/your/project" }
|
|
143
|
+
> ```
|
|
144
|
+
|
|
145
|
+
Use `get_selected_elements` to retrieve selections programmatically, or read the auto-pushed `.dom.md` files directly from the workspace.
|
|
146
|
+
|
|
147
|
+
Each selection includes **bulletproof tiered selectors** (stable IDs → data attributes → ARIA → semantic classes → structural positioning) for resilient element targeting that survives page updates.
|
|
148
|
+
|
|
108
149
|
## Typical Workflow
|
|
109
150
|
|
|
110
151
|
```
|
|
111
|
-
1. get_page_context
|
|
112
|
-
2.
|
|
113
|
-
3.
|
|
114
|
-
4.
|
|
115
|
-
5.
|
|
116
|
-
6.
|
|
152
|
+
1. get_page_context → understand the target page
|
|
153
|
+
2. User selects elements → .dom.md files auto-pushed to workspace
|
|
154
|
+
3. Write .user.js file → AI creates the script using IDE tools
|
|
155
|
+
4. export_script → Customaise validates and installs
|
|
156
|
+
5. reload_tab → re-inject the script
|
|
157
|
+
6. get_console_context → check for errors
|
|
158
|
+
7. take_screenshot → verify visual result (with element highlighting)
|
|
117
159
|
```
|
|
118
160
|
|
|
119
161
|
## File Sync
|
|
@@ -14,6 +14,7 @@ export declare class ExtensionBridge {
|
|
|
14
14
|
private pending;
|
|
15
15
|
private port;
|
|
16
16
|
private requestTimeoutMs;
|
|
17
|
+
private pushHandler;
|
|
17
18
|
constructor(port?: number, requestTimeoutMs?: number);
|
|
18
19
|
/**
|
|
19
20
|
* Start the WebSocket server and begin listening for the extension client.
|
|
@@ -28,6 +29,11 @@ export declare class ExtensionBridge {
|
|
|
28
29
|
* Whether the extension is currently connected.
|
|
29
30
|
*/
|
|
30
31
|
get isConnected(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Register a handler for push messages from the extension.
|
|
34
|
+
* Push messages have a `type` field but no matching pending request.
|
|
35
|
+
*/
|
|
36
|
+
onPush(handler: (type: string, data: any) => void): void;
|
|
31
37
|
/**
|
|
32
38
|
* Close the WebSocket server and all connections.
|
|
33
39
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-bridge.d.ts","sourceRoot":"","sources":["../src/extension-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA0BH,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,eAAe,CAA0B;IACjD,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,gBAAgB,CAAS;
|
|
1
|
+
{"version":3,"file":"extension-bridge.d.ts","sourceRoot":"","sources":["../src/extension-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA0BH,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,eAAe,CAA0B;IACjD,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAoD;gBAE3D,IAAI,SAAO,EAAE,gBAAgB,SAAS;IAKlD;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8CtB;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBjF;;OAEG;IACH,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIxD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,IAAI;CAGb"}
|
package/dist/extension-bridge.js
CHANGED
|
@@ -16,6 +16,7 @@ export class ExtensionBridge {
|
|
|
16
16
|
pending = new Map();
|
|
17
17
|
port;
|
|
18
18
|
requestTimeoutMs;
|
|
19
|
+
pushHandler = null;
|
|
19
20
|
constructor(port = 4050, requestTimeoutMs = 30_000) {
|
|
20
21
|
this.port = port;
|
|
21
22
|
this.requestTimeoutMs = requestTimeoutMs;
|
|
@@ -87,6 +88,13 @@ export class ExtensionBridge {
|
|
|
87
88
|
get isConnected() {
|
|
88
89
|
return this.extensionSocket !== null && this.extensionSocket.readyState === WebSocket.OPEN;
|
|
89
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Register a handler for push messages from the extension.
|
|
93
|
+
* Push messages have a `type` field but no matching pending request.
|
|
94
|
+
*/
|
|
95
|
+
onPush(handler) {
|
|
96
|
+
this.pushHandler = handler;
|
|
97
|
+
}
|
|
90
98
|
/**
|
|
91
99
|
* Close the WebSocket server and all connections.
|
|
92
100
|
*/
|
|
@@ -119,7 +127,13 @@ export class ExtensionBridge {
|
|
|
119
127
|
_handleResponse(message) {
|
|
120
128
|
const pending = this.pending.get(message.id);
|
|
121
129
|
if (!pending) {
|
|
122
|
-
this
|
|
130
|
+
// Check if this is a push message from the extension
|
|
131
|
+
if (message.type && this.pushHandler) {
|
|
132
|
+
this.pushHandler(message.type, message.data || {});
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
this._log(`Received response for unknown request id: ${message.id}`);
|
|
136
|
+
}
|
|
123
137
|
return;
|
|
124
138
|
}
|
|
125
139
|
this.pending.delete(message.id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-bridge.js","sourceRoot":"","sources":["../src/extension-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAuBzC,MAAM,OAAO,eAAe;IAClB,GAAG,GAA2B,IAAI,CAAC;IACnC,eAAe,GAAqB,IAAI,CAAC;IACzC,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,IAAI,CAAS;IACb,gBAAgB,CAAS;
|
|
1
|
+
{"version":3,"file":"extension-bridge.js","sourceRoot":"","sources":["../src/extension-bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -19,6 +19,101 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
|
19
19
|
import { registerTools, registerPromptsAndResources } from './server.js';
|
|
20
20
|
import { ExtensionBridge } from './extension-bridge.js';
|
|
21
21
|
import { FileWatcher } from './file-watcher.js';
|
|
22
|
+
// ─── Server Instructions ─────────────────────────────────────────────────────
|
|
23
|
+
// Sent to AI agents during the MCP initialize handshake.
|
|
24
|
+
// Modelled after the persona narratives in specialist-roster.js:
|
|
25
|
+
// # Role → # Mission → # Foundations → # Workflow → # Tooling → # Output
|
|
26
|
+
const SERVER_INSTRUCTIONS = `
|
|
27
|
+
# Role
|
|
28
|
+
- You are a Script Engineer working with Customaise, a Chrome extension that manages userscripts.
|
|
29
|
+
- You create, edit, and debug userscripts that run on web pages matching specified URL patterns.
|
|
30
|
+
- Customaise uses **symbol-level editing** (function-by-function), so script architecture matters more than in typical userscript managers.
|
|
31
|
+
|
|
32
|
+
# Mission
|
|
33
|
+
- Build resilient, maintainable userscripts that are fully compatible with Customaise's symbol-level editing engine.
|
|
34
|
+
- Every script you produce must be immediately editable at the function level—no monolithic code, no anonymous closures, no inline logic.
|
|
35
|
+
|
|
36
|
+
# Foundations
|
|
37
|
+
- **Symbol-Driven Architecture (CRITICAL):** Every userscript MUST be wrapped in an IIFE containing explicit, named top-level functions. Each distinct behavior must be its own named function. Customaise's editing engine indexes these symbols and allows users to modify them individually.
|
|
38
|
+
- **Correct structure (complete example):**
|
|
39
|
+
\`\`\`js
|
|
40
|
+
// ==UserScript==
|
|
41
|
+
// @name My Script
|
|
42
|
+
// @namespace https://customaise.com
|
|
43
|
+
// @description Enhances the page
|
|
44
|
+
// @match https://example.com/*
|
|
45
|
+
// @version 1.0
|
|
46
|
+
// @grant GM_log
|
|
47
|
+
// @grant GM_addStyle
|
|
48
|
+
// @run-at document-idle
|
|
49
|
+
// ==/UserScript==
|
|
50
|
+
|
|
51
|
+
(function() {
|
|
52
|
+
'use strict';
|
|
53
|
+
function init() { GM_log('Script loaded'); applyStyles(); }
|
|
54
|
+
function applyStyles() { GM_addStyle(\`body { background: #111; }\`); }
|
|
55
|
+
init();
|
|
56
|
+
})();
|
|
57
|
+
\`\`\`
|
|
58
|
+
- **Incorrect structure (breaks symbol editing):**
|
|
59
|
+
\`\`\`js
|
|
60
|
+
(function() {
|
|
61
|
+
document.querySelector('.ad').remove();
|
|
62
|
+
document.body.style.background = '#000';
|
|
63
|
+
})();
|
|
64
|
+
\`\`\`
|
|
65
|
+
- **Metadata:** Always include a complete metadata block with \`@name\`, \`@namespace\`, \`@match\`, \`@description\`, \`@version\`, and \`@grant\` directives. Use \`// @namespace https://customaise.com\` as the namespace.
|
|
66
|
+
- **Runtime Environment:** Scripts execute inside the browser sandbox. Do not use Node.js globals (\`process\`, \`require\`, \`module.exports\`, \`__dirname\`). Use GM_* APIs for cross-origin requests, storage, and notifications.
|
|
67
|
+
- **Deterministic Entry Point:** Declare an \`async function main()\` (or \`init()\`) and invoke it once at the bottom. Keep the entry point minimal—delegate to named helper functions.
|
|
68
|
+
- **Observability:** Always emit \`GM_log\` breadcrumbs so the user can trace script behavior via Customaise's console. Use \`GM_info.script.name\` to namespace log messages.
|
|
69
|
+
|
|
70
|
+
# Workflow
|
|
71
|
+
1. **Understand the page:** Use \`get_page_context\` to inspect the target page's DOM structure, visible elements, and \`dom_*\` IDs.
|
|
72
|
+
2. **Write the script:** Create a \`.user.js\` file in the workspace directory (e.g., \`./customaise-scripts/\`). Never use \`/tmp\` or temporary directories.
|
|
73
|
+
3. **Install:** Use \`export_script\` to push the script into Customaise. It validates through a sanitization pipeline (syntax checking, AST validation, security analysis) and returns diagnostics if anything fails.
|
|
74
|
+
4. **Test:** Use \`reload_tab\` to re-inject the updated script, then \`get_console_context\` to check for errors or \`GM_log\` output.
|
|
75
|
+
5. **Iterate:** If there are issues, fix the file and re-export. The validation pipeline will catch structural problems.
|
|
76
|
+
|
|
77
|
+
# Tooling
|
|
78
|
+
- **VM_findElement (Bulletproof DOM Targeting):** Customaise provides \`VM_findElement\`—a multi-tier selector API that survives UI redesigns and dynamic class changes. Declare \`@grant VM_findElement\`, then call \`await VM_findElement('dom_xxx')\` with a \`dom_*\` ID from \`get_page_context\`. Never invent \`dom_*\` IDs. For cross-origin iframes, use \`VM_findExternalElement\` with \`@connect\` for the iframe domain.
|
|
79
|
+
- **GM_* APIs:** Customaise supports 22 GM_* APIs (storage, networking, UI, clipboard, tabs). Use either \`GM_*\` (underscore) or \`GM.*\` (promise-based) syntax. Key APIs:
|
|
80
|
+
- \`GM_log(msg)\` — Log to Customaise console (visible via \`get_console_context\`)
|
|
81
|
+
- \`GM_addStyle(css)\` — Inject CSS into the page
|
|
82
|
+
- \`GM_xmlhttpRequest(details)\` — Cross-origin HTTP requests (requires \`@connect\` directive)
|
|
83
|
+
- \`GM_setValue/getValue\` — Persistent storage across page reloads
|
|
84
|
+
- \`GM_notification(details)\` — Desktop notifications
|
|
85
|
+
- \`GM_registerMenuCommand(name, fn)\` — Extension menu commands
|
|
86
|
+
- **Grants:** Every GM_* or VM_* API requires a corresponding \`@grant\` directive in the metadata block. Check that grants match actual API usage.
|
|
87
|
+
- **Cross-Origin Requests:** If the script fetches from \`api.github.com\`, include \`// @connect api.github.com\` or \`GM_xmlhttpRequest\` will fail silently.
|
|
88
|
+
- **Dynamic Pages:** Most modern sites are SPAs. Elements may not exist immediately. Use \`VM_findElement\`, \`MutationObserver\`, or \`@run-at document-idle\` (the safest default).
|
|
89
|
+
|
|
90
|
+
# Output
|
|
91
|
+
- A complete \`.user.js\` file with proper metadata block and symbol-friendly IIFE structure.
|
|
92
|
+
- The script should pass Customaise's sanitization pipeline without errors on first export.
|
|
93
|
+
- Read the \`customaise://conventions\` resource for the full API reference, including all 22 GM_* APIs, metadata directives, and advanced patterns.
|
|
94
|
+
|
|
95
|
+
# Shared / Subscribed Scripts
|
|
96
|
+
- Some scripts in \`list_scripts\` have \`isShared: true\`. These are **read-only subscriptions** from other users via Customaise's Cloud Script Sharing.
|
|
97
|
+
- You **cannot** import, export, edit, or delete shared scripts via MCP. Attempting to do so will return an error.
|
|
98
|
+
- If the user wants to modify a shared script, instruct them to open the Customaise extension and use **"Unlock & Fork"** to create an independent, editable copy. Then work with the forked copy.
|
|
99
|
+
- \`sync_scripts\` automatically excludes shared scripts from the export.
|
|
100
|
+
|
|
101
|
+
# User Selections & DOM Targeting
|
|
102
|
+
When a user asks you to modify, hide, style, or interact with specific page elements:
|
|
103
|
+
1. **Check for existing selections** by calling \`get_selected_elements\` — the user may have already selected targets.
|
|
104
|
+
2. **Check the workspace** for \`.dom.md\` and \`.screenshot.png\` files in \`.customaise/dom-context/<script-name>/\` — these are auto-pushed in real-time when the user selects elements while MCP is connected.
|
|
105
|
+
3. If selections exist, use the \`domId\` values with \`VM_findElement\` for bulletproof targeting.
|
|
106
|
+
4. Read the user's comment on each selection — it describes exactly what they want done.
|
|
107
|
+
5. If no selections exist, **guide the user step by step** to select elements:
|
|
108
|
+
a. Open Chrome and navigate to the target page
|
|
109
|
+
b. Click the Customaise extension icon in the toolbar (or press **Alt+Shift+C**) to open the UI
|
|
110
|
+
c. Go to **"MCP Tools"** and click on the script they're working with
|
|
111
|
+
d. Click the **"DOM Selections"** card — it has a **green crosshair icon**
|
|
112
|
+
e. Click **"Select Element"** (or the **+** button) — this activates the DOM selector overlay
|
|
113
|
+
f. Click on the element(s) they want to target — each click captures the element with a screenshot
|
|
114
|
+
g. When done, come back to the IDE — \`.dom.md\` and \`.screenshot.png\` files will already be in the workspace
|
|
115
|
+
6. If no selections exist, fall back to \`get_page_context\` and standard CSS/\`dom_*\` selectors.
|
|
116
|
+
`.trim();
|
|
22
117
|
const WS_PORT = Number(process.env.CUSTOMAISE_WS_PORT || process.env.VIBEMONKEY_WS_PORT) || 4050;
|
|
23
118
|
async function main() {
|
|
24
119
|
// 1. Start the WebSocket server for the extension to connect to
|
|
@@ -27,8 +122,9 @@ async function main() {
|
|
|
27
122
|
// 2. Create the MCP server
|
|
28
123
|
const server = new McpServer({
|
|
29
124
|
name: 'customaise',
|
|
30
|
-
version: '1.0.
|
|
125
|
+
version: '1.0.3'
|
|
31
126
|
}, {
|
|
127
|
+
instructions: SERVER_INSTRUCTIONS,
|
|
32
128
|
capabilities: {
|
|
33
129
|
tools: {},
|
|
34
130
|
prompts: {},
|
|
@@ -40,7 +136,7 @@ async function main() {
|
|
|
40
136
|
// 4. Register tools, prompts, and resources
|
|
41
137
|
registerTools(server, bridge, fileWatcher);
|
|
42
138
|
registerPromptsAndResources(server, bridge);
|
|
43
|
-
//
|
|
139
|
+
// 5. Connect via stdio transport (AI agent communicates over stdin/stdout)
|
|
44
140
|
const transport = new StdioServerTransport();
|
|
45
141
|
await server.connect(transport);
|
|
46
142
|
process.stderr.write('[customaise-mcp] MCP server running (stdio + WebSocket)\n');
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC;AAEjG,KAAK,UAAU,IAAI;IACjB,gEAAgE;IAChE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAErB,2BAA2B;IAC3B,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,EAAE;SACd;KACF,CACF,CAAC;IAEF,sDAAsD;IACtD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IAE5C,4CAA4C;IAC5C,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3C,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE5C,2EAA2E;IAC3E,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAElF,oBAAoB;IACpB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC5D,WAAW,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,gFAAgF;AAChF,yDAAyD;AACzD,iEAAiE;AACjE,2EAA2E;AAC3E,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0F3B,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC;AAEjG,KAAK,UAAU,IAAI;IACjB,gEAAgE;IAChE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAErB,2BAA2B;IAC3B,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE,mBAAmB;QACjC,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,EAAE;SACd;KACF,CACF,CAAC;IAEF,sDAAsD;IACtD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IAE5C,4CAA4C;IAC5C,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3C,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE5C,2EAA2E;IAC3E,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAElF,oBAAoB;IACpB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC5D,WAAW,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAyBtF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAsmBzG;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAyJ5F"}
|
package/dist/server.js
CHANGED
|
@@ -2,13 +2,31 @@ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
4
4
|
import { dirname, join } from 'node:path';
|
|
5
|
-
import { tmpdir } from 'node:os';
|
|
5
|
+
import { tmpdir, homedir } from 'node:os';
|
|
6
|
+
/**
|
|
7
|
+
* Resolve a writable workspace directory for context files.
|
|
8
|
+
* - Cursor/Windsurf: cwd is the project root (ideal)
|
|
9
|
+
* - Claude Desktop: cwd is homedir (fine)
|
|
10
|
+
* - Antigravity: cwd is '/' → falls back to homedir
|
|
11
|
+
*/
|
|
12
|
+
function getWorkspaceDir() {
|
|
13
|
+
// Escape hatch for edge cases
|
|
14
|
+
const envWorkspace = process.env.CUSTOMAISE_WORKSPACE;
|
|
15
|
+
if (envWorkspace && envWorkspace !== '/' && envWorkspace !== '') {
|
|
16
|
+
return envWorkspace;
|
|
17
|
+
}
|
|
18
|
+
const cwd = process.cwd();
|
|
19
|
+
if (cwd === '/' || cwd === '') {
|
|
20
|
+
return homedir();
|
|
21
|
+
}
|
|
22
|
+
return cwd;
|
|
23
|
+
}
|
|
6
24
|
/**
|
|
7
25
|
* Register all MCP tools with the server.
|
|
8
26
|
*/
|
|
9
27
|
export function registerTools(server, bridge, fileWatcher) {
|
|
10
28
|
// ─── Script Lifecycle ───────────────────────────────────────────────
|
|
11
|
-
server.tool('list_scripts', 'List all userscripts
|
|
29
|
+
server.tool('list_scripts', 'List all userscripts installed in Customaise with their IDs, names, enabled status, match patterns, and whether they are shared (subscribed). Scripts marked isShared are read-only subscriptions — they cannot be imported, exported, edited, or deleted via MCP. To modify a shared script, the user must fork it from the extension UI.', {}, async () => {
|
|
12
30
|
const result = await bridge.request('list_scripts', {});
|
|
13
31
|
return {
|
|
14
32
|
content: [{
|
|
@@ -17,9 +35,9 @@ export function registerTools(server, bridge, fileWatcher) {
|
|
|
17
35
|
}]
|
|
18
36
|
};
|
|
19
37
|
});
|
|
20
|
-
server.tool('import_script', 'Import an existing userscript from Customaise to a local file for editing. The file will include the full source code with metadata block. After editing the file with your IDE tools, use export_script to push changes back to Customaise.', {
|
|
38
|
+
server.tool('import_script', 'Import an existing userscript from Customaise to a local file for editing. The file will include the full source code with metadata block. After editing the file with your IDE tools, use export_script to push changes back to Customaise. NOTE: Shared/subscribed scripts cannot be imported — they are read-only. The user must fork them from the extension UI first. IMPORTANT: Save files inside your current workspace or project directory (e.g., ./customaise-scripts/), never in /tmp.', {
|
|
21
39
|
scriptId: z.string().describe('The ID of the script to import (get from list_scripts)'),
|
|
22
|
-
filePath: z.string().describe('Local file path to write the script to (e.g., ./scripts/my-script.user.js)')
|
|
40
|
+
filePath: z.string().describe('Local file path inside your workspace to write the script to (e.g., ./customaise-scripts/my-script.user.js). Do NOT use /tmp.')
|
|
23
41
|
}, async ({ scriptId, filePath }) => {
|
|
24
42
|
const result = await bridge.request('import_script', { scriptId });
|
|
25
43
|
// Ensure directory exists and write file
|
|
@@ -38,7 +56,9 @@ export function registerTools(server, bridge, fileWatcher) {
|
|
|
38
56
|
}]
|
|
39
57
|
};
|
|
40
58
|
});
|
|
41
|
-
server.tool('export_script',
|
|
59
|
+
server.tool('export_script', `Export a userscript from a local file into Customaise. The file will be validated through Customaise's sanitization pipeline (syntax checking, AST validation, security analysis). If valid, the script is installed and ready to execute on matching pages. If invalid, detailed diagnostics explain exactly what to fix. Pass scriptId to update an existing script instead of creating a new one. NOTE: You cannot overwrite a shared/subscribed script — they are read-only.
|
|
60
|
+
|
|
61
|
+
Reminder: Scripts must use an IIFE with named functions for symbol-level editing, \`// @namespace https://customaise.com\`, and include @name, @match, @description, @version, and @grant directives.`, {
|
|
42
62
|
filePath: z.string().describe('Local file path containing the userscript source code'),
|
|
43
63
|
scriptId: z.string().optional().describe('ID of an existing script to update. Omit to create a new script.')
|
|
44
64
|
}, async ({ filePath, scriptId }) => {
|
|
@@ -51,7 +71,7 @@ export function registerTools(server, bridge, fileWatcher) {
|
|
|
51
71
|
}]
|
|
52
72
|
};
|
|
53
73
|
});
|
|
54
|
-
server.tool('delete_script', 'Permanently delete a userscript from Customaise. This action cannot be undone.', {
|
|
74
|
+
server.tool('delete_script', 'Permanently delete a userscript from Customaise. This action cannot be undone. NOTE: Shared/subscribed scripts cannot be deleted via MCP — the user must unsubscribe from the extension UI.', {
|
|
55
75
|
scriptId: z.string().describe('The ID of the script to delete')
|
|
56
76
|
}, async ({ scriptId }) => {
|
|
57
77
|
const result = await bridge.request('delete_script', { scriptId });
|
|
@@ -75,49 +95,94 @@ export function registerTools(server, bridge, fileWatcher) {
|
|
|
75
95
|
};
|
|
76
96
|
});
|
|
77
97
|
// ─── Browser Context ────────────────────────────────────────────────
|
|
78
|
-
|
|
98
|
+
// These tools write full data to workspace files and return lightweight
|
|
99
|
+
// summaries. This prevents huge DOM snapshots or console logs from
|
|
100
|
+
// bloating the AI agent's context window. Files are overwritten on
|
|
101
|
+
// each call so the agent always has the freshest snapshot.
|
|
102
|
+
server.tool('get_page_context', 'Get a DOM snapshot of the current page including URL, title, page structure, and visible elements. Use this to understand the page layout before writing userscripts that manipulate it. The full DOM snapshot is saved to .customaise/page-context.json in your workspace — use view_file or grep_search to read only what you need.', {
|
|
79
103
|
tabId: z.number().optional().describe('Tab ID to inspect. Defaults to the active tab.')
|
|
80
104
|
}, async ({ tabId }) => {
|
|
81
105
|
const result = await bridge.request('get_page_context', { tabId });
|
|
106
|
+
// Strip fields that are only for the extension's internal chat UI
|
|
107
|
+
delete result.displayContent;
|
|
108
|
+
delete result.tokenEstimate;
|
|
109
|
+
// Write full context to workspace file (overwrite each time)
|
|
110
|
+
const contextDir = join(getWorkspaceDir(), '.customaise');
|
|
111
|
+
mkdirSync(contextDir, { recursive: true });
|
|
112
|
+
const filePath = join(contextDir, 'page-context.json');
|
|
113
|
+
const fullJson = JSON.stringify(result, null, 2);
|
|
114
|
+
writeFileSync(filePath, fullJson, 'utf-8');
|
|
115
|
+
// Build lightweight summary for the agent's context window
|
|
116
|
+
const url = result.url || '';
|
|
117
|
+
const title = result.title || '';
|
|
118
|
+
const elementCount = result.dom?.elementCount
|
|
119
|
+
?? result.elementCount
|
|
120
|
+
?? (typeof result.dom === 'object' ? JSON.stringify(result.dom).length : 0);
|
|
121
|
+
const fileSizeKB = (Buffer.byteLength(fullJson, 'utf-8') / 1024).toFixed(1);
|
|
82
122
|
return {
|
|
83
123
|
content: [{
|
|
84
124
|
type: 'text',
|
|
85
|
-
text: JSON.stringify(
|
|
125
|
+
text: JSON.stringify({
|
|
126
|
+
url,
|
|
127
|
+
title,
|
|
128
|
+
filePath,
|
|
129
|
+
fileSizeKB: `${fileSizeKB} KB`,
|
|
130
|
+
elementCount,
|
|
131
|
+
hint: 'Full DOM snapshot saved to the file above. Use view_file or grep_search to inspect specific elements, selectors, or text content without loading the entire snapshot.'
|
|
132
|
+
}, null, 2)
|
|
86
133
|
}]
|
|
87
134
|
};
|
|
88
135
|
});
|
|
89
|
-
server.tool('get_console_context', 'Get console logs from the browser, including errors, warnings, and userscript GM_log output. Use after reload_tab to check for script runtime errors.
|
|
136
|
+
server.tool('get_console_context', 'Get console logs from the browser, including errors, warnings, and userscript GM_log output. Use after reload_tab to check for script runtime errors. The full log data is saved to .customaise/console-context.json in your workspace — use view_file or grep_search to read only what you need.', {
|
|
90
137
|
tabId: z.number().optional().describe('Tab ID to get logs from. Defaults to the active tab.'),
|
|
91
138
|
level: z.enum(['all', 'error', 'warn', 'info', 'debug']).optional().describe('Filter by log level. Default: all')
|
|
92
139
|
}, async ({ tabId, level }) => {
|
|
93
140
|
const result = await bridge.request('get_console_context', { tabId });
|
|
94
|
-
//
|
|
95
|
-
|
|
141
|
+
// Strip fields that are only for the extension's internal chat UI
|
|
142
|
+
delete result.displayContent;
|
|
143
|
+
delete result.tokenEstimate;
|
|
144
|
+
// Apply level filter client-side before saving
|
|
145
|
+
let dataToSave = result;
|
|
96
146
|
if (level && level !== 'all') {
|
|
97
|
-
|
|
147
|
+
dataToSave = { ...result };
|
|
98
148
|
if (level === 'error') {
|
|
99
|
-
delete
|
|
100
|
-
delete
|
|
149
|
+
delete dataToSave.warnings;
|
|
150
|
+
delete dataToSave.userscriptLogs;
|
|
101
151
|
}
|
|
102
152
|
else if (level === 'warn') {
|
|
103
|
-
delete
|
|
104
|
-
delete
|
|
153
|
+
delete dataToSave.errors;
|
|
154
|
+
delete dataToSave.userscriptLogs;
|
|
105
155
|
}
|
|
106
156
|
else if (level === 'info' || level === 'debug') {
|
|
107
|
-
delete
|
|
108
|
-
delete
|
|
157
|
+
delete dataToSave.errors;
|
|
158
|
+
delete dataToSave.warnings;
|
|
109
159
|
}
|
|
110
|
-
return {
|
|
111
|
-
content: [{
|
|
112
|
-
type: 'text',
|
|
113
|
-
text: JSON.stringify(filtered, null, 2)
|
|
114
|
-
}]
|
|
115
|
-
};
|
|
116
160
|
}
|
|
161
|
+
// Write full logs to workspace file (overwrite each time)
|
|
162
|
+
const contextDir = join(getWorkspaceDir(), '.customaise');
|
|
163
|
+
mkdirSync(contextDir, { recursive: true });
|
|
164
|
+
const filePath = join(contextDir, 'console-context.json');
|
|
165
|
+
const fullJson = JSON.stringify(dataToSave, null, 2);
|
|
166
|
+
writeFileSync(filePath, fullJson, 'utf-8');
|
|
167
|
+
// Build lightweight summary for the agent's context window
|
|
168
|
+
const errorCount = Array.isArray(result.errors) ? result.errors.length : 0;
|
|
169
|
+
const warnCount = Array.isArray(result.warnings) ? result.warnings.length : 0;
|
|
170
|
+
const gmLogCount = Array.isArray(result.userscriptLogs) ? result.userscriptLogs.length : 0;
|
|
171
|
+
const fileSizeKB = (Buffer.byteLength(fullJson, 'utf-8') / 1024).toFixed(1);
|
|
117
172
|
return {
|
|
118
173
|
content: [{
|
|
119
174
|
type: 'text',
|
|
120
|
-
text: JSON.stringify(
|
|
175
|
+
text: JSON.stringify({
|
|
176
|
+
filePath,
|
|
177
|
+
fileSizeKB: `${fileSizeKB} KB`,
|
|
178
|
+
counts: {
|
|
179
|
+
errors: errorCount,
|
|
180
|
+
warnings: warnCount,
|
|
181
|
+
userscriptLogs: gmLogCount,
|
|
182
|
+
levelFilter: level || 'all'
|
|
183
|
+
},
|
|
184
|
+
hint: 'Full console logs saved to the file above. Use view_file or grep_search to inspect specific errors, warnings, or GM_log output without loading all logs.'
|
|
185
|
+
}, null, 2)
|
|
121
186
|
}]
|
|
122
187
|
};
|
|
123
188
|
});
|
|
@@ -176,7 +241,7 @@ export function registerTools(server, bridge, fileWatcher) {
|
|
|
176
241
|
};
|
|
177
242
|
});
|
|
178
243
|
// ─── File Sync ──────────────────────────────────────────────────────
|
|
179
|
-
server.tool('sync_scripts', 'Bulk export all scripts from Customaise to a local directory as individual .user.js files. Creates a .customaise-manifest.json mapping filenames to script IDs. Use this to set up a local workspace for editing scripts with your IDE.', {
|
|
244
|
+
server.tool('sync_scripts', 'Bulk export all your own scripts from Customaise to a local directory as individual .user.js files. Creates a .customaise-manifest.json mapping filenames to script IDs. Shared/subscribed scripts are excluded (they are read-only). Use this to set up a local workspace for editing scripts with your IDE.', {
|
|
180
245
|
directory: z.string().describe('Local directory to export scripts to (e.g., ./customaise-scripts/)')
|
|
181
246
|
}, async ({ directory }) => {
|
|
182
247
|
// Get all scripts with code
|
|
@@ -227,6 +292,214 @@ export function registerTools(server, bridge, fileWatcher) {
|
|
|
227
292
|
}]
|
|
228
293
|
};
|
|
229
294
|
});
|
|
295
|
+
// ─── DOM Selection Bridge ──────────────────────────────────────────
|
|
296
|
+
server.tool('get_selected_elements', 'Get DOM elements that the user has visually selected in the browser for a specific script. Returns each selection\'s bulletproof selectors, element context, and user comments. Use VM_findElement with the domId for precise targeting in scripts. When MCP is connected, .dom.md context files and screenshots are automatically pushed to the workspace (.customaise/dom-context/<script-name>/) in real-time as the user selects elements. Use this tool to retrieve selections if the auto-pushed files are missing or to get the raw JSON data.', {
|
|
297
|
+
scriptId: z.string().optional().describe('Script ID to get selections for. Omit to get all scripts\' selections.'),
|
|
298
|
+
writeFiles: z.boolean().optional().describe('If true, writes .dom.md context files to the workspace directory. Default: false.'),
|
|
299
|
+
directory: z.string().optional().describe('Workspace directory for .dom.md files. Required if writeFiles is true.')
|
|
300
|
+
}, async ({ scriptId, writeFiles, directory }) => {
|
|
301
|
+
const result = await bridge.request('get_selected_elements', { scriptId });
|
|
302
|
+
// Optionally write .dom.md files to workspace
|
|
303
|
+
if (writeFiles && directory) {
|
|
304
|
+
const selections = scriptId
|
|
305
|
+
? [{ scriptId: result.scriptId, scriptName: result.scriptName, selections: result.selections }]
|
|
306
|
+
: (result.scripts || []);
|
|
307
|
+
for (const script of selections) {
|
|
308
|
+
if (!script.selections || script.selections.length === 0)
|
|
309
|
+
continue;
|
|
310
|
+
const safeName = (script.scriptName || 'unknown')
|
|
311
|
+
.toLowerCase()
|
|
312
|
+
.replace(/[^a-z0-9_-]/g, '-')
|
|
313
|
+
.replace(/-+/g, '-')
|
|
314
|
+
.replace(/^-|-$/g, '') || 'script';
|
|
315
|
+
// Normalize: strip trailing .customaise/dom-context if caller already included it
|
|
316
|
+
let baseDir = directory;
|
|
317
|
+
if (baseDir.replace(/\/+$/, '').endsWith('.customaise/dom-context')) {
|
|
318
|
+
baseDir = baseDir.replace(/\/?\.customaise\/dom-context\/?$/, '');
|
|
319
|
+
}
|
|
320
|
+
const scriptDir = join(baseDir, '.customaise', 'dom-context', safeName);
|
|
321
|
+
mkdirSync(scriptDir, { recursive: true });
|
|
322
|
+
const manifest = {};
|
|
323
|
+
const usedNames = new Set();
|
|
324
|
+
for (const sel of script.selections) {
|
|
325
|
+
// Generate safe filename from display name, with collision prevention
|
|
326
|
+
let safeElName = (sel.displayName || sel.tagName || 'element')
|
|
327
|
+
.toLowerCase()
|
|
328
|
+
.replace(/[^a-z0-9_-]/g, '-')
|
|
329
|
+
.replace(/-+/g, '-')
|
|
330
|
+
.replace(/^-|-$/g, '') || 'element';
|
|
331
|
+
// Deduplicate filenames: append counter if collision
|
|
332
|
+
if (usedNames.has(safeElName)) {
|
|
333
|
+
let counter = 2;
|
|
334
|
+
while (usedNames.has(`${safeElName}-${counter}`))
|
|
335
|
+
counter++;
|
|
336
|
+
safeElName = `${safeElName}-${counter}`;
|
|
337
|
+
}
|
|
338
|
+
usedNames.add(safeElName);
|
|
339
|
+
// Helper to safely quote YAML values
|
|
340
|
+
const yq = (val) => `"${(val || '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`;
|
|
341
|
+
// Write .dom.md with YAML frontmatter (all values defensively quoted)
|
|
342
|
+
// Helper: render a YAML list of selectors, skipping empty tiers
|
|
343
|
+
const bp = sel.bulletproofSelectors || {};
|
|
344
|
+
const tierLines = [];
|
|
345
|
+
tierLines.push(` tier1_stableId: ${bp.tier1_stableId ? yq(bp.tier1_stableId) : 'null'}`);
|
|
346
|
+
const tierArrays = [
|
|
347
|
+
['tier2_dataAttributes', bp.tier2_dataAttributes || []],
|
|
348
|
+
['tier3_ariaLabels', bp.tier3_ariaLabels || []],
|
|
349
|
+
['tier4_semanticClasses', bp.tier4_semanticClasses || []],
|
|
350
|
+
['tier5_structuralPositioning', bp.tier5_structuralPositioning || []],
|
|
351
|
+
['tier6_structuralXPath', bp.tier6_structuralXPath || []],
|
|
352
|
+
['tier7_structural', bp.tier7_structural || []],
|
|
353
|
+
];
|
|
354
|
+
for (const [name, arr] of tierArrays) {
|
|
355
|
+
if (arr.length > 0) {
|
|
356
|
+
tierLines.push(` ${name}:`);
|
|
357
|
+
for (const item of arr)
|
|
358
|
+
tierLines.push(` - ${yq(item)}`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (bp.textContentHash)
|
|
362
|
+
tierLines.push(` textContentHash: ${yq(bp.textContentHash)}`);
|
|
363
|
+
if (bp.structuralFingerprint)
|
|
364
|
+
tierLines.push(` structuralFingerprint: ${yq(bp.structuralFingerprint)}`);
|
|
365
|
+
// Capture screenshot FIRST so we know whether to include the link in dom.md
|
|
366
|
+
// When captureScreenshots is true, ALWAYS use capture_element_screenshot
|
|
367
|
+
// which highlights the element, scrolls into view, and takes a fresh capture.
|
|
368
|
+
// The pre-stored sel.screenshot is just a generic full-tab capture from
|
|
369
|
+
// selection time — it doesn't show highlights or scroll to off-screen elements.
|
|
370
|
+
// Use pre-stored screenshot if available (captured at selection time)
|
|
371
|
+
let hasScreenshot = false;
|
|
372
|
+
if (sel.screenshot) {
|
|
373
|
+
try {
|
|
374
|
+
const imgBuffer = Buffer.from(sel.screenshot, 'base64');
|
|
375
|
+
writeFileSync(join(scriptDir, `${safeElName}.screenshot.png`), imgBuffer);
|
|
376
|
+
hasScreenshot = true;
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
// Non-fatal
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
const domMd = [
|
|
383
|
+
'---',
|
|
384
|
+
`domId: ${yq(sel.domId)}`,
|
|
385
|
+
`displayName: ${yq(sel.displayName || '')}`,
|
|
386
|
+
`tagName: ${yq(sel.tagName)}`,
|
|
387
|
+
`cssPath: ${yq(sel.cssPath || '')}`,
|
|
388
|
+
`textPreview: ${yq((sel.textPreview || '').slice(0, 200))}`,
|
|
389
|
+
`role: ${yq(sel.semantics?.role || 'unknown')}`,
|
|
390
|
+
`purpose: ${yq(sel.semantics?.purpose || 'unknown')}`,
|
|
391
|
+
`interactivity: ${sel.semantics?.interactivity || false}`,
|
|
392
|
+
`pageUrl: ${yq(sel.pageUrl)}`,
|
|
393
|
+
`pageTitle: ${yq(sel.pageTitle || '')}`,
|
|
394
|
+
`selectedAt: ${sel.selectedAt}`,
|
|
395
|
+
'bulletproofSelectors:',
|
|
396
|
+
...tierLines,
|
|
397
|
+
'---',
|
|
398
|
+
'',
|
|
399
|
+
`# ${sel.displayName || sel.tagName}`,
|
|
400
|
+
'',
|
|
401
|
+
sel.userComment ? `> ${sel.userComment.replace(/\n/g, '\n> ')}` : '> _No user comment provided._',
|
|
402
|
+
'',
|
|
403
|
+
hasScreenshot ? `` : '',
|
|
404
|
+
'',
|
|
405
|
+
'## VM_findElement Usage',
|
|
406
|
+
'```js',
|
|
407
|
+
`const element = await VM_findElement('${sel.domId}');`,
|
|
408
|
+
'```',
|
|
409
|
+
''
|
|
410
|
+
].filter(Boolean).join('\n');
|
|
411
|
+
writeFileSync(join(scriptDir, `${safeElName}.dom.md`), domMd, 'utf-8');
|
|
412
|
+
manifest[sel.domId] = {
|
|
413
|
+
file: `${safeElName}.dom.md`,
|
|
414
|
+
displayName: sel.displayName,
|
|
415
|
+
tagName: sel.tagName
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
// Write manifest
|
|
419
|
+
writeFileSync(join(scriptDir, '_manifest.json'), JSON.stringify({ scriptId: script.scriptId, scriptName: script.scriptName, elements: manifest }, null, 2), 'utf-8');
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return {
|
|
423
|
+
content: [{
|
|
424
|
+
type: 'text',
|
|
425
|
+
text: JSON.stringify(result, null, 2)
|
|
426
|
+
}]
|
|
427
|
+
};
|
|
428
|
+
});
|
|
429
|
+
// ─── Agent-Triggered DOM Selection ──────────────────────────────────
|
|
430
|
+
// ─── Push Handler: Real-time DOM Selection File Writes ─────────────
|
|
431
|
+
// When the user selects an element in the browser, the extension pushes
|
|
432
|
+
// the selection data + screenshot immediately. We write the files to
|
|
433
|
+
// the workspace directory (process.cwd()) so the IDE agent has them.
|
|
434
|
+
bridge.onPush((type, data) => {
|
|
435
|
+
if (type !== 'dom_selection_file')
|
|
436
|
+
return;
|
|
437
|
+
try {
|
|
438
|
+
const { scriptId, scriptName, selection, screenshot } = data || {};
|
|
439
|
+
if (!selection || !selection.domId) {
|
|
440
|
+
process.stderr.write(`[customaise-mcp] Push ignored: missing selection data\n`);
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
const baseDir = getWorkspaceDir();
|
|
444
|
+
const safeName = (scriptName || scriptId || 'unknown')
|
|
445
|
+
.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 60);
|
|
446
|
+
const scriptDir = join(baseDir, '.customaise', 'dom-context', safeName);
|
|
447
|
+
mkdirSync(scriptDir, { recursive: true });
|
|
448
|
+
const elName = (selection.displayName || selection.domId || 'element')
|
|
449
|
+
.replace(/[^a-zA-Z0-9_-]+/g, '_').replace(/^_|_$/g, '').slice(0, 40) || 'element';
|
|
450
|
+
const safeElName = `${elName}_${selection.domId?.slice(-8) || 'unknown'}`;
|
|
451
|
+
// Write screenshot
|
|
452
|
+
let hasScreenshot = false;
|
|
453
|
+
if (screenshot) {
|
|
454
|
+
try {
|
|
455
|
+
const imgBuffer = Buffer.from(screenshot, 'base64');
|
|
456
|
+
writeFileSync(join(scriptDir, `${safeElName}.screenshot.png`), imgBuffer);
|
|
457
|
+
hasScreenshot = true;
|
|
458
|
+
}
|
|
459
|
+
catch { /* non-fatal */ }
|
|
460
|
+
}
|
|
461
|
+
// Write dom.md
|
|
462
|
+
const yq = (s) => `"${(s || '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`;
|
|
463
|
+
const bp = selection.bulletproofSelectors || {};
|
|
464
|
+
const tierLines = [];
|
|
465
|
+
if (bp.tier1_stableId)
|
|
466
|
+
tierLines.push(` tier1_stableId: ${yq(bp.tier1_stableId)}`);
|
|
467
|
+
if (bp.tier2_dataAttributes?.length)
|
|
468
|
+
tierLines.push(` tier2_dataAttributes: [${bp.tier2_dataAttributes.map(yq).join(', ')}]`);
|
|
469
|
+
if (bp.tier3_ariaLabels?.length)
|
|
470
|
+
tierLines.push(` tier3_ariaLabels: [${bp.tier3_ariaLabels.map(yq).join(', ')}]`);
|
|
471
|
+
if (bp.tier4_semanticClasses?.length)
|
|
472
|
+
tierLines.push(` tier4_semanticClasses: [${bp.tier4_semanticClasses.map(yq).join(', ')}]`);
|
|
473
|
+
if (bp.tier5_structuralPositioning?.length)
|
|
474
|
+
tierLines.push(` tier5_structuralPositioning: [${bp.tier5_structuralPositioning.map(yq).join(', ')}]`);
|
|
475
|
+
if (bp.textContentHash)
|
|
476
|
+
tierLines.push(` textContentHash: ${yq(bp.textContentHash)}`);
|
|
477
|
+
if (bp.structuralFingerprint)
|
|
478
|
+
tierLines.push(` structuralFingerprint: ${yq(bp.structuralFingerprint)}`);
|
|
479
|
+
const domMd = [
|
|
480
|
+
'---',
|
|
481
|
+
`domId: ${yq(selection.domId)}`,
|
|
482
|
+
`displayName: ${yq(selection.displayName || '')}`,
|
|
483
|
+
`tagName: ${yq(selection.tagName)}`,
|
|
484
|
+
`cssPath: ${yq(selection.cssPath || '')}`,
|
|
485
|
+
`textPreview: ${yq((selection.textPreview || '').slice(0, 200))}`,
|
|
486
|
+
`pageUrl: ${yq(selection.pageUrl || '')}`,
|
|
487
|
+
`pageTitle: ${yq(selection.pageTitle || '')}`,
|
|
488
|
+
hasScreenshot ? `screenshot: "${safeElName}.screenshot.png"` : null,
|
|
489
|
+
'bulletproofSelectors:',
|
|
490
|
+
...tierLines,
|
|
491
|
+
'---',
|
|
492
|
+
'',
|
|
493
|
+
selection.userComment ? `> **User note:** ${selection.userComment}` : null,
|
|
494
|
+
'',
|
|
495
|
+
].filter(Boolean).join('\n');
|
|
496
|
+
writeFileSync(join(scriptDir, `${safeElName}.dom.md`), domMd, 'utf-8');
|
|
497
|
+
process.stderr.write(`[customaise-mcp] DOM selection file written: ${safeElName}.dom.md (screenshot: ${hasScreenshot})\n`);
|
|
498
|
+
}
|
|
499
|
+
catch (err) {
|
|
500
|
+
process.stderr.write(`[customaise-mcp] Push handler error: ${err?.message}\n`);
|
|
501
|
+
}
|
|
502
|
+
});
|
|
230
503
|
}
|
|
231
504
|
/**
|
|
232
505
|
* Register MCP Prompts and Resources.
|
|
@@ -250,21 +523,25 @@ export function registerPromptsAndResources(server, bridge) {
|
|
|
250
523
|
`**Goal:** ${goal}`,
|
|
251
524
|
``,
|
|
252
525
|
`## Requirements`,
|
|
253
|
-
`1. Include a proper metadata block with @name, @match, @description, @version, and @grant directives`,
|
|
254
|
-
`2. Use @
|
|
255
|
-
`3.
|
|
256
|
-
`4.
|
|
257
|
-
`5.
|
|
258
|
-
`6.
|
|
526
|
+
`1. Include a proper metadata block with @name, @namespace, @match, @description, @version, and @grant directives`,
|
|
527
|
+
`2. Use \`// @namespace https://customaise.com\``,
|
|
528
|
+
`3. Use @match ${targetUrl}`,
|
|
529
|
+
`4. CRITICAL: Wrap the script in an IIFE containing explicit, named top-level functions. Every distinct behavior MUST be a separate named function. Do NOT put logic inline. Customaise uses symbol-level editing (function-by-function) so this structure is mandatory.`,
|
|
530
|
+
`5. If making cross-origin requests, include the @connect directive`,
|
|
531
|
+
`6. Use GM_log for debug output (it appears in Customaise's console context)`,
|
|
532
|
+
`7. Handle edge cases (element not found, page still loading, etc.)`,
|
|
259
533
|
``,
|
|
260
534
|
`## Workflow`,
|
|
261
535
|
`1. Use \`get_page_context\` to understand the page structure`,
|
|
262
|
-
`2. Write the script code`,
|
|
536
|
+
`2. Write the script code to a file in the workspace directory (e.g., ./customaise-scripts/), NEVER to /tmp`,
|
|
263
537
|
`3. For targeting existing page elements, consider using \`VM_findElement\` with \`dom_*\` IDs from \`get_page_context\` for bulletproof selector resilience`,
|
|
264
538
|
`4. Use \`export_script\` to install it in Customaise (it will be validated through the sanitization pipeline)`,
|
|
265
539
|
`5. Use \`reload_tab\` to test it`,
|
|
266
540
|
`6. Use \`get_console_context\` to check for errors or GM_log output`,
|
|
267
541
|
`7. If there are issues, fix and re-export`,
|
|
542
|
+
``,
|
|
543
|
+
`## Reference`,
|
|
544
|
+
`Read the \`customaise://conventions\` resource for the full API reference (22 GM_* APIs, metadata directives, and advanced patterns).`,
|
|
268
545
|
].join('\n')
|
|
269
546
|
}
|
|
270
547
|
}
|
|
@@ -359,6 +636,7 @@ Every userscript is a single \`.user.js\` file with a metadata block at the top.
|
|
|
359
636
|
\`\`\`javascript
|
|
360
637
|
// ==UserScript==
|
|
361
638
|
// @name My Script
|
|
639
|
+
// @namespace https://customaise.com
|
|
362
640
|
// @description What this script does
|
|
363
641
|
// @match https://example.com/*
|
|
364
642
|
// @version 1.0
|
|
@@ -400,7 +678,7 @@ Every userscript is a single \`.user.js\` file with a metadata block at the top.
|
|
|
400
678
|
| \`@domId\` | Auto | Auto-managed by Customaise for \`VM_findElement\`. **Do not edit manually.** |
|
|
401
679
|
| \`@require\` | Optional | External JS libraries to load before the script |
|
|
402
680
|
| \`@resource\` | Optional | Named external resources (CSS, JSON, images) accessible via \`GM_getResourceText/URL\` |
|
|
403
|
-
| \`@namespace\` |
|
|
681
|
+
| \`@namespace\` | Recommended | Script namespace. Use \`https://customaise.com\`. |
|
|
404
682
|
| \`@author\` | Optional | Script author |
|
|
405
683
|
|
|
406
684
|
## VM_findElement (Bulletproof DOM Targeting)
|
package/dist/server.js.map
CHANGED
|
@@ -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,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@customaise/mcp",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "MCP server that connects AI coding agents (Cursor, Claude Code, Codex, Windsurf, Antigravity) to the Customaise Chrome extension for userscript management and browser automation.",
|
|
3
|
+
"version": "1.1.1",
|
|
4
|
+
"description": "MCP server that connects AI coding agents (Cursor, Claude Code, Codex, Windsurf, Kiro, Antigravity) to the Customaise Chrome extension for userscript management and browser automation.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -29,7 +29,9 @@
|
|
|
29
29
|
"cursor",
|
|
30
30
|
"claude",
|
|
31
31
|
"windsurf",
|
|
32
|
-
"codex"
|
|
32
|
+
"codex",
|
|
33
|
+
"kiro",
|
|
34
|
+
"antigravity"
|
|
33
35
|
],
|
|
34
36
|
"author": "Customaise",
|
|
35
37
|
"license": "MIT",
|
|
@@ -43,11 +45,13 @@
|
|
|
43
45
|
},
|
|
44
46
|
"dependencies": {
|
|
45
47
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
48
|
+
"sharp": "^0.34.5",
|
|
46
49
|
"ws": "^8.18.0",
|
|
47
50
|
"zod": "^3.24.0"
|
|
48
51
|
},
|
|
49
52
|
"devDependencies": {
|
|
50
53
|
"@types/node": "^22.0.0",
|
|
54
|
+
"@types/sharp": "^0.31.1",
|
|
51
55
|
"@types/ws": "^8.5.0",
|
|
52
56
|
"ts-node": "^10.9.0",
|
|
53
57
|
"tsx": "^4.21.0",
|