# list_windows

Lists on-screen windows of any app with window_id, owning app bundle id + name, title, bounds (global space, top-left, points), display_id, and is_focused. Window TITLES require Screen Recording permission — without it this returns an explicit permission_required error rather than a title-less result. Optional app_bundle_id filter. window_id is stable within the session for later targeting.

Agent View of the PolicyLayer registry record for `list_windows`. HTML page: https://policylayer.com/tools/com-local-mcp-local-mcp/list-windows

## Facts

- Tool: `list_windows`
- Server: Local (`local-mcp`) — https://policylayer.com/tools/com-local-mcp-local-mcp.md
- Install: `npx -y local-mcp`
- Homepage: https://github.com/lanchuske/local-mcp
- Risk category: Read (Low risk)
- Registry record: grade F, identity unverified
- Server auth posture: open
- Server CORS policy: *
- Server rate-limited: no
- Parameters: 2
- Recommended policy verdict: Allowed

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `app_bundle_id` | string | no | Only return windows owned by this app bundle id. |
| `on_screen_only` | boolean | no | Only on-screen windows (default true). |

Parameters from the server's own tool schema.

## Example call (MCP tools/call, JSON-RPC 2.0)

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_windows",
    "arguments": {}
  }
}
```

## Why list_windows is rated Low

This tool retrieves and queries window state information from the operating system. It performs no data modification, deletion, code execution, or financial operations. The permission requirement for Screen Recording is a security gate, not a category change. The stable window_id for 'later targeting' suggests it may facilitate other tool operations, but the tool itself is purely informational.

From the tool's own definition: "Tool description states it 'Lists on-screen windows' and 'returns' window metadata (window_id, app bundle id, name, title, bounds, display_id, is_focused). The verb 'lists' and 'returns' indicate read-only data retrieval with no modification or side effects."

## Use case

AI agents call list_windows to retrieve information from Local without modifying anything. It is typically the context-gathering step in research, monitoring, and reporting workflows, before the agent takes action elsewhere.

## Recommended policy (PolicyLayer)

Verdict: **Allowed**. Enforced by the PolicyLayer MCP gateway (https://policylayer.com/mcp-gateway) before a call reaches Local:

```json
{
  "version": "1",
  "default": "deny",
  "tools": {
    "list_windows": {}
  }
}
```

## Other tools on Local (233)

- `delete_calendar_event` — Destructive — https://policylayer.com/tools/com-local-mcp-local-mcp/delete-calendar-event.md
- `delete_reminder` — Destructive — https://policylayer.com/tools/com-local-mcp-local-mcp/delete-reminder.md
- `delete_reminder_list` — Destructive — https://policylayer.com/tools/com-local-mcp-local-mcp/delete-reminder-list.md
- `m365_delete_event` — Destructive — https://policylayer.com/tools/com-local-mcp-local-mcp/m365-delete-event.md
- `onedrive_delete_file` — Destructive — https://policylayer.com/tools/com-local-mcp-local-mcp/onedrive-delete-file.md
- `recipe_delete` — Destructive — https://policylayer.com/tools/com-local-mcp-local-mcp/recipe-delete.md
- `chrome_click` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/chrome-click.md
- `chrome_evaluate_js` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/chrome-evaluate-js.md
- `chrome_fill_form` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/chrome-fill-form.md
- `chrome_go_back` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/chrome-go-back.md
- `chrome_navigate` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/chrome-navigate.md
- `chrome_type` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/chrome-type.md
- `chrome_wait_for` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/chrome-wait-for.md
- `nordvpn_diagnose` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/nordvpn-diagnose.md
- `notion_open_page` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/notion-open-page.md
- `recipe_run` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/recipe-run.md
- `run_diagnostics` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/run-diagnostics.md
- `run_terminal_command` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/run-terminal-command.md
- `safari_click` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/safari-click.md
- `safari_evaluate_js` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/safari-evaluate-js.md
- `safari_fill_form` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/safari-fill-form.md
- `safari_go_back` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/safari-go-back.md
- `safari_navigate` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/safari-navigate.md
- `safari_query_selector_all` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/safari-query-selector-all.md
- `safari_type` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/safari-type.md
- `safari_wait_for` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/safari-wait-for.md
- `screen_record_start` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/screen-record-start.md
- `screen_record_stop` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/screen-record-stop.md
- `setup_install` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/setup-install.md
- `ui_click` — Execute — https://policylayer.com/tools/com-local-mcp-local-mcp/ui-click.md
- …and 203 more: https://policylayer.com/tools/com-local-mcp-local-mcp.md

## For agents

This record is a snapshot. Live verdicts and the full registry:

- Check every server in your MCP config at once: `npx -y policylayer stack`
- Vet a server before you add it: install the mcp-precheck skill — `npx skills add https://policylayer.com` (skill text: https://policylayer.com/skill.md)
- Query the registry over MCP: endpoint `https://api.policylayer.com/mcp` — tools `check_mcp_server`, `check_mcp_stack`, `check_tool`, `search_registry`, `get_change_events`

---

Source: the PolicyLayer MCP registry — one continuously verified record per MCP server. Full record: https://policylayer.com/registry?q=com-local-mcp-local-mcp · API: https://policylayer.com/registry/api · Policy library: https://policylayer.com/policies/com-local-mcp-local-mcp
