From c63a09d43e823e59bfabad8da3aceb2cfd3c7d5f Mon Sep 17 00:00:00 2001 From: Asish Kumar Date: Sat, 11 Apr 2026 20:14:00 +0000 Subject: [PATCH 1/4] feat: generate plugin configuration options --- .claude-plugin/plugin.json | 214 ++++++++++++++++++++- .github/plugin/plugin.json | 214 ++++++++++++++++++++- README.md | 16 ++ package.json | 3 +- scripts/generate-plugin-config.ts | 113 +++++++++++ src/bin/chrome-devtools-mcp-cli-options.ts | 65 +++++++ 6 files changed, 622 insertions(+), 3 deletions(-) create mode 100644 scripts/generate-plugin-config.ts diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 08f3e3dda..9c004e06b 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -7,7 +7,219 @@ "command": "npx", "args": [ "chrome-devtools-mcp@latest" - ] + ], + "env": { + "CHROME_DEVTOOLS_MCP_AUTO_CONNECT": "${user_config.autoConnect}", + "CHROME_DEVTOOLS_MCP_BROWSER_URL": "${user_config.browserUrl}", + "CHROME_DEVTOOLS_MCP_WS_ENDPOINT": "${user_config.wsEndpoint}", + "CHROME_DEVTOOLS_MCP_WS_HEADERS": "${user_config.wsHeaders}", + "CHROME_DEVTOOLS_MCP_HEADLESS": "${user_config.headless}", + "CHROME_DEVTOOLS_MCP_EXECUTABLE_PATH": "${user_config.executablePath}", + "CHROME_DEVTOOLS_MCP_ISOLATED": "${user_config.isolated}", + "CHROME_DEVTOOLS_MCP_USER_DATA_DIR": "${user_config.userDataDir}", + "CHROME_DEVTOOLS_MCP_CHANNEL": "${user_config.channel}", + "CHROME_DEVTOOLS_MCP_LOG_FILE": "${user_config.logFile}", + "CHROME_DEVTOOLS_MCP_VIEWPORT": "${user_config.viewport}", + "CHROME_DEVTOOLS_MCP_PROXY_SERVER": "${user_config.proxyServer}", + "CHROME_DEVTOOLS_MCP_ACCEPT_INSECURE_CERTS": "${user_config.acceptInsecureCerts}", + "CHROME_DEVTOOLS_MCP_EXPERIMENTAL_VISION": "${user_config.experimentalVision}", + "CHROME_DEVTOOLS_MCP_EXPERIMENTAL_SCREENCAST": "${user_config.experimentalScreencast}", + "CHROME_DEVTOOLS_MCP_EXPERIMENTAL_FFMPEG_PATH": "${user_config.experimentalFfmpegPath}", + "CHROME_DEVTOOLS_MCP_CATEGORY_EXPERIMENTAL_WEBMCP": "${user_config.categoryExperimentalWebmcp}", + "CHROME_DEVTOOLS_MCP_CHROME_ARG": "${user_config.chromeArg}", + "CHROME_DEVTOOLS_MCP_IGNORE_DEFAULT_CHROME_ARG": "${user_config.ignoreDefaultChromeArg}", + "CHROME_DEVTOOLS_MCP_CATEGORY_EMULATION": "${user_config.categoryEmulation}", + "CHROME_DEVTOOLS_MCP_CATEGORY_PERFORMANCE": "${user_config.categoryPerformance}", + "CHROME_DEVTOOLS_MCP_CATEGORY_NETWORK": "${user_config.categoryNetwork}", + "CHROME_DEVTOOLS_MCP_CATEGORY_EXTENSIONS": "${user_config.categoryExtensions}", + "CHROME_DEVTOOLS_MCP_CATEGORY_EXPERIMENTAL_THIRD_PARTY": "${user_config.categoryExperimentalThirdParty}", + "CHROME_DEVTOOLS_MCP_PERFORMANCE_CRUX": "${user_config.performanceCrux}", + "CHROME_DEVTOOLS_MCP_USAGE_STATISTICS": "${user_config.usageStatistics}", + "CHROME_DEVTOOLS_MCP_SLIM": "${user_config.slim}", + "CHROME_DEVTOOLS_MCP_REDACT_NETWORK_HEADERS": "${user_config.redactNetworkHeaders}" + } + } + }, + "userConfig": { + "autoConnect": { + "type": "boolean", + "title": "Auto Connect", + "description": "If specified, automatically connects to a browser (Chrome 144+) running locally from the user data directory identified by the channel param (default channel is stable). Requires the remote debugging server to be started in the Chrome instance via chrome://inspect/#remote-debugging.", + "sensitive": false, + "default": false + }, + "browserUrl": { + "type": "string", + "title": "Browser URL", + "description": "Connect to a running, debuggable Chrome instance (e.g. `http://127.0.0.1:9222`). For more details see: https://github.com/ChromeDevTools/chrome-devtools-mcp#connecting-to-a-running-chrome-instance.", + "sensitive": false + }, + "wsEndpoint": { + "type": "string", + "title": "WebSocket Endpoint", + "description": "WebSocket endpoint to connect to a running Chrome instance (e.g., ws://127.0.0.1:9222/devtools/browser/). Alternative to --browserUrl.", + "sensitive": false + }, + "wsHeaders": { + "type": "string", + "title": "WebSocket Headers", + "description": "Custom headers for WebSocket connection in JSON format (e.g., '{\"Authorization\":\"Bearer token\"}'). Only works with --wsEndpoint.", + "sensitive": false + }, + "headless": { + "type": "boolean", + "title": "Headless", + "description": "Whether to run in headless (no UI) mode.", + "sensitive": false, + "default": false + }, + "executablePath": { + "type": "string", + "title": "Executable Path", + "description": "Path to custom Chrome executable.", + "sensitive": false + }, + "isolated": { + "type": "boolean", + "title": "Isolated", + "description": "If specified, creates a temporary user-data-dir that is automatically cleaned up after the browser is closed. Defaults to false.", + "sensitive": false + }, + "userDataDir": { + "type": "string", + "title": "User Data Dir", + "description": "Path to the user data directory for Chrome. Default is $HOME/.cache/chrome-devtools-mcp/chrome-profile$CHANNEL_SUFFIX_IF_NON_STABLE", + "sensitive": false + }, + "channel": { + "type": "string", + "title": "Channel", + "description": "Specify a different Chrome channel that should be used. The default is the stable channel version.", + "sensitive": false + }, + "logFile": { + "type": "string", + "title": "Log File", + "description": "Path to a file to write debug logs to. Set the env variable `DEBUG` to `*` to enable verbose logs. Useful for submitting bug reports.", + "sensitive": false + }, + "viewport": { + "type": "string", + "title": "Viewport", + "description": "Initial viewport size for the Chrome instances started by the server. For example, `1280x720`. In headless mode, max size is 3840x2160px.", + "sensitive": false + }, + "proxyServer": { + "type": "string", + "title": "Proxy Server", + "description": "Proxy server configuration for Chrome passed as --proxy-server when launching the browser. See https://www.chromium.org/developers/design-documents/network-settings/ for details.", + "sensitive": false + }, + "acceptInsecureCerts": { + "type": "boolean", + "title": "Accept Insecure Certs", + "description": "If enabled, ignores errors relative to self-signed and expired certificates. Use with caution.", + "sensitive": false + }, + "experimentalVision": { + "type": "boolean", + "title": "Experimental Vision", + "description": "Whether to enable coordinate-based tools such as click_at(x,y). Usually requires a computer-use model able to produce accurate coordinates by looking at screenshots.", + "sensitive": false + }, + "experimentalScreencast": { + "type": "boolean", + "title": "Experimental Screencast", + "description": "Exposes experimental screencast tools (requires ffmpeg). Install ffmpeg https://www.ffmpeg.org/download.html and ensure it is available in the MCP server PATH.", + "sensitive": false + }, + "experimentalFfmpegPath": { + "type": "string", + "title": "Experimental FFmpeg Path", + "description": "Path to ffmpeg executable for screencast recording.", + "sensitive": false + }, + "categoryExperimentalWebmcp": { + "type": "boolean", + "title": "Category Experimental WebMCP", + "description": "Set to true to enable debugging WebMCP tools. Requires Chrome 149+ with the following flags: `--enable-features=WebMCPTesting,DevToolsWebMCPSupport`", + "sensitive": false + }, + "chromeArg": { + "type": "string", + "title": "Chrome Arg", + "description": "Additional arguments for Chrome. Only applies when Chrome is launched by chrome-devtools-mcp.", + "sensitive": false, + "multiple": true + }, + "ignoreDefaultChromeArg": { + "type": "string", + "title": "Ignore Default Chrome Arg", + "description": "Explicitly disable default arguments for Chrome. Only applies when Chrome is launched by chrome-devtools-mcp.", + "sensitive": false, + "multiple": true + }, + "categoryEmulation": { + "type": "boolean", + "title": "Category Emulation", + "description": "Set to false to exclude tools related to emulation.", + "sensitive": false, + "default": true + }, + "categoryPerformance": { + "type": "boolean", + "title": "Category Performance", + "description": "Set to false to exclude tools related to performance.", + "sensitive": false, + "default": true + }, + "categoryNetwork": { + "type": "boolean", + "title": "Category Network", + "description": "Set to false to exclude tools related to network.", + "sensitive": false, + "default": true + }, + "categoryExtensions": { + "type": "boolean", + "title": "Category Extensions", + "description": "Set to true to include tools related to extensions. Note: This feature is currently only supported with a pipe connection. autoConnect, browserUrl, and wsEndpoint are not supported with this feature until 149 will be released.", + "sensitive": false, + "default": false + }, + "categoryExperimentalThirdParty": { + "type": "boolean", + "title": "Category Experimental Third Party", + "description": "Set to true to enable third-party developer tools exposed by the inspected page itself", + "sensitive": false, + "default": false + }, + "performanceCrux": { + "type": "boolean", + "title": "Performance Crux", + "description": "Set to false to disable sending URLs from performance traces to CrUX API to get field performance data.", + "sensitive": false, + "default": true + }, + "usageStatistics": { + "type": "boolean", + "title": "Usage Statistics", + "description": "Set to false to opt-out of usage statistics collection. Google collects usage data to improve the tool, handled under the Google Privacy Policy (https://policies.google.com/privacy). This is independent from Chrome browser metrics. Disabled if `CHROME_DEVTOOLS_MCP_NO_USAGE_STATISTICS` or `CI` env variables are set.", + "sensitive": false, + "default": true + }, + "slim": { + "type": "boolean", + "title": "Slim", + "description": "Exposes a \"slim\" set of 3 tools covering navigation, script execution and screenshots only. Useful for basic browser tasks.", + "sensitive": false + }, + "redactNetworkHeaders": { + "type": "boolean", + "title": "Redact Network Headers", + "description": "If true, redacts some of the network headers considered senstive before returning to the client.", + "sensitive": false, + "default": false } } } diff --git a/.github/plugin/plugin.json b/.github/plugin/plugin.json index 08f3e3dda..9c004e06b 100644 --- a/.github/plugin/plugin.json +++ b/.github/plugin/plugin.json @@ -7,7 +7,219 @@ "command": "npx", "args": [ "chrome-devtools-mcp@latest" - ] + ], + "env": { + "CHROME_DEVTOOLS_MCP_AUTO_CONNECT": "${user_config.autoConnect}", + "CHROME_DEVTOOLS_MCP_BROWSER_URL": "${user_config.browserUrl}", + "CHROME_DEVTOOLS_MCP_WS_ENDPOINT": "${user_config.wsEndpoint}", + "CHROME_DEVTOOLS_MCP_WS_HEADERS": "${user_config.wsHeaders}", + "CHROME_DEVTOOLS_MCP_HEADLESS": "${user_config.headless}", + "CHROME_DEVTOOLS_MCP_EXECUTABLE_PATH": "${user_config.executablePath}", + "CHROME_DEVTOOLS_MCP_ISOLATED": "${user_config.isolated}", + "CHROME_DEVTOOLS_MCP_USER_DATA_DIR": "${user_config.userDataDir}", + "CHROME_DEVTOOLS_MCP_CHANNEL": "${user_config.channel}", + "CHROME_DEVTOOLS_MCP_LOG_FILE": "${user_config.logFile}", + "CHROME_DEVTOOLS_MCP_VIEWPORT": "${user_config.viewport}", + "CHROME_DEVTOOLS_MCP_PROXY_SERVER": "${user_config.proxyServer}", + "CHROME_DEVTOOLS_MCP_ACCEPT_INSECURE_CERTS": "${user_config.acceptInsecureCerts}", + "CHROME_DEVTOOLS_MCP_EXPERIMENTAL_VISION": "${user_config.experimentalVision}", + "CHROME_DEVTOOLS_MCP_EXPERIMENTAL_SCREENCAST": "${user_config.experimentalScreencast}", + "CHROME_DEVTOOLS_MCP_EXPERIMENTAL_FFMPEG_PATH": "${user_config.experimentalFfmpegPath}", + "CHROME_DEVTOOLS_MCP_CATEGORY_EXPERIMENTAL_WEBMCP": "${user_config.categoryExperimentalWebmcp}", + "CHROME_DEVTOOLS_MCP_CHROME_ARG": "${user_config.chromeArg}", + "CHROME_DEVTOOLS_MCP_IGNORE_DEFAULT_CHROME_ARG": "${user_config.ignoreDefaultChromeArg}", + "CHROME_DEVTOOLS_MCP_CATEGORY_EMULATION": "${user_config.categoryEmulation}", + "CHROME_DEVTOOLS_MCP_CATEGORY_PERFORMANCE": "${user_config.categoryPerformance}", + "CHROME_DEVTOOLS_MCP_CATEGORY_NETWORK": "${user_config.categoryNetwork}", + "CHROME_DEVTOOLS_MCP_CATEGORY_EXTENSIONS": "${user_config.categoryExtensions}", + "CHROME_DEVTOOLS_MCP_CATEGORY_EXPERIMENTAL_THIRD_PARTY": "${user_config.categoryExperimentalThirdParty}", + "CHROME_DEVTOOLS_MCP_PERFORMANCE_CRUX": "${user_config.performanceCrux}", + "CHROME_DEVTOOLS_MCP_USAGE_STATISTICS": "${user_config.usageStatistics}", + "CHROME_DEVTOOLS_MCP_SLIM": "${user_config.slim}", + "CHROME_DEVTOOLS_MCP_REDACT_NETWORK_HEADERS": "${user_config.redactNetworkHeaders}" + } + } + }, + "userConfig": { + "autoConnect": { + "type": "boolean", + "title": "Auto Connect", + "description": "If specified, automatically connects to a browser (Chrome 144+) running locally from the user data directory identified by the channel param (default channel is stable). Requires the remote debugging server to be started in the Chrome instance via chrome://inspect/#remote-debugging.", + "sensitive": false, + "default": false + }, + "browserUrl": { + "type": "string", + "title": "Browser URL", + "description": "Connect to a running, debuggable Chrome instance (e.g. `http://127.0.0.1:9222`). For more details see: https://github.com/ChromeDevTools/chrome-devtools-mcp#connecting-to-a-running-chrome-instance.", + "sensitive": false + }, + "wsEndpoint": { + "type": "string", + "title": "WebSocket Endpoint", + "description": "WebSocket endpoint to connect to a running Chrome instance (e.g., ws://127.0.0.1:9222/devtools/browser/). Alternative to --browserUrl.", + "sensitive": false + }, + "wsHeaders": { + "type": "string", + "title": "WebSocket Headers", + "description": "Custom headers for WebSocket connection in JSON format (e.g., '{\"Authorization\":\"Bearer token\"}'). Only works with --wsEndpoint.", + "sensitive": false + }, + "headless": { + "type": "boolean", + "title": "Headless", + "description": "Whether to run in headless (no UI) mode.", + "sensitive": false, + "default": false + }, + "executablePath": { + "type": "string", + "title": "Executable Path", + "description": "Path to custom Chrome executable.", + "sensitive": false + }, + "isolated": { + "type": "boolean", + "title": "Isolated", + "description": "If specified, creates a temporary user-data-dir that is automatically cleaned up after the browser is closed. Defaults to false.", + "sensitive": false + }, + "userDataDir": { + "type": "string", + "title": "User Data Dir", + "description": "Path to the user data directory for Chrome. Default is $HOME/.cache/chrome-devtools-mcp/chrome-profile$CHANNEL_SUFFIX_IF_NON_STABLE", + "sensitive": false + }, + "channel": { + "type": "string", + "title": "Channel", + "description": "Specify a different Chrome channel that should be used. The default is the stable channel version.", + "sensitive": false + }, + "logFile": { + "type": "string", + "title": "Log File", + "description": "Path to a file to write debug logs to. Set the env variable `DEBUG` to `*` to enable verbose logs. Useful for submitting bug reports.", + "sensitive": false + }, + "viewport": { + "type": "string", + "title": "Viewport", + "description": "Initial viewport size for the Chrome instances started by the server. For example, `1280x720`. In headless mode, max size is 3840x2160px.", + "sensitive": false + }, + "proxyServer": { + "type": "string", + "title": "Proxy Server", + "description": "Proxy server configuration for Chrome passed as --proxy-server when launching the browser. See https://www.chromium.org/developers/design-documents/network-settings/ for details.", + "sensitive": false + }, + "acceptInsecureCerts": { + "type": "boolean", + "title": "Accept Insecure Certs", + "description": "If enabled, ignores errors relative to self-signed and expired certificates. Use with caution.", + "sensitive": false + }, + "experimentalVision": { + "type": "boolean", + "title": "Experimental Vision", + "description": "Whether to enable coordinate-based tools such as click_at(x,y). Usually requires a computer-use model able to produce accurate coordinates by looking at screenshots.", + "sensitive": false + }, + "experimentalScreencast": { + "type": "boolean", + "title": "Experimental Screencast", + "description": "Exposes experimental screencast tools (requires ffmpeg). Install ffmpeg https://www.ffmpeg.org/download.html and ensure it is available in the MCP server PATH.", + "sensitive": false + }, + "experimentalFfmpegPath": { + "type": "string", + "title": "Experimental FFmpeg Path", + "description": "Path to ffmpeg executable for screencast recording.", + "sensitive": false + }, + "categoryExperimentalWebmcp": { + "type": "boolean", + "title": "Category Experimental WebMCP", + "description": "Set to true to enable debugging WebMCP tools. Requires Chrome 149+ with the following flags: `--enable-features=WebMCPTesting,DevToolsWebMCPSupport`", + "sensitive": false + }, + "chromeArg": { + "type": "string", + "title": "Chrome Arg", + "description": "Additional arguments for Chrome. Only applies when Chrome is launched by chrome-devtools-mcp.", + "sensitive": false, + "multiple": true + }, + "ignoreDefaultChromeArg": { + "type": "string", + "title": "Ignore Default Chrome Arg", + "description": "Explicitly disable default arguments for Chrome. Only applies when Chrome is launched by chrome-devtools-mcp.", + "sensitive": false, + "multiple": true + }, + "categoryEmulation": { + "type": "boolean", + "title": "Category Emulation", + "description": "Set to false to exclude tools related to emulation.", + "sensitive": false, + "default": true + }, + "categoryPerformance": { + "type": "boolean", + "title": "Category Performance", + "description": "Set to false to exclude tools related to performance.", + "sensitive": false, + "default": true + }, + "categoryNetwork": { + "type": "boolean", + "title": "Category Network", + "description": "Set to false to exclude tools related to network.", + "sensitive": false, + "default": true + }, + "categoryExtensions": { + "type": "boolean", + "title": "Category Extensions", + "description": "Set to true to include tools related to extensions. Note: This feature is currently only supported with a pipe connection. autoConnect, browserUrl, and wsEndpoint are not supported with this feature until 149 will be released.", + "sensitive": false, + "default": false + }, + "categoryExperimentalThirdParty": { + "type": "boolean", + "title": "Category Experimental Third Party", + "description": "Set to true to enable third-party developer tools exposed by the inspected page itself", + "sensitive": false, + "default": false + }, + "performanceCrux": { + "type": "boolean", + "title": "Performance Crux", + "description": "Set to false to disable sending URLs from performance traces to CrUX API to get field performance data.", + "sensitive": false, + "default": true + }, + "usageStatistics": { + "type": "boolean", + "title": "Usage Statistics", + "description": "Set to false to opt-out of usage statistics collection. Google collects usage data to improve the tool, handled under the Google Privacy Policy (https://policies.google.com/privacy). This is independent from Chrome browser metrics. Disabled if `CHROME_DEVTOOLS_MCP_NO_USAGE_STATISTICS` or `CI` env variables are set.", + "sensitive": false, + "default": true + }, + "slim": { + "type": "boolean", + "title": "Slim", + "description": "Exposes a \"slim\" set of 3 tools covering navigation, script execution and screenshots only. Useful for basic browser tasks.", + "sensitive": false + }, + "redactNetworkHeaders": { + "type": "boolean", + "title": "Redact Network Headers", + "description": "If true, redacts some of the network headers considered senstive before returning to the client.", + "sensitive": false, + "default": false } } } diff --git a/README.md b/README.md index b17b72451..e3ef253f2 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,22 @@ Then, install the plugin: Restart Claude Code to have the MCP server and skills load (check with `/skills`). +To connect the plugin to a Chrome instance that is already running with remote debugging, set the plugin's `browserUrl` option in your Claude Code settings: + +```json +{ + "pluginConfigs": { + "chrome-devtools-mcp@claude-plugins-official": { + "options": { + "browserUrl": "http://127.0.0.1:9222" + } + } + } +} +``` + +Leave `browserUrl` blank to use the default behavior where Chrome DevTools MCP launches Chrome automatically. + > [!TIP] > If the plugin installation fails with a `Failed to clone repository` error (e.g., HTTPS connectivity issues behind a corporate firewall), see the [troubleshooting guide](./docs/troubleshooting.md#claude-code-plugin-installation-fails-with-failed-to-clone-repository) for workarounds, or use the CLI installation method above instead. diff --git a/package.json b/package.json index f05f68b91..ea50c4fe3 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,9 @@ "typecheck": "tsc --noEmit", "format": "eslint --cache --fix . && prettier --write --cache .", "check-format": "eslint --cache . && prettier --check --cache .;", - "gen": "npm run build && npm run docs:generate && npm run cli:generate && npm run update-metrics && npm run format", + "gen": "npm run build && npm run docs:generate && npm run cli:generate && npm run plugin:generate && npm run update-metrics && npm run format", "docs:generate": "node --experimental-strip-types scripts/generate-docs.ts", + "plugin:generate": "node --experimental-strip-types scripts/generate-plugin-config.ts", "start": "npm run build && node build/src/bin/chrome-devtools-mcp.js", "start-debug": "DEBUG=mcp:* DEBUG_COLORS=false npm run build && node build/src/bin/chrome-devtools-mcp.js", "test": "npm run build && node scripts/test.mjs", diff --git a/scripts/generate-plugin-config.ts b/scripts/generate-plugin-config.ts new file mode 100644 index 000000000..2b774e1fd --- /dev/null +++ b/scripts/generate-plugin-config.ts @@ -0,0 +1,113 @@ +/** + * @license + * Copyright 2026 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import fs from 'node:fs'; +import path from 'node:path'; + +import { + cliOptions, + pluginEnvVarName, +} from '../build/src/bin/chrome-devtools-mcp-cli-options.js'; + +const PLUGIN_MANIFEST_PATHS = [ + '.claude-plugin/plugin.json', + '.github/plugin/plugin.json', +]; + +function optionDescription(optionConfig: (typeof cliOptions)[string]) { + return optionConfig.description || optionConfig.describe || ''; +} + +function optionTitle(optionName: string) { + return optionName + .replace(/([a-z0-9])([A-Z])/g, '$1 $2') + .replace(/\burl\b/gi, 'URL') + .replace(/\bcli\b/gi, 'CLI') + .replace(/\bmcp\b/gi, 'MCP') + .replace(/\bws\b/gi, 'WebSocket') + .replace(/\bffmpeg\b/gi, 'FFmpeg') + .replace(/\bwebmcp\b/gi, 'WebMCP') + .replace(/^\w/, character => character.toUpperCase()); +} + +function userConfigType(optionConfig: (typeof cliOptions)[string]) { + switch (optionConfig.type) { + case 'array': + return 'string'; + case 'boolean': + case 'number': + case 'string': + return optionConfig.type; + default: + return undefined; + } +} + +function generateUserConfig() { + const userConfig: Record = {}; + + for (const [optionName, optionConfig] of Object.entries(cliOptions)) { + if (optionConfig.hidden) { + continue; + } + + const type = userConfigType(optionConfig); + if (!type) { + continue; + } + + userConfig[optionName] = { + type, + title: optionTitle(optionName), + description: optionDescription(optionConfig), + sensitive: false, + ...(optionConfig.type === 'array' ? {multiple: true} : {}), + ...(optionConfig.default !== undefined + ? {default: optionConfig.default} + : {}), + }; + } + + return userConfig; +} + +function generatePluginEnv() { + const env: Record = {}; + + for (const [optionName, optionConfig] of Object.entries(cliOptions)) { + if (optionConfig.hidden) { + continue; + } + + if (!userConfigType(optionConfig)) { + continue; + } + + env[pluginEnvVarName(optionName)] = `\${user_config.${optionName}}`; + } + + return env; +} + +function updatePluginManifest(manifestPath: string) { + const absolutePath = path.join(import.meta.dirname, '..', manifestPath); + const manifest = JSON.parse(fs.readFileSync(absolutePath, 'utf8')); + const server = manifest.mcpServers?.['chrome-devtools']; + + if (!server) { + throw new Error(`${manifestPath} is missing mcpServers.chrome-devtools`); + } + + manifest.userConfig = generateUserConfig(); + server.env = generatePluginEnv(); + + fs.writeFileSync(absolutePath, `${JSON.stringify(manifest, null, 2)}\n`); + console.log(`Updated ${manifestPath}`); +} + +for (const manifestPath of PLUGIN_MANIFEST_PATHS) { + updatePluginManifest(manifestPath); +} diff --git a/src/bin/chrome-devtools-mcp-cli-options.ts b/src/bin/chrome-devtools-mcp-cli-options.ts index f510744d3..a94bfcb3d 100644 --- a/src/bin/chrome-devtools-mcp-cli-options.ts +++ b/src/bin/chrome-devtools-mcp-cli-options.ts @@ -285,6 +285,70 @@ export const cliOptions = { export type ParsedArguments = ReturnType; +export function pluginEnvVarName(optionName: string) { + return `CHROME_DEVTOOLS_MCP_${optionName + .replace(/([a-z0-9])([A-Z])/g, '$1_$2') + .replace(/[^a-zA-Z0-9]/g, '_') + .toUpperCase()}`; +} + +function parsePluginEnvValue( + optionName: string, + optionConfig: YargsOptions, + rawValue: string | undefined, +) { + if (rawValue === undefined || rawValue === '') { + return undefined; + } + + switch (optionConfig.type) { + case 'boolean': { + if (rawValue === 'true' || rawValue === '1') { + return true; + } + if (rawValue === 'false' || rawValue === '0') { + return false; + } + throw new Error( + `Invalid ${pluginEnvVarName(optionName)} value ${rawValue}. Expected true or false.`, + ); + } + case 'number': { + const value = Number(rawValue); + if (Number.isNaN(value)) { + throw new Error( + `Invalid ${pluginEnvVarName(optionName)} value ${rawValue}. Expected a number.`, + ); + } + return value; + } + case 'array': + if (rawValue.trim().startsWith('[')) { + return JSON.parse(rawValue); + } + return [rawValue]; + default: + return rawValue; + } +} + +function pluginEnvDefaults(env: NodeJS.ProcessEnv) { + const defaults: Record = {}; + + for (const [optionName, optionConfig] of Object.entries(cliOptions)) { + const value = parsePluginEnvValue( + optionName, + optionConfig, + env[pluginEnvVarName(optionName)], + ); + if (value !== undefined) { + defaults[optionName] = value; + } + } + + return defaults; +} + export function parseArguments( version: string, argv = process.argv, @@ -292,6 +356,7 @@ export function parseArguments( ) { const yargsInstance = yargs(hideBin(argv)) .scriptName('npx chrome-devtools-mcp@latest') + .config(pluginEnvDefaults(env)) .options(cliOptions) .check(args => { // We can't set default in the options else From 4572dc889a4271d429158eb060175ad70cf94125 Mon Sep 17 00:00:00 2001 From: Asish Kumar Date: Tue, 12 May 2026 10:41:20 +0530 Subject: [PATCH 2/4] Use plugin args for generated user config --- .claude-plugin/plugin.json | 62 ++++++++++----------- .github/plugin/plugin.json | 62 ++++++++++----------- scripts/generate-plugin-config.ts | 16 +++--- src/bin/chrome-devtools-mcp-cli-options.ts | 65 ---------------------- 4 files changed, 67 insertions(+), 138 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 9c004e06b..7d79c472e 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -6,38 +6,36 @@ "chrome-devtools": { "command": "npx", "args": [ - "chrome-devtools-mcp@latest" - ], - "env": { - "CHROME_DEVTOOLS_MCP_AUTO_CONNECT": "${user_config.autoConnect}", - "CHROME_DEVTOOLS_MCP_BROWSER_URL": "${user_config.browserUrl}", - "CHROME_DEVTOOLS_MCP_WS_ENDPOINT": "${user_config.wsEndpoint}", - "CHROME_DEVTOOLS_MCP_WS_HEADERS": "${user_config.wsHeaders}", - "CHROME_DEVTOOLS_MCP_HEADLESS": "${user_config.headless}", - "CHROME_DEVTOOLS_MCP_EXECUTABLE_PATH": "${user_config.executablePath}", - "CHROME_DEVTOOLS_MCP_ISOLATED": "${user_config.isolated}", - "CHROME_DEVTOOLS_MCP_USER_DATA_DIR": "${user_config.userDataDir}", - "CHROME_DEVTOOLS_MCP_CHANNEL": "${user_config.channel}", - "CHROME_DEVTOOLS_MCP_LOG_FILE": "${user_config.logFile}", - "CHROME_DEVTOOLS_MCP_VIEWPORT": "${user_config.viewport}", - "CHROME_DEVTOOLS_MCP_PROXY_SERVER": "${user_config.proxyServer}", - "CHROME_DEVTOOLS_MCP_ACCEPT_INSECURE_CERTS": "${user_config.acceptInsecureCerts}", - "CHROME_DEVTOOLS_MCP_EXPERIMENTAL_VISION": "${user_config.experimentalVision}", - "CHROME_DEVTOOLS_MCP_EXPERIMENTAL_SCREENCAST": "${user_config.experimentalScreencast}", - "CHROME_DEVTOOLS_MCP_EXPERIMENTAL_FFMPEG_PATH": "${user_config.experimentalFfmpegPath}", - "CHROME_DEVTOOLS_MCP_CATEGORY_EXPERIMENTAL_WEBMCP": "${user_config.categoryExperimentalWebmcp}", - "CHROME_DEVTOOLS_MCP_CHROME_ARG": "${user_config.chromeArg}", - "CHROME_DEVTOOLS_MCP_IGNORE_DEFAULT_CHROME_ARG": "${user_config.ignoreDefaultChromeArg}", - "CHROME_DEVTOOLS_MCP_CATEGORY_EMULATION": "${user_config.categoryEmulation}", - "CHROME_DEVTOOLS_MCP_CATEGORY_PERFORMANCE": "${user_config.categoryPerformance}", - "CHROME_DEVTOOLS_MCP_CATEGORY_NETWORK": "${user_config.categoryNetwork}", - "CHROME_DEVTOOLS_MCP_CATEGORY_EXTENSIONS": "${user_config.categoryExtensions}", - "CHROME_DEVTOOLS_MCP_CATEGORY_EXPERIMENTAL_THIRD_PARTY": "${user_config.categoryExperimentalThirdParty}", - "CHROME_DEVTOOLS_MCP_PERFORMANCE_CRUX": "${user_config.performanceCrux}", - "CHROME_DEVTOOLS_MCP_USAGE_STATISTICS": "${user_config.usageStatistics}", - "CHROME_DEVTOOLS_MCP_SLIM": "${user_config.slim}", - "CHROME_DEVTOOLS_MCP_REDACT_NETWORK_HEADERS": "${user_config.redactNetworkHeaders}" - } + "chrome-devtools-mcp@latest", + "--autoConnect=${user_config.autoConnect}", + "--browserUrl=${user_config.browserUrl}", + "--wsEndpoint=${user_config.wsEndpoint}", + "--wsHeaders=${user_config.wsHeaders}", + "--headless=${user_config.headless}", + "--executablePath=${user_config.executablePath}", + "--isolated=${user_config.isolated}", + "--userDataDir=${user_config.userDataDir}", + "--channel=${user_config.channel}", + "--logFile=${user_config.logFile}", + "--viewport=${user_config.viewport}", + "--proxyServer=${user_config.proxyServer}", + "--acceptInsecureCerts=${user_config.acceptInsecureCerts}", + "--experimentalVision=${user_config.experimentalVision}", + "--experimentalScreencast=${user_config.experimentalScreencast}", + "--experimentalFfmpegPath=${user_config.experimentalFfmpegPath}", + "--categoryExperimentalWebmcp=${user_config.categoryExperimentalWebmcp}", + "--chromeArg=${user_config.chromeArg}", + "--ignoreDefaultChromeArg=${user_config.ignoreDefaultChromeArg}", + "--categoryEmulation=${user_config.categoryEmulation}", + "--categoryPerformance=${user_config.categoryPerformance}", + "--categoryNetwork=${user_config.categoryNetwork}", + "--categoryExtensions=${user_config.categoryExtensions}", + "--categoryExperimentalThirdParty=${user_config.categoryExperimentalThirdParty}", + "--performanceCrux=${user_config.performanceCrux}", + "--usageStatistics=${user_config.usageStatistics}", + "--slim=${user_config.slim}", + "--redactNetworkHeaders=${user_config.redactNetworkHeaders}" + ] } }, "userConfig": { diff --git a/.github/plugin/plugin.json b/.github/plugin/plugin.json index 9c004e06b..7d79c472e 100644 --- a/.github/plugin/plugin.json +++ b/.github/plugin/plugin.json @@ -6,38 +6,36 @@ "chrome-devtools": { "command": "npx", "args": [ - "chrome-devtools-mcp@latest" - ], - "env": { - "CHROME_DEVTOOLS_MCP_AUTO_CONNECT": "${user_config.autoConnect}", - "CHROME_DEVTOOLS_MCP_BROWSER_URL": "${user_config.browserUrl}", - "CHROME_DEVTOOLS_MCP_WS_ENDPOINT": "${user_config.wsEndpoint}", - "CHROME_DEVTOOLS_MCP_WS_HEADERS": "${user_config.wsHeaders}", - "CHROME_DEVTOOLS_MCP_HEADLESS": "${user_config.headless}", - "CHROME_DEVTOOLS_MCP_EXECUTABLE_PATH": "${user_config.executablePath}", - "CHROME_DEVTOOLS_MCP_ISOLATED": "${user_config.isolated}", - "CHROME_DEVTOOLS_MCP_USER_DATA_DIR": "${user_config.userDataDir}", - "CHROME_DEVTOOLS_MCP_CHANNEL": "${user_config.channel}", - "CHROME_DEVTOOLS_MCP_LOG_FILE": "${user_config.logFile}", - "CHROME_DEVTOOLS_MCP_VIEWPORT": "${user_config.viewport}", - "CHROME_DEVTOOLS_MCP_PROXY_SERVER": "${user_config.proxyServer}", - "CHROME_DEVTOOLS_MCP_ACCEPT_INSECURE_CERTS": "${user_config.acceptInsecureCerts}", - "CHROME_DEVTOOLS_MCP_EXPERIMENTAL_VISION": "${user_config.experimentalVision}", - "CHROME_DEVTOOLS_MCP_EXPERIMENTAL_SCREENCAST": "${user_config.experimentalScreencast}", - "CHROME_DEVTOOLS_MCP_EXPERIMENTAL_FFMPEG_PATH": "${user_config.experimentalFfmpegPath}", - "CHROME_DEVTOOLS_MCP_CATEGORY_EXPERIMENTAL_WEBMCP": "${user_config.categoryExperimentalWebmcp}", - "CHROME_DEVTOOLS_MCP_CHROME_ARG": "${user_config.chromeArg}", - "CHROME_DEVTOOLS_MCP_IGNORE_DEFAULT_CHROME_ARG": "${user_config.ignoreDefaultChromeArg}", - "CHROME_DEVTOOLS_MCP_CATEGORY_EMULATION": "${user_config.categoryEmulation}", - "CHROME_DEVTOOLS_MCP_CATEGORY_PERFORMANCE": "${user_config.categoryPerformance}", - "CHROME_DEVTOOLS_MCP_CATEGORY_NETWORK": "${user_config.categoryNetwork}", - "CHROME_DEVTOOLS_MCP_CATEGORY_EXTENSIONS": "${user_config.categoryExtensions}", - "CHROME_DEVTOOLS_MCP_CATEGORY_EXPERIMENTAL_THIRD_PARTY": "${user_config.categoryExperimentalThirdParty}", - "CHROME_DEVTOOLS_MCP_PERFORMANCE_CRUX": "${user_config.performanceCrux}", - "CHROME_DEVTOOLS_MCP_USAGE_STATISTICS": "${user_config.usageStatistics}", - "CHROME_DEVTOOLS_MCP_SLIM": "${user_config.slim}", - "CHROME_DEVTOOLS_MCP_REDACT_NETWORK_HEADERS": "${user_config.redactNetworkHeaders}" - } + "chrome-devtools-mcp@latest", + "--autoConnect=${user_config.autoConnect}", + "--browserUrl=${user_config.browserUrl}", + "--wsEndpoint=${user_config.wsEndpoint}", + "--wsHeaders=${user_config.wsHeaders}", + "--headless=${user_config.headless}", + "--executablePath=${user_config.executablePath}", + "--isolated=${user_config.isolated}", + "--userDataDir=${user_config.userDataDir}", + "--channel=${user_config.channel}", + "--logFile=${user_config.logFile}", + "--viewport=${user_config.viewport}", + "--proxyServer=${user_config.proxyServer}", + "--acceptInsecureCerts=${user_config.acceptInsecureCerts}", + "--experimentalVision=${user_config.experimentalVision}", + "--experimentalScreencast=${user_config.experimentalScreencast}", + "--experimentalFfmpegPath=${user_config.experimentalFfmpegPath}", + "--categoryExperimentalWebmcp=${user_config.categoryExperimentalWebmcp}", + "--chromeArg=${user_config.chromeArg}", + "--ignoreDefaultChromeArg=${user_config.ignoreDefaultChromeArg}", + "--categoryEmulation=${user_config.categoryEmulation}", + "--categoryPerformance=${user_config.categoryPerformance}", + "--categoryNetwork=${user_config.categoryNetwork}", + "--categoryExtensions=${user_config.categoryExtensions}", + "--categoryExperimentalThirdParty=${user_config.categoryExperimentalThirdParty}", + "--performanceCrux=${user_config.performanceCrux}", + "--usageStatistics=${user_config.usageStatistics}", + "--slim=${user_config.slim}", + "--redactNetworkHeaders=${user_config.redactNetworkHeaders}" + ] } }, "userConfig": { diff --git a/scripts/generate-plugin-config.ts b/scripts/generate-plugin-config.ts index 2b774e1fd..a41627bc3 100644 --- a/scripts/generate-plugin-config.ts +++ b/scripts/generate-plugin-config.ts @@ -7,10 +7,7 @@ import fs from 'node:fs'; import path from 'node:path'; -import { - cliOptions, - pluginEnvVarName, -} from '../build/src/bin/chrome-devtools-mcp-cli-options.js'; +import {cliOptions} from '../build/src/bin/chrome-devtools-mcp-cli-options.js'; const PLUGIN_MANIFEST_PATHS = [ '.claude-plugin/plugin.json', @@ -74,8 +71,8 @@ function generateUserConfig() { return userConfig; } -function generatePluginEnv() { - const env: Record = {}; +function generatePluginArgs(existingArgs: string[]) { + const args = existingArgs.filter(arg => !arg.includes('${user_config.')); for (const [optionName, optionConfig] of Object.entries(cliOptions)) { if (optionConfig.hidden) { @@ -86,10 +83,10 @@ function generatePluginEnv() { continue; } - env[pluginEnvVarName(optionName)] = `\${user_config.${optionName}}`; + args.push(`--${optionName}=\${user_config.${optionName}}`); } - return env; + return args; } function updatePluginManifest(manifestPath: string) { @@ -102,7 +99,8 @@ function updatePluginManifest(manifestPath: string) { } manifest.userConfig = generateUserConfig(); - server.env = generatePluginEnv(); + server.args = generatePluginArgs(server.args || []); + delete server.env; fs.writeFileSync(absolutePath, `${JSON.stringify(manifest, null, 2)}\n`); console.log(`Updated ${manifestPath}`); diff --git a/src/bin/chrome-devtools-mcp-cli-options.ts b/src/bin/chrome-devtools-mcp-cli-options.ts index a94bfcb3d..f510744d3 100644 --- a/src/bin/chrome-devtools-mcp-cli-options.ts +++ b/src/bin/chrome-devtools-mcp-cli-options.ts @@ -285,70 +285,6 @@ export const cliOptions = { export type ParsedArguments = ReturnType; -export function pluginEnvVarName(optionName: string) { - return `CHROME_DEVTOOLS_MCP_${optionName - .replace(/([a-z0-9])([A-Z])/g, '$1_$2') - .replace(/[^a-zA-Z0-9]/g, '_') - .toUpperCase()}`; -} - -function parsePluginEnvValue( - optionName: string, - optionConfig: YargsOptions, - rawValue: string | undefined, -) { - if (rawValue === undefined || rawValue === '') { - return undefined; - } - - switch (optionConfig.type) { - case 'boolean': { - if (rawValue === 'true' || rawValue === '1') { - return true; - } - if (rawValue === 'false' || rawValue === '0') { - return false; - } - throw new Error( - `Invalid ${pluginEnvVarName(optionName)} value ${rawValue}. Expected true or false.`, - ); - } - case 'number': { - const value = Number(rawValue); - if (Number.isNaN(value)) { - throw new Error( - `Invalid ${pluginEnvVarName(optionName)} value ${rawValue}. Expected a number.`, - ); - } - return value; - } - case 'array': - if (rawValue.trim().startsWith('[')) { - return JSON.parse(rawValue); - } - return [rawValue]; - default: - return rawValue; - } -} - -function pluginEnvDefaults(env: NodeJS.ProcessEnv) { - const defaults: Record = {}; - - for (const [optionName, optionConfig] of Object.entries(cliOptions)) { - const value = parsePluginEnvValue( - optionName, - optionConfig, - env[pluginEnvVarName(optionName)], - ); - if (value !== undefined) { - defaults[optionName] = value; - } - } - - return defaults; -} - export function parseArguments( version: string, argv = process.argv, @@ -356,7 +292,6 @@ export function parseArguments( ) { const yargsInstance = yargs(hideBin(argv)) .scriptName('npx chrome-devtools-mcp@latest') - .config(pluginEnvDefaults(env)) .options(cliOptions) .check(args => { // We can't set default in the options else From fd04ae40c825c2e57969518fe57ab1989a9de188 Mon Sep 17 00:00:00 2001 From: Asish Kumar Date: Thu, 14 May 2026 22:20:26 +0530 Subject: [PATCH 3/4] chore: update generated plugin configs --- .claude-plugin/plugin.json | 35 +++++++++++++++++++++++++++++++++++ .github/plugin/plugin.json | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 7d79c472e..74c4c0f00 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -20,7 +20,12 @@ "--viewport=${user_config.viewport}", "--proxyServer=${user_config.proxyServer}", "--acceptInsecureCerts=${user_config.acceptInsecureCerts}", + "--experimentalPageIdRouting=${user_config.experimentalPageIdRouting}", + "--experimentalDevtools=${user_config.experimentalDevtools}", "--experimentalVision=${user_config.experimentalVision}", + "--experimentalMemory=${user_config.experimentalMemory}", + "--experimentalStructuredContent=${user_config.experimentalStructuredContent}", + "--experimentalIncludeAllPages=${user_config.experimentalIncludeAllPages}", "--experimentalScreencast=${user_config.experimentalScreencast}", "--experimentalFfmpegPath=${user_config.experimentalFfmpegPath}", "--categoryExperimentalWebmcp=${user_config.categoryExperimentalWebmcp}", @@ -119,12 +124,42 @@ "description": "If enabled, ignores errors relative to self-signed and expired certificates. Use with caution.", "sensitive": false }, + "experimentalPageIdRouting": { + "type": "boolean", + "title": "Experimental Page Id Routing", + "description": "Whether to expose pageId on page-scoped tools and route requests by page ID (useful for concurrent agent sessions).", + "sensitive": false + }, + "experimentalDevtools": { + "type": "boolean", + "title": "Experimental Devtools", + "description": "Whether to enable automation over DevTools targets", + "sensitive": false + }, "experimentalVision": { "type": "boolean", "title": "Experimental Vision", "description": "Whether to enable coordinate-based tools such as click_at(x,y). Usually requires a computer-use model able to produce accurate coordinates by looking at screenshots.", "sensitive": false }, + "experimentalMemory": { + "type": "boolean", + "title": "Experimental Memory", + "description": "Whether to enable experimental memory tools.", + "sensitive": false + }, + "experimentalStructuredContent": { + "type": "boolean", + "title": "Experimental Structured Content", + "description": "Whether to output structured formatted content.", + "sensitive": false + }, + "experimentalIncludeAllPages": { + "type": "boolean", + "title": "Experimental Include All Pages", + "description": "Whether to include all kinds of pages such as webviews or background pages as pages.", + "sensitive": false + }, "experimentalScreencast": { "type": "boolean", "title": "Experimental Screencast", diff --git a/.github/plugin/plugin.json b/.github/plugin/plugin.json index 7d79c472e..74c4c0f00 100644 --- a/.github/plugin/plugin.json +++ b/.github/plugin/plugin.json @@ -20,7 +20,12 @@ "--viewport=${user_config.viewport}", "--proxyServer=${user_config.proxyServer}", "--acceptInsecureCerts=${user_config.acceptInsecureCerts}", + "--experimentalPageIdRouting=${user_config.experimentalPageIdRouting}", + "--experimentalDevtools=${user_config.experimentalDevtools}", "--experimentalVision=${user_config.experimentalVision}", + "--experimentalMemory=${user_config.experimentalMemory}", + "--experimentalStructuredContent=${user_config.experimentalStructuredContent}", + "--experimentalIncludeAllPages=${user_config.experimentalIncludeAllPages}", "--experimentalScreencast=${user_config.experimentalScreencast}", "--experimentalFfmpegPath=${user_config.experimentalFfmpegPath}", "--categoryExperimentalWebmcp=${user_config.categoryExperimentalWebmcp}", @@ -119,12 +124,42 @@ "description": "If enabled, ignores errors relative to self-signed and expired certificates. Use with caution.", "sensitive": false }, + "experimentalPageIdRouting": { + "type": "boolean", + "title": "Experimental Page Id Routing", + "description": "Whether to expose pageId on page-scoped tools and route requests by page ID (useful for concurrent agent sessions).", + "sensitive": false + }, + "experimentalDevtools": { + "type": "boolean", + "title": "Experimental Devtools", + "description": "Whether to enable automation over DevTools targets", + "sensitive": false + }, "experimentalVision": { "type": "boolean", "title": "Experimental Vision", "description": "Whether to enable coordinate-based tools such as click_at(x,y). Usually requires a computer-use model able to produce accurate coordinates by looking at screenshots.", "sensitive": false }, + "experimentalMemory": { + "type": "boolean", + "title": "Experimental Memory", + "description": "Whether to enable experimental memory tools.", + "sensitive": false + }, + "experimentalStructuredContent": { + "type": "boolean", + "title": "Experimental Structured Content", + "description": "Whether to output structured formatted content.", + "sensitive": false + }, + "experimentalIncludeAllPages": { + "type": "boolean", + "title": "Experimental Include All Pages", + "description": "Whether to include all kinds of pages such as webviews or background pages as pages.", + "sensitive": false + }, "experimentalScreencast": { "type": "boolean", "title": "Experimental Screencast", From 8d086d6cdaaad11579739bc4bb375a0f46b1ace7 Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Thu, 21 May 2026 15:04:19 +0200 Subject: [PATCH 4/4] chore: fixes --- .claude-plugin/plugin.json | 2 +- .github/plugin/plugin.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 74c4c0f00..83a0b8bcf 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -250,7 +250,7 @@ "redactNetworkHeaders": { "type": "boolean", "title": "Redact Network Headers", - "description": "If true, redacts some of the network headers considered senstive before returning to the client.", + "description": "If true, redacts some of the network headers considered sensitive before returning to the client.", "sensitive": false, "default": false } diff --git a/.github/plugin/plugin.json b/.github/plugin/plugin.json index 74c4c0f00..83a0b8bcf 100644 --- a/.github/plugin/plugin.json +++ b/.github/plugin/plugin.json @@ -250,7 +250,7 @@ "redactNetworkHeaders": { "type": "boolean", "title": "Redact Network Headers", - "description": "If true, redacts some of the network headers considered senstive before returning to the client.", + "description": "If true, redacts some of the network headers considered sensitive before returning to the client.", "sensitive": false, "default": false }