Skip to main content
Glama
honeybook-mcp

honeybook-mcp

by chrischall

HoneyBook MCP

CI npm license

A Model Context Protocol server that connects Claude to the HoneyBook client portal, giving you natural-language access to contracts and invoices sent by your wedding vendors.

WARNING

AI-developed project. This codebase was built and is actively maintained by Claude Code. No human has audited the implementation. Review all code and tool permissions before use.

What you can do

Ask Claude things like:

  • "Paste your magic link — I'll connect to your HoneyBook portal."

  • "Show me every unsigned contract."

  • "What invoices do I have due in the next month?"

  • "Summarize the contract from Silk Veil Events."

  • "Give me a deep link to sign the photographer's contract."

  • "What has the planner sent me this month? Read me the checklist."

  • "Reply to Ivy's last message and ask about the rehearsal time."

  • "When is my next Zoom with the planner, and what's the link?"

  • "What have I paid so far, and what's still owed?"

Related MCP server: WealthGuard MCP

Requirements

  • Claude Desktop or Claude Code

  • Node.js 22 or later

  • Magic-link emails from the wedding vendors that use HoneyBook

  • ContextMint Bridge browser extension — in Chrome, download the chrome zip from the releases page and load it unpacked (chrome://extensions → Developer mode → Load unpacked). Safari isn't available yet (it will ship inside the ContextMint app, which has no public download), so use Chrome for now. Used by use_magic_link to snapshot the session out of your signed-in vendor portal tab.

Acknowledgement of Terms

By using this MCP server, you acknowledge and agree to the following:

1. This server accesses your own HoneyBook workspace. Every request is dispatched through your own signed-in browser session via the ContextMint Bridge extension. It does not — and cannot — access anyone else's workspace.

2. HoneyBook's Terms of Service govern your use of this server, just as they govern your direct use of honeybook.com. The clauses most relevant here:

In connection with your use of the Service you will not engage in or use any data mining, robots, scraping or similar data gathering or extraction methods.

And: users may not "modify, copy, frame, scrape, rent, lease, loan, sell, distribute or create derivative works based on the Service or the Service Content."

You are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server. HoneyBook's ToS broadly prohibits data mining and scraping; this MCP is an unofficial automation tool and HoneyBook has not granted it an exception.

3. Personal, single-business use only. This project is not affiliated with, endorsed by, sponsored by, or in partnership with HoneyBook, Inc. It is a personal automation tool that an individual HoneyBook account holder can use to drive their own workspace. Do not use it on behalf of another business, do not bulk-extract HoneyBook's directory or template content, and do not create a derivative SaaS product on top of it.

4. Stability is not guaranteed. This server calls internal HoneyBook endpoints that HoneyBook may change without notice. It may break.

5. You accept full responsibility for any consequences of using this server in connection with your HoneyBook account — rate limiting, account warnings, suspension, or any enforcement action HoneyBook takes. HoneyBook can detect automated traffic and may block your IP or workspace. If HoneyBook objects to your use, stop using this server.

This section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede HoneyBook's actual ToS.

Installation

From source

git clone https://github.com/chrischall/honeybook-mcp.git
cd honeybook-mcp
npm install
npm run build

Add to Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "honeybook": {
      "command": "node",
      "args": ["/absolute/path/to/honeybook-mcp/dist/bundle.js"]
    }
  }
}

No environment variables are required. The optional ones below tune how writes are confirmed — see Confirmations.

Sessions

HoneyBook has no public client-portal API. This MCP reuses the same auth state your browser has after clicking a vendor's magic link, via the ContextMint Bridge browser extension.

