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=="], 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..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,10 +36,13 @@ 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({ + ...(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, emptyText: "No extensions found", }); } diff --git a/src/lib/mcp/tools/proxies.ts b/src/lib/mcp/tools/proxies.ts index e2b4b74..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,10 +136,13 @@ 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({ + ...(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, emptyText: "No proxies found", }); }