
Marigold
io.github.immuneebPublished by GitHub account immuneebv0.9.1Updated Nov 2, 2026
Comment on AI-generated webpages; feedback flows back to your coding agent. Free, MIT, local-first.
Overview
Marigold lets an assistant create HTML/SVG drafts, open them in a browser comment shell, and receive the reviewer's comments and edits back as feedback.
- What you can do
- Create, open, update and read HTML or SVG drafts served in a local browser comment shell
- Wait for reviewer feedback, including a blocking wait until feedback is sent
- Reply to comments and set them resolved or reopened
- Publish a draft to hosted Marigold to get a share link and a claim link
- When to use it
- Useful when an agent produces a visual draft — a page, report or diagram — and a human wants to highlight, comment and edit it in place, with the feedback flowing back to the agent for another revision round.
- Requirements
- Local mode runs the npm package marigold-draft (Node.js) as a stdio MCP server or CLI, with a background daemon on 127.0.0.1 (default port 4747). The hosted endpoint at marigold.page requires OAuth sign-in. Sharing posts the draft to hosted Marigold.
Installation
In SourceWeft
- Open Marigold in the dashboard and add it to a workspace.
- Connect the required credentials. They are stored privately and never shown on public pages.
- Enable the server for the chats that should use its tools.
Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.
Use with an agent
Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.
Read https://sourceweft.com/mcp/io.github.immuneeb%2Fmarigold/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.Other MCP clients
Add this to your client's mcpServers config. The client completes OAuth sign-in on first connect.
{
"mcpServers": {
"marigold": {
"type": "http",
"url": "https://marigold.page/api/mcp"
}
}
}README
Marigold — local drafts (marigold-draft)
The Marigold review loop, on your machine, in milliseconds. An agent writes a
rich HTML/SVG draft to a file; marigold-draft open serves it in the same
comment shell as cloud Marigold; you highlight, comment, edit in place, and hit
Send feedback to agent — the agent's blocked open --json call returns the
feedback and it revises the file, which live-reloads in your tab.
No Postgres, no render tokens, no OAuth, no network. One warm background daemon
(state in ~/.marigold-local/server.json) is reused across every open, so
per-revision cost is a file write. Comments persist in a sidecar
<file>.marigold.json next to the draft — written before the handoff event
fires, so feedback survives crashed waiters and daemon restarts.
Same anchoring engine as prod (@marigold/core's deterministic
data-marigold-id instrumentation + resolveAnchor), so comments re-anchor
across revisions, in-place edits write through to the source file, and a draft
promoted to cloud Marigold (create_doc with the same HTML) instruments
identically.
Install
Or hand this prompt to your coding agent:
Install Marigold for me using
npm i -g marigold-draft, then read https://marigold.page/draft/setup.md and set yourself up to use it.
From the monorepo instead: pnpm --filter marigold-draft build, then link
packages/local/dist/cli.cjs onto your PATH.
The loop (what an agent runs)
Run the blocking open as a background process; its exit is the signal that
feedback arrived. Keep stdout clean with --json (status goes to stderr).
.svg files work too — they're inlined into the wrapper so every element is
commentable.
Sharing & graduating to hosted Marigold
Local drafts never leave your machine. When you want to share one — send it to someone, open it on your phone, or just keep it — graduate it to hosted Marigold. Two rungs:
- Instant share link, no account.
sharePOSTs the draft to hosted Marigold's quick door and prints a URL whose?k=is the capability — anyone with the link can view and comment. It's link-visible only (never listed) and expires ~30 days after the last write.sharealso prints a claim link. - Keep it / control access. Open the claim link and sign in: the doc moves
into your account (the quick link is burned), and you can share it by email at
viewer / commenter / editor roles, with kept version history. For ongoing
agent work on a claimed doc, point your agent at the hosted MCP endpoint,
https://marigold.page/api/mcp.
share defaults the title to the file's <title> (or its filename) and posts
to https://marigold.page — override with --origin or
MARIGOLD_ORIGIN. Local comments stay in the local sidecar; the hosted copy
starts a fresh thread on the same anchoring engine, so comments re-anchor across
revisions there exactly as they do locally.
CLI
MCP server (Claude Desktop and other chat clients)
marigold-draft mcp speaks MCP over stdio, for clients that can't run shell
commands. Tools: create_draft (html in → file written under
~/.marigold-local/drafts/ → browser opens), open_draft, update_draft
(tab live-reloads), get_feedback (with waitSeconds it blocks until the
reviewer hits "Send feedback to agent"), reply_to_comment,
resolve_comment, read_draft.
Claude Desktop registration (~/Library/Application Support/Claude/claude_desktop_config.json):
For Claude Code, a marigold-draft skill (~/.claude/skills/marigold-draft/)
teaches the agent the CLI loop — saying "spin up marigold draft" in chat does
the whole thing. (The binary answers to both marigold-local and
marigold-draft.)
Other coding assistants
Any MCP-capable assistant can drive the loop — the server spawns as
{ command: "marigold-draft", args: ["mcp"] }. And any assistant that can run
shell commands can skip MCP entirely and use the CLI directly (add the
AGENTS.md snippet that agent-setup prints so it knows the loop). Registration
per assistant:
- Codex CLI —
~/.codex/config.toml:[mcp_servers.marigold-draft]withcommand = "marigold-draft"andargs = ["mcp"](orcodex mcp add marigold-draft -- marigold-draft mcp). ReadsAGENTS.md. - opencode —
opencode.json→"mcp":{ "marigold-draft": { "type": "local", "command": ["marigold-draft", "mcp"], "enabled": true } }. ReadsAGENTS.md. - Google Antigravity — Settings → Customizations → Open MCP Config
(
~/.gemini/config/mcp_config.json) →"mcpServers":{ "marigold-draft": { "command": "marigold-draft", "args": ["mcp"] } }. ReadsAGENTS.md/.agents/rules/*.md.
GUI apps may not inherit your shell PATH; if the server won't start, use the
absolute path from which marigold-draft. Full copy-pasteable snippets and the
AGENTS.md block:
/draft/setup.md.
Resilience
The daemon persists a docId→path registry (~/.marigold-local/docs.json) and
lazily re-opens docs on demand, so browser tabs survive daemon restarts; the
shell shows an inline banner while the daemon is unreachable and reconnects
automatically. Comments live in the sidecar and are never lost with the daemon.
How it works
- Daemon (
src/server.ts): node:http on 127.0.0.1. Watches each opened file; on change re-instruments, re-anchors every comment (marigoldId → css → textQuote, orphaning what can't resolve), bumps the version and pushes an SSEreloadto the tab. - Shell (
src/shell.ts): vanilla-JS port of the prod viewer (apps/web/.../viewer-client.tsx) — same postMessage protocol, same anchor agent inside asandbox="allow-scripts"iframe, same marigold styling. The frame gets the same CSP as the prod render origin, so a draft that works locally renders identically in cloud Marigold. - Handoff:
GET /api/docs/:id/wait?since=<seq>long-poll; Send feedback persists the round to the sidecar, then resolves waiters. Thesincecursor closes the submit-before-wait race. - In-place edits (
applyInlineEdits) write through to the source file; fragment drafts are unwrapped back to fragments so the file stays clean.
Tests
Telemetry
marigold-draft sends anonymous usage counts on five actions (draft.opened,
feedback.submitted, listen.started, share.cloud, agent-setup.run).
The entire payload per event is:
No arguments, paths, file names, doc content, hostname, username, locale, or hardware info — and no client-side identifier of any kind: nothing is persisted to identify your machine. Approximate unique counts come from a salted, truncated server-side hash of the request IP (never reversible, raw address never stored) — the same posture as every anonymous signal on marigold.page.
Turn it off any of these ways (any one wins):
marigold-draft telemetry off(persisted;on/statusalso available)MARIGOLD_TELEMETRY=0DO_NOT_TRACK=1(the console.dev standard)- CI environments are skipped automatically
MARIGOLD_TELEMETRY_DEBUG=1 prints every payload to stderr as it is sent.
Sends are fire-and-forget with a 1.5s cap and can never slow, block, or break
a command. The implementation is src/telemetry.ts —
audit it. If you point MARIGOLD_ORIGIN at a self-hosted instance, pings go
there, not to us.
License
MIT — free forever. See LICENSE. Source on GitHub:
github.com/immuneeb/marigold-collab
(directory packages/local).
Source: packages/local/README.md at commit c041a2c
Tools
0Version history
1- v0.9.1LatestSep 16, 2026
Score
85% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 daysRequired25 pts
- Auth declaredRequired10 pts
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts