Marigold

io.github.immuneeb由 GitHub 帳號 immuneeb 發布v0.9.1更新於 Nov 2, 2026

Comment on AI-generated webpages; feedback flows back to your coding agent. Free, MIT, local-first.

已驗證Streamable HTTP可網頁執行效率與工作流檔案與儲存開發者工具

概覽

AI 產生的概覽

Marigold 讓助理產生 HTML/SVG 草稿,在瀏覽器批註介面中開啟,並把審閱者的留言與就地修改當成回饋傳回給助理。

可以做什麼
  • 建立、開啟、更新與讀取 HTML 或 SVG 草稿,並在本地瀏覽器批註介面中呈現
  • 等待審閱回饋,可阻塞等待直到審閱者按下送出回饋
  • 回覆留言,並把留言標記為已解決或重新開啟
  • 把草稿發佈到託管版 Marigold,取得分享連結與認領連結
適用情境
適合助理產出視覺化草稿(頁面、報告、圖表)後,由人工在頁面上標註、留言並就地修改,再把回饋交回助理進行下一輪修訂的情境。
執行需求
本地模式需安裝 npm 套件 marigold-draft(Node.js),以 stdio MCP 伺服器或命令列方式執行,並在 127.0.0.1 上執行背景守護程序(預設埠 4747)。託管端點 marigold.page 需要 OAuth 登入。分享功能會把草稿上傳到託管版 Marigold。
安裝前請注意
分享會把草稿上傳到託管版 Marigold:分享連結中的金鑰即為存取憑證,任何取得連結的人都能檢視與留言,連結在最後一次寫入約 30 天後過期。就地編輯會直接寫入來源檔案。除非透過 telemetry off、MARIGOLD_TELEMETRY=0 或 DO_NOT_TRACK=1 關閉,否則會傳送匿名使用次數。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Marigold,將其新增到工作區。
  2. 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.immuneeb%2Fmarigold/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。

{
  "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

sh
npm i -g marigold-draftmarigold-draft agent-setup   # wires up Claude Code (skill) + Claude Desktop (MCP)

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)

sh
# 1. write draft.html (full document or fragment — fragments get a neutral wrapper)marigold-draft open draft.html --json          # opens the browser tab, BLOCKS# 2. reviewer comments / edits in place / hits "Send feedback to agent"#    → the open call prints the review JSON (openComments with anchoredText,#      overallComment, per-comment replies) and exits# 3. edit draft.html — the tab live-reloads, comments re-anchormarigold-draft reply draft.html c1 "Bumped the chart to 34px"marigold-draft resolve draft.html c1# 4. next round (tab already connected, so no new browser tab):marigold-draft open draft.html --json --no-browser

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:

sh
marigold-draft share draft.html          # prints a share link + a claim linkmarigold-draft share draft.html --title "Q3 Review" --origin http://localhost:3000
  1. Instant share link, no account. share POSTs 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. share also prints a claim link.
  2. 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

open <file>       serve + open in browser, wait for feedback                  --json --no-browser --no-wait --timeout <s> --title <t>listen [path…]    stream submitted rounds as JSON lines; path args (files                  and/or dirs) scope it to those drafts — scope it when                  parallel agent sessions run at once (no paths = all drafts);                  reconnects forever — run under a persistent monitorshare <file>      publish to hosted Marigold + print a share link and claim link                  --title <t> --origin <url> (default marigold.page)comments <file>   list threads               [--json]reply <file> <id> <text…>    reply to a comment (badged AI in the UI)resolve|reopen <file> <id>   set comment statusstart | status | stop        manage the background daemon (default port 4747,                             override with MARIGOLD_LOCAL_PORT or --port)mcp               stdio MCP server for chat clients (see below)

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):

json
{  "mcpServers": {    "marigold-draft": {      "command": "/opt/homebrew/bin/node",      "args": ["<repo>/packages/local/dist/cli.cjs", "mcp"]    }  }}

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] with command = "marigold-draft" and args = ["mcp"] (or codex mcp add marigold-draft -- marigold-draft mcp). Reads AGENTS.md.
  • opencode — opencode.json → "mcp": { "marigold-draft": { "type": "local", "command": ["marigold-draft", "mcp"], "enabled": true } }. Reads AGENTS.md.
  • Google Antigravity — Settings → Customizations → Open MCP Config (~/.gemini/config/mcp_config.json) → "mcpServers": { "marigold-draft": { "command": "marigold-draft", "args": ["mcp"] } }. Reads AGENTS.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 SSE reload to 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 a sandbox="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. The since cursor 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

sh
pnpm --filter @marigold/local test

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:

json
{ "event": "draft.opened", "version": "0.9.0", "platform": "darwin", "nodeMajor": 22 }

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/status also available)
  • MARIGOLD_TELEMETRY=0
  • DO_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).

來源:packages/local/README.md,提交 c041a2c

工具

0
該伺服器需要登入,因此 SourceWeft 無法在沒有帳號的情況下讀取其工具,也未收錄。已連接帳號所能看到的內容可能因帳號及其權限而異。

版本歷史

1
  1. v0.9.1最新Sep 16, 2026

評分

已滿足適用檢查項的 85%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分