# v0.6.0 — Native JSON: structured output across every data tool

## TL;DR
Every tool that returns data now emits MCP `structuredContent` — a real JSON object in the protocol result — alongside a compact text fallback. Clients that support structured output (the mcpproxy chain does) render the object directly: no more `{"result": "{\"url\":\"...\"}"}` string-in-string escape inflation. This also sweeps up the five pretty-print sites v0.5.0 missed.

## Why
v0.5.0 made JSON outputs *compact*, but they still travelled as JSON strings inside a `text` content block — so the transport JSON-encoded them a second time, and every quote became `\"` noise the client pays tokens for. The proof the fix works sat in plain sight: fs-mcp tools crossing the exact same proxy chain surface as clean native objects, because they emit `structuredContent`. This release closes that gap for firefox-docker-mcp.

## Highlights
| Tool | Before | After |
|---|---|---|
| `query_dom` | Compact JSON string in text block | Native object + text fallback (fallback dropped by structured-aware clients) |
| `page_info` | Compact JSON string in text block | Native object + text fallback |
| `list_console_messages` (json) | Compact JSON string | Native object |
| `list_network_requests` (min/full) | **Still pretty-printed** header + JSON | Native object (`{total, showing, hasMore, requests}`) |
| `get_network_request` | **Still pretty-printed** in text format | Native object both formats |
| `evaluate_script` | **Still pretty-printed** in a ```` ```json ```` fence | `{result}` native object + one-line text |
| `evaluate_privileged_script` | **Still pretty-printed** | `{result}` native object + one-line text |
| `scroll_page` | One-liner | Unchanged — deliberate, see below |

## Design notes
- **Text fallback always ships.** Spec-compliant clients that ignore `structuredContent` see exactly the v0.5.0 compact output — zero regression, pure upside.
- **`scroll_page` (and all 13 auto-screenshot tools) stay text-only.** Their screenshot rides in `content[]`; a client that prefers `structuredContent` may drop `content[]`, and losing the screenshot to de-escape a one-line summary is a bad trade.
- **Truncation guard.** `query_dom` skips `structuredContent` when the text payload was truncated — otherwise the full object would smuggle itself past the response token cap.
- **Objects only.** The spec requires `structuredContent` to be a JSON object, so script results are wrapped as `{result: ...}` and arrays/primitives stay text-only in `jsonResponse`.

## Files changed
- `src/types/common.ts` — `structuredContent` on `McpToolResponse`
- `src/utils/response-helpers.ts` — `jsonResponse` emits object + compact text
- `src/tools/query-dom.ts`, `src/tools/page-info.ts` — parse-once attach with truncation guard
- `src/tools/network.ts` — min/full/detail branches de-prettied + structured
- `src/tools/script.ts`, `src/tools/privileged-context.ts` — fence dropped, `{result}` structured

No breaking changes. Bridge package untouched.
