You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Agent ergonomics: cheaper act→observe loop, two small tool-surface trims #11
Filed after driving the MCP from an agent for a real session. The docs system (progressive disclosure via docs_list/docs_get, the error-code taxonomy) is genuinely good — these are marginal trims, not complaints. 18 entry tools is already leaner than comparable browser MCPs.
tab_act's post-action observe could support a diff mode. observe → act → observe is the highest-frequency agent loop; today the post-act observe returns a full snapshot. An observe: { diff: true } option would cut the token cost of every action confirmation.
Merge docs_list into docs_get. Calling docs_get without a name could return the list; one less entry tool, same capability.
js_reset could be a flag on js (e.g. {code, reset:true}) — or simply documented as "a new MCP session starts fresh", if that invariant holds.
Written by an AI agent (Maka) based on a live testing session; reviewed by the user before filing.
Two more ergonomics gaps from a real task ("brush an X timeline for 100 posts, then save it as Markdown"). Both cost tokens or force hand-rolled loops:
1. No way to write a file from the REPL.
The only path to disk is save_file in the MCP tool surface, so content generated inside js has to be round-tripped through the model context:
nodeRepl.write(mdText);// 11k chars, needs a maxChars bump to avoid truncation
then paste the same 11k chars into save_file. That doubles the cost of every "export this page" task. A tools.saveFile(path, content) binding, or a workspace-scoped fs inside the REPL, would remove the round-trip entirely.
2. No "collect while scrolling" primitive for virtualised lists. tab.read() only sees mounted nodes: on X, ~12-18 article elements exist at any moment, and they are recycled as you scroll. Every agent therefore hand-rolls scroll + dedupe:
for(leti=0;i<8;i++){collect();// dedupe by /status/ hrefdocument.scrollingElement.scrollTop+=innerHeight*1.05;awaitsleep(1400);}
Station adapters do not help here: the twitter.timeline adapter pages through API cursors and never moves the visible page, so it cannot satisfy "scroll the page for me". Suggestions: a tab.collect({ scrolls, key }) helper, and/or a visual: true mode on site commands that also drives the UI.
(Related: the twitter.timeline cursor call also aborted with MCP request aborted once mid-page, which after the abort left the REPL bindings cleared — see the separate issue about silent state loss.)
Activity
jackwener commentedon Oct 22, 2026
Two more ergonomics gaps from a real task ("brush an X timeline for 100 posts, then save it as Markdown"). Both cost tokens or force hand-rolled loops:
1. No way to write a file from the REPL.
The only path to disk is
save_filein the MCP tool surface, so content generated insidejshas to be round-tripped through the model context:then paste the same 11k chars into
save_file. That doubles the cost of every "export this page" task. Atools.saveFile(path, content)binding, or a workspace-scopedfsinside the REPL, would remove the round-trip entirely.2. No "collect while scrolling" primitive for virtualised lists.
tab.read()only sees mounted nodes: on X, ~12-18articleelements exist at any moment, and they are recycled as you scroll. Every agent therefore hand-rolls scroll + dedupe:Station adapters do not help here: the
twitter.timelineadapter pages through API cursors and never moves the visible page, so it cannot satisfy "scroll the page for me". Suggestions: atab.collect({ scrolls, key })helper, and/or avisual: truemode on site commands that also drives the UI.(Related: the
twitter.timelinecursor call also aborted withMCP request abortedonce mid-page, which after the abort left the REPL bindings cleared — see the separate issue about silent state loss.)