PowerScroll
Read and edit a live local-first PowerScroll visual notebook.
Connector by CynaCons · GitHub account verified by the MCP Registry
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/cynacons-powerscroll
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.
- Tools
- 12 read · 36 write · 8 delete · 2 not yet classified
- Secrets
- None asked for
- Install scripts
- Not scanned yet
- Runs as
- Node.js package
Tools by what they do 58
Read from the source code; the running server may list different tools.
Read 12 · Look things up without changing anything.
board_listboard_readcard_checkcard_getcheck_updateget_backgroundget_blocklist_pageslist_scrollsread_diagramread_imageread_page
Write 36 · Create, change, send or run things.
append_blockboard_createboard_updatesbridge_statuscard_archivecard_checklist_addcard_checklist_movecard_checklist_setcard_checklist_updatecard_claimcard_createcard_move
Show 24 more tools
card_notecard_restorecard_updatecreate_diagramcreate_diagram_drawiocreate_diagram_mermaidcreate_diagram_plantumlcreate_diagram_svgcreate_pagecreate_scrollcreate_sectioninsert_blockinsert_imagemove_blockmove_pagemove_scrollrename_notebookrename_pagerename_scrollresize_scrollrun_updatesave_notebookset_backgroundupdate_block
Delete 8 · Delete, drop, revoke or wipe things.
agent_leavecard_checklist_removecard_releasedelete_blockdelete_diagramdelete_pagedelete_scrolldelete_section
Not yet classified 2 · We could not tell from the name and description.
agent_statusfit_diagram
Files it touches
- Any path the agent passes to its tools
Tools (58)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
agent_leaveSign off: remove me from the board's active agents. Call when you finish or stop working. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
agent_statusSet the one-line status shown in the board agents strip. Naming a card marks you active on it. Does not change the board. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
append_blockAppend a markdown block to the bottom of a page. This is the main way to write content. The markdown is rendered live in the app: use "- " for bullets, "1. " for numbered lists, "- [ ] " for checkboxes (which the user can then click to tick), "#"/"##" for headings, **bold**, `code`, tables, and $math$. Prefer one block per logical chunk (one list, one paragraph) rather than one block per line.
board_createCreate a new board page. Does NOT switch the owner's active page. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
board_listList every board page in the notebook: id, title, section, and card counts per column. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
board_readRead cards on a board: number, id, title, column, order, assignee, labels, checklist done/total, question, last note, updatedAt. Filter with column or assignee. Archived cards are omitted unless include_archived is true. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
board_updatesEvents with seq > since (omit since to receive only the cursor). mine:true limits to cards assigned to you. If none and wait_seconds > 0, this server re-asks the app every 1 s until something arrives or the wait (max 300 s) ends. Returns {events, cursor}. This is how you hear the owner's replies and moves. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wa…
bridge_statusWho else is working in this notebook. Several agents may be connected at once but only one may operate at a time, so call this when a tool comes back LOCKED, or before starting a long piece of work. Reports the connected notebook, every connected agent, which one holds the notebook, how long until it frees up, and whether that is you. This tool is never blocked. Note that a free result can go stale immediately -- another agent may take the lock before your next call -- so treat the LOCKED error as the real signal and this as a way to understand it.
card_archiveArchive a card (hide it from columns; it stays in the notebook and can be restored). Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
card_checkTick or untick a checklist item. `item` is the item id or a 1-based index. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
card_checklist_addAdd a checklist item to a card: at the end, `under` an item (as its last sub-item), or at a 1-based `position`. Items nest up to depth 3, like PowerPlan tasks. Returns the card with `item` (the new item) and `items` (the whole list: id, index, text, done, depth). Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to …
card_checklist_moveMove a checklist item (alone) to a 1-based position. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
card_checklist_removeRemove a checklist item. Its sub-items stay, one level up. `item` is the item id or a 1-based index. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
card_checklist_setReplace the whole checklist, from `items` or from PowerPlan-style `text` ("- [ ] task" / "- [x] done", two spaces per level). Items whose text is unchanged keep their id. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
card_checklist_updateEdit a checklist item: new `text`, `done`, and/or `depth` (0-3; its sub-items move with it). `item` is the item id or a 1-based index. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
Show 43 more tools
card_claimAssign the card to me. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
card_createCreate a card on a board. Returns the card including its number. Default column is todo. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
card_getRead one card in full, including notes, checklist and history events. `card` accepts the id or the number (15 or "#15"). Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
card_moveMove a card to todo, doing, waiting or done. `question` is required when moving to waiting. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
card_noteAdd a signed note on a card. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
card_releaseClear the card assignee. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
card_restoreRestore an archived card into its previous column, at the end. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
card_updateUpdate a card title, description or labels. Workflow: board_read the board, card_claim a card, card_move it to doing, work and call card_check/card_note as you go (card_checklist_* to edit the checklist), agent_status for what you are doing now, card_move to waiting WITH a question when you need the owner, board_updates {mine:true, wait_seconds} to hear back, then card_move to done.
check_updateCheck whether a newer PowerScroll release exists on GitHub. Reports the running version and the latest one. Note "checked": when false the API was unreachable or rate limited and the status is unknown — that is not the same as up to date.
create_diagramDEPRECATED - use create_diagram_plantuml, create_diagram_mermaid, create_diagram_svg or create_diagram_drawio instead, which name the language they take and each document their own subset. This name still works and sniffs the format from the source, but it will be removed. Behaviour is otherwise identical.
create_diagram_drawioDescription is built at runtime.
create_diagram_mermaidDraw a diagram on the page from MERMAID source. (For PlantUML source, use create_diagram_plantuml instead.) A DOCUMENTED SUBSET is read, and anything outside it comes back as a diagnostic instead of being drawn wrong. (1) FLOWCHART: "flowchart TD" / "flowchart LR" / "graph LR" as the first line, then nodes A[Label], A(Label) and A{Label}, and edges A --> B, A -->|guard| B and A --- B. Chains such as A --> B --> C work. (2) SEQUENCE: "sequenceDiagram" as the first line, then participant X (optionally "participant X as Label") and messages A->>B: text and A-->>B: reply. TWO THINGS TO EXPECT. Nod…
create_diagram_plantumlDraw a UML diagram on the page from PLANTUML source. (For Mermaid source, use create_diagram_mermaid instead - this tool refuses it rather than half-drawing it.) Two PlantUML dialects are supported, and the right one is detected automatically. (1) COMPONENT / COMPOSITE STRUCTURE: components, nested components, ports (port / portin / portout), provided and required interfaces, and assembly and delegation connectors. A composite-structure part puts its role in the label, as component "role : Type [multiplicity]" as alias. Nesting uses braces. (2) ACTIVITY / SWIMLANE FLOWCHARTS: |Lane| switches t…
create_diagram_svgDraw an SVG onto the page as native PowerScroll shapes. Every element becomes an ordinary rectangle, circle, line or text run that the user can select and drag afterwards -- it is transpiled, NOT embedded as an image. THIS TOOL IS THE OPPOSITE OF THE OTHER TWO: create_diagram_plantuml and create_diagram_mermaid want semantics and compute every coordinate for you, whereas here YOU have already done the layout and the coordinates are the payload. Use this when you want exact placement, and one of the others when you want a diagram laid out well without doing the geometry yourself. Supported: svg…
create_pageCreate a new page and open it. By default also writes the title onto the canvas as an H1 block so the page reads as a titled note.
create_scrollCreate a new named scroll on a page — a fresh vertical column to the right of the existing ones, with its title shown at the top on the canvas. Use this to keep a separate workstream (say "Open questions" beside "Research log") from interleaving with what is already there. Returns a scrollId to pass to append_block.
create_sectionCreate a new section (a tab in the notebook sidebar). Sections contain pages. A first empty page is created along with it.
delete_blockDelete a single markdown block by id. Use read_page first to get block ids and check you are removing the right one. Passed a diagram FRAME id, this cascades to the frame's members and grouped strokes — same primitive as delete_diagram, which names the act and reports the counts. Passed a diagram MEMBER id (a node whose groupId is owned by a diagram frame), the call is refused (UNSUPPORTED) naming the owning diagram and pointing at delete_diagram or the redraw path.
delete_diagramDelete a diagram frame and everything that belongs to it: every node whose groupId is the frame id, and every stroke grouped with it. Use this when you placed a diagram you no longer want — delete_block on the frame id does the same cascade, but this tool names the act and reports how many members and strokes went. Occupants below the frame in the same scroll close the gap. An unknown id is NOT_FOUND. Passing a non-diagram node id is refused (the message names the type and points at delete_block). The bridge has no undo, so pass confirm:true once the user has agreed. Returns deletedMembers and…
delete_pageDelete a page and everything on it. Cannot be undone from here — the app has no agent-facing undo — so ask the user before calling, then pass confirm:true. Refuses when the page is the last one in its section.
delete_scrollDelete a named scroll (a column band). When the band holds ANY content — nodes, group members, or ink — content is REQUIRED: "delete" removes them with the band, "keep" closes the gap and leaves them where they are. There is deliberately no default. The old default was keep (confirm:true used to be a safe trim); a default flip would silently destroy callers that never passed the flag. An empty band needs no content param. Membership is group-aware: a diagram belongs to the band of its frame origin, and its members and grouped ink follow that verdict. A page must keep at least one scroll: a pla…
delete_sectionDelete a section AND every page inside it. This is the widest-reaching delete available — confirm the page list with the user first (list_pages shows what would go). Refuses when it is the notebook's only section.
fit_diagramRefit an existing diagram to the scroll band its frame sits in. Unlike placement-time fit (shrink-only), this scales BOTH directions: up to fill band-width minus padding when the diagram is under-width, down with the same 0.45 floor when over. Works on member diagrams (members rescale) and on renderMode 'snapshot' diagrams (the frame rescales; the image follows). Out-of-band frames are refused (PRECONDITION, naming the diagram). Discover ids from read_page diagrams[]. One undo in the app.
get_backgroundRead the canvas look a page is actually drawn with: which guide style is active and which background colour. A page may override the notebook default, so the reply also carries "source" (whether each value came from the page or the notebook) and "notebookDefault". Call before set_background when you intend to restore the previous look afterwards.
get_blockRe-fetch a single markdown block by id (BlockSummary plus page location). Use this after read_page hits the size cap. A block larger than the 20000-character budget is returned in slices: the response carries markdownTruncated {fullLength, notice} and nextOffset — pass nextOffset back as offset to continue. Any block, any size, is fully readable in bounded calls. Unknown or non-block ids are NOT_FOUND.
insert_blockInsert a markdown block into a scroll at a chosen position, shifting every occupant below it (text, diagram frames, images, shapes, ungrouped ink) down by the new block's height + 12px. Frame members ride the frame. Prefer after (a block or diagram-frame id): ids survive reordering, indices do not. Exactly one of after or index. index 0 is the top of the column (ceiling-clamped when a titled scroll arms the page ceiling). index counts packed occupants of the scroll, not read_page blocks[] — prefer after. Returns the new block plus displacedCount.
insert_imageInsert an image into a scroll at a chosen position, shifting every occupant below it (text, diagram frames, images, shapes, ungrouped ink) down by the image's display height + 12px. Frame members ride the frame. Source is exactly one of data (a data:image/...;base64, URI) or path (a local png/jpg/jpeg/gif/webp file this server reads and encodes — the app never sees paths). Both or neither is an error. Placement matches insert_block: prefer after (an occupant id); exactly one of after or index. index 0 is the column top (ceiling-clamped when a titled scroll arms the page ceiling). Optional alt …
list_pagesList every section and page in the connected notebook, with the number of text blocks on each and which page is currently open. Call this first to discover page ids.
list_scrollsList the scrolls (named vertical columns) on a page, with how many blocks each holds. Call this before writing when a page may have more than one workstream on it: passing the returned scrollId to append_block keeps your blocks in their own column instead of stacking under someone else's. A block belongs to whichever scroll it physically sits in, so a block the user drags to another scroll moves with it.
move_blockMove a markdown block or diagram frame inside a scroll or across scrolls on the same page. Occupants below the source close up; occupants at the target open a gap. Diagram members ride the frame. ONE undo. Prefer after (a block or diagram-frame id) over index: ids survive reordering. scrollId is optional and defaults to the block's current scroll; when given it must be on the same page. Exactly one of after or index. Diagram members, shapes and images as the move target are refused by name. Returns the block plus displacedCount.
move_pageMove a page into a different section. Section ids come from list_pages. A section must keep at least one page, so moving the only page out of a section is refused — create another page there first.
move_scrollMove a scroll (named column band) left or right, or to an absolute column. Members, grouped ink and the band's own width travel with it; neighbouring scrolls shift to make room and cumulative offsets are recomputed. A diagram belongs to the band of its frame origin — the whole group moves, it is never split. Refuses with NOT_FOUND on an unknown id and PRECONDITION when the scroll is already at the named edge.
read_diagramRead one diagram: id, title, format, source, bounds, memberCount, and a page of members [{id, type, x, y, w, h, label?}]. member_limit + member_cursor page members (cursor = last member id; same style as read_page). Default member_limit is derived from the 20000-character budget so a typical page sits well under it. If the serialized response still exceeds the budget, members trim at an entry boundary (truncated {at, notice}). Source counts toward the budget; if source alone blows it, source is cut (sourceTruncated {fullLength, notice}) and the notice names the full length and suggests exporti…
read_imageExport one image by node id so you can look at it. Discovers ids from read_page images[].id. The notebook returns the embedded bytes over the bridge; this server decodes them and writes a local file. Optional out_path (absolute) names the destination — parent dirs are created; an existing file is overwritten. When omitted, the file lands in os.tmpdir()/powerscroll-images/<id>.<ext>. The response is {path, format, bytes, naturalWidth, naturalHeight, alt} — NEVER the base64 payload. Unknown id is NOT_FOUND. A non-image id is UNSUPPORTED naming the type. Then open the file with your vision tools.
read_pageRead a page. DEFAULT CHANGED in v0.54: blocks[] is free-standing markdown only — diagram labels (text nodes with a groupId) no longer leak in as fake content, and diagrams are collapsed to diagrams[] {id, title, format, memberCount, bounds} with NO members and NO source. Images are a compact images[] index {id, alt, x, y, w, h, naturalWidth, naturalHeight, bytes, mini, scrollId} — never the base64 payload. Discovery flow: read_page → diagrams[].id → read_diagram / delete_diagram / fit_diagram; read_page → images[].id → read_image (writes a local file you open with vision). include defaults to …
rename_notebookRename the notebook itself (the title shown in the app and used for future Save As filenames). This does NOT rename the .html file already on disk — that keeps its current name until the user saves to a new location. The result reports the bound filename so you can tell them.
rename_pageRetitle a page in the sidebar. If the page still opens with the "# Old title" heading block that create_page wrote, that block is retitled too so the two do not drift apart; a hand-edited heading is left alone.
rename_scrollRename a scroll. The new title appears immediately at the top of that column on the canvas. Naming a previously untitled scroll is how its header first appears. Pass an empty title to untitle it: the header disappears and the page ceiling disarms — a plain page is one untitled scroll, not zero scrolls.
resize_scrollResize a scroll band by stable id. The width is clamped to PowerScroll's shared limits, persists on that page, and every node or stroke in bands to the right moves by the same delta. The resized band's own content stays fixed. One undo restores width and positions. list_scrolls reports the effective width.
run_updateInstall the latest PowerScroll release into the current notebook file. This rewrites the .html on disk and reloads the app, which drops this bridge connection until the notebook reconnects. Ask the user before calling it, then pass confirm:true. A safety backup is downloaded first where the browser allows it. Run check_update first.
save_notebookWrite the notebook back to the file it was opened from. Only works when the notebook is already bound to a file: the Save As picker needs a click from the user, which an agent cannot supply. Call this after a batch of edits so the work is on disk.
set_backgroundChange the notebook's canvas look. "scroll" renders each column as one continuous vertical sheet with light page separators — best for long reading and for notes an agent is filling in. "pages" shows detached A4 cards, "grid" a dot grid, "none" a blank canvas. The setting is stored in the notebook itself, so it survives closing and reopening. Pass at least one of guideStyle or color. Scope defaults to "notebook" (every page that has not overridden it). Pass scope:"page" to change one page only — useful when a notebook wants a scrolling page of notes next to a grid page of diagrams.
update_blockReplace the markdown of an existing block, found via read_page. Use this to revise content or tick a checkbox ("- [ ]" to "- [x]") rather than appending a duplicate block. If the block grows or shrinks, every occupant below it in the scroll (text, diagram frames, images, shapes, ungrouped ink) shifts by the height delta; frame members ride the frame. One undo. Returns displacedCount. A diagram-member id is refused (UNSUPPORTED) naming the owning diagram — redraw the source instead.
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 0
- Last commit
- Oct 23, 2026 (5 days ago)
- Last release
- Oct 23, 2026 (5 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- Registry name
io.github.CynaCons/powerscroll- Version
- 0.67.1
- Auth
- No auth
- Packages
- npm powerscroll-mcp
- License
- MIT
- Repository
- github.com/CynaCons/PowerScroll
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
More from CynaCons
Cite this page
PowerScroll MCP server. Agent Mart. https://agentmart.dev/connectors/cynacons-powerscroll (last updated 2026-10-24)