honeybook-mcp 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "metadata": {
9
9
  "description": "HoneyBook client-portal tools for Claude Code",
10
- "version": "1.1.3"
10
+ "version": "1.2.0"
11
11
  },
12
12
  "plugins": [
13
13
  {
@@ -15,7 +15,7 @@
15
15
  "displayName": "HoneyBook",
16
16
  "source": "./",
17
17
  "description": "HoneyBook client-portal MCP for Claude — view wedding-vendor contracts and invoices via MCP",
18
- "version": "1.1.3",
18
+ "version": "1.2.0",
19
19
  "author": {
20
20
  "name": "Chris Chall"
21
21
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "honeybook",
3
3
  "displayName": "HoneyBook",
4
- "version": "1.1.3",
4
+ "version": "1.2.0",
5
5
  "description": "HoneyBook client-portal MCP for Claude — view wedding-vendor contracts and invoices via MCP",
6
6
  "author": {
7
7
  "name": "Chris Chall",
package/README.md CHANGED
@@ -76,7 +76,7 @@ Add to Claude Desktop config (`~/Library/Application Support/Claude/claude_deskt
76
76
  }
77
77
  ```
78
78
 
79
- No environment variables are required.
79
+ No environment variables are required. The optional ones below tune how writes are confirmed — see [Confirmations](#confirmations).
80
80
 
81
81
  ## Sessions
82
82
 
@@ -134,13 +134,13 @@ Tools that touch a vendor accept an optional `origin` argument (e.g. `https://ac
134
134
  | `get_workspace_file` | Full detail for one file | Auto |
135
135
  | `get_workspace` | Workspace detail + status flags | Auto |
136
136
  | `list_payment_methods` | Saved payment methods | Auto |
137
- | `sign_contract` | Deep link to sign in portal (requires `confirm:true`) | Confirm |
138
- | `pay_invoice` | Deep link to pay in portal (requires `confirm:true`) | Confirm |
137
+ | `sign_contract` | Deep link to sign in portal (after you confirm) | Confirm |
138
+ | `pay_invoice` | Deep link to pay in portal (after you confirm) | Confirm |
139
139
  | `list_projects` | Your projects with a vendor + their workspace ids | Auto |
140
140
  | `get_project` | Project details: date, location, people, custom fields | Auto |
141
141
  | `list_messages` | Messages (or the activity log) in a workspace, newest first | Auto |
142
142
  | `get_message` | One message in full: body, attachments, delivery status | Auto |
143
- | `send_message` | Send or reply through the portal (requires `confirm:true`) | Confirm |
143
+ | `send_message` | Send or reply through the portal (after you confirm) | Confirm |
144
144
  | `mark_messages_seen` | Mark feed items seen (reads never do this on their own) | Auto |
145
145
  | `list_meetings` | Scheduled meetings with join links, latest time wins | Auto |
146
146
  | `list_tasks` | Tasks the vendor assigned you, with counts | Auto |
@@ -151,7 +151,17 @@ Tools that touch a vendor accept an optional `origin` argument (e.g. `https://ac
151
151
  `send_message` is the one tool that acts on your behalf: it creates the same
152
152
  `send_workspace_message` job the portal's Activity composer creates and waits
153
153
  for HoneyBook to finish it, so the vendor receives a normal HoneyBook email.
154
- Without `confirm:true` it only previews the recipients, subject and body.
154
+ Until you confirm it only previews the recipients, subject and body — see [Confirmations](#confirmations).
155
+
156
+ ## Confirmations
157
+
158
+ `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).
159
+
160
+ | variable | default | |
161
+ |---|---|---|
162
+ | `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. An unrecognised value is treated as `refuse`. |
163
+ | `MCP_CONFIRM_TTL_SECONDS` | `600` | How long a token stays valid. |
164
+ | `MCP_CONFIRM_SECRET` | random per process | Signing key; set it only if tokens must survive a server restart. |
155
165
 
156
166
  ## Troubleshooting
157
167
 
@@ -188,7 +198,7 @@ Nothing else changes: existing sessions in `~/.honeybook-mcp/sessions.json` keep
188
198
 
189
199
  - Sessions are captured locally — auth tokens never leave your machine
190
200
  - `~/.honeybook-mcp/sessions.json` is written with mode 0600; directory with mode 0700
191
- - Write tools (`sign_contract`, `pay_invoice`) require `confirm:true` and return portal deep links rather than signing/paying headlessly
201
+ - Write tools (`sign_contract`, `pay_invoice`, `send_message`) ask you to confirm first (see [Confirmations](#confirmations)); `sign_contract` and `pay_invoice` return portal deep links rather than signing/paying headlessly
192
202
 
193
203
  ## Development
194
204
 
package/dist/auth.js CHANGED
@@ -67,7 +67,7 @@ import { bootstrap } from '@fetchproxy/bootstrap';
67
67
  import { bridgeErrorInfo } from '@chrischall/mcp-utils/fetchproxy';
68
68
  import { parseBoolEnv } from '@chrischall/mcp-utils';
69
69
  import pkg from '../package.json' with { type: 'json' };
70
- import { sessionStore, normalizeOrigin } from './sessions.js';
70
+ import { sessionStore, normalizeOrigin, vendorPortalSubdomain } from './sessions.js';
71
71
  /** True if the user has explicitly disabled the fetchproxy capture path. */
72
72
  function fetchproxyDisabled() {
73
73
  return parseBoolEnv('HONEYBOOK_DISABLE_FETCHPROXY');
@@ -87,6 +87,8 @@ function fetchproxyDisabled() {
87
87
  * subsequent tool call without an explicit `origin` will use it.
88
88
  */
89
89
  export async function captureSessionViaFetchproxy(opts) {
90
+ // Refuse a foreign host before the bridge opens (fleet-audit#139).
91
+ const vendorSubdomain = vendorPortalSubdomain(opts.portalOrigin);
90
92
  if (fetchproxyDisabled()) {
91
93
  throw new Error('HoneyBook auth: fetchproxy capture is disabled by HONEYBOOK_DISABLE_FETCHPROXY. ' +
92
94
  'Unset that env var to enable session capture via the browser extension.');
@@ -111,6 +113,10 @@ export async function captureSessionViaFetchproxy(opts) {
111
113
  // know which tab to target.
112
114
  domains: ['honeybook.com', 'hbportal.co'],
113
115
  storageDomain: 'hbportal.co',
116
+ // Pin the read to the vendor's own tab. Without it the extension reads
117
+ // whichever hbportal.co tab is open, so vendor A's token could be
118
+ // stored under vendor B's origin (fleet-audit#139).
119
+ storageSubdomain: vendorSubdomain,
114
120
  declare: {
115
121
  cookies: [],
116
122
  // `HONEYBOOK_REACT_CURR_USER` is ~6.5KB of mostly unused user