Skip to main content
Glama

list_tabs

Retrieve all active tabs in Firefox for efficient browser management and multi-tab debugging using Playwright-based automation.

Instructions

List all active tabs

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • Implementation of the list_tabs tool handler. It lists all active tabs (pages) with their tabId, current URL, and active status, returning a formatted text response.
    async listTabs() {
      const tabs = [];
      for (const [tabId, page] of this.pages) {
        const url = page.url();
        const isActive = tabId === this.activeTabId;
        tabs.push({ tabId, url, active: isActive });
      }
      return {
        content: [{
          type: 'text',
          text: `Active tabs (${tabs.length}):\n` + 
                tabs.map(tab => `- ${tab.tabId}: ${tab.url}${tab.active ? ' (active)' : ''}`).join('\n')
        }]
      };
    }
  • Registration/dispatch in the CallToolRequestSchema handler switch statement that invokes the listTabs method for the 'list_tabs' tool.
    case 'list_tabs':
      return await this.listTabs();
  • Tool registration in ListToolsRequestSchema response including name, description, and input schema (empty object since no parameters required).
    {
      name: 'list_tabs',
      description: 'List all active tabs',
      inputSchema: { type: 'object', properties: {} }
    },
  • Overall registration of all tools including list_tabs via setRequestHandler for ListToolsRequestSchema.
    this.server.setRequestHandler(ListToolsRequestSchema, async () => {
      return {
        tools: [
          // Original tools (abbreviated for space)
          {
            name: 'launch_firefox_multi',
            description: 'Launch Firefox browser with multi-tab support and debugging',
            inputSchema: {
              type: 'object',
              properties: {
                headless: { type: 'boolean', default: false },
                enableDebugLogging: { type: 'boolean', default: true }
              }
            }
          },
          {
            name: 'create_tab',
            description: 'Create a new tab with isolated session and debugging',
            inputSchema: {
              type: 'object',
              properties: {
                tabId: { type: 'string' },
                url: { type: 'string', default: 'about:blank' },
                contextId: { type: 'string' },
                enableMonitoring: { type: 'boolean', default: true }
              },
              required: ['tabId']
            }
          },
          {
            name: 'list_tabs',
            description: 'List all active tabs',
            inputSchema: { type: 'object', properties: {} }
          },
          {
            name: 'close_tab',
            description: 'Close a specific tab',
            inputSchema: {
              type: 'object',
              properties: { tabId: { type: 'string' } },
              required: ['tabId']
            }
          },
          {
            name: 'navigate',
            description: 'Navigate to a URL',
            inputSchema: {
              type: 'object',
              properties: {
                url: { type: 'string' },
                tabId: { type: 'string' }
              },
              required: ['url']
            }
          },
          {
            name: 'click',
            description: 'Click on an element',
            inputSchema: {
              type: 'object',
              properties: {
                selector: { type: 'string' },
                coordinates: {
                  type: 'object',
                  properties: { x: { type: 'number' }, y: { type: 'number' } }
                },
                tabId: { type: 'string' }
              }
            }
          },
          {
            name: 'type_text',
            description: 'Type text into an input field',
            inputSchema: {
              type: 'object',
              properties: {
                selector: { type: 'string' },
                text: { type: 'string' },
                tabId: { type: 'string' }
              },
              required: ['selector', 'text']
            }
          },
          {
            name: 'send_key',
            description: 'Send keyboard events',
            inputSchema: {
              type: 'object',
              properties: {
                key: { type: 'string' },
                selector: { type: 'string' },
                modifiers: { type: 'array', items: { type: 'string' } },
                repeat: { type: 'number', default: 1 },
                tabId: { type: 'string' }
              },
              required: ['key']
            }
          },
          {
            name: 'drag',
            description: 'Perform drag operation',
            inputSchema: {
              type: 'object',
              properties: {
                selector: { type: 'string' },
                fromCoordinates: {
                  type: 'object',
                  properties: { x: { type: 'number' }, y: { type: 'number' } }
                },
                toCoordinates: {
                  type: 'object',
                  properties: { x: { type: 'number' }, y: { type: 'number' } }
                },
                offsetX: { type: 'number' },
                offsetY: { type: 'number' },
                duration: { type: 'number', default: 0 },
                steps: { type: 'number', default: 1 },
                tabId: { type: 'string' }
              }
            }
          },
          {
            name: 'execute_script',
            description: 'Execute JavaScript in the browser',
            inputSchema: {
              type: 'object',
              properties: {
                script: { type: 'string' },
                tabId: { type: 'string' }
              },
              required: ['script']
            }
          },
          {
            name: 'screenshot',
            description: 'Take a screenshot',
            inputSchema: {
              type: 'object',
              properties: {
                path: { type: 'string', default: 'screenshot.png' },
                fullPage: { type: 'boolean', default: false },
                tabId: { type: 'string' }
              }
            }
          },
          {
            name: 'get_page_content',
            description: 'Get HTML content',
            inputSchema: {
              type: 'object',
              properties: {
                selector: { type: 'string' },
                tabId: { type: 'string' }
              }
            }
          },
          {
            name: 'get_page_text',
            description: 'Get visible text content',
            inputSchema: {
              type: 'object',
              properties: {
                selector: { type: 'string' },
                tabId: { type: 'string' }
              }
            }
          },
          {
            name: 'wait_for_element',
            description: 'Wait for element to appear',
            inputSchema: {
              type: 'object',
              properties: {
                selector: { type: 'string' },
                timeout: { type: 'number', default: 30000 },
                tabId: { type: 'string' }
              },
              required: ['selector']
            }
          },
          {
            name: 'close_browser',
            description: 'Close browser and all tabs',
            inputSchema: { type: 'object', properties: {} }
          },
          {
            name: 'get_current_url',
            description: 'Get current page URL',
            inputSchema: {
              type: 'object',
              properties: { tabId: { type: 'string' } }
            }
          },
          {
            name: 'back',
            description: 'Navigate back',
            inputSchema: {
              type: 'object',
              properties: { tabId: { type: 'string' } }
            }
          },
          {
            name: 'forward',
            description: 'Navigate forward',
            inputSchema: {
              type: 'object',
              properties: { tabId: { type: 'string' } }
            }
          },
          {
            name: 'reload',
            description: 'Reload page',
            inputSchema: {
              type: 'object',
              properties: { tabId: { type: 'string' } }
            }
          },
          {
            name: 'set_active_tab',
            description: 'Set active tab',
            inputSchema: {
              type: 'object',
              properties: { tabId: { type: 'string' } },
              required: ['tabId']
            }
          },
    
          // NEW DEBUG TOOLS
          {
            name: 'get_console_logs',
            description: 'Get captured console logs from browser',
            inputSchema: {
              type: 'object',
              properties: {
                tabId: { type: 'string' },
                since: { type: 'number', description: 'Timestamp to filter logs since' },
                types: {
                  type: 'array',
                  items: { type: 'string', enum: ['log', 'error', 'warn', 'info', 'debug'] },
                  description: 'Filter by log types'
                },
                limit: { type: 'number', default: 50, description: 'Max number of logs to return' }
              }
            }
          },
          {
            name: 'get_javascript_errors',
            description: 'Get captured JavaScript errors',
            inputSchema: {
              type: 'object',
              properties: {
                tabId: { type: 'string' },
                since: { type: 'number' },
                limit: { type: 'number', default: 20 }
              }
            }
          },
          {
            name: 'get_network_activity',
            description: 'Get captured network requests and responses',
            inputSchema: {
              type: 'object',
              properties: {
                tabId: { type: 'string' },
                since: { type: 'number' },
                filter: { type: 'string', enum: ['all', 'xhr', 'websocket', 'fetch'], default: 'all' },
                limit: { type: 'number', default: 30 }
              }
            }
          },
          {
            name: 'get_websocket_messages',
            description: 'Get captured WebSocket messages (for LiveView debugging)',
            inputSchema: {
              type: 'object',
              properties: {
                tabId: { type: 'string' },
                since: { type: 'number' },
                limit: { type: 'number', default: 50 }
              }
            }
          },
          {
            name: 'get_performance_metrics',
            description: 'Get performance metrics (timing, memory usage)',
            inputSchema: {
              type: 'object',
              properties: {
                tabId: { type: 'string' }
              }
            }
          },
          {
            name: 'start_monitoring',
            description: 'Start/restart monitoring for a tab',
            inputSchema: {
              type: 'object',
              properties: {
                tabId: { type: 'string' },
                types: {
                  type: 'array',
                  items: { type: 'string', enum: ['console', 'errors', 'network', 'websocket', 'performance'] },
                  default: ['console', 'errors', 'network', 'websocket']
                }
              }
            }
          },
          {
            name: 'clear_debug_buffers',
            description: 'Clear debug event buffers for a tab',
            inputSchema: {
              type: 'object',
              properties: {
                tabId: { type: 'string' },
                types: {
                  type: 'array',
                  items: { type: 'string', enum: ['console', 'errors', 'network', 'websocket'] }
                }
              }
            }
          },
          {
            name: 'get_all_debug_activity',
            description: 'Get combined feed of all debug events',
            inputSchema: {
              type: 'object',
              properties: {
                tabId: { type: 'string' },
                since: { type: 'number' },
                limit: { type: 'number', default: 100 }
              }
            }
          },
          {
            name: 'inject_debugging_helpers',
            description: 'Inject debugging helper functions into the page',
            inputSchema: {
              type: 'object',
              properties: {
                tabId: { type: 'string' },
                includeWebSocketMonitoring: { type: 'boolean', default: true }
              }
            }
          }
        ],
      };

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/JediLuke/firefox-mcp-server'

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