Skip to main content
Glama

pilot_tabs

List all open browser tabs with their IDs, URLs, titles, and active tab marker. Find a specific tab by title or URL to know which tab is active before switching.

Instructions

List all open browser tabs with their IDs, URLs, titles, and which tab is currently active. Use when the user wants to see what tabs are open, find a specific tab by title or URL, or check which tab is active before switching.

Parameters: (none)

Returns: Numbered list of tabs showing [id], title, URL, and an arrow (→) marking the active tab.

Errors: None — returns empty list if no tabs exist (unlikely in normal operation).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • The `pilot_tabs` tool handler: lists all open browser tabs via extension or BrowserManager, returns tab IDs, titles, URLs, and marks the active tab.
      server.tool(
        'pilot_tabs',
        `List all open browser tabs with their IDs, URLs, titles, and which tab is currently active.
    Use when the user wants to see what tabs are open, find a specific tab by title or URL, or check which tab is active before switching.
    
    Parameters: (none)
    
    Returns: Numbered list of tabs showing [id], title, URL, and an arrow (→) marking the active tab.
    
    Errors: None — returns empty list if no tabs exist (unlikely in normal operation).`,
        {},
        async () => {
          await bm.ensureBrowser();
          try {
            const ext = bm.getExtension();
            if (ext) {
              const tabs = await ext.send<Array<{ tabId: number; url: string; title: string; active: boolean }>>('tabs');
              const text = tabs.map(t =>
                `${t.active ? '→ ' : '  '}[${t.tabId}] ${t.title || '(untitled)'} — ${t.url}`
              ).join('\n');
              return { content: [{ type: 'text' as const, text }] };
            }
            const tabs = await bm.getTabListWithTitles();
            const text = tabs.map(t =>
              `${t.active ? '→ ' : '  '}[${t.id}] ${t.title || '(untitled)'} — ${t.url}`
            ).join('\n');
            return { content: [{ type: 'text' as const, text }] };
          } catch (err) {
            return { content: [{ type: 'text' as const, text: wrapError(err) }], isError: true };
          }
        }
      );
  • Schema for `pilot_tabs` — empty object (no parameters).
    {},
  • Registration of tab tools (including pilot_tabs) via registerTabTools(effectiveServer, bm).
    registerTabTools(effectiveServer, bm);
  • `pilot_tabs` is listed in the STANDARD_TOOLS profile set, meaning it's available in the 'standard' and 'full' profiles but not in 'core'.
    'pilot_tabs', 'pilot_tab_new', 'pilot_tab_close', 'pilot_tab_select',
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must fully disclose behavior. It states the tool returns a list and that no errors occur, but does not explicitly confirm it is read-only or describe any side effects. The non-destructive nature is implied but not stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise at three short sentences, each adding value: purpose, usage, return format, and error handling. It is front-loaded with the core action and information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, usage, and return format, but lacks output schema to confirm the structure. It does not specify if tabs are from the current window or all windows, which could be ambiguous. Slight gap for a simple listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the description explicitly notes 'Parameters: (none)'. Since schema coverage is 100% and no parameters exist, the description adds clarity that no input is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all open browser tabs with their IDs, URLs, titles, and active status. It distinguishes itself from sibling tab tools (e.g., pilot_tab_close, pilot_tab_new) by focusing on listing rather than manipulation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use the tool: to see what tabs are open, find a specific tab, or check the active tab. It does not explicitly state when not to use it, but the context of listing makes it clear this is for observation, not for tab management.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/TacosyHorchata/Pilot'

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