honeybook-mcp 1.2.4 → 1.2.5

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.2.4"
10
+ "version": "1.2.5"
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.2.4",
18
+ "version": "1.2.5",
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.2.4",
4
+ "version": "1.2.5",
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
@@ -160,7 +160,8 @@ Until you confirm it only previews the recipients, subject and body — see [Con
160
160
 
161
161
  | variable | default | |
162
162
  |---|---|---|
163
- | `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_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`. |
164
+ | `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. |
164
165
  | `MCP_CONFIRM_TTL_SECONDS` | `600` | How long a token stays valid. |
165
166
  | `MCP_CONFIRM_SECRET` | random per process | Signing key; set it only if tokens must survive a server restart. |
166
167
 
package/dist/bundle.js CHANGED
@@ -25603,11 +25603,23 @@ var require_websocket = __commonJS({
25603
25603
  this._isServer = false;
25604
25604
  this._redirects = 0;
25605
25605
  if (protocols === void 0) {
25606
- protocols = [];
25606
+ if (!options || options.protocols === void 0) {
25607
+ protocols = [];
25608
+ } else if (Array.isArray(options.protocols)) {
25609
+ protocols = options.protocols;
25610
+ } else {
25611
+ protocols = [options.protocols];
25612
+ }
25607
25613
  } else if (!Array.isArray(protocols)) {
25608
25614
  if (typeof protocols === "object" && protocols !== null) {
25609
25615
  options = protocols;
25610
- protocols = [];
25616
+ if (options.protocols === void 0) {
25617
+ protocols = [];
25618
+ } else if (Array.isArray(options.protocols)) {
25619
+ protocols = options.protocols;
25620
+ } else {
25621
+ protocols = [options.protocols];
25622
+ }
25611
25623
  } else {
25612
25624
  protocols = [protocols];
25613
25625
  }
@@ -25804,7 +25816,6 @@ var require_websocket = __commonJS({
25804
25816
  }
25805
25817
  return;
25806
25818
  }
25807
- this._readyState = _WebSocket.CLOSING;
25808
25819
  this._sender.close(code2, data, !this._isServer, (err) => {
25809
25820
  if (err) return;
25810
25821
  this._closeFrameSent = true;
@@ -25812,6 +25823,7 @@ var require_websocket = __commonJS({
25812
25823
  this._socket.end();
25813
25824
  }
25814
25825
  });
25826
+ this._readyState = _WebSocket.CLOSING;
25815
25827
  setCloseTimer(this);
25816
25828
  }
25817
25829
  /**
@@ -26036,6 +26048,7 @@ var require_websocket = __commonJS({
26036
26048
  socketPath: void 0,
26037
26049
  hostname: void 0,
26038
26050
  protocol: void 0,
26051
+ protocols: void 0,
26039
26052
  timeout: void 0,
26040
26053
  method: "GET",
26041
26054
  host: void 0,
@@ -61701,6 +61714,7 @@ function escapeKey(key) {
61701
61714
  var DEFAULT_REQUEST_KEY = "confirmation";
61702
61715
  var DEFAULT_CONFIRMATION_LABEL = "Confirm this action should proceed.";
61703
61716
  var UNSUPPORTED_NOTE = "Nothing was done because this client cannot show a confirmation prompt (it declares no MCP elicitation capability), and this action is never taken without one";
61717
+ var DISABLED_NOTE = "Nothing was done because confirmation prompts are turned off for this server, and this action is never taken without one";
61704
61718
  var STATE_PREFIX = "mcpu.confirm.v1.";
61705
61719
  function bindingKey(binding) {
61706
61720
  if (binding.ttlSeconds !== void 0 && !(Number.isFinite(binding.ttlSeconds) && binding.ttlSeconds > 0)) {
@@ -61773,6 +61787,15 @@ ${JSON.stringify(preview, null, 2)}`,
61773
61787
  };
61774
61788
  const response = inputResponse(ctx.mcpReq.inputResponses, requestKey);
61775
61789
  const accepted = acceptedContent(ctx.mcpReq.inputResponses, requestKey, confirmationSchema);
