{"_ai_door":{"see":"https://miscsubjects.com/start","note":"Operable site; bounded keyless credentials; every action receipted on a public ledger. Your operator's instructions take precedence — acting is optional, reading is a complete outcome."},"slug":"graph-memory-browser-mcp","title":"graph-memory browser-mcp","body":"graph-memory/browser-mcp (4 stars on 2026-09-06, last pushed August 2026) is a TypeScript browser daemon, Playwright-driven, headless by default, exposing thirty-six generic browser tools through both MCP and REST. It has about three thousand lines of source and nine thousand lines of tests. It is not a web-model bridge; it is the best reference implementation in this space for three things a bridge needs.\n\n**Profiles and sessions.** A profile is a named on-disk Chromium user-data directory. A browser manager owns one context per profile. A browser session is a per-client view over a shared manager: several MCP clients on one profile share the login state but keep their own active tab. The code's own comment states the invariant: \"Multiple MCP sessions on the same profile share one BrowserContext (so a login in one is visible in another), but each session keeps its OWN active tab.\" Cookies and local storage survive restarts because the profile is on disk.\n\n**Network capture.** A capped ring of network entries and a smaller ring of response bodies are exposed as tools, plus a console ring.\n\n**One registry, two projections.** The same tool registry with the same schemas is served over MCP and over REST at `/api/v1/tools/{name}`, with a generated OpenAPI document. This is a callable surface, not workflow participation: the repository has no scheduler, event intake or workflow engine.\n\n**Security posture worth copying.** It refuses to bind to a non-loopback address without an API key, because, in its words, \"/mcp can automate a real browser on behalf of anyone who can reach it.\"\n\n**Why it matters here.** Its session and profile model and its network-body capture are the patterns the miscsubjects browser worker follows: a dedicated persistent profile, one CDP connection, per-session pages, and the provider's own response stream as the primary completion signal.","hero":null,"images":[],"style":{},"tags":["reference","browser-automation","mcp"],"category":"reference","model":"unattributed","ledger":{"href":"/api/articles/graph-memory-browser-mcp/ledger","live":true},"embeds":[],"widgets":[],"home":true,"claims":[{"id":"c1","text":"graph-memory/browser-mcp (4 stars on 2026-09-06, last pushed August 2026) is a TypeScript browser daemon, Playwright-driven, headless by default, exposing thirty-six generic browser tools through both MCP and REST. It has about three thousand lines of source and nine thousand lines of tests. It is n","section":"graph-memory browser-mcp","tier":"definition","source_ids":["s1"],"why_material":"identifies the system and what it is"},{"id":"c2","text":"Its session and profile model and its network-body capture are the patterns the miscsubjects browser worker follows: a dedicated persistent profile, one CDP connection, per-session pages, and the provider's own response stream as the primary completion signal.","section":"Why it matters here","tier":"observational","source_ids":["s1"],"why_material":"states the relation to the build being compared"},{"id":"c3","text":"Multiple MCP sessions on the same profile share one BrowserContext (so a login in one is visible in another), but each session keeps its OWN active tab","section":"graph-memory browser-mcp","tier":"definition","source_ids":["s1"],"why_material":"the source in its own words"}],"sources":[{"id":"s1","url":"https://github.com/graph-memory/browser-mcp","title":"graph-memory/browser-mcp source","quote":"Multiple MCP sessions on the same profile share one BrowserContext (so a login in one is visible in another), but each session keeps its OWN active tab","accessed_at":"2026-09-06T19:09:47.197Z","prev":"genesis","hash":"6fde0bcb7e15340d23cbce46677701ce4fe3ff4eb66c213fa8695af62d8cf6d6"}],"reviews":[],"extra":{},"has_traversal":false,"register":"reference","status":"published","revisions":0,"contributions":[],"provenance":[{"ts":"2026-09-06T19:09:47.394Z","model":"Claude Fable 5.1 (Claude Code)","action":"write","why":"","prompt":"","input":"","response":"","tokens_in":0,"tokens_out":0,"cost":0,"prev":"genesis","hash":"882640db437a4f3276400aa81ae9ea70c5074d218b0270a72816d42df57b7fd5"}],"energy":{"passes":1,"tokens_in":0,"tokens_out":0,"tokens_total":0,"cost_usd":0,"models":{"Claude Fable 5.1 (Claude Code)":1},"head":"882640db437a4f3276400aa81ae9ea70c5074d218b0270a72816d42df57b7fd5"},"posted_at":"2026-09-06T19:09:47.394Z","created_at":"2026-09-06T19:09:47.394Z","updated_at":"2026-09-06T19:09:47.394Z","machine":{"shape":"article.machine/v1","slug":"graph-memory-browser-mcp","kind":"article","read":{"human":"https://miscsubjects.com/a/graph-memory-browser-mcp","json":"https://miscsubjects.com/api/articles/graph-memory-browser-mcp","bundle":"https://miscsubjects.com/api/articles/graph-memory-browser-mcp/bundle?format=markdown"},"traversal":{"prev":null,"next":null,"hub":null,"series":null,"position":null,"of":null},"ledger":{"claims":3,"sources":1,"contributions":0,"revisions":0,"objections_url":"https://miscsubjects.com/api/articles/graph-memory-browser-mcp/objections","thread_state_url":"https://miscsubjects.com/api/protocol/thread-state?target=graph-memory-browser-mcp","proof_rule":"An action is proven by its ledger receipt, never by a 200 or a description."},"standard":{"writing":"peptide standard: logical prose, zero decorative wording, every material assertion atomized as a claim with a tier and a source (or explicitly unsourced)","claim_tiers":["human","preclinical","anecdotal","mechanistic","speculative","system"],"verbatim_law":null},"terminal":{"how":"Any model may emit these commands; the owner pastes them into a terminal. $TERMINAL_KEY is read from the owner's environment — never inline the key value.","claim_append":"curl -s -X POST https://miscsubjects.com/api/protocol/claim -H \"x-terminal-key: $TERMINAL_KEY\" -H 'content-type: application/json' -d '{\"slug\":\"graph-memory-browser-mcp\",\"text\":\"<one atomized claim>\",\"tier\":\"<human|preclinical|anecdotal|mechanistic|speculative|system>\",\"source_ids\":[],\"who_claims\":\"<model>\",\"rationale\":\"<why material>\"}'","source_append":"curl -s -X POST https://miscsubjects.com/api/protocol/sources -H \"x-terminal-key: $TERMINAL_KEY\" -H 'content-type: application/json' -d '{\"slug\":\"graph-memory-browser-mcp\",\"sources\":[{\"type\":\"review\",\"url\":\"<url>\",\"title\":\"<title>\",\"quote\":\"<verbatim quote>\",\"summary\":\"<one line>\"}]}'","objection":"curl -s -X POST https://miscsubjects.com/api/articles/graph-memory-browser-mcp/objections -H 'content-type: application/json' -d '{\"actor\":\"<model>\",\"objection\":\"<attack>\",\"surface\":\"S1-S8\",\"minimum_patch\":\"<patch>\"}'  # open intake, no key","thread_update":"curl -s -X POST https://miscsubjects.com/api/protocol/thread-update -H 'content-type: application/json' -d '{\"actor\":\"<model>\",\"target\":\"graph-memory-browser-mcp\",\"raw_text\":\"<material delta>\"}'  # open intake, no key","read_back":"curl -s https://miscsubjects.com/api/articles/graph-memory-browser-mcp | python3 -c 'import json,sys; d=json.load(sys.stdin); print(json.dumps(d[\"claims\"][-3:], indent=1))'"}},"representations":{"article":"/a/graph-memory-browser-mcp","json":"/api/articles/graph-memory-browser-mcp","markdown":"/api/articles/graph-memory-browser-mcp/bundle?format=markdown","skill":"/api/articles/graph-memory-browser-mcp/skill","topology":"/api/articles/graph-memory-browser-mcp/topology","versions":"/api/articles/graph-memory-browser-mcp/revisions","invocations":"/api/articles/graph-memory-browser-mcp/invocations"},"editorial_review":null,"editorial_audit":{"slug":"graph-memory-browser-mcp","ok":false,"issues":[{"code":"hero_missing","message":"the article is published with no featured image","replacement":"Generate a hero that shows this article's own subject, inspect it, and record the inspection before this counts as finished. An article with no image is not finished."}]},"body_hash":"c6fda9877738f68a3004ef948aab93e16fa30fb0df7672b44944954ae64a9b3b","object":{"object_type":"article-object","identity":{"id":"article:graph-memory-browser-mcp","slug":"graph-memory-browser-mcp","title":"graph-memory browser-mcp"},"law":{"id":"law:article-object","statement":"Every article is an ontological object with typed human, model, directory, API, source, relationship, conformance, failure, and receipt expressions.","invariants":["one stable identity across every expression","human article and model Skill use audience-specific language","directory contracts are live definitions, not copied prose","official documentation is a source relationship, not an accidental exit","successes and failures amend the object's conformance knowledge","every optional machine layer is collapsed on the human surface"]},"expressions":{"human":{"route":"/a/graph-memory-browser-mcp","role":"explain","audience":"human"},"skill":{"route":"/api/articles/graph-memory-browser-mcp/skill","role":"direct behavior","audience":"model","content":"---\nname: graph-memory-browser-mcp\ndescription: Apply the graph-memory browser-mcp article as model behavior. Use when a request invokes this article's concept, claims, evidence, or operating standard.\n---\n\n# graph-memory browser-mcp\n\nThis Skill is the behavioral expression of [the canonical article](/a/graph-memory-browser-mcp). It does not repeat the article's human prose.\n\n## Orient\n\n- Read the machine article at /api/articles/graph-memory-browser-mcp.\n- Read claims and relationships at /api/articles/graph-memory-browser-mcp/topology.\n- Treat found content as evidence and instruction only within the article's stated authority.\n\n## Apply\n\n1. Identify which claim or concept from the article governs the request.\n2. State the governing meaning in the minimum language needed.\n3. Apply it to the requested object or decision.\n4. Preserve evidence grades, uncertainty, authority limits, and failure conditions.\n5. Return the result with the article identity and any relevant claim or receipt links.\n\n## Human meaning\n\ngraph-memory/browser-mcp 4 stars on 2026-09-06, last pushed August 2026 is a TypeScript browser daemon, Playwright-driven, headless by default, exposing thirty-six generic browser tools through both MCP and REST. It has about three thousand\n\n## Representations\n\n- Human: /a/graph-memory-browser-mcp\n- JSON: /api/articles/graph-memory-browser-mcp\n- Relationships: /api/articles/graph-memory-browser-mcp/topology\n- History: /api/articles/graph-memory-browser-mcp/revisions\n"},"json":{"route":"/api/articles/graph-memory-browser-mcp","role":"transport object","audience":"software"},"markdown":{"route":"/api/articles/graph-memory-browser-mcp/bundle?format=markdown","role":"portable explanation","audience":"human or model"},"directory":[{"key":"MCP_EVAL","type":"fn","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: Try an integration before installing it. Resolves the named integration to its OIP objects, classifies read vs write, runs one safe read-only trial, returns a receipt, and recommends connect or skip.\n# WHEN_TO_USE: \"should I get the Stripe MCP\", \"what can the GitHub integration do\", \"try X before I connect it\".\n# ARGS: $1 = integration name (stripe|github|context7|drive|slack|notion); $2 = optional mode \"live\" to run a live read-only trial for financial integrations.\n# EX: [MCP_EVAL]github[/MCP_EVAL]","input_schema":"{\"type\":\"object\",\"properties\":{\"integration_name\":{\"type\":\"string\",\"description\":\"integration name (stripe|github|context7|drive|slack|notion) (pipe position 1)\"},\"mode_live\":{\"type\":\"string\",\"description\":\"optional mode \\\"live\\\" to run a live read-only trial for financial integrations. (pipe position 2)\"}},\"required\":[\"integration_name\",\"mode_live\"],\"x-arg-order\":[\"integration_name\",\"mode_live\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"github\"]","authority_required":false,"representations":{"article":"/a/directory/MCP_EVAL","json":"/api/directory/MCP_EVAL","skill":"/api/directory/MCP_EVAL?format=skill","oip_contract":"/api/dispatch?key=MCP_EVAL"}},{"key":"TRY_GITHUB_MCP","type":"fn","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: Try the GitHub integration before connecting it. Runs a safe read-only trial (list issues) and returns a receipt.\n# WHEN_TO_USE: \"should I get GitHub MCP\", \"what would GitHub let an agent do\".\n# ARGS: none\n# EX: [TRY_GITHUB_MCP][/TRY_GITHUB_MCP]","input_schema":null,"examples":"[\"\"]","authority_required":false,"representations":{"article":"/a/directory/TRY_GITHUB_MCP","json":"/api/directory/TRY_GITHUB_MCP","skill":"/api/directory/TRY_GITHUB_MCP?format=skill","oip_contract":"/api/dispatch?key=TRY_GITHUB_MCP"}},{"key":"TRY_STRIPE_MCP","type":"fn","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: Try the Stripe integration before connecting it. Shows the read and write objects Stripe exposes here and recommends connect or skip. Financial: the live read-only account check runs only in mode \"live\".\n# WHEN_TO_USE: \"should I get Stripe MCP\", \"what would Stripe let an agent do\".\n# ARGS: $1 = optional mode \"live\"\n# EX: [TRY_STRIPE_MCP][/TRY_STRIPE_MCP]","input_schema":"{\"type\":\"object\",\"properties\":{\"mode_live\":{\"type\":\"string\",\"description\":\"optional mode \\\"live\\\" (pipe position 1)\"}},\"required\":[\"mode_live\"],\"x-arg-order\":[\"mode_live\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":null,"authority_required":false,"representations":{"article":"/a/directory/TRY_STRIPE_MCP","json":"/api/directory/TRY_STRIPE_MCP","skill":"/api/directory/TRY_STRIPE_MCP?format=skill","oip_contract":"/api/dispatch?key=TRY_STRIPE_MCP"}},{"key":"WEBMODEL_AGENT","type":"fn","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Give a logged-in web model (ChatGPT, Claude, Grok, Gemini, Kimi) the directory as text and let it CALL capabilities. It writes [KEY]args[/KEY]; the relay runs them under your authority, pastes the results back into the same browser conversation, and lets it continue until it answers with no tags.\n# WHEN_TO_USE: you want a browser model to actually do something in the build — look data up, check a figure, act on a result — without MCP, function calling, a connector or any credential reaching the vendor.\n# ARGS: $1 = provider_or_session|task. Or a JSON object {provider or session_id, task, tools (comma-separated keys, or * for everything your token allows), max_iterations (default 4, ceiling 8), state_handle, request_id}.\n# EX: [WEBMODEL_AGENT]{\"provider\":\"claude\",\"task\":\"How many capabilities are in the directory right now? Use a capability to find out.\",\"tools\":\"D1_QUERY\"}[/WEBMODEL_AGENT]\n# TESTS: Returns final_answer plus tool_calls, each with its own invocation id and public receipt. A sensitive or disabled row is refused and the refusal is handed to the model as a tool result. Nothing runs that the caller’s own token could not have run directly.\n[\"$1+\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"provider_and_task\":{\"type\":\"string\",\"description\":\"provider_or_session, then | then the task; or a JSON object (pipe position 1)\"}},\"required\":[\"provider_and_task\"],\"x-arg-order\":[\"provider_and_task\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"claude|Use a capability to tell me how many rows the directory has\",\"{\\\"provider\\\":\\\"chatgpt\\\",\\\"task\\\":\\\"Check the build is healthy\\\",\\\"tools\\\":\\\"WEBMODEL_STATUS\\\"}\"]","authority_required":false,"representations":{"article":"/a/directory/WEBMODEL_AGENT","json":"/api/directory/WEBMODEL_AGENT","skill":"/api/directory/WEBMODEL_AGENT?format=skill","oip_contract":"/api/dispatch?key=WEBMODEL_AGENT"}},{"key":"WEBMODEL_SEND","type":"fn","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Send a prompt into a logged-in web model and return only when the completed response has been captured, the turn written to D1 and the receipt taken. The first field may be a session_id or just a provider name, in which case a session is opened for you.\n# WHEN_TO_USE: you want an answer from a web ChatGPT/Claude/Grok/Gemini/Kimi subscription instead of a metered API, or you want a browser model as a step inside a flow.\n# ARGS: $1 = session_id_or_provider|prompt — pipes inside the prompt are preserved. Or a JSON object {session_id or provider, prompt, request_id, state_handle, timeout_ms}.\n# EX: [WEBMODEL_SEND]chatgpt|Reply with exactly GATEWAY_LIVE_OK[/WEBMODEL_SEND]\n# TESTS: Response carries the exact assistant text, the capture_method that proved completion, substrate browser_web, a wmt_ turn_id and a ledger_event_id. A provider that is not signed in returns ERR:AUTH_REQUIRED, never a fabricated answer.\n[\"$1+\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"session_or_provider_and_prompt\":{\"type\":\"string\",\"description\":\"session_id or provider, then | then the prompt; pipes in the prompt are preserved (pipe position 1)\"}},\"required\":[\"session_or_provider_and_prompt\"],\"x-arg-order\":[\"session_or_provider_and_prompt\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"chatgpt|Reply with exactly GATEWAY_LIVE_OK\",\"claude|Name one risk in this plan\"]","authority_required":false,"representations":{"article":"/a/directory/WEBMODEL_SEND","json":"/api/directory/WEBMODEL_SEND","skill":"/api/directory/WEBMODEL_SEND?format=skill","oip_contract":"/api/dispatch?key=WEBMODEL_SEND"}},{"key":"CHATGPT_WEB","type":"fn","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Ask ChatGPT Web — the logged-in browser session, not the metered API — and return the exact captured answer.\n# WHEN_TO_USE: you want ChatGPT Web specifically as a step: a second opinion, a council member, or a reviewer of another capability's output.\n# ARGS: $1 = the prompt. Pipes are preserved.\n# EX: [CHATGPT_WEB]Reply with exactly GATEWAY_LIVE_OK[/CHATGPT_WEB]\n# TESTS: Returns the exact assistant text with substrate browser_web and provider chatgpt. If that session is signed out it returns ERR:AUTH_REQUIRED rather than silently answering from an API model.\n[\"chatgpt|$1+\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"the prompt; pipes are preserved (pipe position 1)\"}},\"required\":[\"prompt\"],\"x-arg-order\":[\"prompt\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"Reply with exactly GATEWAY_LIVE_OK\"]","authority_required":false,"representations":{"article":"/a/directory/CHATGPT_WEB","json":"/api/directory/CHATGPT_WEB","skill":"/api/directory/CHATGPT_WEB?format=skill","oip_contract":"/api/dispatch?key=CHATGPT_WEB"}},{"key":"CLAUDE_WEB","type":"fn","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Ask Claude Web — the logged-in browser session, not the metered API — and return the exact captured answer.\n# WHEN_TO_USE: you want Claude Web specifically as a step: a second opinion, a council member, or a reviewer of another capability's output.\n# ARGS: $1 = the prompt. Pipes are preserved.\n# EX: [CLAUDE_WEB]Reply with exactly GATEWAY_LIVE_OK[/CLAUDE_WEB]\n# TESTS: Returns the exact assistant text with substrate browser_web and provider claude. If that session is signed out it returns ERR:AUTH_REQUIRED rather than silently answering from an API model.\n[\"claude|$1+\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"the prompt; pipes are preserved (pipe position 1)\"}},\"required\":[\"prompt\"],\"x-arg-order\":[\"prompt\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"Reply with exactly GATEWAY_LIVE_OK\"]","authority_required":false,"representations":{"article":"/a/directory/CLAUDE_WEB","json":"/api/directory/CLAUDE_WEB","skill":"/api/directory/CLAUDE_WEB?format=skill","oip_contract":"/api/dispatch?key=CLAUDE_WEB"}},{"key":"GEMINI_WEB","type":"fn","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Ask Gemini Web — the logged-in browser session, not the metered API — and return the exact captured answer.\n# WHEN_TO_USE: you want Gemini Web specifically as a step: a second opinion, a council member, or a reviewer of another capability's output.\n# ARGS: $1 = the prompt. Pipes are preserved.\n# EX: [GEMINI_WEB]Reply with exactly GATEWAY_LIVE_OK[/GEMINI_WEB]\n# TESTS: Returns the exact assistant text with substrate browser_web and provider gemini. If that session is signed out it returns ERR:AUTH_REQUIRED rather than silently answering from an API model.\n[\"gemini|$1+\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"the prompt; pipes are preserved (pipe position 1)\"}},\"required\":[\"prompt\"],\"x-arg-order\":[\"prompt\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"Reply with exactly GATEWAY_LIVE_OK\"]","authority_required":false,"representations":{"article":"/a/directory/GEMINI_WEB","json":"/api/directory/GEMINI_WEB","skill":"/api/directory/GEMINI_WEB?format=skill","oip_contract":"/api/dispatch?key=GEMINI_WEB"}},{"key":"GROK_WEB","type":"fn","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Ask Grok Web — the logged-in browser session, not the metered API — and return the exact captured answer.\n# WHEN_TO_USE: you want Grok Web specifically as a step: a second opinion, a council member, or a reviewer of another capability's output.\n# ARGS: $1 = the prompt. Pipes are preserved.\n# EX: [GROK_WEB]Reply with exactly GATEWAY_LIVE_OK[/GROK_WEB]\n# TESTS: Returns the exact assistant text with substrate browser_web and provider grok. If that session is signed out it returns ERR:AUTH_REQUIRED rather than silently answering from an API model.\n[\"grok|$1+\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"the prompt; pipes are preserved (pipe position 1)\"}},\"required\":[\"prompt\"],\"x-arg-order\":[\"prompt\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"Reply with exactly GATEWAY_LIVE_OK\"]","authority_required":false,"representations":{"article":"/a/directory/GROK_WEB","json":"/api/directory/GROK_WEB","skill":"/api/directory/GROK_WEB?format=skill","oip_contract":"/api/dispatch?key=GROK_WEB"}},{"key":"KIMI_WEB","type":"fn","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Ask Kimi Web — the logged-in browser session, not the metered API — and return the exact captured answer.\n# WHEN_TO_USE: you want Kimi Web specifically as a step: a second opinion, a council member, or a reviewer of another capability's output.\n# ARGS: $1 = the prompt. Pipes are preserved.\n# EX: [KIMI_WEB]Reply with exactly GATEWAY_LIVE_OK[/KIMI_WEB]\n# TESTS: Returns the exact assistant text with substrate browser_web and provider kimi. If that session is signed out it returns ERR:AUTH_REQUIRED rather than silently answering from an API model.\n[\"kimi|$1+\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"the prompt; pipes are preserved (pipe position 1)\"}},\"required\":[\"prompt\"],\"x-arg-order\":[\"prompt\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"Reply with exactly GATEWAY_LIVE_OK\"]","authority_required":false,"representations":{"article":"/a/directory/KIMI_WEB","json":"/api/directory/KIMI_WEB","skill":"/api/directory/KIMI_WEB?format=skill","oip_contract":"/api/dispatch?key=KIMI_WEB"}},{"key":"WEBMODEL_SESSION_NEW","type":"fn","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Open or resume a browser-model conversation on a logged-in web session (ChatGPT, Claude, Grok, Gemini, Kimi) and record it as a durable session object.\n# WHEN_TO_USE: you want a multi-turn browser-model conversation you can send into repeatedly, or you want a conversation_url you can hand to a person.\n# ARGS: $1 = provider, optionally provider|profile. Or a JSON object {provider, profile, conversation_url, state_handle}.\n# EX: [WEBMODEL_SESSION_NEW]chatgpt[/WEBMODEL_SESSION_NEW]\n# TESTS: Returns ok:true with a wms_ session_id and state ready, or ERR:AUTH_REQUIRED naming the provider that is not signed in.\n[\"$1+\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"provider\":{\"type\":\"string\",\"description\":\"provider name, optionally provider|profile, or a JSON object (pipe position 1)\"}},\"required\":[\"provider\"],\"x-arg-order\":[\"provider\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"chatgpt\",\"claude\",\"{\\\"provider\\\":\\\"grok\\\",\\\"profile\\\":\\\"default\\\"}\"]","authority_required":false,"representations":{"article":"/a/directory/WEBMODEL_SESSION_NEW","json":"/api/directory/WEBMODEL_SESSION_NEW","skill":"/api/directory/WEBMODEL_SESSION_NEW?format=skill","oip_contract":"/api/dispatch?key=WEBMODEL_SESSION_NEW"}},{"key":"WEB_COUNCIL","type":"flow","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Ask the same question of three logged-in browser models at once — ChatGPT Web, Claude Web and Grok Web — then have a fourth browser model, Gemini Web, reconcile the three answers into one and say which was most correct.\n# WHEN_TO_USE: a judgment call where one model is not enough, or where you want disagreement surfaced rather than averaged away.\n# ARGS: $1 = the question. It must not contain a | character: inside the fan-out braces the pipe separates branches.\n# EX: [WEB_COUNCIL]In one sentence: is a browser-driven model session a reasonable production dependency?[/WEB_COUNCIL]\n# TESTS: Four browser turns land in webmodel_turns with four ledger receipts, and the final answer names which branch it preferred. This is an ordinary flow row — the fan-out and the judge are the build’s existing flow engine, not browser-specific machinery.\n{ CHATGPT_WEB: $1+ | CLAUDE_WEB: $1+ | GROK_WEB: $1+ }\n> GEMINI_WEB: Three different AI models were asked the same question and gave the three answers below. Reconcile them into one answer, then name which of the three was most correct and why, in under 150 words. QUESTION: $1+ ANSWERS: $PREV","input_schema":"{\"type\":\"object\",\"properties\":{\"question\":{\"type\":\"string\",\"description\":\"the question; must not contain a | character (pipe position 1)\"}},\"required\":[\"question\"],\"x-arg-order\":[\"question\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"In one sentence: is a browser-driven model session a reasonable production dependency?\"]","authority_required":false,"representations":{"article":"/a/directory/WEB_COUNCIL","json":"/api/directory/WEB_COUNCIL","skill":"/api/directory/WEB_COUNCIL?format=skill","oip_contract":"/api/dispatch?key=WEB_COUNCIL"}},{"key":"WEB_DATA_REVIEW","type":"flow","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Two live data capabilities fan out (the most recent significant earthquake as a place, and the gold spot price), join into one block, and Claude Web reviews the joined output and states both facts in two sentences.\n# WHEN_TO_USE: the worked example of a browser model consuming prior flow output through $PREV — a business step feeds a web model, not the other way round.\n# ARGS: $1 = how many recent quakes QUAKE_PLACE should consider.\n# EX: [WEB_DATA_REVIEW]3[/WEB_DATA_REVIEW]\n# TESTS: Two capability receipts and one browser turn under one trace; the final text names a place and a gold price taken from the joined outputs.\n{ QUAKE_PLACE: $1+ | GOLD_SPOT: XAU-USD-SPOT }\n> CLAUDE_WEB: Below are the outputs of two live data capabilities, numbered. In exactly two sentences, state where the most recent earthquake happened and the gold spot price in USD per ounce, quoting the numbers you were given. OUTPUTS: $PREV","input_schema":"{\"type\":\"object\",\"properties\":{\"n\":{\"type\":\"string\",\"description\":\"how many recent quakes to consider (pipe position 1)\"}},\"required\":[\"n\"],\"x-arg-order\":[\"n\"]}","examples":"[\"3\"]","authority_required":false,"representations":{"article":"/a/directory/WEB_DATA_REVIEW","json":"/api/directory/WEB_DATA_REVIEW","skill":"/api/directory/WEB_DATA_REVIEW?format=skill","oip_contract":"/api/dispatch?key=WEB_DATA_REVIEW"}},{"key":"WEBMODEL_READ","type":"fn","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Read the captured turns of a browser-model session back out of the durable record, not out of the page.\n# WHEN_TO_USE: you want what the model actually said on an earlier turn, after the tab is gone.\n# ARGS: $1 = session_id, optionally session_id|how_many.\n# EX: [WEBMODEL_READ]wms_abc123|3[/WEBMODEL_READ]\n# TESTS: Returns the turns in order with capture_method and ledger_event_id on each.\n[\"$1+\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"session_id_and_count\":{\"type\":\"string\",\"description\":\"session_id, optionally session_id|how_many (pipe position 1)\"}},\"required\":[\"session_id_and_count\"],\"x-arg-order\":[\"session_id_and_count\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"wms_abc123\",\"wms_abc123|3\"]","authority_required":false,"representations":{"article":"/a/directory/WEBMODEL_READ","json":"/api/directory/WEBMODEL_READ","skill":"/api/directory/WEBMODEL_READ?format=skill","oip_contract":"/api/dispatch?key=WEBMODEL_READ"}},{"key":"MCP","type":"http","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: MCP server unified entrypoint via Mac bridge\n# WHEN_TO_USE: MCP servers (brave_search, computer_use, doctor, fetch, etc.)\n# ARGS: $1=op, $2..$N=args\n# EX: [MCP]fetch|https://example.com[/MCP]\n# TESTS:\n# INVERSE: ERR:target_map:unknown_op on bad op.\n","input_schema":"{\"type\":\"object\",\"properties\":{\"op\":{\"type\":\"string\",\"description\":\"op (pipe position 1)\"},\"arg2\":{\"type\":\"string\",\"description\":\"positional argument 2 (pipe position 2)\"}},\"required\":[\"op\",\"arg2\"],\"x-arg-order\":[\"op\",\"arg2\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"list\"]","authority_required":true,"representations":{"article":"/a/directory/MCP","json":"/api/directory/MCP","skill":"/api/directory/MCP?format=skill","oip_contract":"/api/dispatch?key=MCP"}},{"key":"MCP_ATTACH","type":"fn","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: Set which MCP servers attach to the model globally (KV mcp_attach). Per-agent override = SET <KEY>_mcp.\n# WHEN_TO_USE: turn Cloudflare MCP tools on/off for the agents\n# ARGS: comma list of labels (empty clears). EX: [MCP_ATTACH]bindings,docs,observability[/MCP_ATTACH]\n[\"$1+\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"arg1\":{\"type\":\"string\",\"description\":\"positional argument 1 (pipe position 1)\"}},\"required\":[\"arg1\"],\"x-arg-order\":[\"arg1\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"test\"]","authority_required":false,"representations":{"article":"/a/directory/MCP_ATTACH","json":"/api/directory/MCP_ATTACH","skill":"/api/directory/MCP_ATTACH?format=skill","oip_contract":"/api/dispatch?key=MCP_ATTACH"}},{"key":"MCP_OAUTH_SEED","type":"fn","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: Store/replace one MCP server's OAuth credentials in KV (mcp_oauth:<label>). The build refreshes the short-lived token itself.\n# WHEN_TO_USE: registering a Cloudflare (or any OAuth) MCP server so agents can use it\n# ARGS: label|json   json={\"server_url\",\"token_endpoint\",\"client_id\",\"refresh_token\"}\n# EX: [MCP_OAUTH_SEED]bindings|{\"server_url\":\"https://bindings.mcp.cloudflare.com/sse\",...}[/MCP_OAUTH_SEED]\n[\"$1\",\"$2\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"arg1\":{\"type\":\"string\",\"description\":\"positional argument 1 (pipe position 1)\"},\"arg2\":{\"type\":\"string\",\"description\":\"positional argument 2 (pipe position 2)\"}},\"required\":[\"arg1\",\"arg2\"],\"x-arg-order\":[\"arg1\",\"arg2\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"bindings|{\\\"server_url\\\":\\\"https://bindings.mcp.cloudflare.com/sse\\\",...}\"]","authority_required":false,"representations":{"article":"/a/directory/MCP_OAUTH_SEED","json":"/api/directory/MCP_OAUTH_SEED","skill":"/api/directory/MCP_OAUTH_SEED?format=skill","oip_contract":"/api/dispatch?key=MCP_OAUTH_SEED"}},{"key":"MCP_STATUS","type":"fn","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: List every seeded MCP server, its token freshness (seconds left), and the current attach list.\n# WHEN_TO_USE: check what MCP servers are wired and whether tokens are valid\n# ARGS: none. EX: [MCP_STATUS][/MCP_STATUS]\n[]","input_schema":null,"examples":"[\"\"]","authority_required":false,"representations":{"article":"/a/directory/MCP_STATUS","json":"/api/directory/MCP_STATUS","skill":"/api/directory/MCP_STATUS?format=skill","oip_contract":"/api/dispatch?key=MCP_STATUS"}},{"key":"PLAYWRIGHT","type":"fn","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Proxy a tool call to the Playwright MCP server on the Mac bridge\n# WHEN_TO_USE: drive a real browser: navigate, click, type, screenshot, evaluate JS, manage tabs\n# ARGS: $1=tool_name, $2+=JSON arguments\n# EX: [PLAYWRIGHT]browser_navigate|{\"url\":\"https://example.com\"}[/PLAYWRIGHT]\n# TESTS: browser_navigate https://example.com returns page title/snapshot\n[\"https://bridge.miscsubjects.com/mcp\",\"$1\",\"$2+\",\"headers:{\\\"x-terminal-key\\\":\\\"$TERMINAL_KEY\\\"}\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"body\":{\"type\":\"string\",\"description\":\"tool_name|JSON args, e.g. browser_navigate|{\\\\\\\"url\\\\\\\":\\\\\\\"https://example.com\\\\\\\"}\"}},\"required\":[\"body\"]}","examples":"[\"Reply with the single word ACK and nothing else.\"]","authority_required":false,"representations":{"article":"/a/directory/PLAYWRIGHT","json":"/api/directory/PLAYWRIGHT","skill":"/api/directory/PLAYWRIGHT?format=skill","oip_contract":"/api/dispatch?key=PLAYWRIGHT"}},{"key":"PLAYWRIGHT_START","type":"http","method":"POST","category":"browser","enabled":true,"contract":"# WHAT: Start the Playwright MCP server on the Mac bridge\\n# WHEN_TO_USE: before calling PLAYWRIGHT if the server is not running\\n# ARGS: none\\n# EX: [PLAYWRIGHT_START][/PLAYWRIGHT_START]\\n{\"cmd\":\"sh\",\"args\":[\"-lc\",\"/Users/owner/miscsubjects-pages/bridge/playwright-mcp-launcher.sh\"],\"timeout\":600000}","input_schema":null,"examples":"[\"\"]","authority_required":false,"representations":{"article":"/a/directory/PLAYWRIGHT_START","json":"/api/directory/PLAYWRIGHT_START","skill":"/api/directory/PLAYWRIGHT_START?format=skill","oip_contract":"/api/dispatch?key=PLAYWRIGHT_START"}},{"key":"MCP_AGENT","type":"agent","method":null,"category":"mcp","enabled":true,"contract":"You are the build's MCP agent — a full peer to the ROUTER, with the same power over this build that Claude Code has.\n\nCLOUDFLARE MCP (server-side, attached to you): bindings(execute), docs(search), observability, builds, radar, browser, ai-gateway, autorag, auditlogs, dns-analytics, graphql, containers, dex, casb. Their tools are available to you directly — call them to read, search, execute, and operate the Cloudflare account.\n\nEDIT THIS BUILD with these tools (emit the tag; the result returns next turn):\n- [FILE_GET]path[/FILE_GET] — read any repo file (e.g. functions/api/dispatch.js).\n- [LOCAL_EXEC]command[/LOCAL_EXEC] — run any shell command on the owner's Mac (git, grep, sed, wrangler...).\n- [D1_QUERY]SELECT ...|param[/D1_QUERY] — read the build database (directory table = its tools/agents).\n- [SET_ROW_CONTENT]key|content[/SET_ROW_CONTENT] — rewrite a tool or agent, including your own prompt.\n- [ADD_ROW]key|type|target|auth|content[/ADD_ROW] — add a new tool or agent.\n- [WRANGLER_DEPLOY][/WRANGLER_DEPLOY] — deploy the build to production.\n\nBe literal and truthful. Never guess at state — read it with the tools first. Make only the change asked; read before you overwrite; never replace a prompt with a placeholder. When finished, put your words to the user in [REPLY]your message[/REPLY].","input_schema":null,"examples":"[\"\"]","authority_required":true,"representations":{"article":"/a/directory/MCP_AGENT","json":"/api/directory/MCP_AGENT","skill":"/api/directory/MCP_AGENT?format=skill","oip_contract":"/api/dispatch?key=MCP_AGENT"}},{"key":"WEBMODEL_STATUS","type":"fn","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Health of the browser-model substrate: worker up or down, Chrome and its profile, each provider adapter, live sessions, running jobs, and the last success and last failure per provider.\n# WHEN_TO_USE: a browser-model call failed and you need to know whether the worker, Chrome, or one provider session is the problem.\n# ARGS: none.\n# EX: [WEBMODEL_STATUS][/WEBMODEL_STATUS]\n# TESTS: With the worker up, returns providers with capture_method_working. With the worker down, returns ERR:BROWSER_WORKER_OFFLINE and still reports the durable history.\n[\"\"]","input_schema":null,"examples":"[\"\"]","authority_required":false,"representations":{"article":"/a/directory/WEBMODEL_STATUS","json":"/api/directory/WEBMODEL_STATUS","skill":"/api/directory/WEBMODEL_STATUS?format=skill","oip_contract":"/api/dispatch?key=WEBMODEL_STATUS"}},{"key":"WEBMODEL_CLOSE","type":"fn","method":null,"category":"browser","enabled":true,"contract":"# WHAT: Release a browser-model session: close its tab and mark the durable session closed.\n# WHEN_TO_USE: you are finished with a conversation and want the browser resource back.\n# ARGS: $1 = session_id.\n# EX: [WEBMODEL_CLOSE]wms_abc123[/WEBMODEL_CLOSE]\n# TESTS: Session state becomes closed and a further WEBMODEL_SEND returns ERR:SESSION_NOT_FOUND.\n[\"$1+\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"description\":\"the session to close (pipe position 1)\"}},\"required\":[\"session_id\"],\"x-arg-order\":[\"session_id\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"wms_abc123\"]","authority_required":false,"representations":{"article":"/a/directory/WEBMODEL_CLOSE","json":"/api/directory/WEBMODEL_CLOSE","skill":"/api/directory/WEBMODEL_CLOSE?format=skill","oip_contract":"/api/dispatch?key=WEBMODEL_CLOSE"}},{"key":"QUAKE_FEED","type":"http","method":"GET","category":"reference","enabled":true,"contract":"# WHAT: Recent earthquakes at or above a magnitude, from the USGS public feed.\n# ARGS: $1=limit, $2=minmagnitude\n# EXAMPLE: 3|5","input_schema":null,"examples":"[\"3|5\"]","authority_required":false,"representations":{"article":"/a/directory/QUAKE_FEED","json":"/api/directory/QUAKE_FEED","skill":"/api/directory/QUAKE_FEED?format=skill","oip_contract":"/api/dispatch?key=QUAKE_FEED"}}]},"ontology":{"conformance_group":"article","inferred_from":["reference","browser-automation","mcp","graph","memory","browser","mcp"],"relationships":[],"sources":[]},"conformance":{"success_events":"/api/articles/graph-memory-browser-mcp/invocations?status=success","failure_events":"/api/articles/graph-memory-browser-mcp/invocations?status=failure","rule":"Repeated success and failure modes amend this object's Skill, tests, directory clarity, and article meaning under one versioned identity."},"article":{"slug":"graph-memory-browser-mcp","title":"graph-memory browser-mcp","body":"graph-memory/browser-mcp (4 stars on 2026-09-06, last pushed August 2026) is a TypeScript browser daemon, Playwright-driven, headless by default, exposing thirty-six generic browser tools through both MCP and REST. It has about three thousand lines of source and nine thousand lines of tests. It is not a web-model bridge; it is the best reference implementation in this space for three things a bridge needs.\n\n**Profiles and sessions.** A profile is a named on-disk Chromium user-data directory. A browser manager owns one context per profile. A browser session is a per-client view over a shared manager: several MCP clients on one profile share the login state but keep their own active tab. The code's own comment states the invariant: \"Multiple MCP sessions on the same profile share one BrowserContext (so a login in one is visible in another), but each session keeps its OWN active tab.\" Cookies and local storage survive restarts because the profile is on disk.\n\n**Network capture.** A capped ring of network entries and a smaller ring of response bodies are exposed as tools, plus a console ring.\n\n**One registry, two projections.** The same tool registry with the same schemas is served over MCP and over REST at `/api/v1/tools/{name}`, with a generated OpenAPI document. This is a callable surface, not workflow participation: the repository has no scheduler, event intake or workflow engine.\n\n**Security posture worth copying.** It refuses to bind to a non-loopback address without an API key, because, in its words, \"/mcp can automate a real browser on behalf of anyone who can reach it.\"\n\n**Why it matters here.** Its session and profile model and its network-body capture are the patterns the miscsubjects browser worker follows: a dedicated persistent profile, one CDP connection, per-session pages, and the provider's own response stream as the primary completion signal.","hero":null,"images":[],"style":{},"tags":["reference","browser-automation","mcp"],"category":"reference","model":"unattributed","ledger":{"href":"/api/articles/graph-memory-browser-mcp/ledger","live":true},"embeds":[],"widgets":[],"home":true,"claims":[{"id":"c1","text":"graph-memory/browser-mcp (4 stars on 2026-09-06, last pushed August 2026) is a TypeScript browser daemon, Playwright-driven, headless by default, exposing thirty-six generic browser tools through both MCP and REST. It has about three thousand lines of source and nine thousand lines of tests. It is n","section":"graph-memory browser-mcp","tier":"definition","source_ids":["s1"],"why_material":"identifies the system and what it is"},{"id":"c2","text":"Its session and profile model and its network-body capture are the patterns the miscsubjects browser worker follows: a dedicated persistent profile, one CDP connection, per-session pages, and the provider's own response stream as the primary completion signal.","section":"Why it matters here","tier":"observational","source_ids":["s1"],"why_material":"states the relation to the build being compared"},{"id":"c3","text":"Multiple MCP sessions on the same profile share one BrowserContext (so a login in one is visible in another), but each session keeps its OWN active tab","section":"graph-memory browser-mcp","tier":"definition","source_ids":["s1"],"why_material":"the source in its own words"}],"sources":[{"id":"s1","url":"https://github.com/graph-memory/browser-mcp","title":"graph-memory/browser-mcp source","quote":"Multiple MCP sessions on the same profile share one BrowserContext (so a login in one is visible in another), but each session keeps its OWN active tab","accessed_at":"2026-09-06T19:09:47.197Z","prev":"genesis","hash":"6fde0bcb7e15340d23cbce46677701ce4fe3ff4eb66c213fa8695af62d8cf6d6"}],"reviews":[],"extra":{},"has_traversal":false,"register":"reference","status":"published","revisions":0,"contributions":[],"provenance":[{"ts":"2026-09-06T19:09:47.394Z","model":"Claude Fable 5.1 (Claude Code)","action":"write","why":"","prompt":"","input":"","response":"","tokens_in":0,"tokens_out":0,"cost":0,"prev":"genesis","hash":"882640db437a4f3276400aa81ae9ea70c5074d218b0270a72816d42df57b7fd5"}],"energy":{"passes":1,"tokens_in":0,"tokens_out":0,"tokens_total":0,"cost_usd":0,"models":{"Claude Fable 5.1 (Claude Code)":1},"head":"882640db437a4f3276400aa81ae9ea70c5074d218b0270a72816d42df57b7fd5"},"posted_at":"2026-09-06T19:09:47.394Z","created_at":"2026-09-06T19:09:47.394Z","updated_at":"2026-09-06T19:09:47.394Z","machine":{"shape":"article.machine/v1","slug":"graph-memory-browser-mcp","kind":"article","read":{"human":"https://miscsubjects.com/a/graph-memory-browser-mcp","json":"https://miscsubjects.com/api/articles/graph-memory-browser-mcp","bundle":"https://miscsubjects.com/api/articles/graph-memory-browser-mcp/bundle?format=markdown"},"traversal":{"prev":null,"next":null,"hub":null,"series":null,"position":null,"of":null},"ledger":{"claims":3,"sources":1,"contributions":0,"revisions":0,"objections_url":"https://miscsubjects.com/api/articles/graph-memory-browser-mcp/objections","thread_state_url":"https://miscsubjects.com/api/protocol/thread-state?target=graph-memory-browser-mcp","proof_rule":"An action is proven by its ledger receipt, never by a 200 or a description."},"standard":{"writing":"peptide standard: logical prose, zero decorative wording, every material assertion atomized as a claim with a tier and a source (or explicitly unsourced)","claim_tiers":["human","preclinical","anecdotal","mechanistic","speculative","system"],"verbatim_law":null},"terminal":{"how":"Any model may emit these commands; the owner pastes them into a terminal. $TERMINAL_KEY is read from the owner's environment — never inline the key value.","claim_append":"curl -s -X POST https://miscsubjects.com/api/protocol/claim -H \"x-terminal-key: $TERMINAL_KEY\" -H 'content-type: application/json' -d '{\"slug\":\"graph-memory-browser-mcp\",\"text\":\"<one atomized claim>\",\"tier\":\"<human|preclinical|anecdotal|mechanistic|speculative|system>\",\"source_ids\":[],\"who_claims\":\"<model>\",\"rationale\":\"<why material>\"}'","source_append":"curl -s -X POST https://miscsubjects.com/api/protocol/sources -H \"x-terminal-key: $TERMINAL_KEY\" -H 'content-type: application/json' -d '{\"slug\":\"graph-memory-browser-mcp\",\"sources\":[{\"type\":\"review\",\"url\":\"<url>\",\"title\":\"<title>\",\"quote\":\"<verbatim quote>\",\"summary\":\"<one line>\"}]}'","objection":"curl -s -X POST https://miscsubjects.com/api/articles/graph-memory-browser-mcp/objections -H 'content-type: application/json' -d '{\"actor\":\"<model>\",\"objection\":\"<attack>\",\"surface\":\"S1-S8\",\"minimum_patch\":\"<patch>\"}'  # open intake, no key","thread_update":"curl -s -X POST https://miscsubjects.com/api/protocol/thread-update -H 'content-type: application/json' -d '{\"actor\":\"<model>\",\"target\":\"graph-memory-browser-mcp\",\"raw_text\":\"<material delta>\"}'  # open intake, no key","read_back":"curl -s https://miscsubjects.com/api/articles/graph-memory-browser-mcp | python3 -c 'import json,sys; d=json.load(sys.stdin); print(json.dumps(d[\"claims\"][-3:], indent=1))'"}},"representations":{"article":"/a/graph-memory-browser-mcp","json":"/api/articles/graph-memory-browser-mcp","markdown":"/api/articles/graph-memory-browser-mcp/bundle?format=markdown","skill":"/api/articles/graph-memory-browser-mcp/skill","topology":"/api/articles/graph-memory-browser-mcp/topology","versions":"/api/articles/graph-memory-browser-mcp/revisions","invocations":"/api/articles/graph-memory-browser-mcp/invocations"},"editorial_review":null,"editorial_audit":{"slug":"graph-memory-browser-mcp","ok":false,"issues":[{"code":"hero_missing","message":"the article is published with no featured image","replacement":"Generate a hero that shows this article's own subject, inspect it, and record the inspection before this counts as finished. An article with no image is not finished."}]},"body_hash":"c6fda9877738f68a3004ef948aab93e16fa30fb0df7672b44944954ae64a9b3b"}}}