From bb1f1abd9e2841059519e12006433ce603654219 Mon Sep 17 00:00:00 2001 From: Ilyaas Kapadia <86218345+IlyaasK@users.noreply.github.com> Date: Fri, 26 Jun 2026 17:05:17 -0400 Subject: [PATCH 1/3] Adopt @onkernel/sdk v0.72.0; drop save_changes from browser pools Bumps @onkernel/sdk ^0.60.0 -> ^0.72.0 and adapts to the API/SDK changes in the 12-minor jump: - List endpoints now return paginated results (OffsetPagination) instead of arrays: read `.items` for browser-pools, extensions, and proxies list, and surface the real has_more / next_offset for extensions and proxies (was hardcoded false/null). - Credential `values` is typed string->string; use z.record(z.string(), z.string()) (also required by zod v4's two-arg z.record). - Browser pools no longer accept save_changes on their profile (kernel/kernel #2484): drop the save_profile_changes input from the manage_browser_pools tool and Omit it from PoolConfigParams so the pool path can't send it. Single-session `browsers`/`profiles` tools keep save_profile_changes unchanged. tsc --noEmit passes. Co-Authored-By: Claude Opus 4.8 (1M context) --- package.json | 2 +- src/lib/mcp/tools/browser-pools.ts | 17 +++++++---------- src/lib/mcp/tools/credentials.ts | 2 +- src/lib/mcp/tools/extensions.ts | 8 ++++---- src/lib/mcp/tools/proxies.ts | 8 ++++---- 5 files changed, 17 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index beb5d8d..3c1edcb 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@clerk/themes": "^2.4.19", "@mcp-ui/server": "^5.10.0", "@modelcontextprotocol/sdk": "1.26.0", - "@onkernel/sdk": "^0.60.0", + "@onkernel/sdk": "^0.72.0", "@types/jsonwebtoken": "^9.0.10", "@types/redis": "^4.0.11", "builtin-modules": "^5.0.0", diff --git a/src/lib/mcp/tools/browser-pools.ts b/src/lib/mcp/tools/browser-pools.ts index c72b204..21ef047 100644 --- a/src/lib/mcp/tools/browser-pools.ts +++ b/src/lib/mcp/tools/browser-pools.ts @@ -27,7 +27,10 @@ type BrowserPoolAcquireResponse = Awaited< ReturnType >; -type PoolConfigParams = BrowserCreateConfigParams & { +type PoolConfigParams = Omit< + BrowserCreateConfigParams, + "save_profile_changes" +> & { size?: number; name?: string; headless?: boolean; @@ -159,14 +162,14 @@ export function registerBrowserPoolCapabilities(server: McpServer) { } const client = createKernelClient(extra.authInfo.token); - const pools = await client.browserPools.list(); + const pools = (await client.browserPools.list())?.items ?? []; return { contents: [ { uri: uri.toString(), mimeType: "application/json", text: - pools && pools.length > 0 + pools.length > 0 ? JSON.stringify(pools.map(summarizeBrowserPool), null, 2) : "No browser pools found", }, @@ -245,12 +248,6 @@ export function registerBrowserPoolCapabilities(server: McpServer) { "(create, update) Profile ID to load into pool browsers. Cannot use with profile_name.", ) .optional(), - save_profile_changes: z - .boolean() - .describe( - "(create, update) Save browser changes back to the selected profile when sessions end.", - ) - .optional(), proxy_id: z .string() .describe("(create, update) Proxy for pool browsers.") @@ -391,7 +388,7 @@ export function registerBrowserPoolCapabilities(server: McpServer) { }); } case "list": { - const pools = (await client.browserPools.list()) ?? []; + const pools = (await client.browserPools.list())?.items ?? []; return pools.length > 0 ? jsonResponse({ items: pools.map(summarizeBrowserPool), diff --git a/src/lib/mcp/tools/credentials.ts b/src/lib/mcp/tools/credentials.ts index 933634e..cb7f2c3 100644 --- a/src/lib/mcp/tools/credentials.ts +++ b/src/lib/mcp/tools/credentials.ts @@ -37,7 +37,7 @@ export function registerCredentialTools(server: McpServer) { ) .optional(), values: z - .record(z.string()) + .record(z.string(), z.string()) .describe( "(create, update) Field name to value mapping (e.g. username, password). On update, merged with existing values.", ) diff --git a/src/lib/mcp/tools/extensions.ts b/src/lib/mcp/tools/extensions.ts index 5928607..56cd119 100644 --- a/src/lib/mcp/tools/extensions.ts +++ b/src/lib/mcp/tools/extensions.ts @@ -34,10 +34,10 @@ export function registerExtensionTools(server: McpServer) { try { switch (params.action) { case "list": { - const extensions = await client.extensions.list(); - return itemsJsonResponse(extensions ?? [], { - has_more: false, - next_offset: null, + const page = await client.extensions.list(); + return itemsJsonResponse(page?.items ?? [], { + has_more: page?.has_more ?? false, + next_offset: page?.next_offset ?? null, emptyText: "No extensions found", }); } diff --git a/src/lib/mcp/tools/proxies.ts b/src/lib/mcp/tools/proxies.ts index e2b4b74..1783dff 100644 --- a/src/lib/mcp/tools/proxies.ts +++ b/src/lib/mcp/tools/proxies.ts @@ -134,10 +134,10 @@ export function registerProxyTools(server: McpServer) { return jsonResponse(proxy); } case "list": { - const proxies = await client.proxies.list(); - return itemsJsonResponse(proxies ?? [], { - has_more: false, - next_offset: null, + const page = await client.proxies.list(); + return itemsJsonResponse(page?.items ?? [], { + has_more: page?.has_more ?? false, + next_offset: page?.next_offset ?? null, emptyText: "No proxies found", }); } From 33cf30784cd0d13ddc6df3d791a03ba841ce3996 Mon Sep 17 00:00:00 2001 From: Ilyaas Kapadia <86218345+IlyaasK@users.noreply.github.com> Date: Fri, 26 Jun 2026 17:16:33 -0400 Subject: [PATCH 2/3] extensions/proxies list: add limit/offset pagination inputs The SDK now paginates list endpoints; surfacing has_more/next_offset without input controls let callers see there's more but not fetch it. Wire the shared paginationParams (limit/offset) into the manage_extensions and manage_proxies list actions and pass them to list(), matching the apps/profiles/projects tools. Addresses Cursor Bugbot "list lacks pagination inputs". Co-Authored-By: Claude Opus 4.8 (1M context) --- src/lib/mcp/tools/extensions.ts | 7 ++++++- src/lib/mcp/tools/proxies.ts | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/lib/mcp/tools/extensions.ts b/src/lib/mcp/tools/extensions.ts index 56cd119..cfd35a9 100644 --- a/src/lib/mcp/tools/extensions.ts +++ b/src/lib/mcp/tools/extensions.ts @@ -7,6 +7,7 @@ import { textResponse, toolErrorResponse, } from "@/lib/mcp/responses"; +import { paginationParams } from "@/lib/mcp/schemas"; export function registerExtensionTools(server: McpServer) { // manage_extensions -- List and delete browser extensions @@ -19,6 +20,7 @@ export function registerExtensionTools(server: McpServer) { .string() .describe("(delete) Extension ID or name to delete.") .optional(), + ...paginationParams, }, { title: "Manage Kernel browser extensions", @@ -34,7 +36,10 @@ export function registerExtensionTools(server: McpServer) { try { switch (params.action) { case "list": { - const page = await client.extensions.list(); + const page = await client.extensions.list({ + ...(params.limit !== undefined && { limit: params.limit }), + ...(params.offset !== undefined && { offset: params.offset }), + }); return itemsJsonResponse(page?.items ?? [], { has_more: page?.has_more ?? false, next_offset: page?.next_offset ?? null, diff --git a/src/lib/mcp/tools/proxies.ts b/src/lib/mcp/tools/proxies.ts index 1783dff..51d7312 100644 --- a/src/lib/mcp/tools/proxies.ts +++ b/src/lib/mcp/tools/proxies.ts @@ -8,6 +8,7 @@ import { textResponse, toolErrorResponse, } from "@/lib/mcp/responses"; +import { paginationParams } from "@/lib/mcp/schemas"; const httpUrlSchema = z .string() @@ -77,6 +78,7 @@ export function registerProxyTools(server: McpServer) { .string() .describe("(create, custom type) Auth password.") .optional(), + ...paginationParams, }, { title: "Manage Kernel proxy configurations", @@ -134,7 +136,10 @@ export function registerProxyTools(server: McpServer) { return jsonResponse(proxy); } case "list": { - const page = await client.proxies.list(); + const page = await client.proxies.list({ + ...(params.limit !== undefined && { limit: params.limit }), + ...(params.offset !== undefined && { offset: params.offset }), + }); return itemsJsonResponse(page?.items ?? [], { has_more: page?.has_more ?? false, next_offset: page?.next_offset ?? null, From 5077eb743667a22b82c962768d1b4e2d2123f883 Mon Sep 17 00:00:00 2001 From: Ilyaas Kapadia <86218345+IlyaasK@users.noreply.github.com> Date: Fri, 26 Jun 2026 17:24:07 -0400 Subject: [PATCH 3/3] chore: update bun.lock for @onkernel/sdk 0.72.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI runs `bun install --frozen-lockfile`; the SDK bump requires the lockfile entry to match package.json. Regenerated with `bun install` (bun 1.3.14). Only the @onkernel/sdk resolution changes; the `next` spec line is a cosmetic normalization bun applied (16.2.6 -> ^16.2.6, matching package.json's existing ^16.2.6 — resolved version unchanged). Co-Authored-By: Claude Opus 4.8 (1M context) --- bun.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 8d0e7aa..7e460b0 100644 --- a/bun.lock +++ b/bun.lock @@ -10,7 +10,7 @@ "@clerk/themes": "^2.4.19", "@mcp-ui/server": "^5.10.0", "@modelcontextprotocol/sdk": "1.26.0", - "@onkernel/sdk": "^0.60.0", + "@onkernel/sdk": "^0.72.0", "@types/jsonwebtoken": "^9.0.10", "@types/redis": "^4.0.11", "builtin-modules": "^5.0.0", @@ -20,7 +20,7 @@ "jszip": "^3.10.1", "lucide-react": "^0.534.0", "mcp-handler": "^1.1.0", - "next": "16.2.6", + "next": "^16.2.6", "next-themes": "^0.4.4", "playwright": "^1.49.1", "prettier": "^3.6.2", @@ -145,7 +145,7 @@ "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.2.6", "", { "os": "win32", "cpu": "x64" }, "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA=="], - "@onkernel/sdk": ["@onkernel/sdk@0.60.0", "", {}, "sha512-z9POhDK6uanj9FJ5GS/ff7MaqYjCOWP5605pbuUYEH9EuX5bthD89y/XPqwcC9xpgr9RLjlFVJ73ORAiAXfuPw=="], + "@onkernel/sdk": ["@onkernel/sdk@0.72.0", "", {}, "sha512-Q0hcPWccnuoY977GB2bBlJm+UIfXEH3MOPO7ENF+zVracdEuktX0KUucjJm2wxSLERDyhBHptTUG/IOv5EigTA=="], "@redis/bloom": ["@redis/bloom@5.6.0", "", { "peerDependencies": { "@redis/client": "^5.6.0" } }, "sha512-l13/d6BaZDJzogzZJEphIeZ8J0hpQpjkMiozomTm6nJiMNYkoPsNOBOOQua4QsG0fFjyPmLMDJFPAp5FBQtTXg=="],