yoke-mcp 0.1.1 → 0.1.3
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/PRIVACY.md +93 -0
- package/README.md +10 -3
- package/dist/cli.js +19 -3
- package/dist/cli.js.map +1 -1
- package/dist/doctor.js +4 -3
- package/dist/doctor.js.map +1 -1
- package/dist/install.d.ts +17 -4
- package/dist/install.js +56 -19
- package/dist/install.js.map +1 -1
- package/dist/mcp-server.d.ts +1 -1
- package/dist/mcp-server.js +12 -6
- package/dist/mcp-server.js.map +1 -1
- package/dist/native-host.d.ts +1 -1
- package/dist/native-host.js +81 -11
- package/dist/native-host.js.map +1 -1
- package/extension/browser/background.js +89 -4
- package/extension/browser/cdp.js +31 -0
- package/extension/browser/messages.js +6 -0
- package/extension/browser/popup.js +49 -0
- package/extension/manifest.json +11 -1
- package/extension/popup.html +86 -0
- package/package.json +8 -4
package/PRIVACY.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Privacy policy for Yoke
|
|
2
|
+
|
|
3
|
+
Last updated: 23 August 2026
|
|
4
|
+
|
|
5
|
+
Yoke handles a lot of what is on your screen, and sends none of it to us.
|
|
6
|
+
|
|
7
|
+
There is no Yoke server, no account, no analytics and no telemetry. Every hop is
|
|
8
|
+
between processes on your own machine. But "we receive nothing" is not the same
|
|
9
|
+
as "nothing is handled", and the honest version is the second one: Yoke reads
|
|
10
|
+
page content, captures screenshots and observes network activity when asked to,
|
|
11
|
+
and hands all of it to the local client you connected. Where that client sends it
|
|
12
|
+
next is the question worth asking, and it is answered below.
|
|
13
|
+
|
|
14
|
+
## What Yoke can see
|
|
15
|
+
|
|
16
|
+
Yoke exists to drive the browser you are already signed in to, so it can see a
|
|
17
|
+
great deal:
|
|
18
|
+
|
|
19
|
+
- Every tab and tab group in every window, with titles and URLs.
|
|
20
|
+
- The text and the interactive structure of any page it is asked to read.
|
|
21
|
+
- Screenshots of any tab it is asked to capture.
|
|
22
|
+
- Console messages and network request metadata (method, URL, status) for any tab
|
|
23
|
+
it is attached to.
|
|
24
|
+
- Anything a page displays while it is being driven.
|
|
25
|
+
|
|
26
|
+
It reads these only when a connected client asks for a specific tab by id. There
|
|
27
|
+
is no background collection, no crawling, and nothing is read on a schedule.
|
|
28
|
+
|
|
29
|
+
## Where that information goes
|
|
30
|
+
|
|
31
|
+
To one place: the local program you connected. The path is
|
|
32
|
+
|
|
33
|
+
extension -> native messaging host -> Unix socket -> MCP server -> your client
|
|
34
|
+
|
|
35
|
+
Every hop is on your computer. The socket lives in a directory readable only by
|
|
36
|
+
your user account. Nothing is written to a remote service by Yoke, and the
|
|
37
|
+
extension makes no network requests of its own.
|
|
38
|
+
|
|
39
|
+
What your client then does with what it receives is outside Yoke's control and
|
|
40
|
+
governed by that client's own policy. If the client is an AI assistant, page
|
|
41
|
+
content you ask Yoke to read will be sent to whatever model that assistant uses.
|
|
42
|
+
That is a property of the tool you connected, not of Yoke, and it is the main
|
|
43
|
+
thing to understand before installing.
|
|
44
|
+
|
|
45
|
+
## What Yoke stores
|
|
46
|
+
|
|
47
|
+
Almost nothing, and nothing that outlives the browser:
|
|
48
|
+
|
|
49
|
+
- Console messages and network requests for tabs being driven, kept in memory
|
|
50
|
+
only, capped at 500 entries per tab, and discarded when the tab closes, when
|
|
51
|
+
the debugger detaches, or when Chrome restarts the extension.
|
|
52
|
+
- No cookies, credentials, passwords, form values or browsing history are
|
|
53
|
+
recorded or persisted anywhere by Yoke.
|
|
54
|
+
|
|
55
|
+
The values of password fields are deliberately excluded from what Yoke reports
|
|
56
|
+
about a page. The field is described so a client can type into it; its contents
|
|
57
|
+
are not returned.
|
|
58
|
+
|
|
59
|
+
URL fields in tool output are reduced to origin and path, because query strings
|
|
60
|
+
routinely carry session tokens. `list_tabs` accepts `full_urls` to opt out of
|
|
61
|
+
that, and it is the only tool that does: everywhere else the reduction is
|
|
62
|
+
unconditional.
|
|
63
|
+
|
|
64
|
+
Redaction covers URL fields and not whole payloads, which is worth stating
|
|
65
|
+
plainly rather than leaving to be discovered. A page's own text comes back as it
|
|
66
|
+
is, so a URL printed on the page arrives whole. So do console messages, and the
|
|
67
|
+
value of any expression a caller evaluates, including `location.href` or
|
|
68
|
+
`document.cookie`. Screenshots are pixels and are not filtered at all. The
|
|
69
|
+
redaction stops Yoke from volunteering a URL, and it is not a filter on what a
|
|
70
|
+
page can tell a caller that asks.
|
|
71
|
+
|
|
72
|
+
## Permissions and why each exists
|
|
73
|
+
|
|
74
|
+
| Permission | Why |
|
|
75
|
+
| --- | --- |
|
|
76
|
+
| `tabs` | List, open, navigate and close tabs by id, and see which group each is in. |
|
|
77
|
+
| `tabGroups` | Put the tabs it drives into one visible group, so you can see what is under automation. |
|
|
78
|
+
| `nativeMessaging` | Talk to the local host, which is the only way an extension can reach a program on your machine. |
|
|
79
|
+
| `scripting` | Read page text and describe interactive elements. |
|
|
80
|
+
| `debugger` | Send input a page cannot distinguish from yours, and capture background tabs. An extension has no other route to either. |
|
|
81
|
+
| `<all_urls>` | Allow the above on whichever site you ask it to work on, rather than a fixed list. |
|
|
82
|
+
|
|
83
|
+
Attaching the debugger makes Chrome display its own notification that the browser
|
|
84
|
+
is being debugged. That bar is Chrome telling you the truth, and Yoke does not
|
|
85
|
+
try to hide or suppress it.
|
|
86
|
+
|
|
87
|
+
## Data sold or shared
|
|
88
|
+
|
|
89
|
+
None. There is nobody to sell it to and no channel to share it over.
|
|
90
|
+
|
|
91
|
+
## Contact
|
|
92
|
+
|
|
93
|
+
Issues and questions: https://github.com/hamzahamidi/yoke/issues
|
package/README.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# yoke
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/yoke-mcp)
|
|
4
|
+
[](https://github.com/hamzahamidi/yoke/actions/workflows/test.yml)
|
|
5
|
+
[](https://www.npmjs.com/package/yoke-mcp#provenance)
|
|
6
|
+
[](https://nodejs.org)
|
|
7
|
+
[](package.json)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
|
|
3
10
|
yoke lets an MCP client drive the Chrome profile you already use. It can work with every tab in every window, read pages, click and type, take screenshots, and inspect console and network activity. Your signed in sessions, cookies, extensions, and open tabs stay available.
|
|
4
11
|
|
|
5
12
|
That is the reason to use yoke instead of starting a fresh browser through Playwright or Puppeteer. It works where you already work.
|
|
@@ -53,7 +60,7 @@ In Chrome, Chromium, or Brave:
|
|
|
53
60
|
|
|
54
61
|
In Edge, use `edge://extensions` and follow the same steps.
|
|
55
62
|
|
|
56
|
-
|
|
63
|
+
An unpacked load gets the id `oceljemfocgfidhhdlbojkbkmlbfclna`, pinned by a public key in `extension/manifest.json`. A Chrome Web Store install gets a different one, `mebojgahcmmffbaonhnmmjhmbdbfbamm`, because an uploaded package may not carry a key and so cannot choose its id. `yoke install` allowlists both, so either install works. A build whose id is neither is refused by native messaging, which is the point of pinning it.
|
|
57
64
|
|
|
58
65
|
The native messaging host id is `io.github.hamzahamidi.yoke`.
|
|
59
66
|
|
|
@@ -123,7 +130,7 @@ Any tool that acts on an existing tab requires an explicit `tab_id` obtained fro
|
|
|
123
130
|
|
|
124
131
|
Every tab opened by yoke goes into a cyan group titled `yoke`, so the tab strip names what is driving those tabs. Pass `group_title` to `open_tab` for a different label, which is worth doing when more than one agent works in the same browser. The extension creates that group when needed and reuses a group with the same title in the same window. Reuse comes from Chrome's current group state, so it still works after Chrome has stopped and restarted the extension service worker. You do not collect a row of identical group pills.
|
|
125
132
|
|
|
126
|
-
Any tab yoke drives or reads joins the group as well, whether or not it opened that tab, so the strip always shows what is under automation. Tabs are never moved between windows to achieve it. Grouping is visual only, so no tool depends on it to find a tab. `ungroup_tabs` removes tabs from their group without closing them. When the group becomes empty, Chrome removes its pill.
|
|
133
|
+
Any tab yoke drives or reads joins the group as well, whether or not it opened that tab, so the strip always shows what is under automation. While yoke actually holds a tab, its toolbar icon also carries a cyan dot on that tab, which is the only per-tab marker Chrome offers an extension. Anything louder would mean changing the page itself, such as its title or favicon, and yoke does not alter a page it was asked to read. Tabs are never moved between windows to achieve it. Grouping is visual only, so no tool depends on it to find a tab. `ungroup_tabs` removes tabs from their group without closing them. When the group becomes empty, Chrome removes its pill.
|
|
127
134
|
|
|
128
135
|
### URL redaction
|
|
129
136
|
|
|
@@ -186,7 +193,7 @@ From a checkout that has not been linked, replace `yoke` with `node dist/cli.js`
|
|
|
186
193
|
4. A driven tab shows Chrome's debugging bar and cannot share its debugger slot with DevTools.
|
|
187
194
|
5. Element references expire after navigation or a page render. Console and network history starts when yoke first attaches to that tab, not before.
|
|
188
195
|
6. Screenshots capture the page viewport, not browser chrome such as the address bar or tab strip.
|
|
189
|
-
7. Chrome's internal pages
|
|
196
|
+
7. Chrome's internal pages cannot be read or driven. Neither can the Chrome Web Store or the extensions gallery: Chrome refuses both `chrome.scripting` and `chrome.debugger` there, so no extension can automate them, including this one. Publishing an extension is therefore a manual job by design.
|
|
190
197
|
|
|
191
198
|
## Uninstall
|
|
192
199
|
|
package/dist/cli.js
CHANGED
|
@@ -42,9 +42,25 @@ async function main() {
|
|
|
42
42
|
process.stderr.write(`skipped ${browser}: ${reason}\n`);
|
|
43
43
|
}
|
|
44
44
|
if (result.platform === 'win32') {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
const manifest = result.written[0]?.[1];
|
|
46
|
+
if (manifest === undefined) {
|
|
47
|
+
return EXIT.UNAVAILABLE;
|
|
48
|
+
}
|
|
49
|
+
// Windows finds the host through the registry, so the file above is only
|
|
50
|
+
// half the job. These are the exact commands for the manifest that was
|
|
51
|
+
// just written, rather than a sentence about a file the caller has to
|
|
52
|
+
// locate: every browser key points at the same manifest.
|
|
53
|
+
process.stdout.write('\nOn Windows the host is found through the registry. Run these, for each browser you use:\n\n');
|
|
54
|
+
for (const key of [
|
|
55
|
+
'Software\\Google\\Chrome',
|
|
56
|
+
'Software\\Chromium',
|
|
57
|
+
'Software\\Microsoft\\Edge',
|
|
58
|
+
'Software\\BraveSoftware\\Brave-Browser',
|
|
59
|
+
]) {
|
|
60
|
+
process.stdout.write(` reg add "HKCU\\${key}\\NativeMessagingHosts\\${result.hostName}" /ve /t REG_SZ /d "${manifest}" /f\n`);
|
|
61
|
+
}
|
|
62
|
+
process.stdout.write('\nThen load extension\\ at chrome://extensions with Developer mode on.\n');
|
|
63
|
+
process.stdout.write('This path is written but untested: please report what happens.\n');
|
|
48
64
|
return EXIT.OK;
|
|
49
65
|
}
|
|
50
66
|
if (result.written.length === 0) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,8EAA8E;AAC9E,gEAAgE;AAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;CAiBb,CAAC;AAEF,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAW,CAAC;AAE3D,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/B,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,2DAA2D;QAC3D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACxD,KAAK,EAAE,CAAC;QACR,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACnE,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC;QAC/D,CAAC;QACD,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
9
9
|
import { dirname, join } from 'node:path';
|
|
10
10
|
import { fileURLToPath } from 'node:url';
|
|
11
|
-
import { browserDirs,
|
|
11
|
+
import { browserDirs, EXTENSION_IDS, HOST_NAME } from './install.js';
|
|
12
12
|
import { endpointPath } from './socket-path.js';
|
|
13
13
|
import { ask } from './socket-client.js';
|
|
14
14
|
const extensionRoot = () => join(dirname(fileURLToPath(import.meta.url)), '..');
|
|
@@ -78,8 +78,9 @@ function checkRegistration() {
|
|
|
78
78
|
problems.push(`${browser}: its launcher runs ${node}, which no longer exists`);
|
|
79
79
|
continue;
|
|
80
80
|
}
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
const missing = EXTENSION_IDS.filter((id) => !manifest.allowed_origins.includes(`chrome-extension://${id}/`));
|
|
82
|
+
if (missing.length > 0) {
|
|
83
|
+
problems.push(`${browser}: allowlists ${manifest.allowed_origins.join(', ')}, which is missing ${missing.join(', ')}`);
|
|
83
84
|
continue;
|
|
84
85
|
}
|
|
85
86
|
found.push(browser);
|
package/dist/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,gFAAgF;AAChF,4EAA4E;AAC5E,+CAA+C;AAC/C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/install.d.ts
CHANGED
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
export declare const HOST_NAME = "io.github.hamzahamidi.yoke";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Every extension id allowed to reach the host.
|
|
4
|
+
*
|
|
5
|
+
* A list because a published extension has a different id from an unpacked one,
|
|
6
|
+
* and both have to work. The id below is derived from the public key pinned in
|
|
7
|
+
* extension/manifest.json, which is what an unpacked load uses. The Chrome Web
|
|
8
|
+
* Store assigns its own id from a key it generates: per Chrome's documentation
|
|
9
|
+
* the key flows the other way, and you "copy the public key from the Dashboard's
|
|
10
|
+
* Package tab" into the manifest afterwards, so a store id cannot be predicted
|
|
11
|
+
* or chosen in advance.
|
|
12
|
+
*
|
|
13
|
+
* Native messaging allowed_origins is documented as a list of extensions, with
|
|
14
|
+
* wildcards explicitly not allowed, so the store id is appended here when the
|
|
15
|
+
* listing exists and both installs keep working. Getting that wrong is silent:
|
|
16
|
+
* Chrome refuses the connection and says nothing.
|
|
6
17
|
*/
|
|
7
|
-
export declare const
|
|
18
|
+
export declare const EXTENSION_IDS: readonly string[];
|
|
19
|
+
/** The unpacked id, which is the one the pinned key has to derive. */
|
|
20
|
+
export declare const EXTENSION_ID: string;
|
|
8
21
|
export interface HostManifest {
|
|
9
22
|
name: string;
|
|
10
23
|
description: string;
|
package/dist/install.js
CHANGED
|
@@ -7,17 +7,37 @@
|
|
|
7
7
|
// own directory.
|
|
8
8
|
import { chmodSync, existsSync, mkdirSync, realpathSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
9
9
|
import { homedir } from 'node:os';
|
|
10
|
-
import { dirname, join } from 'node:path';
|
|
10
|
+
import { dirname, join, win32 as windowsPath } from 'node:path';
|
|
11
11
|
// Reverse DNS on the GitHub namespace rather than a domain, because that is the
|
|
12
12
|
// ownership actually demonstrable here. Chrome reads this string by exact match
|
|
13
13
|
// from a file on the user's disk, so changing it breaks every existing install.
|
|
14
14
|
export const HOST_NAME = 'io.github.hamzahamidi.yoke';
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* Every extension id allowed to reach the host.
|
|
17
|
+
*
|
|
18
|
+
* A list because a published extension has a different id from an unpacked one,
|
|
19
|
+
* and both have to work. The id below is derived from the public key pinned in
|
|
20
|
+
* extension/manifest.json, which is what an unpacked load uses. The Chrome Web
|
|
21
|
+
* Store assigns its own id from a key it generates: per Chrome's documentation
|
|
22
|
+
* the key flows the other way, and you "copy the public key from the Dashboard's
|
|
23
|
+
* Package tab" into the manifest afterwards, so a store id cannot be predicted
|
|
24
|
+
* or chosen in advance.
|
|
25
|
+
*
|
|
26
|
+
* Native messaging allowed_origins is documented as a list of extensions, with
|
|
27
|
+
* wildcards explicitly not allowed, so the store id is appended here when the
|
|
28
|
+
* listing exists and both installs keep working. Getting that wrong is silent:
|
|
29
|
+
* Chrome refuses the connection and says nothing.
|
|
19
30
|
*/
|
|
20
|
-
export const
|
|
31
|
+
export const EXTENSION_IDS = [
|
|
32
|
+
// Derived from the key pinned in extension/manifest.json, so this is the id an
|
|
33
|
+
// unpacked load gets. scripts/check-extension-id.mjs asserts the two agree.
|
|
34
|
+
'oceljemfocgfidhhdlbojkbkmlbfclna',
|
|
35
|
+
// Assigned by the Chrome Web Store when the listing was created, and not
|
|
36
|
+
// predictable: an upload may not carry a key, so it cannot choose its id.
|
|
37
|
+
'mebojgahcmmffbaonhnmmjhmbdbfbamm',
|
|
38
|
+
];
|
|
39
|
+
/** The unpacked id, which is the one the pinned key has to derive. */
|
|
40
|
+
export const EXTENSION_ID = EXTENSION_IDS[0];
|
|
21
41
|
/**
|
|
22
42
|
* Where each browser looks for host manifests.
|
|
23
43
|
*
|
|
@@ -37,9 +57,13 @@ export function browserDirs(platform = process.platform, home = homedir()) {
|
|
|
37
57
|
];
|
|
38
58
|
}
|
|
39
59
|
if (platform === 'win32') {
|
|
40
|
-
// Windows
|
|
41
|
-
//
|
|
42
|
-
|
|
60
|
+
// Windows selects the host through the registry rather than through a
|
|
61
|
+
// per-browser directory, so one location holds the manifest and every
|
|
62
|
+
// browser's registry key points at it. It still has to be WRITTEN
|
|
63
|
+
// somewhere: returning nothing here is what left `install` telling people
|
|
64
|
+
// to point the registry at a manifest it had never created.
|
|
65
|
+
const appData = process.env['LOCALAPPDATA'] ?? windowsPath.join(home, 'AppData', 'Local');
|
|
66
|
+
return [['Windows', windowsPath.join(appData, 'yoke')]];
|
|
43
67
|
}
|
|
44
68
|
const config = process.env['XDG_CONFIG_HOME'] ?? join(home, '.config');
|
|
45
69
|
return [
|
|
@@ -94,8 +118,16 @@ function stableNodePath() {
|
|
|
94
118
|
}
|
|
95
119
|
return exact;
|
|
96
120
|
}
|
|
97
|
-
/**
|
|
98
|
-
|
|
121
|
+
/**
|
|
122
|
+
* The launcher's name and the path rules for a platform.
|
|
123
|
+
*
|
|
124
|
+
* Taken from the platform being installed for, never from process.platform.
|
|
125
|
+
* These functions exist so the Windows path can be exercised from any machine,
|
|
126
|
+
* and reading the host's platform instead made it untestable, which is how it
|
|
127
|
+
* came to write a manifest naming a launcher it had not created.
|
|
128
|
+
*/
|
|
129
|
+
const launcherName = (platform) => (platform === 'win32' ? 'yoke-host.bat' : 'yoke-host.sh');
|
|
130
|
+
const pathsFor = (platform) => (platform === 'win32' ? windowsPath : { join });
|
|
99
131
|
/**
|
|
100
132
|
* Writes the launcher into the same directory as the manifest that names it.
|
|
101
133
|
*
|
|
@@ -106,9 +138,9 @@ const LAUNCHER = process.platform === 'win32' ? 'yoke-host.bat' : 'yoke-host.sh'
|
|
|
106
138
|
* rather than the missing file. Here it is created and removed with the manifest
|
|
107
139
|
* it belongs to, and no build touches it.
|
|
108
140
|
*/
|
|
109
|
-
function writeLauncher(dir, hostPath, nodePath = stableNodePath()) {
|
|
110
|
-
const launcher = join(dir,
|
|
111
|
-
if (
|
|
141
|
+
function writeLauncher(dir, hostPath, platform, nodePath = stableNodePath()) {
|
|
142
|
+
const launcher = pathsFor(platform).join(dir, launcherName(platform));
|
|
143
|
+
if (platform === 'win32') {
|
|
112
144
|
writeFileSync(launcher, `@echo off\r\n"${nodePath}" "${hostPath}" %*\r\n`);
|
|
113
145
|
return launcher;
|
|
114
146
|
}
|
|
@@ -121,7 +153,7 @@ export const manifestFor = (hostPath) => ({
|
|
|
121
153
|
description: 'yoke native messaging host',
|
|
122
154
|
path: hostPath,
|
|
123
155
|
type: 'stdio',
|
|
124
|
-
allowed_origins:
|
|
156
|
+
allowed_origins: EXTENSION_IDS.map((id) => `chrome-extension://${id}/`),
|
|
125
157
|
});
|
|
126
158
|
/**
|
|
127
159
|
* Writes the manifest into every browser directory whose parent already exists.
|
|
@@ -140,7 +172,12 @@ export function install({ hostPath, platform = process.platform, home = homedir(
|
|
|
140
172
|
const written = [];
|
|
141
173
|
const skipped = [];
|
|
142
174
|
for (const [browser, dir] of browserDirs(platform, home)) {
|
|
143
|
-
|
|
175
|
+
// The parent-exists check asks "is this browser installed", so it only makes
|
|
176
|
+
// sense for a directory the browser owns. On Windows the directory is ours,
|
|
177
|
+
// named by a registry value rather than found by a browser, so skipping it
|
|
178
|
+
// for a missing parent would mean never writing the manifest at all.
|
|
179
|
+
const browserOwnsIt = platform !== 'win32';
|
|
180
|
+
if (browserOwnsIt && !existsSync(dirname(dir))) {
|
|
144
181
|
skipped.push([browser, 'not installed']);
|
|
145
182
|
continue;
|
|
146
183
|
}
|
|
@@ -149,8 +186,8 @@ export function install({ hostPath, platform = process.platform, home = homedir(
|
|
|
149
186
|
// The manifest points at a launcher rather than at the host, so Chrome
|
|
150
187
|
// never has to find node on a PATH it does not have. Both live here, so
|
|
151
188
|
// neither can outlive the other.
|
|
152
|
-
const launcher = writeLauncher(dir, hostPath);
|
|
153
|
-
const file = join(dir, `${HOST_NAME}.json`);
|
|
189
|
+
const launcher = writeLauncher(dir, hostPath, platform);
|
|
190
|
+
const file = pathsFor(platform).join(dir, `${HOST_NAME}.json`);
|
|
154
191
|
writeFileSync(file, `${JSON.stringify(manifestFor(launcher), null, 2)}\n`);
|
|
155
192
|
written.push([browser, file]);
|
|
156
193
|
}
|
|
@@ -163,7 +200,7 @@ export function install({ hostPath, platform = process.platform, home = homedir(
|
|
|
163
200
|
export function uninstall({ platform = process.platform, home = homedir(), } = {}) {
|
|
164
201
|
const removed = [];
|
|
165
202
|
for (const [browser, dir] of browserDirs(platform, home)) {
|
|
166
|
-
const file = join(dir, `${HOST_NAME}.json`);
|
|
203
|
+
const file = pathsFor(platform).join(dir, `${HOST_NAME}.json`);
|
|
167
204
|
try {
|
|
168
205
|
unlinkSync(file);
|
|
169
206
|
removed.push([browser, file]);
|
|
@@ -172,7 +209,7 @@ export function uninstall({ platform = process.platform, home = homedir(), } = {
|
|
|
172
209
|
// The launcher lives beside the manifest, so it goes with it rather than
|
|
173
210
|
// being left behind pointing at a host nothing will ask for.
|
|
174
211
|
try {
|
|
175
|
-
unlinkSync(join(dir,
|
|
212
|
+
unlinkSync(pathsFor(platform).join(dir, launcherName(platform)));
|
|
176
213
|
}
|
|
177
214
|
catch { /* not there */ }
|
|
178
215
|
}
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,EAAE;AACF,kFAAkF;AAClF,iFAAiF;AACjF,sEAAsE;AACtE,gFAAgF;AAChF,iBAAiB;AACjB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-server.d.ts
CHANGED
package/dist/mcp-server.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// A stdio MCP server for the browser you are already signed in to.
|
|
2
2
|
//
|
|
3
3
|
// Register this with any MCP client and it gets browser automation against your
|
|
4
|
-
// real Chrome profile
|
|
5
|
-
//
|
|
4
|
+
// real Chrome profile: every tab in every window is addressable, each one named
|
|
5
|
+
// by id, and nothing is acted on that a caller did not name.
|
|
6
6
|
//
|
|
7
7
|
// Three processes, because Chrome's rules say so:
|
|
8
8
|
//
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import { createInterface } from 'node:readline';
|
|
14
14
|
import { ask, ExtensionUnavailable } from './socket-client.js';
|
|
15
15
|
export const SERVER_NAME = 'yoke';
|
|
16
|
-
export const SERVER_VERSION = '0.1.
|
|
16
|
+
export const SERVER_VERSION = '0.1.3';
|
|
17
17
|
export const PROTOCOL_VERSION = '2024-11-05';
|
|
18
18
|
/**
|
|
19
19
|
* The label on the group holding tabs yoke opened.
|
|
@@ -45,8 +45,8 @@ export const TOOLS = [
|
|
|
45
45
|
{
|
|
46
46
|
name: 'list_tabs',
|
|
47
47
|
description: 'List every open tab in the browser, across all windows, with its id, title and URL. '
|
|
48
|
-
+ '
|
|
49
|
-
+ '
|
|
48
|
+
+ 'Any tab it returns can be passed straight to the other tools. '
|
|
49
|
+
+ 'URLs are reduced to origin and path by default, '
|
|
50
50
|
+ 'because a raw URL can carry credentials, a session token or a query string; pass '
|
|
51
51
|
+ 'full_urls to opt out.',
|
|
52
52
|
inputSchema: {
|
|
@@ -549,7 +549,13 @@ export async function callTool(name, args) {
|
|
|
549
549
|
if (name === 'release_tab') {
|
|
550
550
|
const released = await ask('release', { tabId: asTabId(args['tab_id']) });
|
|
551
551
|
return text(released.released
|
|
552
|
-
|
|
552
|
+
// Says what detaching does and no more. Chrome's banner going away and
|
|
553
|
+
// DevTools becoming attachable follow from the one-client-per-tab rule
|
|
554
|
+
// rather than from anything Chrome documents, and the tab keeps its group:
|
|
555
|
+
// releasing is not unmarking.
|
|
556
|
+
? `Released tab ${released.tabId}. The debugger is detached and this tab's console and `
|
|
557
|
+
+ "network buffers are dropped. It stays in its group, and Chrome should stop showing "
|
|
558
|
+
+ 'the debugging banner for it.'
|
|
553
559
|
: `Tab ${released.tabId} was not being driven.`);
|
|
554
560
|
}
|
|
555
561
|
return failed(`unknown tool: ${name}`);
|
package/dist/mcp-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
package/dist/native-host.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
export declare function main(): void
|
|
2
|
+
export declare function main(): Promise<void>;
|
package/dist/native-host.js
CHANGED
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
// so "any local process can connect" is not an acceptable posture; file
|
|
13
13
|
// permissions are the cheapest correct answer. Windows gets a named pipe, where
|
|
14
14
|
// the path namespace plays the same role.
|
|
15
|
-
import { chmodSync, mkdirSync, statSync, unlinkSync } from 'node:fs';
|
|
16
|
-
import { createServer } from 'node:net';
|
|
15
|
+
import { chmodSync, existsSync, mkdirSync, statSync, unlinkSync } from 'node:fs';
|
|
16
|
+
import { connect, createServer } from 'node:net';
|
|
17
17
|
import { dirname } from 'node:path';
|
|
18
18
|
import { PROTOCOL, isResponse } from './protocol.js';
|
|
19
19
|
import { endpointPath } from './socket-path.js';
|
|
@@ -59,7 +59,7 @@ function readFromChrome(onMessage) {
|
|
|
59
59
|
}
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
|
-
export function main() {
|
|
62
|
+
export async function main() {
|
|
63
63
|
const socketPath = endpointPath();
|
|
64
64
|
const waiting = new Map();
|
|
65
65
|
let nextId = 1;
|
|
@@ -140,14 +140,38 @@ export function main() {
|
|
|
140
140
|
});
|
|
141
141
|
connection.on('error', () => { });
|
|
142
142
|
});
|
|
143
|
-
|
|
144
|
-
//
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
143
|
+
// Asked before the endpoint is claimed, because a profile with nothing in it
|
|
144
|
+
// must not take the endpoint from one the user is actually looking at.
|
|
145
|
+
//
|
|
146
|
+
// The check lives here rather than in the extension because the host is
|
|
147
|
+
// spawned fresh by Chrome for every connection, so it always runs current
|
|
148
|
+
// code, while an extension in another profile may be running whatever was on
|
|
149
|
+
// disk when that profile last loaded it. Relying on the extension to
|
|
150
|
+
// self-restrict only works once every profile has been reloaded, which is not
|
|
151
|
+
// something this can assume.
|
|
152
|
+
const drivable = await new Promise((resolve) => {
|
|
153
|
+
const id = nextId++;
|
|
154
|
+
const timer = setTimeout(() => { waiting.delete(id); resolve(true); }, 3_000);
|
|
155
|
+
waiting.set(id, (reply) => {
|
|
156
|
+
clearTimeout(timer);
|
|
157
|
+
// An error here means the profile could not answer at all, which includes
|
|
158
|
+
// "No current window". Treated as not drivable.
|
|
159
|
+
if (!reply.ok) {
|
|
160
|
+
resolve(false);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const tabs = reply.data?.tabs;
|
|
164
|
+
resolve(Array.isArray(tabs) && tabs.length > 0);
|
|
165
|
+
});
|
|
166
|
+
writeToChrome({ id, op: 'listTabs', args: {} });
|
|
167
|
+
});
|
|
168
|
+
if (!drivable) {
|
|
169
|
+
process.stderr.write('this Chrome profile has no tabs, so it is not claiming the yoke endpoint: a caller driving it '
|
|
170
|
+
+ 'would be operating a browser nobody can see. Another profile with windows open can have it.\n');
|
|
171
|
+
process.exit(0);
|
|
150
172
|
}
|
|
173
|
+
prepareDirectory(socketPath);
|
|
174
|
+
await claimEndpoint(socketPath);
|
|
151
175
|
server.listen(socketPath, () => {
|
|
152
176
|
if (process.platform !== 'win32') {
|
|
153
177
|
chmodSync(socketPath, 0o600);
|
|
@@ -157,6 +181,49 @@ export function main() {
|
|
|
157
181
|
process.on(signal, () => { cleanup(); process.exit(0); });
|
|
158
182
|
}
|
|
159
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* Takes the socket path, but only if nobody live is using it.
|
|
186
|
+
*
|
|
187
|
+
* The path is per user, not per Chrome profile, so two profiles with this
|
|
188
|
+
* extension loaded each get their own host from Chrome and both want this
|
|
189
|
+
* endpoint. Unlinking unconditionally, which is what this did, let the second
|
|
190
|
+
* host steal it: the MCP server then reached whichever host bound last and drove
|
|
191
|
+
* a different browser profile than the one the person was looking at, with no
|
|
192
|
+
* error anywhere. Observed as `list_tabs` returning 0 while the visible window
|
|
193
|
+
* held 40 tabs.
|
|
194
|
+
*
|
|
195
|
+
* So a connect is attempted first. Succeeding means a live host owns the path
|
|
196
|
+
* and this one has nothing to offer: it exits, and Chrome surfaces that to the
|
|
197
|
+
* extension rather than the two of them trading the socket back and forth.
|
|
198
|
+
* Failing means the file is a corpse from a host Chrome killed, and unlinking it
|
|
199
|
+
* is right.
|
|
200
|
+
*/
|
|
201
|
+
async function claimEndpoint(socketPath) {
|
|
202
|
+
if (process.platform === 'win32') {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (!existsSync(socketPath)) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const alive = await new Promise((resolve) => {
|
|
209
|
+
const probe = connect(socketPath)
|
|
210
|
+
.on('connect', () => { probe.destroy(); resolve(true); })
|
|
211
|
+
.on('error', () => resolve(false));
|
|
212
|
+
// A socket that neither connects nor errors is not a working host either.
|
|
213
|
+
setTimeout(() => { probe.destroy(); resolve(false); }, 500).unref();
|
|
214
|
+
});
|
|
215
|
+
if (alive) {
|
|
216
|
+
process.stderr.write(`another yoke host already owns ${socketPath}, which happens when a second Chrome profile `
|
|
217
|
+
+ 'has the extension loaded. This one is exiting rather than taking the endpoint from it, '
|
|
218
|
+
+ 'because doing so would point the server at a different browser profile. Disable the '
|
|
219
|
+
+ 'extension in the profile you are not driving.\n');
|
|
220
|
+
process.exit(0);
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
unlinkSync(socketPath);
|
|
224
|
+
}
|
|
225
|
+
catch { /* nothing there */ }
|
|
226
|
+
}
|
|
160
227
|
// Runs unconditionally, because this file exists only to be executed.
|
|
161
228
|
//
|
|
162
229
|
// It used to be guarded by comparing process.argv[1] to this module's path,
|
|
@@ -166,5 +233,8 @@ export function main() {
|
|
|
166
233
|
// "Native host has exited" with nothing else to go on. An entry point that the
|
|
167
234
|
// runner invokes with unpredictable arguments cannot detect itself from argv, so
|
|
168
235
|
// it should not try.
|
|
169
|
-
main()
|
|
236
|
+
void main().catch((failure) => {
|
|
237
|
+
process.stderr.write(`yoke host failed to start: ${String(failure)}\n`);
|
|
238
|
+
process.exit(1);
|
|
239
|
+
});
|
|
170
240
|
//# sourceMappingURL=native-host.js.map
|
package/dist/native-host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-host.js","sourceRoot":"","sources":["../src/native-host.ts"],"names":[],"mappings":";AACA,wDAAwD;AACxD,EAAE;AACF,kEAAkE;AAClE,kEAAkE;AAClE,gFAAgF;AAChF,iFAAiF;AACjF,iCAAiC;AACjC,EAAE;AACF,iFAAiF;AACjF,iFAAiF;AACjF,wEAAwE;AACxE,gFAAgF;AAChF,0CAA0C;AAC1C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"native-host.js","sourceRoot":"","sources":["../src/native-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -245,6 +245,36 @@ async function markTab(tabId) {
|
|
|
245
245
|
// chrome.tabs.get per operation for a tab that cannot be grouped anyway.
|
|
246
246
|
}
|
|
247
247
|
}
|
|
248
|
+
/**
|
|
249
|
+
* Answers the popup.
|
|
250
|
+
*
|
|
251
|
+
* Kept apart from handle(): those messages arrive from the native host and cross
|
|
252
|
+
* a trust boundary, these come from a page inside this extension. Sharing one
|
|
253
|
+
* dispatcher would let the host reach operations meant only for the popup.
|
|
254
|
+
*/
|
|
255
|
+
chrome.runtime.onMessage.addListener((message, _sender, respond) => {
|
|
256
|
+
if (message?.kind === 'status') {
|
|
257
|
+
const reply = {
|
|
258
|
+
kind: 'status',
|
|
259
|
+
connected: port !== undefined,
|
|
260
|
+
version: chrome.runtime.getManifest().version,
|
|
261
|
+
host: HOST,
|
|
262
|
+
attached: attachedTabIds(),
|
|
263
|
+
};
|
|
264
|
+
respond(reply);
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
if (message?.kind === 'releaseAll') {
|
|
268
|
+
const held = attachedTabIds();
|
|
269
|
+
void Promise.all(held.map((tabId) => detach(tabId))).then(() => {
|
|
270
|
+
const reply = { kind: 'released', count: held.length };
|
|
271
|
+
respond(reply);
|
|
272
|
+
});
|
|
273
|
+
// Keeps the channel open, because respond is called after the detaches.
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
return false;
|
|
277
|
+
});
|
|
248
278
|
async function handle(message) {
|
|
249
279
|
const named = message.args?.tabId;
|
|
250
280
|
if (named !== undefined && MARKS_TAB.has(message.op)) {
|
|
@@ -381,6 +411,31 @@ async function handle(message) {
|
|
|
381
411
|
}
|
|
382
412
|
/** Narrows a tab id that has already been validated by the server. */
|
|
383
413
|
const tabId2 = (value) => value;
|
|
414
|
+
/**
|
|
415
|
+
* Whether this profile has anything to drive.
|
|
416
|
+
*
|
|
417
|
+
* A profile with no windows cannot be driven and cannot show anything: the tab
|
|
418
|
+
* group that tells the user which tabs are under automation has nowhere to
|
|
419
|
+
* appear, and list_tabs answers nothing. Chrome keeps such a profile's service
|
|
420
|
+
* worker alive, so without this check a windowless profile can win the endpoint
|
|
421
|
+
* and the caller drives an invisible browser. Observed exactly that way:
|
|
422
|
+
* list_tab_groups answered "No current window" while the visible window held 40
|
|
423
|
+
* tabs.
|
|
424
|
+
*/
|
|
425
|
+
async function hasWindows() {
|
|
426
|
+
try {
|
|
427
|
+
return (await chrome.windows.getAll()).length > 0;
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
// If the question cannot be answered, connecting is the lesser risk: a
|
|
431
|
+
// profile that will not connect is useless, and this check is a tiebreak
|
|
432
|
+
// rather than a safety property.
|
|
433
|
+
return true;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/** Grows on each failed attempt, resets once a connection holds. */
|
|
437
|
+
let retryDelayMs = 1_000;
|
|
438
|
+
const MAX_RETRY_MS = 60_000;
|
|
384
439
|
function connect() {
|
|
385
440
|
if (port) {
|
|
386
441
|
return;
|
|
@@ -392,6 +447,9 @@ function connect() {
|
|
|
392
447
|
console.log('yoke: native host unavailable', failure);
|
|
393
448
|
return;
|
|
394
449
|
}
|
|
450
|
+
// Reset here rather than on the first message, because a port that opens is
|
|
451
|
+
// the thing being retried. A host that then exits raises the delay again.
|
|
452
|
+
retryDelayMs = 1_000;
|
|
395
453
|
port.onMessage.addListener((message) => {
|
|
396
454
|
if (message?.id === undefined) {
|
|
397
455
|
return;
|
|
@@ -415,9 +473,36 @@ function connect() {
|
|
|
415
473
|
// first call work without reloading the extension by hand.
|
|
416
474
|
port.onDisconnect.addListener(() => {
|
|
417
475
|
port = undefined;
|
|
418
|
-
|
|
476
|
+
// Read, not ignored. Chrome logs "Unchecked runtime.lastError: Native host
|
|
477
|
+
// has exited" for every disconnect nobody inspects, so a profile that cannot
|
|
478
|
+
// get the host filled the extension's error list once per retry.
|
|
479
|
+
const reason = chrome.runtime.lastError?.message ?? 'the host disconnected';
|
|
480
|
+
retryDelayMs = Math.min(retryDelayMs * 2, MAX_RETRY_MS);
|
|
481
|
+
console.log(`yoke: ${reason}. Retrying in ${retryDelayMs / 1_000}s`);
|
|
482
|
+
// Backoff rather than a fixed second. The common reason for a host that
|
|
483
|
+
// exits immediately is another Chrome profile already owning the endpoint,
|
|
484
|
+
// which does not resolve by asking again quickly, and hammering it turned one
|
|
485
|
+
// problem into a log full of them.
|
|
486
|
+
setTimeout(connectWhenDrivable, retryDelayMs);
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
chrome.runtime.onStartup.addListener(() => { connectWhenDrivable(); });
|
|
490
|
+
chrome.runtime.onInstalled.addListener(() => { connectWhenDrivable(); });
|
|
491
|
+
/**
|
|
492
|
+
* Connects only from a profile that has a window, and waits for one otherwise.
|
|
493
|
+
*
|
|
494
|
+
* The endpoint is per user rather than per profile, so whichever profile claims
|
|
495
|
+
* it decides which browser a caller drives. Preferring one the user can actually
|
|
496
|
+
* see is the difference between driving their browser and driving a ghost.
|
|
497
|
+
*/
|
|
498
|
+
function connectWhenDrivable() {
|
|
499
|
+
void hasWindows().then((yes) => {
|
|
500
|
+
if (yes) {
|
|
501
|
+
connect();
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
console.log('yoke: this profile has no windows, so it is leaving the host to another profile');
|
|
419
505
|
});
|
|
420
506
|
}
|
|
421
|
-
chrome.
|
|
422
|
-
|
|
423
|
-
connect();
|
|
507
|
+
chrome.windows.onCreated.addListener(() => { connectWhenDrivable(); });
|
|
508
|
+
connectWhenDrivable();
|
package/extension/browser/cdp.js
CHANGED
|
@@ -87,9 +87,38 @@ chrome.debugger.onEvent.addListener((source, method, params) => {
|
|
|
87
87
|
chrome.debugger.onDetach.addListener((source) => {
|
|
88
88
|
if (source.tabId !== undefined) {
|
|
89
89
|
state.delete(source.tabId);
|
|
90
|
+
badge(source.tabId, false);
|
|
90
91
|
}
|
|
91
92
|
});
|
|
92
93
|
chrome.tabs.onRemoved.addListener((tabId) => { state.delete(tabId); });
|
|
94
|
+
/**
|
|
95
|
+
* Marks a tab in the browser's own chrome, per tab.
|
|
96
|
+
*
|
|
97
|
+
* The tab group tints a driven tab in the strip, which is the indicator that
|
|
98
|
+
* scales to many tabs at once, but it is quiet. A badge is the only other
|
|
99
|
+
* per-tab surface Chrome gives an extension: it appears on the toolbar icon for
|
|
100
|
+
* whichever tab is showing, so on a driven tab the marker is right there next to
|
|
101
|
+
* the address bar. Anything louder than these two means altering the page
|
|
102
|
+
* itself, which this project does not do to a page it was asked to read.
|
|
103
|
+
*/
|
|
104
|
+
const badge = (tabId, driving) => {
|
|
105
|
+
const set = (call, details) => {
|
|
106
|
+
// Every one of these throws for a tab that has closed, which is a normal
|
|
107
|
+
// race rather than a fault: detach runs while a tab is going away.
|
|
108
|
+
try {
|
|
109
|
+
void Promise.resolve(call(details)).catch(() => { });
|
|
110
|
+
}
|
|
111
|
+
catch { /* tab gone */ }
|
|
112
|
+
};
|
|
113
|
+
if (driving) {
|
|
114
|
+
set(chrome.action.setBadgeText, { tabId, text: '●' });
|
|
115
|
+
set(chrome.action.setBadgeBackgroundColor, { tabId, color: '#1098ad' });
|
|
116
|
+
set(chrome.action.setTitle, { tabId, title: 'Yoke is driving this tab. Click to release it.' });
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
set(chrome.action.setBadgeText, { tabId, text: '' });
|
|
120
|
+
set(chrome.action.setTitle, { tabId, title: 'Yoke' });
|
|
121
|
+
};
|
|
93
122
|
const send = (tabId, method, params) => chrome.debugger.sendCommand({ tabId }, method, params);
|
|
94
123
|
/**
|
|
95
124
|
* Attaches to a tab if it is not already attached, and enables the domains whose
|
|
@@ -126,6 +155,7 @@ export async function attach(tabId) {
|
|
|
126
155
|
send(tabId, 'Page.enable'),
|
|
127
156
|
]);
|
|
128
157
|
tab.painting = await keepPainting(tabId);
|
|
158
|
+
badge(tabId, true);
|
|
129
159
|
return { attachedNow: true };
|
|
130
160
|
}
|
|
131
161
|
/**
|
|
@@ -162,6 +192,7 @@ async function keepPainting(tabId) {
|
|
|
162
192
|
export async function detach(tabId) {
|
|
163
193
|
const tab = state.get(tabId);
|
|
164
194
|
state.delete(tabId);
|
|
195
|
+
badge(tabId, false);
|
|
165
196
|
if (!tab?.attached) {
|
|
166
197
|
return false;
|
|
167
198
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Messages between the popup and the service worker.
|
|
2
|
+
//
|
|
3
|
+
// Separate from protocol.ts because these never cross the native messaging
|
|
4
|
+
// boundary: they are internal to the extension, and mixing them into the wire
|
|
5
|
+
// protocol would imply the host could send them.
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const ask = (request) => chrome.runtime.sendMessage(request);
|
|
2
|
+
const el = (id) => {
|
|
3
|
+
const found = document.getElementById(id);
|
|
4
|
+
if (!found) {
|
|
5
|
+
throw new Error(`missing element #${id}`);
|
|
6
|
+
}
|
|
7
|
+
return found;
|
|
8
|
+
};
|
|
9
|
+
const plural = (count, one, many) => `${count} ${count === 1 ? one : many}`;
|
|
10
|
+
async function render() {
|
|
11
|
+
const status = await ask({ kind: 'status' });
|
|
12
|
+
if (status.kind !== 'status') {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
el('version').textContent = `v${status.version}`;
|
|
16
|
+
const connected = status.connected;
|
|
17
|
+
el('state').className = connected ? 'state on' : 'state off';
|
|
18
|
+
el('state-text').textContent = connected ? 'Connected' : 'Not connected';
|
|
19
|
+
el('state-detail').textContent = connected
|
|
20
|
+
? 'The local server is running. A client can drive this browser.'
|
|
21
|
+
: 'The local half is not answering, so nothing can drive this browser yet.';
|
|
22
|
+
// Shown only when disconnected, because that is the only time it is the
|
|
23
|
+
// reader's problem. Someone whose setup works does not need instructions.
|
|
24
|
+
el('setup').hidden = connected;
|
|
25
|
+
const held = status.attached.length;
|
|
26
|
+
el('driving').hidden = held === 0;
|
|
27
|
+
if (held > 0) {
|
|
28
|
+
el('driving-text').textContent = `Driving ${plural(held, 'tab', 'tabs')}`;
|
|
29
|
+
el('driving-detail').textContent = held === 1
|
|
30
|
+
? 'That tab shows Chrome\'s debugging bar and cannot open DevTools.'
|
|
31
|
+
: 'Those tabs show Chrome\'s debugging bar and cannot open DevTools.';
|
|
32
|
+
}
|
|
33
|
+
el('idle').hidden = held > 0;
|
|
34
|
+
}
|
|
35
|
+
el('release').addEventListener('click', () => {
|
|
36
|
+
const button = el('release');
|
|
37
|
+
button.disabled = true;
|
|
38
|
+
button.textContent = 'Releasing';
|
|
39
|
+
void ask({ kind: 'releaseAll' }).then(() => {
|
|
40
|
+
button.disabled = false;
|
|
41
|
+
button.textContent = 'Release all tabs';
|
|
42
|
+
return render();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
void render();
|
|
46
|
+
// Kept current while the popup is open: a tab can be released or driven from
|
|
47
|
+
// elsewhere, and a stale count here would be worse than no count.
|
|
48
|
+
setInterval(() => { void render(); }, 2_000);
|
|
49
|
+
export {};
|
package/extension/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"name": "Yoke",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.3",
|
|
5
5
|
"description": "Let MCP clients drive your signed in Chrome: tabs, page text, trusted input, screenshots, console, and network.",
|
|
6
6
|
"icons": {
|
|
7
7
|
"16": "icons/16.png",
|
|
@@ -9,6 +9,16 @@
|
|
|
9
9
|
"48": "icons/48.png",
|
|
10
10
|
"128": "icons/128.png"
|
|
11
11
|
},
|
|
12
|
+
"action": {
|
|
13
|
+
"default_popup": "popup.html",
|
|
14
|
+
"default_title": "Yoke",
|
|
15
|
+
"default_icon": {
|
|
16
|
+
"16": "icons/16.png",
|
|
17
|
+
"32": "icons/32.png",
|
|
18
|
+
"48": "icons/48.png",
|
|
19
|
+
"128": "icons/128.png"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
12
22
|
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyt9Vs20B0gvtrAGrHnM1tCwXLa8mtRp/GLfYqMwwIAg1osvEAzk+aAhBam4wYrVI0p6y97qgcp0diwi6zHx/9z5feuklqRtPbI+JJSdJIIUZfJTs06HPfdKvMFUyLeyTVeIIqOPqkNPNUrRRa7QrZ3iAPE3+zpBUbR/t9EeW5VPFW7pM+PPZ0Jnv7GyyrTWRQ5veA5Y0N0PTJK8uBUu8uVa863inuVyTxUCxslD76whBuR5GqjTkzl9T0CzZ0Oo5aTJm+0ni+LT4g6sQIEKRukAvL1rj+Y5tTD4K5hh/4+d/u2t07uDlE5iymW3xdiYJ+hBuXPSz2nj+OWV19iJcLwIDAQAB",
|
|
13
23
|
"minimum_chrome_version": "116",
|
|
14
24
|
"permissions": [
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<meta charset="utf-8">
|
|
2
|
+
<title>Yoke</title>
|
|
3
|
+
<style>
|
|
4
|
+
:root {
|
|
5
|
+
--ink: #14181a; --muted: #55646a; --faint: #8b9a9e;
|
|
6
|
+
--ground: #ffffff; --panel: #f7f9f9; --line: #e2e8e9;
|
|
7
|
+
--cyan: #0e8fa3; --warn: #a4642c;
|
|
8
|
+
}
|
|
9
|
+
@media (prefers-color-scheme: dark) {
|
|
10
|
+
:root {
|
|
11
|
+
--ink: #e8eaed; --muted: #9aa8ac; --faint: #6d7b7f;
|
|
12
|
+
--ground: #1c1f20; --panel: #24282a; --line: #33383a;
|
|
13
|
+
--cyan: #3cc7da; --warn: #e0a56d;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
* { box-sizing: border-box; }
|
|
17
|
+
body {
|
|
18
|
+
margin: 0; width: 320px; background: var(--ground); color: var(--ink);
|
|
19
|
+
font: 13px/1.5 system-ui, -apple-system, sans-serif;
|
|
20
|
+
}
|
|
21
|
+
header {
|
|
22
|
+
display: flex; align-items: center; gap: 8px;
|
|
23
|
+
padding: 12px 14px; border-bottom: 1px solid var(--line);
|
|
24
|
+
}
|
|
25
|
+
header svg { width: 18px; height: 18px; }
|
|
26
|
+
header b { font-size: 14px; font-weight: 640; letter-spacing: -.01em; }
|
|
27
|
+
header span { margin-left: auto; color: var(--faint); font-size: 11px;
|
|
28
|
+
font-family: ui-monospace, Menlo, monospace; }
|
|
29
|
+
section { padding: 12px 14px; border-bottom: 1px solid var(--line); }
|
|
30
|
+
section:last-of-type { border-bottom: 0; }
|
|
31
|
+
.state { display: flex; align-items: baseline; gap: 7px; font-weight: 600; }
|
|
32
|
+
.state::before {
|
|
33
|
+
content: ''; width: 7px; height: 7px; border-radius: 50%; flex: none;
|
|
34
|
+
transform: translateY(-1px);
|
|
35
|
+
}
|
|
36
|
+
.state.on::before { background: var(--cyan); }
|
|
37
|
+
.state.off::before { background: var(--faint); }
|
|
38
|
+
p { margin: 5px 0 0; color: var(--muted); }
|
|
39
|
+
.warn { color: var(--warn); font-weight: 600; }
|
|
40
|
+
code {
|
|
41
|
+
display: block; background: var(--panel); border: 1px solid var(--line);
|
|
42
|
+
border-radius: 5px; padding: 8px 10px; margin-top: 8px;
|
|
43
|
+
font: 12px/1.7 ui-monospace, Menlo, monospace; color: var(--ink);
|
|
44
|
+
white-space: pre; overflow-x: auto;
|
|
45
|
+
}
|
|
46
|
+
button {
|
|
47
|
+
margin-top: 10px; width: 100%; padding: 7px; border-radius: 6px;
|
|
48
|
+
border: 1px solid var(--line); background: var(--panel); color: var(--ink);
|
|
49
|
+
font: inherit; font-weight: 600; cursor: pointer;
|
|
50
|
+
}
|
|
51
|
+
button:hover:not(:disabled) { border-color: var(--cyan); color: var(--cyan); }
|
|
52
|
+
button:disabled { opacity: .55; cursor: default; }
|
|
53
|
+
a { color: var(--cyan); }
|
|
54
|
+
</style>
|
|
55
|
+
|
|
56
|
+
<header>
|
|
57
|
+
<svg viewBox="0 0 128 128" fill="none" stroke="var(--cyan)" stroke-width="16"
|
|
58
|
+
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
59
|
+
<path d="M24 24V64h80V24"/><path d="M64 64v40"/>
|
|
60
|
+
</svg>
|
|
61
|
+
<b>Yoke</b>
|
|
62
|
+
<span id="version"></span>
|
|
63
|
+
</header>
|
|
64
|
+
|
|
65
|
+
<section>
|
|
66
|
+
<div class="state off" id="state"><span id="state-text">Checking</span></div>
|
|
67
|
+
<p id="state-detail">Asking the local server whether it is running.</p>
|
|
68
|
+
</section>
|
|
69
|
+
|
|
70
|
+
<section id="setup" hidden>
|
|
71
|
+
<p>Yoke is two halves. Install the other one, then reload this extension:</p>
|
|
72
|
+
<code>npm install -g yoke-mcp
|
|
73
|
+
yoke install</code>
|
|
74
|
+
<p><a href="https://github.com/hamzahamidi/yoke#readme" target="_blank">Setup guide and troubleshooting</a></p>
|
|
75
|
+
</section>
|
|
76
|
+
|
|
77
|
+
<section>
|
|
78
|
+
<div id="driving" hidden>
|
|
79
|
+
<div class="warn" id="driving-text"></div>
|
|
80
|
+
<p id="driving-detail"></p>
|
|
81
|
+
<button id="release">Release all tabs</button>
|
|
82
|
+
</div>
|
|
83
|
+
<p id="idle" hidden>No tabs are being driven. Yoke does nothing until a client asks it to.</p>
|
|
84
|
+
</section>
|
|
85
|
+
|
|
86
|
+
<script type="module" src="browser/popup.js"></script>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yoke-mcp",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "MCP server for browser automation in the Chrome you are already signed in to,
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "MCP server for browser automation in the Chrome you are already signed in to. Every tab in every window, addressed by id.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"yoke": "dist/cli.js"
|
|
7
7
|
},
|
|
@@ -9,11 +9,13 @@
|
|
|
9
9
|
"dist/",
|
|
10
10
|
"!dist/*.sh",
|
|
11
11
|
"!dist/*.bat",
|
|
12
|
+
"!dist/store/",
|
|
12
13
|
"extension/",
|
|
13
14
|
"LICENSE",
|
|
14
15
|
"README.md",
|
|
15
16
|
"ROADMAP.md",
|
|
16
|
-
"MOTIVATION.md"
|
|
17
|
+
"MOTIVATION.md",
|
|
18
|
+
"PRIVACY.md"
|
|
17
19
|
],
|
|
18
20
|
"engines": {
|
|
19
21
|
"node": ">=22"
|
|
@@ -25,7 +27,9 @@
|
|
|
25
27
|
"lint": "tsc --noEmit",
|
|
26
28
|
"clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
27
29
|
"check:versions": "node scripts/check-versions.mjs",
|
|
28
|
-
"prepublishOnly": "npm run clean && npm run build && npm run check:versions"
|
|
30
|
+
"prepublishOnly": "npm run clean && npm run build && npm run check:versions",
|
|
31
|
+
"package": "npm run build && node scripts/package-extension.mjs",
|
|
32
|
+
"screenshot": "node scripts/render-screenshot.mjs"
|
|
29
33
|
},
|
|
30
34
|
"keywords": [
|
|
31
35
|
"mcp",
|