import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { getCookiesSchema, setCookiesSchema, deleteCookiesSchema } from '../schemas.js';
import { getPageForOperation } from '../tabs.js';
import { getBrowser } from '../browser.js';
import {
handleResult,
ok,
err,
normalizeError,
} from '../errors.js';
import type { CookieParam } from '../types.js';
/**
* Register cookie management tools
*/
export function registerCookiesTools(server: McpServer): void {
// Get cookies
server.tool(
'get_cookies',
'Get cookies for the current page or specified URLs',
getCookiesSchema.shape,
async ({ urls, tabId }) => {
const pageResult = await getPageForOperation(tabId);
if (!pageResult.success) {
return handleResult(pageResult);
}
const page = pageResult.data;
try {
const cookies = await page.cookies(...(urls ?? []));
return handleResult(ok({
cookies: cookies.map((cookie) => ({
name: cookie.name,
value: cookie.value,
domain: cookie.domain,
path: cookie.path,
expires: cookie.expires,
httpOnly: cookie.httpOnly,
secure: cookie.secure,
sameSite: cookie.sameSite,
})),
}));
} catch (error) {
return handleResult(err(normalizeError(error)));
}
}
);
// Set cookies
server.tool(
'set_cookies',
'Set cookies in the browser',
setCookiesSchema.shape,
async ({ cookies, tabId }) => {
const pageResult = await getPageForOperation(tabId);
if (!pageResult.success) {
return handleResult(pageResult);
}
const page = pageResult.data;
try {
// Get the current page URL for domain defaulting
const pageUrl = new URL(page.url());
const cookiesToSet = cookies.map((cookie: CookieParam) => ({
name: cookie.name,
value: cookie.value,
domain: cookie.domain ?? pageUrl.hostname,
path: cookie.path ?? '/',
expires: cookie.expires,
httpOnly: cookie.httpOnly,
secure: cookie.secure,
sameSite: cookie.sameSite as 'Strict' | 'Lax' | 'None' | undefined,
}));
await page.setCookie(...cookiesToSet);
return handleResult(ok({
set: cookies.length,
cookies: cookiesToSet.map((c) => c.name),
}));
} catch (error) {
return handleResult(err(normalizeError(error)));
}
}
);
// Delete cookies
server.tool(
'delete_cookies',
'Delete cookies by name',
deleteCookiesSchema.shape,
async ({ names, tabId }) => {
const pageResult = await getPageForOperation(tabId);
if (!pageResult.success) {
return handleResult(pageResult);
}
const page = pageResult.data;
try {
// Get all cookies first
const allCookies = await page.cookies();
// Find cookies to delete
const cookiesToDelete = allCookies.filter((cookie) =>
names.includes(cookie.name)
);
// Delete each matching cookie
const browserResult = await getBrowser();
if (browserResult.success) {
const context = browserResult.data.defaultBrowserContext();
for (const cookie of cookiesToDelete) {
await context.clearPermissionOverrides();
// Delete by setting empty value and expired date
await page.setCookie({
name: cookie.name,
value: '',
domain: cookie.domain,
path: cookie.path,
expires: 0,
});
}
}
return handleResult(ok({
deleted: cookiesToDelete.length,
names: cookiesToDelete.map((c) => c.name),
}));
} catch (error) {
return handleResult(err(normalizeError(error)));
}
}
);
}