{"accessModel":{"bootstrapExchange":"Bootstrap bearers list only `rotate_agent_token` in tools/list. Calling it revokes the bootstrap bearer and returns a session bearer.","pageUrl":"The page URL exposes the tool catalog. After bootstrap exchange, MCP operations mirror to the live browser tab in real time.","security":"Session tokens are bearer credentials; they expire and can be revoked. The bootstrap bearer is the human's explicit consent to attach an agent to their live tab.","sessionToken":"Bootstrap bearer from **AI に渡す**, then POST JSON-RPC to `/agent`. First `tools/call rotate_agent_token` returns the session bearer.","tabId":null,"tabIdParam":"t","tokenSources":["Primary (chat agents): bootstrap bearer issued when the human opens **AI に渡す** in the live tab","Server-side `Dialup.Session.grant/2` for programmatic access","POST `/_dialup/agent-session` to start an agent-first session without a browser tab","Same-browser cookie handoff: POST `/_dialup/agent-handoff?tab_id=...` (instant active token)"]},"agentQuickstart":{"goal":"Dialup couples a live browser session with an HTTP JSON-RPC API. The human pastes two lines from **AI に渡す**; the agent exchanges the bootstrap bearer for a session bearer.","humanConfirmation":"Actions marked confirm=human return an isError tool result over HTTP MCP (structuredContent.confirm = \"human\"). They require the human browser UI.","jsonRpcRequestShape":{"id":1,"jsonrpc":"2.0","method":"tools/call","params":{"arguments":{},"name":"rotate_agent_token"}},"steps":["The human copies `https://host/agent` and `Authorization: Bearer <bootstrap>` from **AI に渡す**.","POST `/agent` with the bootstrap bearer accepts JSON-RPC (`initialize`, `tools/list`, `tools/call`).","Bootstrap grants expose only `rotate_agent_token` in tools/list.","`tools/call rotate_agent_token` revokes the bootstrap bearer and returns a session bearer.","The session bearer accepts the page's normal tools (read_scene, navigate_*, etc.).","Mutating tools include `_version` from the latest `read_scene` response."]},"connection":{"agentWireEndpoint":"/agent","authentication":"bootstrap_bearer","httpEndpoint":"/agent","httpEndpointTemplate":"/agent","instructions":"The human copies two lines from **AI に渡す**: the MCP endpoint (`POST /agent`) and `Authorization: Bearer <bootstrap>`. POST `/agent` accepts JSON-RPC.","protocolVersion":"2025-11-25","status":"no_live_session","tabId":null,"tabIdParam":"t"},"dialup":"agent-discovery","message":{"concept":"A showcase of Dialup's interactive UI primitives: counter with partial patch, form submission, real-time input sync, and a message log.","flow":["Call read_scene to see current widget states.","Use inc/dec/reset_counter to test the counter.","Use submit_name to test form submission.","Use send_message/clear_log for the message log."],"goal":"Explore each widget to verify that agent-driven mutations produce the same real-time results as human interaction.","safety":["clear_log deletes all messages; confirm with the user first."]},"protocolGuide":{"browserHandoff":"issue_browser_url mints a one-time browserUrl when the grant allows. The client attaches over WebSocket and POSTs /_dialup/finalize-join to set the cookie; opening the URL alone does not complete join.","expiryRecovery":"Expired or revoked session bearers require a fresh bootstrap bearer from **AI に渡す** in the live tab.","humanConfirmation":"Actions with confirm=human return an isError tool result over HTTP MCP; completion requires the browser UI.","navigation":"Navigation actions carry _meta.navigate (for example navigate_docs__concepts). Invoking one updates the human browser tab like clicking the same link. The tool catalog is page-specific; tools/list and read_scene reflect the current path. There is no free-form navigate tool — only UI-declared destinations.","requests":{"initialize":{"id":1,"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{},"clientInfo":{"name":"ai-agent","version":"1"},"protocolVersion":"2025-11-25"}},"readScene":{"id":3,"jsonrpc":"2.0","method":"tools/call","params":{"arguments":{},"name":"read_scene"}},"toolsList":{"id":2,"jsonrpc":"2.0","method":"tools/list","params":{}}},"transport":{"http":"POST /agent with Content-Type: application/json and Authorization: Bearer {session-token}"},"uiLock":"lock_ui (optional reason) sets uiLocked; human input is ignored until unlock_ui. read_scene reports uiLocked.","versioning":{"recovery":"After a stale result, read_scene reflects current availability; a subsequent action includes the returned version.","rule":"Mutating tools expect `_version` matching the latest scene version from read_scene.","staleResult":"A stale `_version` returns an isError tool result; structuredContent.currentVersion holds the latest version."}},"scene":{"actions":[{"available":true,"confirm":null,"description":"Increment the counter","effects":null,"examples":null,"idempotent":null,"mode":"action","name":"inc","navigate":null,"reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Decrement the counter","effects":null,"examples":null,"idempotent":null,"mode":"action","name":"dec","navigate":null,"reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Reset the counter to zero","effects":null,"examples":null,"idempotent":null,"mode":"action","name":"reset_counter","navigate":null,"reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Submit a name from the form","effects":null,"examples":null,"idempotent":null,"mode":"action","name":"submit_name","navigate":null,"reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Sync draft text while typing","effects":null,"examples":null,"idempotent":null,"mode":"action","name":"draft_change","navigate":null,"reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Confirm the current draft","effects":null,"examples":null,"idempotent":null,"mode":"action","name":"confirm_draft","navigate":null,"reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Append a message to the log","effects":null,"examples":null,"idempotent":null,"mode":"action","name":"send_message","navigate":null,"reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Clear the message log","effects":null,"examples":null,"idempotent":null,"mode":"action","name":"clear_log","navigate":null,"reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Open /","effects":null,"examples":null,"idempotent":null,"mode":"navigate","name":"navigate_root","navigate":"/","reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Open /docs","effects":null,"examples":null,"idempotent":null,"mode":"navigate","name":"navigate_docs","navigate":"/docs","reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Open /docs/concepts","effects":null,"examples":null,"idempotent":null,"mode":"navigate","name":"navigate_docs__concepts","navigate":"/docs/concepts","reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Open /docs/reference","effects":null,"examples":null,"idempotent":null,"mode":"navigate","name":"navigate_docs__reference","navigate":"/docs/reference","reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Open /agent_demo","effects":null,"examples":null,"idempotent":null,"mode":"navigate","name":"navigate_agent_demo","navigate":"/agent_demo","reversible":null,"risk":"unspecified","success":null},{"available":true,"confirm":null,"description":"Open /demo","effects":null,"examples":null,"idempotent":null,"mode":"navigate","name":"navigate_demo","navigate":"/demo","reversible":null,"risk":"unspecified","success":null}],"path":"/demo","regions":[],"state":{"count":0,"draft":"","draft_confirmed":null,"message_log":[],"submitted_name":null},"version":0},"url":"/demo","version":1}