diff --git a/CHANGELOG.md b/CHANGELOG.md index f309456..9595c24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 2.1.0 + +### New Features + +- **`interceptor_browser_list_cookies` `full` option**: Pass `full: true` to return full cookie values inline (capped at 20000 chars) under a `value` field, instead of the default truncated `value_preview`. Overrides `value_max_chars`. Avoids round-tripping through `interceptor_browser_get_cookie` per entry when full bodies are needed. + ## 2.0.0 ### Breaking Changes diff --git a/package-lock.json b/package-lock.json index 1b740c8..025dd22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "proxy-mcp", - "version": "1.2.0", + "version": "2.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "proxy-mcp", - "version": "1.2.0", + "version": "2.1.0", "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", "cloakbrowser": "^0.3.24", @@ -25,6 +25,9 @@ "@types/node": "^22.0.0", "tsx": "^4.19.0", "typescript": "^5.8.0" + }, + "engines": { + "node": ">=20" } }, "node_modules/@balena/dockerignore": { diff --git a/package.json b/package.json index 2682aeb..e2a0f23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "proxy-mcp", - "version": "2.0.0", + "version": "2.1.0", "description": "MCP server for HTTP/HTTPS MITM proxy via mockttp", "type": "module", "engines": { diff --git a/src/tools/devtools.ts b/src/tools/devtools.ts index e4da308..6769a72 100644 --- a/src/tools/devtools.ts +++ b/src/tools/devtools.ts @@ -247,9 +247,11 @@ export function registerDevToolsTools(server: McpServer): void { limit: z.number().optional().default(DEFAULT_LIST_LIMIT).describe("Max cookies to return (default: 50, max: 500)"), value_max_chars: z.number().optional().default(DEFAULT_VALUE_MAX_CHARS) .describe("Max characters for cookie value previews (default: 256)"), + full: z.boolean().optional().default(false) + .describe(`Return full cookie values instead of previews (capped at ${HARD_VALUE_CAP_CHARS} chars). Overrides value_max_chars.`), sort: z.enum(["name", "domain", "expires"]).optional().default("name").describe("Sort order (default: name)"), }, - async ({ target_id, url_filter, domain_filter, name_filter, offset, limit, value_max_chars, sort }) => { + async ({ target_id, url_filter, domain_filter, name_filter, offset, limit, value_max_chars, full, sort }) => { try { const entry = getEntry(target_id); const cookies = await entry.context.cookies(); @@ -279,11 +281,13 @@ export function registerDevToolsTools(server: McpServer): void { const l = normalizeLimit(limit); const page = sorted.slice(o, o + l); - const valueCap = Math.max(0, Math.min(HARD_VALUE_CAP_CHARS, Math.trunc(value_max_chars ?? DEFAULT_VALUE_MAX_CHARS))); + const valueCap = full + ? HARD_VALUE_CAP_CHARS + : Math.max(0, Math.min(HARD_VALUE_CAP_CHARS, Math.trunc(value_max_chars ?? DEFAULT_VALUE_MAX_CHARS))); const summaries = page.map((c) => { const capped = capValue(c.value, valueCap); - return { + const base = { cookie_id: cookieStableId(c), name: c.name, domain: c.domain, @@ -292,10 +296,12 @@ export function registerDevToolsTools(server: McpServer): void { httpOnly: c.httpOnly, secure: c.secure, sameSite: c.sameSite ?? null, - value_preview: capped.value, value_length: capped.valueLength, value_truncated: capped.truncated, }; + return full + ? { ...base, value: capped.value } + : { ...base, value_preview: capped.value }; }); return {