set_local_storage
Set a key-value pair in the browser's localStorage on the active page. Specify the key and value to store data locally.
Instructions
Set a localStorage entry on the current page
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Storage key | |
| value | Yes | Storage value | |
| tabId | No | Target tab ID (defaults to active tab) | |
| apiKey | No | API key for authentication |
Implementation Reference
- src/tools/devtools-storage.ts:75-89 (handler)The tool handler function that executes set_local_storage logic. It takes key, value, optional tabId and apiKey, sends a 'set_local_storage' command via the WebSocket bridge, and returns success/error text.
server.tool( 'set_local_storage', 'Set a localStorage entry on the current page', { key: z.string().describe('Storage key'), value: z.string().describe('Storage value'), tabId: z.number().optional().describe('Target tab ID (defaults to active tab)'), apiKey: z.string().optional().describe('API key for authentication'), }, async ({ key, value, tabId, apiKey }) => { const result = await bridge.sendCommand({ command: 'set_local_storage', params: { key, value }, tabId, apiKey }); if (!result.success) return { content: [{ type: 'text' as const, text: `Error: ${result.error?.message}` }], isError: true }; return { content: [{ type: 'text' as const, text: `localStorage["${key}"] set` }] }; } ); - src/tools/devtools-storage.ts:78-83 (schema)Input schema/validation for set_local_storage using Zod, defining required 'key' (string), required 'value' (string), optional 'tabId' (number), and optional 'apiKey' (string).
{ key: z.string().describe('Storage key'), value: z.string().describe('Storage value'), tabId: z.number().optional().describe('Target tab ID (defaults to active tab)'), apiKey: z.string().optional().describe('API key for authentication'), }, - src/tools/devtools-storage.ts:75-89 (registration)The tool is registered via server.tool() call on line 75 as 'set_local_storage' inside the registerDevtoolsStorageTools function.
server.tool( 'set_local_storage', 'Set a localStorage entry on the current page', { key: z.string().describe('Storage key'), value: z.string().describe('Storage value'), tabId: z.number().optional().describe('Target tab ID (defaults to active tab)'), apiKey: z.string().optional().describe('API key for authentication'), }, async ({ key, value, tabId, apiKey }) => { const result = await bridge.sendCommand({ command: 'set_local_storage', params: { key, value }, tabId, apiKey }); if (!result.success) return { content: [{ type: 'text' as const, text: `Error: ${result.error?.message}` }], isError: true }; return { content: [{ type: 'text' as const, text: `localStorage["${key}"] set` }] }; } ); - src/websocket-bridge.ts:63-103 (helper)The sendCommand method on WebSocketBridge that dispatches the 'set_local_storage' command over WebSocket to the Chrome extension.
async sendCommand(cmd: BridgeCommand): Promise<BridgeResponse> { if (!this.isConnected()) { return { success: false, error: { code: 'NOT_CONNECTED', message: 'Chrome extension is not connected. Ensure the extension is installed, enabled, and the browser is running.', }, }; } const id = crypto.randomUUID(); const timeout = cmd.timeout ?? DEFAULT_TIMEOUT; return new Promise<BridgeResponse>((resolve, reject) => { const timer = setTimeout(() => { this.pending.delete(id); resolve({ success: false, error: { code: 'TIMEOUT', message: `Command '${cmd.command}' timed out after ${timeout}ms`, }, }); }, timeout); this.pending.set(id, { resolve, reject, timer }); const message = { id, type: 'request', command: cmd.command, params: cmd.params, tabId: cmd.tabId, apiKey: cmd.apiKey, timestamp: Date.now(), }; this.client!.send(JSON.stringify(message)); }); } - src/tools/index.ts:29-55 (registration)The registerAllTools function (called from server.ts) which calls registerDevtoolsStorageTools to register all storage tools including set_local_storage.
export function registerAllTools(server: McpServer, bridge: WebSocketBridge) { registerNavigationTools(server, bridge); registerTabManagementTools(server, bridge); registerKeyboardTools(server, bridge); registerScreenshotTools(server, bridge); registerClickTools(server, bridge); registerInputTools(server, bridge); registerDragDropTools(server, bridge); registerHoverTools(server, bridge); registerDevtoolsSourcesTools(server, bridge); registerDevtoolsModifyTools(server, bridge); registerDevtoolsNetworkTools(server, bridge); registerDevtoolsStorageTools(server, bridge); registerDevtoolsConsoleTools(server, bridge); registerAccessibilityTools(server, bridge); registerEmulationTools(server, bridge); registerElementTools(server, bridge); registerAuditTools(server, bridge); registerInteractionTools(server, bridge); registerMonitoringTools(server, bridge); registerQaTools(server, bridge); registerGestureTools(server, bridge); registerMacroTools(server, bridge); registerVisualRegressionTools(server, bridge); }