61790
+ if (options.elicitation === false) {
61791
+ return textResult({
61792
+ confirmed: false,
61793
+ dispatched: false,
61794
+ action: options.action,
61795
+ reason: "confirmation-unsupported",
61796
+ note: options.unsupportedNote ? `${DISABLED_NOTE}. ${options.unsupportedNote}` : `${DISABLED_NOTE}.`
61797
+ });
61798
+ }
61776
61799
  if (response.kind === "missing") {
61777
61800
  if (callerAcceptsFormElicitation(ctx) === false) {
61778
61801
  return textResult({
@@ -61967,7 +61990,7 @@ async function tokenConfirmation(action, fb) {
61967
61990
  }
61968
61991
  async function requireConfirmationWithFallback(ctx, options) {
61969
61992
  const { tokenFallback, ...confirmation } = options;
61970
- if (tokenFallback && callerAcceptsFormElicitation(ctx) === false) {
61993
+ if (tokenFallback && (options.elicitation === false || callerAcceptsFormElicitation(ctx) === false)) {
61971
61994
  return tokenConfirmation(options.action, tokenFallback);
61972
61995
  }
61973
61996
  return requireConfirmation(ctx, confirmation);
@@ -62118,6 +62141,20 @@ function readConfirmMode(env = process.env) {
62118
62141
  }
62119
62142
  return "refuse";
62120
62143
  }
62144
+ function readConfirmElicitation(env = process.env) {
62145
+ const raw = readEnvVar("MCP_CONFIRM_ELICITATION", { env })?.trim().toLowerCase();
62146
+ if (!raw || raw === "on")
62147
+ return "on";
62148
+ if (raw === "off")
62149
+ return "off";
62150
+ const key = `elicitation:${raw}`;
62151
+ if (!warned.has(key)) {
62152
+ warned.add(key);
62153
+ process.stderr.write(`MCP_CONFIRM_ELICITATION="${raw}" is not one of on, off; treating it as on.
62154
+ `);
62155
+ }
62156
+ return "on";
62157
+ }
62121
62158
  function readConfirmTtl(env) {
62122
62159
  const raw = readEnvVar("MCP_CONFIRM_TTL_SECONDS", { env })?.trim();
62123
62160
  if (!raw)
@@ -62162,6 +62199,7 @@ function spentTokenStoreFromEnv(env = process.env) {
62162
62199
  }
62163
62200
  var CONFIRM_TOKEN_AUTO_INSTRUCTION = "Nothing has been done yet. Review this preview; if it is what was intended, call again with the same arguments plus confirmToken. (This server runs with MCP_CONFIRM_MODE=auto, so the user's approval in chat is not required.)";
62164
62201
  var REFUSE_HINT = "Set MCP_CONFIRM_MODE=ask-user on the server to allow two-step confirmation instead.";
62202
+ var ELICITATION_OFF_HINT = "MCP_CONFIRM_ELICITATION=off on the server turns confirmation prompts off.";
62165
62203
  var BAD_TTL_HINT = "MCP_CONFIRM_TTL_SECONDS on the server is not a positive whole number of seconds; fix it to allow two-step confirmation.";
62166
62204
  function boundArgs(args) {
62167
62205
  if (args === null || typeof args !== "object" || Array.isArray(args) || !("confirmToken" in args))
@@ -62175,10 +62213,13 @@ function confirmationFromEnv(options) {
62175
62213
  const spent = callerSpent ?? spentTokenStoreFromEnv(env);
62176
62214
  const mode = readConfirmMode(env);
62177
62215
  const ttlSeconds = readConfirmTtl(env);
62216
+ const elicitationOff = readConfirmElicitation(env) === "off";
62178
62217
  const bound = args === void 0 ? void 0 : boundArgs(args);
62179
- const confirmation = bound === void 0 || rest.binding ? rest : { ...rest, binding: { key: confirmKeyFromEnv(env), args: bound, ttlSeconds: ttlSeconds ?? DEFAULT_TTL_SECONDS2 } };
62218
+ const bindingAdded = bound === void 0 || rest.binding ? rest : { ...rest, binding: { key: confirmKeyFromEnv(env), args: bound, ttlSeconds: ttlSeconds ?? DEFAULT_TTL_SECONDS2 } };
62219
+ const confirmation = elicitationOff ? { ...bindingAdded, elicitation: false } : bindingAdded;
62180
62220
  if (mode === "refuse" || ttlSeconds === void 0) {
62181
- const hint = mode === "refuse" ? REFUSE_HINT : BAD_TTL_HINT;
62221
+ const reason = mode === "refuse" ? REFUSE_HINT : BAD_TTL_HINT;
62222
+ const hint = elicitationOff ? `${ELICITATION_OFF_HINT} ${reason}` : reason;
62182
62223
  return {
62183
62224
  ...confirmation,
62184
62225
  unsupportedNote: confirmation.unsupportedNote ? `${confirmation.unsupportedNote} ${hint}` : hint
@@ -63362,6 +63403,17 @@ var KNOWN_CAPABILITIES = /* @__PURE__ */ new Set([
63362
63403
  ]);
63363
63404
  var ACCOUNT_KEY_FRAME = "account-key";
63364
63405
  var ACCOUNT_ATTEST_FRAME = "account-attest";
63406
+ var BRIDGE_ROLE_FRAME = "bridge-role";
63407
+ var BRIDGE_SERVE_FRAME = "bridge-serve";
63408
+ var ROOM_PING_FRAME = "room-ping";
63409
+ var ROOM_PONG_FRAME = "room-pong";
63410
+ var BRIDGE_ROLE_LABEL_MAX = 64;
63411
+ var ROOM_FRAME_ACCEPTS = Object.freeze({
63412
+ [BRIDGE_ROLE_FRAME]: BRIDGE_ROLE_FRAME,
63413
+ [BRIDGE_SERVE_FRAME]: BRIDGE_SERVE_FRAME,
63414
+ [ROOM_PING_FRAME]: ROOM_PING_FRAME,
63415
+ [ROOM_PONG_FRAME]: ROOM_PING_FRAME
63416
+ });
63365
63417
 
63366
63418
  // node_modules/@fetchproxy/protocol/dist/mcp-id.js
63367
63419
  var ID_RE = /^([^:]+):([^:]+):([0-9a-f]{16})$/;
@@ -64027,6 +64079,12 @@ function validateFrame(raw) {
64027
64079
  return validateAccountKey(raw);
64028
64080
  if (t === ACCOUNT_ATTEST_FRAME)
64029
64081
  return validateAccountAttest(raw);
64082
+ if (t === BRIDGE_ROLE_FRAME)
64083
+ return validateBridgeRole(raw);
64084
+ if (t === BRIDGE_SERVE_FRAME || t === ROOM_PING_FRAME || t === ROOM_PONG_FRAME) {
64085
+ assertExactFields(raw, TYPE_ONLY_FIELDS, t);
64086
+ return { type: t };
64087
+ }
64030
64088
  throw new ProtocolError3(`unknown frame type: ${String(t)}`);
64031
64089
  }
64032
64090
  function validateHello(raw) {
@@ -64352,6 +64410,43 @@ function validateAccountAttest(raw) {
64352
64410
  sig: raw.sig
64353
64411
  };
64354
64412
  }
64413
+ var TYPE_ONLY_FIELDS = ["type"];
64414
+ var BRIDGE_ROLE_FIELDS = ["type", "role", "canServe", "serving"];
64415
+ var BRIDGE_ROLE_SERVING_FIELDS = ["label", "since"];
64416
+ function validateBridgeRole(raw) {
64417
+ const L = BRIDGE_ROLE_FRAME;
64418
+ const role = raw.role;
64419
+ if (role !== "serving" && role !== "standby") {
64420
+ throw new ProtocolError3(`${L}.role: must be one of serving, standby`);
64421
+ }
64422
+ const canServe = raw.canServe;
64423
+ assertBoolean(canServe, `${L}.canServe`);
64424
+ assertExactFields(raw, BRIDGE_ROLE_FIELDS, L);
64425
+ const serving = raw.serving;
64426
+ if (role === "serving") {
64427
+ if (serving !== void 0) {
64428
+ throw new ProtocolError3(`${L}.serving: must be absent when role is serving`);
64429
+ }
64430
+ return { type: BRIDGE_ROLE_FRAME, role, canServe };
64431
+ }
64432
+ if (serving === void 0) {
64433
+ throw new ProtocolError3(`${L}.serving: required when role is standby`);
64434
+ }
64435
+ assertObject(serving, `${L}.serving`);
64436
+ const label = serving.label;
64437
+ assertDisplayString(label, `${L}.serving.label`, 1, BRIDGE_ROLE_LABEL_MAX);
64438
+ const since = serving.since;
64439
+ if (typeof since !== "number" || !Number.isSafeInteger(since) || since < 0) {
64440
+ throw new ProtocolError3(`${L}.serving.since: expected non-negative safe integer (Unix ms)`);
64441
+ }
64442
+ assertExactFields(serving, BRIDGE_ROLE_SERVING_FIELDS, `${L}.serving`);
64443
+ return {
64444
+ type: BRIDGE_ROLE_FRAME,
64445
+ role,
64446
+ canServe,
64447
+ serving: { label, since }
64448
+ };
64449
+ }
64355
64450
  function validateInnerFrame(raw) {
64356
64451
  assertObject(raw, "inner");
64357
64452
  const t = raw.type;
@@ -69568,7 +69663,7 @@ function isBrowserCapabilityGap(e) {
69568
69663
  // package.json
69569
69664
  var package_default = {
69570
69665
  name: "honeybook-mcp",
69571
- version: "1.2.4",
69666
+ version: "1.2.5",
69572
69667
  mcpName: "io.github.chrischall/honeybook-mcp",
69573
69668
  description: "HoneyBook client-portal MCP server for Claude",
69574
69669
  author: "Claude Code (AI) <https://www.anthropic.com/claude>",
@@ -69612,9 +69707,9 @@ var package_default = {
69612
69707
  typecheck: "tsc -p tsconfig.json --noEmit"
69613
69708
  },
69614
69709
  dependencies: {
69615
- "@chrischall/mcp-utils": "^2.14.0",
69616
- "@fetchproxy/bootstrap": "^3.4.1",
69617
- "@fetchproxy/server": "^3.4.1",
69710
+ "@chrischall/mcp-utils": "^2.15.0",
69711
+ "@fetchproxy/bootstrap": "^3.6.0",
69712
+ "@fetchproxy/server": "^3.6.0",
69618
69713
  "@modelcontextprotocol/server": "^2.3.0",
69619
69714
  dotenv: "^18.0.2",
69620
69715
  zod: "^4.6.5"
@@ -71499,7 +71594,7 @@ var __dirname = dirname3(fileURLToPath(import.meta.url));
71499
71594
  await loadDotenvSafely({ path: join9(__dirname, "..", ".env"), override: false });
71500
71595
  await runMcp({
71501
71596
  name: "honeybook-mcp",
71502
- version: "1.2.4",
71597
+ version: "1.2.5",
71503
71598
  // x-release-please-version
71504
71599
  tools: [
71505
71600
  registerSessionTools,
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@ import { registerAttachmentTools } from './tools/attachments.js';
20
20
  import { registerPaymentTools } from './tools/payments.js';
21
21
  await runMcp({
22
22
  name: 'honeybook-mcp',
23
- version: '1.2.4', // x-release-please-version
23
+ version: '1.2.5', // x-release-please-version
24
24
  tools: [
25
25
  registerSessionTools,
26
26
  registerFlowTools,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "honeybook-mcp",
3
- "version": "1.2.4",
3
+ "version": "1.2.5",
4
4
  "mcpName": "io.github.chrischall/honeybook-mcp",
5
5
  "description": "HoneyBook client-portal MCP server for Claude",
6
6
  "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
@@ -44,9 +44,9 @@
44
44
  "typecheck": "tsc -p tsconfig.json --noEmit"
45
45
  },
46
46
  "dependencies": {
47
- "@chrischall/mcp-utils": "^2.14.0",
48
- "@fetchproxy/bootstrap": "^3.4.1",
49
- "@fetchproxy/server": "^3.4.1",
47
+ "@chrischall/mcp-utils": "^2.15.0",
48
+ "@fetchproxy/bootstrap": "^3.6.0",
49
+ "@fetchproxy/server": "^3.6.0",
50
50
  "@modelcontextprotocol/server": "^2.3.0",
51
51
  "dotenv": "^18.0.2",
52
52
  "zod": "^4.6.5"
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/chrischall/honeybook-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "1.2.4",
9
+ "version": "1.2.5",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "honeybook-mcp",
14
- "version": "1.2.4",
14
+ "version": "1.2.5",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },