@extension.dev/mcp 4.3.0 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,7 @@
10
10
  "name": "extension-mcp",
11
11
  "source": "./",
12
12
  "description": "MCP tools for browser extension development: scaffold from 60+ templates, run the dev server with HMR, inspect the live DOM and logs, and publish store-ready builds for Chrome, Edge, and Firefox.",
13
- "version": "4.3.0",
13
+ "version": "4.5.0",
14
14
  "category": "development",
15
15
  "author": {
16
16
  "name": "Cezar Augusto"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "extension-mcp",
3
3
  "description": "MCP tools for browser extension development: scaffold from 60+ templates, run the dev server with HMR, inspect the live DOM and logs, and publish store-ready builds for Chrome, Edge, and Firefox. Ships /extension, /extension-add, /extension-debug, and /extension-publish commands.",
4
- "version": "4.3.0",
4
+ "version": "4.5.0",
5
5
  "author": {
6
6
  "name": "Cezar Augusto",
7
7
  "email": "boss@cezaraugusto.net",
@@ -24,7 +24,10 @@
24
24
  "mcpServers": {
25
25
  "extension-dev": {
26
26
  "command": "npx",
27
- "args": ["-y", "@extension.dev/mcp"]
27
+ "args": [
28
+ "-y",
29
+ "@extension.dev/mcp"
30
+ ]
28
31
  }
29
32
  }
30
33
  }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.5.0
4
+
5
+ The platform client (GitHub device-code login, the credential store, and the
6
+ publish flow) is now vendored directly in this package instead of the
7
+ separate `@extension.dev/core` dependency. No behavior change: the tool
8
+ schemas, the credential file, token resolution, and the publish error
9
+ envelopes are all unchanged. This drops a runtime dependency and the
10
+ two-package release step.
11
+
12
+ ## 4.4.0
13
+
14
+ Browser-matrix parity release: the tool surface now mirrors the engine
15
+ CLI flag for flag, and a 30th tool cleans up the managed browser cache.
16
+
17
+ - New tool `extension_uninstall_browser`. Removes a managed browser
18
+ binary from the Extension.js cache (or every one with `all: true`).
19
+ Only touches the managed cache, never system-installed browsers.
20
+ - Full Extension.js browser matrix in `extension_detect_browsers`: all
21
+ eleven supported browsers (chrome, chromium, edge, brave, opera,
22
+ vivaldi, yandex, firefox, waterfox, librewolf, safari) are probed,
23
+ each reported with its engine family and whether the managed
24
+ installer can provision it.
25
+ - Shared browser-launch flags on `extension_dev`, `extension_start`,
26
+ and `extension_preview`: `profile` (path, or `"false"` to reuse the
27
+ default user profile), `startingUrl`, `chromiumBinary` /
28
+ `geckoBinary` custom binaries, `host` / `publicHost` for Docker and
29
+ devcontainer splits, and companion `extensions` loaded alongside the
30
+ project.
31
+ - `extension_build` closes its gaps against the engine CLI:
32
+ `zipFilename`, `polyfill`, `silent`, and `mode`
33
+ (development/production/none, also sets NODE_ENV).
34
+ - Engine dependencies bumped to ^4.0.11.
35
+ - The shipped debugging docs are rewritten around the live inspect
36
+ surface.
37
+ - Release plumbing: npm publishes now carry provenance from a
38
+ changelog-backed GitHub workflow, the npm README renders the logo at
39
+ the right width via pack hooks, and the Safari web extension keyword
40
+ aids npm discovery.
41
+
3
42
  ## 4.3.0
4
43
 
5
44
  Diagnosis + version-skew release: a 29th tool that turns "an act tool
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Extension Dev
3
+ Copyright (c) Cezar Augusto and the extension.dev collaborators
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,15 +1,15 @@
1
- [npm-version-image]: https://img.shields.io/npm/v/%40extension.dev%2Fmcp.svg?color=0971fe
1
+ [npm-version-image]: https://img.shields.io/npm/v/%40extension.dev%2Fmcp.svg?color=26FFB8
2
2
  [npm-version-url]: https://www.npmjs.com/package/@extension.dev/mcp
3
- [npm-downloads-image]: https://img.shields.io/npm/dm/%40extension.dev%2Fmcp.svg?color=0971fe
3
+ [npm-downloads-image]: https://img.shields.io/npm/dm/%40extension.dev%2Fmcp.svg?color=26FFB8
4
4
  [npm-downloads-url]: https://www.npmjs.com/package/@extension.dev/mcp
5
- [discord-image]: https://img.shields.io/discord/1253608412890271755?label=Discord&logo=discord&style=flat&color=0971fe
5
+ [discord-image]: https://img.shields.io/discord/1253608412890271755?label=Discord&logo=discord&style=flat&color=26FFB8
6
6
  [discord-url]: https://discord.gg/v9h2RgeTSN
7
7
 
8
8
  # @extension.dev/mcp [![Version][npm-version-image]][npm-version-url] [![Downloads][npm-downloads-image]][npm-downloads-url] [![Discord][discord-image]][discord-url]
9
9
 
10
- > Give your AI agent hands for browser extension development. 29 MCP tools that scaffold, run, inspect, debug, and publish cross-browser extensions.
10
+ > Give your AI agent hands for browser extension development. 30 MCP tools that scaffold, run, inspect, debug, and publish cross-browser extensions.
11
11
 
12
- <img alt="Logo" align="right" src="https://avatars.githubusercontent.com/u/106714027" width="20%" />
12
+ <img alt="Logo" align="right" src="https://media.extension.land/brand/extension-dev/logo-dock.png" width="15.5%" />
13
13
 
14
14
  ```bash
15
15
  claude mcp add extension-dev npx @extension.dev/mcp
@@ -26,7 +26,7 @@ Extensions fail silently: content scripts that never inject, panels that never o
26
26
  These tools give agents eyes on the live browser, so they debug from evidence instead of guessing:
27
27
 
28
28
  - **Scaffold** from the 60+ template catalog behind [templates.extension.dev](https://templates.extension.dev), or add a popup, sidebar, or content script to an existing project
29
- - **Run** the dev server with HMR in Chrome, Edge, Firefox, or any managed browser binary, no build config
29
+ - **Run** the dev server with HMR in Chrome, Edge, Firefox, Safari, Brave, Opera, Vivaldi, Yandex, Waterfox, LibreWolf, or any Chromium- or Gecko-based binary, no build config
30
30
  - **See** the live DOM, unified logs from every extension context, `chrome.storage` contents, and the loaded-extension list
31
31
  - **Act**: evaluate code in any context, trigger the action button and commands, reload the extension, replay events
32
32
  - **Ship**: validate the manifest cross-browser, build for production, publish a shareable preview, and promote builds to release channels headlessly
@@ -113,6 +113,7 @@ cp node_modules/@extension.dev/mcp/claude/commands/*.md ~/my-extension/.claude/c
113
113
  | act | `extension_reload` | Reload extension or tab |
114
114
  | act | `extension_open` | Open a surface / trigger `action`, `command` |
115
115
  | browsers | `extension_install_browser` | Install a managed browser binary |
116
+ | browsers | `extension_uninstall_browser` | Remove a managed browser binary |
116
117
  | browsers | `extension_list_browsers` | List managed browsers |
117
118
  | browsers | `extension_detect_browsers` | Detect system browsers |
118
119
  | platform | `extension_login` | GitHub device-code login, stored token |
@@ -133,7 +134,6 @@ The four platform tools connect agents to [extension.dev](https://extension.dev)
133
134
  | --- | --- |
134
135
  | [`@extension.dev/skill`](https://www.npmjs.com/package/@extension.dev/skill) | Teach AI agents the judgment half: cross-browser rules, gotchas, playbooks |
135
136
  | [`@extension.dev/deploy`](https://www.npmjs.com/package/@extension.dev/deploy) | Ship to Chrome, Firefox, and Edge stores from CI |
136
- | [`@extension.dev/core`](https://www.npmjs.com/package/@extension.dev/core) | Authenticate and publish to the extension.dev platform |
137
137
 
138
138
  All of it rides on [Extension.js](https://github.com/extension-js/extension.js), the open-source cross-browser extension framework.
139
139
 
@@ -145,4 +145,4 @@ All of it rides on [Extension.js](https://github.com/extension-js/extension.js),
145
145
 
146
146
  ## License
147
147
 
148
- MIT (c) Cezar Augusto and the Extension.js authors.
148
+ MIT (c) Cezar Augusto and the extension.dev collaborators
@@ -1,4 +1,11 @@
1
1
  #!/usr/bin/env node
2
+ // ███╗ ███╗ ██████╗██████╗
3
+ // ████╗ ████║██╔════╝██╔══██╗
4
+ // ██╔████╔██║██║ ██████╔╝
5
+ // ██║╚██╔╝██║██║ ██╔═══╝
6
+ // ██║ ╚═╝ ██║╚██████╗██║
7
+ // ╚═╝ ╚═╝ ╚═════╝╚═╝
8
+ // MIT License (c) Cezar Augusto and the extension.dev collaborators
2
9
  import {startServer, runCli} from '../dist/module.js'
3
10
 
4
11
  const [, , cmd, ...rest] = process.argv
package/claude/CLAUDE.md CHANGED
@@ -170,52 +170,42 @@ https://github.com/extension-js/examples/tree/main/examples/<slug>/src
170
170
 
171
171
  ## When debugging
172
172
 
173
- ### Source inspection (`--source`)
173
+ ### Live DOM inspection (`extension inspect` / MCP inspect tools)
174
174
 
175
- The `--source` flag on `dev` gives live DOM inspection of a running extension:
175
+ Two ways to see inside a running extension. Both need an active dev session.
176
176
 
177
- ```bash
178
- # Basic: see injected HTML after content scripts run
179
- npm run dev -- --source https://example.com
177
+ **Agent bridge (CDP-free, localhost): `extension inspect`.** Requires the session to be started with `--allow-control` (or `allowControl: true` on the `extension_dev` MCP tool). Sees open shadow roots but not closed ones.
180
178
 
181
- # Structured JSON output (best for programmatic use)
182
- npm run dev -- --source https://example.com --source-format json
179
+ ```bash
180
+ # Structured summary of the content-script DOM in a tab
181
+ extension inspect --tab 1
183
182
 
184
- # Probe specific selectors
185
- npm run dev -- --source https://example.com --source-probe "#my-root,.sidebar"
183
+ # Inspect an open extension surface instead of a tab
184
+ extension inspect --context popup
186
185
 
187
- # Full inspection: DOM snapshots, console summary, diffs on rebuild
188
- npm run dev -- --source https://example.com --source-dom --source-console --source-diff
186
+ # Include byte-capped HTML plus the last 20 console lines
187
+ extension inspect --tab 1 --include summary,html --with-console 20
189
188
  ```
190
189
 
191
- **Available --source sub-flags:**
192
-
193
- | Flag | Default | Purpose |
194
- | ---------------------------- | --------- | ------------------------------------------------- |
195
- | `--source [url]` | | Open URL and print live HTML after injection |
196
- | `--watch-source` | true | Re-print on rebuilds |
197
- | `--source-format` | json | Output format: `pretty`, `json`, `ndjson` |
198
- | `--source-summary` | auto | Compact stats instead of full HTML |
199
- | `--source-meta` | auto | Page metadata: readyState, viewport, frames |
200
- | `--source-probe <selectors>` | — | CSS selectors to query (comma-separated) |
201
- | `--source-tree` | off | Extension root DOM tree: `off`, `root-only` |
202
- | `--source-console` | auto | Console counts: error/warn/info/log/debug |
203
- | `--source-dom` | auto | DOM snapshots and structural diffs |
204
- | `--source-max-bytes` | 256KB | Truncate HTML output (0 = unlimited) |
205
- | `--source-redact` | safe | Redact sensitive content: `off`, `safe`, `strict` |
206
- | `--source-include-shadow` | open-only | Shadow DOM: `off`, `open-only`, `all` |
207
- | `--source-diff` | auto | Include diff metadata on watch updates |
208
-
209
- **Output event types** (in JSON/NDJSON format):
210
-
211
- - `page_html` — full injected HTML
212
- - `page_html_summary` — root/script/style/link counts
213
- - `page_meta` — readyState, viewport, frame count
214
- - `dom_snapshot` — structured tree (tag, id, classes, role, max 500 nodes)
215
- - `dom_diff` — added/removed/changed between rebuilds
216
- - `console_summary` — error/warn counts + top 5 unique messages
217
- - `selector_probe` — per-selector element counts and samples
218
- - `extension_root_tree` — extension root elements with reinject generations
190
+ | Flag | Default | Purpose |
191
+ | -------------------- | ------- | ---------------------------------------------------------------------------------------------- |
192
+ | `--context <name>` | content | `content`/`page` (needs `--tab`) or an open surface: `popup`, `options`, `sidebar`, `devtools` |
193
+ | `--tab <id>` | - | Tab id to inspect (required for content/page) |
194
+ | `--include <list>` | summary | Comma-separated: `summary`, `html` (html is byte-capped) |
195
+ | `--max-bytes <n>` | 262144 | Cap on returned HTML bytes |
196
+ | `--with-console [n]` | 20 | Also include the last n console lines for the target |
197
+
198
+ The `extension_dom_inspect` MCP tool wraps this verb one-to-one.
199
+
200
+ **Debugging protocol (Chromium CDP): `extension_source_inspect` MCP tool.** Connects directly to the running session's debug port. Use it when the bridge is not enough: closed shadow roots (`deepDom`), selector probes, DOM snapshots, console summaries, or navigating the tab to a URL before inspecting. Returns structured events:
201
+
202
+ - `page_html` - full injected HTML (after content scripts run)
203
+ - `page_html_summary` - root/script/style/link counts
204
+ - `page_meta` - readyState, viewport, frame count
205
+ - `dom_snapshot` - structured tree (tag, id, classes, role, max 500 nodes)
206
+ - `console_summary` - error/warn counts + top 5 unique messages
207
+ - `selector_probe` - per-selector element counts and samples
208
+ - `extension_root_tree` - extension root elements with reinject generations
219
209
 
220
210
  ### Unified logging (`--logs`)
221
211
 
@@ -20,9 +20,8 @@ Debug the currently running extension dev session. The user said: $ARGUMENTS
20
20
  - Report the results in a structured way
21
21
 
22
22
  If MCP is not available:
23
- - Suggest the CLI equivalent: `npx extension dev --source <url> --source-format json --source-console`
24
- - Read `dist/extension-js/chrome/ready.json` to get the CDP port
25
- - Report the port and suggest Chrome DevTools inspection
23
+ - If the session was started with `--allow-control`, suggest the CLI equivalent: `npx extension inspect --tab <id> --include summary,html --with-console 20`
24
+ - Otherwise read `dist/extension-js/chrome/ready.json` to get the CDP port and suggest Chrome DevTools inspection
26
25
 
27
26
  3. **Exercise event handlers (when the bug is in an action / command / shortcut)**
28
27
  If the session was started with `--allow-control`, fire the events a user would, without clicking:
@@ -164,7 +164,7 @@ These map directly to existing programmatic APIs and provide immediate value.
164
164
  },
165
165
  "browser": {
166
166
  "type": "string",
167
- "enum": ["chrome", "edge", "firefox", "chromium-based", "gecko-based"],
167
+ "enum": ["chrome", "chromium", "edge", "brave", "opera", "vivaldi", "yandex", "firefox", "waterfox", "librewolf", "safari", "chromium-based", "gecko-based", "firefox-based", "webkit-based"],
168
168
  "default": "chrome",
169
169
  "description": "Target browser"
170
170
  },
@@ -186,6 +186,8 @@ These map directly to existing programmatic APIs and provide immediate value.
186
186
 
187
187
  **Returns:** `{ outputPath, duration, zipPath?, warnings[] }`
188
188
 
189
+ `extension_build` also accepts `zipFilename` (string), `polyfill` (boolean, default false), `silent` (boolean), and `mode` (`development` | `production` | `none`, default `production`).
190
+
189
191
  ---
190
192
 
191
193
  #### `extension_dev`
@@ -207,7 +209,7 @@ These map directly to existing programmatic APIs and provide immediate value.
207
209
  },
208
210
  "browser": {
209
211
  "type": "string",
210
- "enum": ["chrome", "edge", "firefox", "chromium-based", "gecko-based"],
212
+ "enum": ["chrome", "chromium", "edge", "brave", "opera", "vivaldi", "yandex", "firefox", "waterfox", "librewolf", "safari", "chromium-based", "gecko-based", "firefox-based", "webkit-based"],
211
213
  "default": "chrome"
212
214
  },
213
215
  "port": {
@@ -218,7 +220,21 @@ These map directly to existing programmatic APIs and provide immediate value.
218
220
  "type": "boolean",
219
221
  "default": false,
220
222
  "description": "Start dev server without launching browser"
221
- }
223
+ },
224
+ "polyfill": {
225
+ "type": "boolean",
226
+ "default": true,
227
+ "description": "Apply cross-browser polyfill"
228
+ },
229
+ "profile": { "type": "string", "description": "Browser profile path, or \"false\" for the default user profile" },
230
+ "startingUrl": { "type": "string", "description": "URL the browser opens on launch" },
231
+ "chromiumBinary": { "type": "string", "description": "Custom Chromium-based binary path" },
232
+ "geckoBinary": { "type": "string", "description": "Custom Gecko/Firefox binary path" },
233
+ "host": { "type": "string", "description": "Bind host (0.0.0.0 for Docker); default 127.0.0.1" },
234
+ "publicHost": { "type": "string", "description": "Connectable host for HMR/reload when it differs from the bind host" },
235
+ "extensions": { "type": "array", "items": { "type": "string" }, "description": "Companion extension paths or store URLs" },
236
+ "allowControl": { "type": "boolean", "default": false, "description": "Enable the agent-bridge control channel" },
237
+ "allowEval": { "type": "boolean", "default": false, "description": "Additionally enable extension_eval" }
222
238
  },
223
239
  "required": ["projectPath"]
224
240
  }
@@ -248,7 +264,7 @@ These map directly to existing programmatic APIs and provide immediate value.
248
264
  },
249
265
  "browser": {
250
266
  "type": "string",
251
- "enum": ["chrome", "edge", "firefox", "chromium-based", "gecko-based"],
267
+ "enum": ["chrome", "chromium", "edge", "brave", "opera", "vivaldi", "yandex", "firefox", "waterfox", "librewolf", "safari", "chromium-based", "gecko-based", "firefox-based", "webkit-based"],
252
268
  "default": "chrome"
253
269
  },
254
270
  "polyfill": {
@@ -274,6 +290,8 @@ These map directly to existing programmatic APIs and provide immediate value.
274
290
 
275
291
  **Returns:** When `wait: true`, returns the `ready.json` contract: `{ status, browser, port, pid, distPath, manifestPath, compiledAt }`. Otherwise returns `{ pid, browser }`.
276
292
 
293
+ Both `extension_start` and `extension_preview` also accept `port`, `noBrowser`, and the shared launch flags: `profile`, `startingUrl`, `chromiumBinary`, `geckoBinary`, `host`, `publicHost`, `extensions` (same shapes as on `extension_dev`).
294
+
277
295
  **Why this is distinct from dev:** `dev` uses HMR and watches files. `start` builds once in production mode and launches — what you'd use to verify a production build works before publishing.
278
296
 
279
297
  ---
@@ -297,7 +315,7 @@ These map directly to existing programmatic APIs and provide immediate value.
297
315
  },
298
316
  "browser": {
299
317
  "type": "string",
300
- "enum": ["chrome", "edge", "firefox", "chromium-based", "gecko-based"],
318
+ "enum": ["chrome", "chromium", "edge", "brave", "opera", "vivaldi", "yandex", "firefox", "waterfox", "librewolf", "safari", "chromium-based", "gecko-based", "firefox-based", "webkit-based"],
301
319
  "default": "chrome"
302
320
  }
303
321
  },
@@ -390,7 +408,7 @@ The `similarTemplates` field lists templates from the catalog with similar surfa
390
408
 
391
409
  #### `extension_inspect`
392
410
 
393
- **Source:** New tool wraps `--source` inspection from `programs/develop`
411
+ **Source:** New tool; static analysis of the built `dist/` output
394
412
 
395
413
  **Purpose:** Analyze a built extension's structure, size, and entry points.
396
414
 
@@ -474,7 +492,7 @@ The `similarTemplates` field lists templates from the catalog with similar surfa
474
492
 
475
493
  **Source:** `programs/extension/browsers/` → CDP/RDP source inspection system
476
494
 
477
- **Purpose:** Live-inspect a running extension's DOM, console, and content script injection state. This is the `--source` system exposed as an MCP tool it gives Claude _eyes_ into the running extension.
495
+ **Purpose:** Live-inspect a running extension's DOM, console, and content script injection state over the debugging protocol. It gives Claude _eyes_ into the running extension. (This grew out of the engine's old `dev --source` CLI flags, which are no longer registered; the MCP connects to the CDP port directly.)
478
496
 
479
497
  ```json
480
498
  {
@@ -500,7 +518,7 @@ The `similarTemplates` field lists templates from the catalog with similar surfa
500
518
  "type": "array",
501
519
  "items": {
502
520
  "type": "string",
503
- "enum": ["html", "summary", "meta", "dom_snapshot", "console", "tree"]
521
+ "enum": ["html", "summary", "meta", "dom_snapshot", "console", "extension_roots"]
504
522
  },
505
523
  "default": ["summary", "meta", "console"],
506
524
  "description": "What data to return"
@@ -537,17 +555,17 @@ The `similarTemplates` field lists templates from the catalog with similar surfa
537
555
  }
538
556
  ```
539
557
 
540
- **Returns:** Structured NDJSON events based on `include` selection:
558
+ **Returns:** One JSON object; keys appear based on `include` selection:
541
559
 
542
- | Event type | What it contains |
543
- | --------------------- | ------------------------------------------------------------------------------------------ |
544
- | `page_html` | Full injected HTML (after content scripts run) |
545
- | `page_html_summary` | Compact stats: root/script/style/link counts |
546
- | `page_meta` | readyState, viewport dimensions, frame count |
547
- | `dom_snapshot` | Structured tree: tag, id, classes, role, text length, child count (max 500 nodes, depth 6) |
548
- | `console_summary` | error/warn/info/log/debug counts + top 5 unique messages |
549
- | `extension_root_tree` | Extension root elements with reinject generations |
550
- | `selector_probe` | Per-selector: count + element samples |
560
+ | Key | What it contains |
561
+ | ---------------- | ------------------------------------------------------------------------------------------ |
562
+ | `html` | Full injected HTML (after content scripts run), `htmlTruncated` flag when capped |
563
+ | `summary` | Compact stats: html length, script/style/link counts, extension root + body child counts |
564
+ | `meta` | readyState, viewport dimensions, frame count |
565
+ | `domSnapshot` | Structured tree: tag, id, classes, role, text length, child count (max 500 nodes, depth 6) |
566
+ | `console` | error/warn/info/log/debug counts + top 5 unique messages |
567
+ | `extensionRoots` | Extension root elements with reinject generations |
568
+ | `probes` | Per-selector: count + element samples (when `probe` selectors are passed) |
551
569
 
552
570
  **Implementation:**
553
571
 
@@ -744,6 +762,38 @@ The `similarTemplates` field lists templates from the catalog with similar surfa
744
762
 
745
763
  ---
746
764
 
765
+ #### `extension_uninstall_browser`
766
+
767
+ **Source:** `extension-install` → `extensionUninstall()`
768
+
769
+ **Purpose:** Remove a managed browser binary from the Extension.js cache (never system-installed browsers).
770
+
771
+ ```json
772
+ {
773
+ "name": "extension_uninstall_browser",
774
+ "inputSchema": {
775
+ "type": "object",
776
+ "properties": {
777
+ "browser": {
778
+ "type": "string",
779
+ "enum": ["chrome", "chromium", "edge", "firefox"],
780
+ "description": "Managed browser to remove"
781
+ },
782
+ "all": {
783
+ "type": "boolean",
784
+ "default": false,
785
+ "description": "Remove every managed browser binary"
786
+ }
787
+ },
788
+ "required": []
789
+ }
790
+ }
791
+ ```
792
+
793
+ **Returns:** `{ status, target, duration }`
794
+
795
+ ---
796
+
747
797
  ## Where each tool lives in the codebase
748
798
 
749
799
  | MCP Tool | Program | Source API | Data source | Needs new code? |