Skip to main content
Glama
cookies.ts3.95 kB
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))); } } ); }

Implementation Reference

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/andytango/puppeteer-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server