One-time setup:

  1. Install ContextMint Bridge from its releases page: in Chrome, load the chrome zip unpacked. Safari isn't available yet (it will ship inside the ContextMint app, which has no public download) — use Chrome for now. ContextMint Bridge is the fetchproxy browser extension under its new name, from the same maintainer — fetchproxy's own README (fetchproxy#extension) points to it. Its source is public at nullnet-app/contextmint-bridge: build it yourself, or check a release zip against the .sha256 file published beside it (shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256).

  2. Click each vendor's magic link in your normal browser. That signs you into their *.hbportal.co portal.

Per-vendor activation:

  1. Make sure the vendor's portal tab is open (the magic link from their email).

  2. In Claude, call use_magic_link with the magic-link URL — the tool asks the ContextMint Bridge extension to snapshot the auth fields out of the page's localStorage["HONEYBOOK_REACT_CURR_USER"], then closes the bridge. The tab only has to be open and signed in; nothing is read off a live request. No headless browser is spawned.

  3. All other tools use the most-recently-activated session by default. Pass origin explicitly when multiple vendors are active.

Sessions are stored in memory and persisted to ~/.honeybook-mcp/sessions.json (mode 0600) so they survive MCP restarts. Re-run use_magic_link when a session expires.

A vendor can send a second, different shape of link:

https://<vendor>.hbportal.co/flow/<flowId>?hash=…&userId=…

That one does not sign you into the portal. It opens a single questionnaire and stores a per-flow credential — HoneyBook calls it weak auth — under localStorage["HONEYBOOK_REACT_WEAK_AUTH_<flowId>"]. Capture it with use_flow_link and read it with get_flow.

The two credential kinds are kept apart on purpose, in two files and two stores:

portal session

flow credential

capture tool

use_magic_link

use_flow_link

link shape

/app/link/resolve/…

/flow/<flowId>?hash=…

stored in

~/.honeybook-mcp/sessions.json

~/.honeybook-mcp/flows.json

can read

workspaces, files, invoices, payment methods

that one questionnaire

Each tool refuses the other's link shape by name, and a portal tool asked to run with only a flow credential says so rather than failing later with an opaque HoneyBook error. list_active_sessions reports both kinds, separately.

get_flow makes the same two calls the questionnaire page does: the public GET /api/v2/flow/<flowId>/minimal for the vendor company id, then GET /api/v2/client/flow/<flowId>/active?ctxc=<companyId>. If the first does not carry a company id it stops there and says so — calling /active without ctxc answers a bare 400 that reads like an expired credential.

One thing to expect: the storage key contains the flow id, so every new questionnaire is a new key in the declared fetchproxy scope. The extension gates on the scope you approved at pair time, so it asks you to re-approve once per questionnaire. That is the extension working, not a fault.

Available tools

Tools that touch a vendor accept an optional origin argument (e.g. https://acme.hbportal.co). When only one session is active it is inferred.

Tool

What it does

Permission

use_magic_link

Capture a session from a magic-link URL

Confirm

list_active_sessions

Show active credentials, split by kind

Auto

use_flow_link

Capture a questionnaire (flow) credential

Confirm

get_flow

Read one questionnaire and its answers

Auto

list_workspace_files

Files from one vendor; filter by type

Auto

get_workspace_file

Full detail for one file

Auto

get_workspace

Workspace detail + status flags

Auto

list_payment_methods

Saved payment methods (brand, last 4, expiry)

Auto

sign_contract

Deep link to sign in portal (after you confirm)

Confirm

pay_invoice

Deep link to pay in portal (after you confirm)

Confirm

list_projects

Your projects with a vendor + their workspace ids

Auto

get_project

Project details: date, location, people, custom fields

Auto

list_messages

Messages (or the activity log) in a workspace, newest first

Auto

get_message

One message in full: body (text, Markdown or HTML), attachments, delivery status

Auto

send_message

Send or reply through the portal, in text, Markdown or HTML (after you confirm)

Confirm

mark_messages_seen

Mark feed items seen (reads never do this on their own)

Auto

list_meetings

Scheduled meetings with join links, latest time wins

Auto

list_tasks

Tasks the vendor assigned you, with counts

Auto

list_notes

Notes the vendor shared

Auto

list_attachments

Loose images, files and bookmarks in a workspace

Auto

list_payments

Payment schedule with paid/unpaid totals

Auto

send_message is the one tool that acts on your behalf: it creates the same send_workspace_message job the portal's Activity composer creates and waits for HoneyBook to finish it, so the vendor receives a normal HoneyBook email. Until you confirm it only previews the recipients, subject and body — see Confirmations.

Confirmations

sign_contract, pay_invoice and send_message ask you to confirm before they act. A client that can show an MCP confirmation prompt (Claude Code) shows one. On a client that cannot (claude.ai, Claude Desktop), the first call does nothing and returns a preview plus a confirmToken; only a repeat call with the same arguments and that token proceeds. A token works once, and is refused if anything it covers changed between the two calls (the file's title, the message body, the workspace's recipients).

variable

default

MCP_CONFIRM_MODE

ask-user

What a write does on a client that cannot show a confirmation prompt (claude.ai, Claude Desktop). ask-user: two steps — the first call does nothing and returns a preview plus a token, and the model must get your approval in chat before calling again with it. auto: the same two steps, but the model may use the token after reviewing the preview itself. refuse: writes are refused on such clients. A client that can show prompts (Claude Code) always gets the real prompt, unless MCP_CONFIRM_ELICITATION=off. An unrecognised value is treated as refuse.

MCP_CONFIRM_ELICITATION

on

off never sends a confirmation prompt, so every client gets the MCP_CONFIRM_MODE path. Set it for a client that declares it can show prompts but never does (the gated call hangs — opencode 2.0.x). Any other value stays on, with a stderr warning.

MCP_CONFIRM_TTL_SECONDS

600

How long a token stays valid.

MCP_CONFIRM_SECRET

random per process

Signing key; set it only if tokens must survive a server restart.

Troubleshooting

  • "HoneyBook auth expired" — re-open the vendor's magic link in Chrome and re-run use_magic_link.

  • "No active HoneyBook session" — call use_magic_link first.

  • "No active HoneyBook portal session. N flow (questionnaire) credentials are active" — you captured a /flow/ link but the tool you called needs a client-portal one. Run use_magic_link with an /app/link/resolve/… link, or use get_flow to read the questionnaire.

  • "that is a questionnaire (flow) link, not a client-portal link" — use use_flow_link for it.

  • "no auth hash for flow …" — the link you passed had lost its ?hash= parameter (the page rewrites the URL after it loads). Re-copy the original link out of the vendor email.

  • "HoneyBook error 400 … NOT an auth failure" on get_flow — a required input was missing, not your credential. Usually a pinned HONEYBOOK_API_VERSION that has gone stale: unset it so the live value is read from /api/gon. Re-running use_flow_link will not help.

  • "no context id for flow …" — HoneyBook's public /minimal route did not return the vendor company id the questionnaire read needs. Also not a credential problem.

  • "fetchproxy capture failed" — install ContextMint Bridge, then open the vendor's magic link in that browser.

  • "fetchproxy capture timed out" — the extension found no signed-in portal tab to read. Open the vendor's magic link, confirm the portal page has loaded, then retry.

  • "no confirmed browser session" — the extension is connected but has not approved this MCP. Open the ContextMint Bridge popup and approve the pair code it shows, then retry.

  • "this browser … cannot serve the … capability" — the browser you paired lacks an API the capture needs. Nothing is wrong with the MCP or your pairing, and retrying or re-approving will not help: run it from a browser that provides the API (for example Chrome).

  • "localStorage keys not in declared set" — the MCP now reads a storage key your existing pairing doesn't cover. See Upgrading from 0.4.4 or earlier. Retrying will not help, and this is not a version problem.

Upgrading from 0.4.4 or earlier

0.4.5 requires a one-time re-approval in the browser extension. HoneyBook moved the client-portal session out of localStorage["jStorage"] into localStorage["HONEYBOOK_REACT_CURR_USER"], so 0.4.5 reads a different storage key. The extension approves a MCP's declared scope at pair time, so an existing pairing does not cover the new key and every capture is refused with:

localStorage keys not in declared set: HONEYBOOK_REACT_CURR_USER

To fix it, once:

  1. Open the ContextMint Bridge extension popup.

  2. Revoke honeybook-mcp.

  3. Re-run use_magic_link — a fresh pair code appears.

  4. Approve it in the popup. You are approving the new scope.

Nothing else changes: existing sessions in ~/.honeybook-mcp/sessions.json keep working, and a re-capture is only needed if the session itself has expired.

Security

  • Sessions are captured locally — auth tokens never leave your machine

  • ~/.honeybook-mcp/sessions.json is written with mode 0600; directory with mode 0700

  • Write tools (sign_contract, pay_invoice, send_message) ask you to confirm first (see Confirmations); sign_contract and pay_invoice return portal deep links rather than signing/paying headlessly

Development

npm test        # run tests
npm run build   # tsc + esbuild bundle

License

MIT

Available Tools

22 tools
get_flowA
Read-only

Read a HoneyBook questionnaire (flow) — its pages, questions and any answers already submitted — using a credential captured by use_flow_link. Requires a flow credential; a client-portal session will NOT work here, and vice versa. Defaults to the most recently captured flow. Makes two calls: the public /api/v2/flow//minimal for the vendor company id, then /api/v2/client/flow//active, passing that id as ?ctxc= when /minimal supplied one. A questionnaire larger than the default ceiling answers with its size and top-level keys instead; call again with view="raw" for the whole thing.

Inputs: view, flow_id.

get_messageA
Read-only

Read one message in full: body (HoneyBook's plain text by default, Markdown, or the original HTML), sender, recipients, attachments and per-recipient delivery status.

Inputs: message_id (required), workspace_id (required), format, origin.

get_projectA
Read-only

Project details — the portal's Overview "Project details" card plus the people on it: name, date, time, timezone, location, guest count, custom fields, cover image, and each participant's name / email / phone / role. view="raw" returns the untrimmed response (large: it embeds the vendor's account).

Inputs: project_id (required), view, origin.

get_workspaceB
Read-only

Get full detail for a workspace (vendor project). Includes status flags like has_sent_files, has_signed_files, has_paid_payments.

Inputs: workspace_id (required), origin.

get_workspace_fileA
Read-only

Get detail for one workspace file. Returns a compact summary by default (metadata, vendor, event, pricing totals, payment schedule, agreement presence). Use section to drill into a specific part of the file: "pricing" for full line items + tax/svc detail, "agreement" for contract HTML + signatures, "payments" for full payment-schedule detail, "all" for the pruned full response, or "raw" for the entirely-unpruned response (may exceed MCP size limits on proposal-class files).

Inputs: file_id (required), origin, section.

honeybook_healthcheckVerify credentials and upstream reachabilityA
Read-onlyIdempotent

Resolves the credential the way real tools do, then makes one authenticated request to api.honeybook.com. Reports which source supplied the credential, whether api.honeybook.com accepted it, the round-trip time, and a plain-English hint distinguishing 'no credential' from 'credential rejected' from 'a api.honeybook.com-side problem'. Read-only; never returns the credential itself. Call this when a real tool fails and you want to know which hop broke.

Inputs: no named parameters.

list_active_sessionsA
Read-only

List the HoneyBook credentials currently active in this MCP, split by kind: portalSessions (captured via use_magic_link — read workspaces, files, invoices, payment methods) and flowCredentials (captured via use_flow_link — weak auth scoped to ONE questionnaire). The two are not interchangeable. No API call.

Inputs: no named parameters.

list_attachmentsA
Read-only

Loose images, files and bookmarks shared in a workspace — the portal's Files tab, minus the contracts/invoices/proposals that list_workspace_files covers.

Inputs: workspace_id (required), origin.

list_meetingsA
Read-only

Meetings the vendor has scheduled in a workspace (consultations, Zoom calls, walkthroughs): title, start/end, timezone, join link and password. Derived from the workspace feed, so a rescheduled meeting shows its latest time. Sorted by start.

Inputs: workspace_id (required), origin.

list_messagesA
Read-only

List the messages (and optionally the activity log) in a workspace — the portal's Activity tab. Returns compact cards (sender, subject, preview, seen state, attachments), newest first; call get_message for a full body. Reading does NOT mark anything as seen.

Inputs: workspace_id (required), kind, limit, origin.

list_notesB
Read-only

Notes the vendor has shared with you in a workspace (meeting notes, AI recaps) — the portal's Notes tab.

Inputs: workspace_id (required), origin.

list_payment_methodsA
Read-only

List saved payment methods for your client account with a vendor: id, type, brand, last 4, expiry and whether it is the default. Empty array if none are saved. view="raw" returns the untrimmed records (billing name/address and Stripe references).

Inputs: view, origin.

list_paymentsA
Read-only

Payment schedule for a workspace — the portal's Payments tab: each file's payments with amount, due date, paid/pending state, how it was paid and the invoice number, plus paid/unpaid totals per currency. To pay one, use pay_invoice.

Inputs: workspace_id (required), view, origin.

list_projectsA
Read-only

List your projects with a vendor (HoneyBook calls them events): name, date, booked flag and the workspace_id that every other workspace tool takes. This is the portal's project switcher.

Inputs: page, origin.

list_tasksA
Read-only

Tasks the vendor has assigned to you in a workspace — the portal's Tasks tab — with the today / this week / overdue / completed counts and any task groups. Sorted by due date.

Inputs: workspace_id (required), page, origin, per_page, +1 more.

list_workspace_filesA
Read-only

List all files a vendor has shared with you (contracts, invoices, brochures, proposals). Optionally filter by file_type. Follows every page; returns { files, complete } — complete:false means some files could not be fetched. Each file is a light summary row by default (id, title, type, status, sent date, workspace, payment/acceptance flags); call get_workspace_file with its _id for pricing, contract or payments, or pass view="all" for every pruned file object (large).

Inputs: view, origin, file_type.

mark_messages_seenA
DestructiveIdempotent

Mark feed items as seen (what the portal does when you open the Activity tab). list_messages and get_message never do this on their own.

Inputs: message_ids (required), workspace_id (required), origin.

pay_invoiceA
Read-only

Pay an invoice from a vendor. In v1 this returns a deep link to the HoneyBook portal instead of paying headlessly — it moves no money itself; the user pays in their browser. It still asks the user to confirm before handing over the link: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).

Inputs: file_id (required), origin, confirmToken.

send_messageA
Destructive

Send a message to the vendor (and the other members of the workspace) through the HoneyBook portal, exactly as the Activity tab composer does. HoneyBook emails it to every recipient. Pass reply_to_message_id to reply in-thread (the subject is inherited). Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). If HoneyBook has not finished sending within about a minute the result has status "pending" and a task_id; if it did not answer the send request at all the status is "unknown". Either way the message may still be delivered, so check list_messages before resending.

Inputs: body (required), workspace_id (required), format, origin, +3 more.

sign_contractA
Read-only

Sign a contract you received from a vendor. In v1 this returns a deep link to the HoneyBook portal instead of signing headlessly — it signs nothing itself; the user signs in their browser. It still asks the user to confirm before handing over the link: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).

Inputs: file_id (required), origin, confirmToken.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 22 tools

    Disambiguation4/5

    Most tools map to one clear portal concept (messages, meetings, tasks, notes, payments, sessions) and the auth trio (use_magic_link vs use_flow_link vs list_active_sessions) is explicitly cross-referenced by URL shape and credential kind. The main wobble is get_project vs get_workspace, which are two views of the same HoneyBook event/workspace and could be confused, plus a softer overlap between list_attachments and list_workspace_files (the descriptions do disambiguate by file class).

    Naming Consistency4/5

    Nearly every tool follows a snake_case verb_noun pattern (get_message, list_projects, pay_invoice, sign_contract, use_flow_link), with resource pairs such as list_workspace_files/get_workspace_file reading predictably. The only real deviations are honeybook_healthcheck (noun with a product prefix rather than a verb) and the 'use_*' verb group for credential capture.

    Tool Count3/5

    22 tools is heavy for a client-side portal integration, and roughly a quarter of the surface (use_magic_link, use_flow_link, list_active_sessions, get_flow, honeybook_healthcheck) is authentication/diagnostics plumbing rather than domain operations. The remaining tools each cover a distinct tab of the portal, so nothing is clearly redundant, but the set sits in the borderline-heavy band.

    Completeness3/5

    Read and action coverage spans projects, messages, meetings, tasks, notes, files, payments and questionnaires, but several are read-only dead ends: tasks cannot be marked complete, notes and meetings have no create/RSVP/reschedule, and there is no tool to submit questionnaire answers or accept a proposal — only get_flow reads it. sign_contract and pay_invoice also just hand back deep links, so the two highest-value actions are not actually performed.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers