honeybook-mcp 0.10.2 → 0.10.3

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": "0.10.2"
10
+ "version": "0.10.3"
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": "0.10.2",
18
+ "version": "0.10.3",
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": "0.10.2",
4
+ "version": "0.10.3",
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/dist/bundle.js CHANGED
@@ -40549,6 +40549,11 @@ function validateInnerRequest(raw) {
40549
40549
  if (raw.init.inPage !== void 0) {
40550
40550
  assertBoolean(raw.init.inPage, "inner.init.inPage");
40551
40551
  }
40552
+ if (raw.init.credentials !== void 0) {
40553
+ if (raw.init.credentials !== "include" && raw.init.credentials !== "omit") {
40554
+ throw new ProtocolError("inner.init.credentials: must be 'include' or 'omit'");
40555
+ }
40556
+ }
40552
40557
  return raw;
40553
40558
  }
40554
40559
  if (raw.op === "read_cookies") {
@@ -42827,9 +42832,9 @@ var FetchproxyServer = class {
42827
42832
  async _fetchOnceWithTimeout(init) {
42828
42833
  const id = this.nextRequestId++;
42829
42834
  const inner = { type: "request", id, op: "fetch", init };
42830
- const pending = new Promise((resolve2) => {
42835
+ const pending = this.guardPending(new Promise((resolve2) => {
42831
42836
  this.pending.set(id, resolve2);
42832
- });
42837
+ }));
42833
42838
  await this.sendInnerFrame(inner);
42834
42839
  const timeoutMs = this.opts.fetchTimeoutMs;
42835
42840
  if (timeoutMs === void 0 || timeoutMs <= 0)
@@ -42876,6 +42881,34 @@ var FetchproxyServer = class {
42876
42881
  * already surface for fetch timeouts). `0`/unset opts out (unbounded),
42877
42882
  * matching the fetch path.
42878
42883
  */
42884
+ /**
42885
+ * Register a verb's pending promise and keep an early rejection from being
42886
+ * fatal.
42887
+ *
42888
+ * Every verb stores its resolver, then AWAITS `sendInnerFrame` before the
42889
+ * caller attaches a handler — and that send does real work (sealing, a
42890
+ * socket write), so it yields across event-loop turns. Anything that drains
42891
+ * the pending maps inside that window rejects a promise nothing is
42892
+ * listening to yet: a refused pairing (`rejectAllPending(pairingErrorMessage
42893
+ * (code))`), an extension disconnect, a `close()`. Under Node's default
42894
+ * `--unhandled-rejections=throw` that ends the PROCESS, so an MCP that
42895
+ * should have reported "approve pair code NNN-NN" dies instead, and each
42896
+ * respawn mints a fresh code nobody can approve (#329).
42897
+ *
42898
+ * The no-op catch is a listener, not a swallow. `.catch()` derives a NEW
42899
+ * promise and leaves this one's rejection intact, so `_withVerbTimeout` and
42900
+ * the caller still see it — the only thing that changes is that the
42901
+ * rejection is never unhandled.
42902
+ *
42903
+ * This is the same hazard `_withVerbTimeout`'s timer already guards against
42904
+ * from the other side, where it drops the resolver "so a late bridge
42905
+ * response doesn't become an unhandled promise that crashes the host".
42906
+ */
42907
+ guardPending(pending) {
42908
+ pending.catch(() => {
42909
+ });
42910
+ return pending;
42911
+ }
42879
42912
  async _withVerbTimeout(pending, pendingMap, id, url2, requestedTimeoutMs) {
42880
42913
  const timeoutMs = this.opts.fetchTimeoutMs;
42881
42914
  if (timeoutMs === void 0 || timeoutMs <= 0)
@@ -42987,7 +43020,11 @@ var FetchproxyServer = class {
42987
43020
  // Spread rather than `inPage: opts.inPage`: the wire's validator treats
42988
43021
  // the key's PRESENCE as the request, and a literal `undefined` would
42989
43022
  // both serialize away inconsistently and read as "asked for" here.
42990
- ...opts.inPage === true ? { inPage: true } : {}
43023
+ ...opts.inPage === true ? { inPage: true } : {},
43024
+ // Spread for the reason `inPage` is: only a deliberate 'omit' goes on
43025
+ // the wire, so an untouched request serialises byte-identically to
43026
+ // every version before this option existed.
43027
+ ...opts.credentials === "omit" ? { credentials: "omit" } : {}
42991
43028
  };
42992
43029
  const result = await this.fetch(init);
42993
43030
  if (!result.ok) {
@@ -43215,9 +43252,9 @@ var FetchproxyServer = class {
43215
43252
  const tabUrl = `https://${host}/`;
43216
43253
  inner = { type: "request", id, op: "read_cookies", init: { tabUrl } };
43217
43254
  }
43218
- const pending = new Promise((resolve2) => {
43255
+ const pending = this.guardPending(new Promise((resolve2) => {
43219
43256
  this.pendingReadCookies.set(id, resolve2);
43220
- });
43257
+ }));
43221
43258
  await this.sendInnerFrame(inner);
43222
43259
  const result = await this._withVerbTimeout(pending, this.pendingReadCookies, id, `https://${host}`);
43223
43260
  if (!result.ok) {
@@ -43274,9 +43311,9 @@ var FetchproxyServer = class {
43274
43311
  ...cookiePath !== void 0 ? { path: cookiePath } : {}
43275
43312
  }
43276
43313
  };
43277
- const pending = new Promise((resolve2, reject) => {
43314
+ const pending = this.guardPending(new Promise((resolve2, reject) => {
43278
43315
  this.pendingWriteCookies.set(id, { resolve: resolve2, reject });
43279
- });
43316
+ }));
43280
43317
  await this.sendInnerFrame(inner);
43281
43318
  return this._withVerbTimeout(pending, this.pendingWriteCookies, id, `https://${host}`);
43282
43319
  }
@@ -43337,9 +43374,9 @@ var FetchproxyServer = class {
43337
43374
  ...opts.pointers ? { pointers: { ...opts.pointers } } : {}
43338
43375
  }
43339
43376
  };
43340
- const pending = new Promise((resolve2, reject) => {
43377
+ const pending = this.guardPending(new Promise((resolve2, reject) => {
43341
43378
  this.pendingStorage.set(id, { resolve: resolve2, reject });
43342
- });
43379
+ }));
43343
43380
  await this.sendInnerFrame(inner);
43344
43381
  return this._withVerbTimeout(pending, this.pendingStorage, id, `https://${host}`);
43345
43382
  }
@@ -43442,9 +43479,9 @@ var FetchproxyServer = class {
43442
43479
  ...opts.timeoutMs !== void 0 ? { timeoutMs: opts.timeoutMs } : {}
43443
43480
  }
43444
43481
  };
43445
- const pending = new Promise((resolve2, reject) => {
43482
+ const pending = this.guardPending(new Promise((resolve2, reject) => {
43446
43483
  this.pendingCapture.set(id, { resolve: resolve2, reject });
43447
- });
43484
+ }));
43448
43485
  await this.sendInnerFrame(inner);
43449
43486
  return this._withVerbTimeout(
43450
43487
  pending,
@@ -43535,9 +43572,9 @@ var FetchproxyServer = class {
43535
43572
  ...opts.timeoutMs !== void 0 ? { timeoutMs: opts.timeoutMs } : {}
43536
43573
  }
43537
43574
  };
43538
- const pending = new Promise((resolve2, reject) => {
43575
+ const pending = this.guardPending(new Promise((resolve2, reject) => {
43539
43576
  this.pendingRedirect.set(id, { resolve: resolve2, reject });
43540
- });
43577
+ }));
43541
43578
  await this.sendInnerFrame(inner);
43542
43579
  return this._withVerbTimeout(
43543
43580
  pending,
@@ -43625,9 +43662,9 @@ var FetchproxyServer = class {
43625
43662
  ...opts.timeoutMs !== void 0 ? { timeoutMs: opts.timeoutMs } : {}
43626
43663
  }
43627
43664
  };
43628
- const pending = new Promise((resolve2, reject) => {
43665
+ const pending = this.guardPending(new Promise((resolve2, reject) => {
43629
43666
  this.pendingDownload.set(id, { resolve: resolve2, reject });
43630
- });
43667
+ }));
43631
43668
  await this.sendInnerFrame(inner);
43632
43669
  return this._withVerbTimeout(
43633
43670
  pending,
@@ -43683,9 +43720,9 @@ var FetchproxyServer = class {
43683
43720
  keys: [...opts.keys]
43684
43721
  }
43685
43722
  };
43686
- const pending = new Promise((resolve2, reject) => {
43723
+ const pending = this.guardPending(new Promise((resolve2, reject) => {
43687
43724
  this.pendingIdb.set(id, { resolve: resolve2, reject });
43688
- });
43725
+ }));
43689
43726
  await this.sendInnerFrame(inner);
43690
43727
  return this._withVerbTimeout(pending, this.pendingIdb, id, origin);
43691
43728
  }
@@ -43723,9 +43760,9 @@ var FetchproxyServer = class {
43723
43760
  op: "read_dom",
43724
43761
  init: { origin, names: [...opts.names] }
43725
43762
  };
43726
- const pending = new Promise((resolve2, reject) => {
43763
+ const pending = this.guardPending(new Promise((resolve2, reject) => {
43727
43764
  this.pendingStorage.set(id, { resolve: resolve2, reject });
43728
- });
43765
+ }));
43729
43766
  await this.sendInnerFrame(inner);
43730
43767
  return this._withVerbTimeout(pending, this.pendingStorage, id, origin);
43731
43768
  }
@@ -43769,9 +43806,9 @@ var FetchproxyServer = class {
43769
43806
  ...opts.tabUrl !== void 0 ? { tabUrl: opts.tabUrl } : {}
43770
43807
  }
43771
43808
  };
43772
- const pending = new Promise((resolve2, reject) => {
43809
+ const pending = this.guardPending(new Promise((resolve2, reject) => {
43773
43810
  this.pendingGraphql.set(id, { resolve: resolve2, reject });
43774
- });
43811
+ }));
43775
43812
  await this.sendInnerFrame(inner);
43776
43813
  return this._withVerbTimeout(pending, this.pendingGraphql, id, opts.name);
43777
43814
  }
@@ -44239,6 +44276,8 @@ var CREDENTIAL_ARMS = /* @__PURE__ */ new Set([
44239
44276
  "ok",
44240
44277
  "no_credential",
44241
44278
  "credential_rejected",
44279
+ "session_expired",
44280
+ "verification_pending",
44242
44281
  "timeout",
44243
44282
  "http",
44244
44283
  "transport",
@@ -44255,6 +44294,10 @@ function credentialHint(arm, prefix, hostLabel, source) {
44255
44294
  return `No credential resolved. Nothing was available to authenticate with \u2014 sign in and reconnect the connector so ${prefix} receives a token, or set the documented environment variable.`;
44256
44295
  case "credential_rejected":
44257
44296
  return `${hostLabel} rejected the credential from '${source}'. It is present but no longer valid \u2014 most often expired or revoked upstream. Re-authenticate and reconnect; retrying will not fix it.`;
44297
+ case "session_expired":
44298
+ return `The credential from '${source}' is configured, but no session is live \u2014 ${hostLabel} served a sign-in page rather than the data. Sign in again; a cookie-session portal expires these on its own, so this recurs between uses.`;
44299
+ case "verification_pending":
44300
+ return `${hostLabel} is holding the sign-in on a second factor rather than refusing it. Supply the verification code the ACCOUNT HOLDER received \u2014 the credential itself is not the problem, so changing it will not help.`;
44258
44301
  case "timeout":
44259
44302
  return `The credential from '${source}' resolved, but ${hostLabel} did not answer in time. Usually transient \u2014 retry. If it persists, ${hostLabel} is slow or unreachable from here.`;
44260
44303
  case "http":
@@ -44265,12 +44308,102 @@ function credentialHint(arm, prefix, hostLabel, source) {
44265
44308
  return `Unexpected failure \u2014 see error.message.`;
44266
44309
  }
44267
44310
  }
44311
+ function credentialHealthcheckDescription(hostLabel) {
44312
+ return `Resolves the credential the way real tools do, then makes one authenticated request to ${hostLabel}. Reports which source supplied the credential, whether ${hostLabel} accepted it, the round-trip time, and a plain-English hint distinguishing 'no credential' from 'credential rejected' from 'a ${hostLabel}-side problem'. Read-only; never returns the credential itself.`;
44313
+ }
44314
+ async function runCredentialHealthcheck(args) {
44315
+ const { prefix, hostLabel, probePath, resolveCredential, probeFn, classifyThrown, hints } = args;
44316
+ const probeUrl = probePath ? `https://${hostLabel}${probePath.startsWith("/") ? "" : "/"}${probePath}` : void 0;
44317
+ let probeStarted = 0;
44318
+ let state;
44319
+ try {
44320
+ state = await resolveCredential();
44321
+ } catch (e) {
44322
+ const classified = classifyThrown?.(e);
44323
+ const result2 = {
44324
+ ok: false,
44325
+ // Still false, and still no source: a classification explains WHY
44326
+ // nothing resolved, it does not invent a credential that did.
44327
+ credential: { source: null, resolved: false },
44328
+ // No `url`: nothing was probed, and naming one implies it was tried.
44329
+ probe: { elapsed_ms: 0 },
44330
+ error: {
44331
+ kind: classified?.kind ?? "no_credential",
44332
+ message: truncateErrorMessage(messageOf(e)),
44333
+ ...classified?.detail !== void 0 ? { detail: classified.detail } : {}
44334
+ },
44335
+ // The hint must follow the KIND beside it. Falling back to
44336
+ // `no_credential`'s copy under a classified kind would state a cause
44337
+ // the kind contradicts — the same disagreement this path exists to
44338
+ // remove. So: an inline hint wins; else the classified arm's own
44339
+ // copy (consumer override first); else, for a kind this module has
44340
+ // no copy for, the neutral `unknown` text rather than one that
44341
+ // asserts a cause; else the unclassified `no_credential` default.
44342
+ hint: classified?.hint ?? (isArm(classified?.kind) ? hints?.[classified.kind] ?? credentialHint(classified.kind, prefix, hostLabel, null) : classified !== void 0 ? credentialHint("unknown", prefix, hostLabel, null) : hints?.no_credential ?? credentialHint("no_credential", prefix, hostLabel, null))
44343
+ };
44344
+ return { content: [{ type: "text", text: JSON.stringify(result2, null, 2) }] };
44345
+ }
44346
+ const credential = {
44347
+ source: state.source,
44348
+ resolved: state.source !== null,
44349
+ ...state.detail !== void 0 ? { detail: state.detail } : {}
44350
+ };
44351
+ if (!credential.resolved) {
44352
+ const result2 = {
44353
+ ok: false,
44354
+ credential,
44355
+ probe: { elapsed_ms: 0 },
44356
+ error: { kind: "no_credential", message: "no credential source resolved" },
44357
+ hint: hints?.no_credential ?? credentialHint("no_credential", prefix, hostLabel, null)
44358
+ };
44359
+ return { content: [{ type: "text", text: JSON.stringify(result2, null, 2) }] };
44360
+ }
44361
+ let arm = "ok";
44362
+ let error61;
44363
+ let status;
44364
+ let customHint;
44365
+ probeStarted = Date.now();
44366
+ try {
44367
+ await probeFn();
44368
+ } catch (e) {
44369
+ status = statusOf(e);
44370
+ const aborted2 = e instanceof Error && e.name === "AbortError";
44371
+ arm = status === 401 || status === 403 ? "credential_rejected" : status !== void 0 ? "http" : aborted2 || /timeout|timed out|ETIMEDOUT/i.test(messageOf(e)) ? "timeout" : /fetch failed|ENOTFOUND|ECONNREFUSED|ECONNRESET|network/i.test(messageOf(e)) ? "transport" : "unknown";
44372
+ let kind = arm;
44373
+ let detail;
44374
+ const custom2 = classifyThrown?.(e);
44375
+ if (custom2) {
44376
+ kind = custom2.kind;
44377
+ customHint = custom2.hint;
44378
+ detail = custom2.detail;
44379
+ arm = isArm(kind) ? kind : "unknown";
44380
+ }
44381
+ error61 = {
44382
+ kind,
44383
+ // Redacted AND bounded before it reaches the result: an upstream
44384
+ // failure routinely quotes what it was sent, and a healthcheck is
44385
+ // the tool people paste into a chat when something is broken.
44386
+ message: truncateErrorMessage(messageOf(e)),
44387
+ ...detail !== void 0 ? { detail } : {}
44388
+ };
44389
+ }
44390
+ const result = {
44391
+ ok: error61 === void 0,
44392
+ credential,
44393
+ probe: {
44394
+ ...probeUrl ? { url: probeUrl } : {},
44395
+ elapsed_ms: Date.now() - probeStarted,
44396
+ ...status !== void 0 ? { status } : {}
44397
+ },
44398
+ ...error61 ? { error: error61 } : {},
44399
+ hint: customHint ?? hints?.[arm] ?? credentialHint(arm, prefix, hostLabel, state.source)
44400
+ };
44401
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
44402
+ }
44268
44403
  function registerCredentialHealthcheckTool(args) {
44269
- const { server, prefix, hostLabel, probePath, resolveCredential, probeFn, classifyThrown, hints } = args;
44270
- const probeUrl = probePath ? `https://${hostLabel}${probePath}` : void 0;
44271
- server.registerTool(`${prefix}_healthcheck`, {
44404
+ args.server.registerTool(`${args.prefix}_healthcheck`, {
44272
44405
  title: "Verify credentials and upstream reachability",
44273
- description: `Resolves the credential the way real tools do, then makes one authenticated request to ${hostLabel}. Reports which source supplied the credential, whether ${hostLabel} accepted it, the round-trip time, and a plain-English hint distinguishing 'no credential' from 'credential rejected' from 'a ${hostLabel}-side problem'. Call this when a real tool fails and you want to know which hop broke. Read-only; never returns the credential itself.`,
44406
+ description: `${credentialHealthcheckDescription(args.hostLabel)} Call this when a real tool fails and you want to know which hop broke.`,
44274
44407
  annotations: {
44275
44408
  title: "Verify credentials and upstream reachability",
44276
44409
  readOnlyHint: true,
@@ -44278,92 +44411,7 @@ function registerCredentialHealthcheckTool(args) {
44278
44411
  openWorldHint: true
44279
44412
  },
44280
44413
  inputSchema: {}
44281
- }, async () => {
44282
- let probeStarted = 0;
44283
- let state;
44284
- try {
44285
- state = await resolveCredential();
44286
- } catch (e) {
44287
- const classified = classifyThrown?.(e);
44288
- const result2 = {
44289
- ok: false,
44290
- // Still false, and still no source: a classification explains WHY
44291
- // nothing resolved, it does not invent a credential that did.
44292
- credential: { source: null, resolved: false },
44293
- // No `url`: nothing was probed, and naming one implies it was tried.
44294
- probe: { elapsed_ms: 0 },
44295
- error: {
44296
- kind: classified?.kind ?? "no_credential",
44297
- message: truncateErrorMessage(messageOf(e)),
44298
- ...classified?.detail !== void 0 ? { detail: classified.detail } : {}
44299
- },
44300
- // The hint must follow the KIND beside it. Falling back to
44301
- // `no_credential`'s copy under a classified kind would state a cause
44302
- // the kind contradicts — the same disagreement this path exists to
44303
- // remove. So: an inline hint wins; else the classified arm's own
44304
- // copy (consumer override first); else, for a kind this module has
44305
- // no copy for, the neutral `unknown` text rather than one that
44306
- // asserts a cause; else the unclassified `no_credential` default.
44307
- hint: classified?.hint ?? (isArm(classified?.kind) ? hints?.[classified.kind] ?? credentialHint(classified.kind, prefix, hostLabel, null) : classified !== void 0 ? credentialHint("unknown", prefix, hostLabel, null) : hints?.no_credential ?? credentialHint("no_credential", prefix, hostLabel, null))
44308
- };
44309
- return { content: [{ type: "text", text: JSON.stringify(result2, null, 2) }] };
44310
- }
44311
- const credential = {
44312
- source: state.source,
44313
- resolved: state.source !== null,
44314
- ...state.detail !== void 0 ? { detail: state.detail } : {}
44315
- };
44316
- if (!credential.resolved) {
44317
- const result2 = {
44318
- ok: false,
44319
- credential,
44320
- probe: { elapsed_ms: 0 },
44321
- error: { kind: "no_credential", message: "no credential source resolved" },
44322
- hint: hints?.no_credential ?? credentialHint("no_credential", prefix, hostLabel, null)
44323
- };
44324
- return { content: [{ type: "text", text: JSON.stringify(result2, null, 2) }] };
44325
- }
44326
- let arm = "ok";
44327
- let error61;
44328
- let status;
44329
- let customHint;
44330
- probeStarted = Date.now();
44331
- try {
44332
- await probeFn();
44333
- } catch (e) {
44334
- status = statusOf(e);
44335
- const aborted2 = e instanceof Error && e.name === "AbortError";
44336
- arm = status === 401 || status === 403 ? "credential_rejected" : status !== void 0 ? "http" : aborted2 || /timeout|timed out|ETIMEDOUT/i.test(messageOf(e)) ? "timeout" : /fetch failed|ENOTFOUND|ECONNREFUSED|ECONNRESET|network/i.test(messageOf(e)) ? "transport" : "unknown";
44337
- let kind = arm;
44338
- let detail;
44339
- const custom2 = classifyThrown?.(e);
44340
- if (custom2) {
44341
- kind = custom2.kind;
44342
- customHint = custom2.hint;
44343
- detail = custom2.detail;
44344
- }
44345
- error61 = {
44346
- kind,
44347
- // Redacted AND bounded before it reaches the result: an upstream
44348
- // failure routinely quotes what it was sent, and a healthcheck is
44349
- // the tool people paste into a chat when something is broken.
44350
- message: truncateErrorMessage(messageOf(e)),
44351
- ...detail !== void 0 ? { detail } : {}
44352
- };
44353
- }
44354
- const result = {
44355
- ok: error61 === void 0,
44356
- credential,
44357
- probe: {
44358
- ...probeUrl ? { url: probeUrl } : {},
44359
- elapsed_ms: Date.now() - probeStarted,
44360
- ...status !== void 0 ? { status } : {}
44361
- },
44362
- ...error61 ? { error: error61 } : {},
44363
- hint: customHint ?? hints?.[arm] ?? credentialHint(arm, prefix, hostLabel, state.source)
44364
- };
44365
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
44366
- });
44414
+ }, async () => runCredentialHealthcheck(args));
44367
44415
  }
44368
44416
 
44369
44417
  // node_modules/@chrischall/mcp-utils/dist/fetchproxy/index.js
@@ -44409,7 +44457,7 @@ function bridgeErrorInfo(err) {
44409
44457
  // package.json
44410
44458
  var package_default = {
44411
44459
  name: "honeybook-mcp",
44412
- version: "0.10.2",
44460
+ version: "0.10.3",
44413
44461
  mcpName: "io.github.chrischall/honeybook-mcp",
44414
44462
  description: "HoneyBook client-portal MCP server for Claude",
44415
44463
  author: "Claude Code (AI) <https://www.anthropic.com/claude>",
@@ -44453,12 +44501,12 @@ var package_default = {
44453
44501
  typecheck: "tsc -p tsconfig.json --noEmit"
44454
44502
  },
44455
44503
  dependencies: {
44456
- "@chrischall/mcp-utils": "^0.23.0",
44504
+ "@chrischall/mcp-utils": "^0.26.1",
44457
44505
  "@fetchproxy/bootstrap": "^2.7.0",
44458
- "@fetchproxy/server": "^2.7.0",
44459
- "@modelcontextprotocol/sdk": "^1.29.0",
44506
+ "@fetchproxy/server": "^2.10.0",
44507
+ "@modelcontextprotocol/sdk": "^1.30.0",
44460
44508
  dotenv: "^17.4.2",
44461
- zod: "^4.4.3"
44509
+ zod: "^4.5.4"
44462
44510
  },
44463
44511
  devDependencies: {
44464
44512
  "@types/node": "^26.0.0",
@@ -46225,7 +46273,7 @@ var __dirname = dirname2(fileURLToPath(import.meta.url));
46225
46273
  await loadDotenvSafely({ path: join6(__dirname, "..", ".env"), override: false });
46226
46274
  await runMcp({
46227
46275
  name: "honeybook-mcp",
46228
- version: "0.10.2",
46276
+ version: "0.10.3",
46229
46277
  // x-release-please-version
46230
46278
  tools: [
46231
46279
  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: '0.10.2', // x-release-please-version
23
+ version: '0.10.3', // 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": "0.10.2",
3
+ "version": "0.10.3",
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,12 +44,12 @@
44
44
  "typecheck": "tsc -p tsconfig.json --noEmit"
45
45
  },
46
46
  "dependencies": {
47
- "@chrischall/mcp-utils": "^0.23.0",
47
+ "@chrischall/mcp-utils": "^0.26.1",
48
48
  "@fetchproxy/bootstrap": "^2.7.0",
49
- "@fetchproxy/server": "^2.7.0",
50
- "@modelcontextprotocol/sdk": "^1.29.0",
49
+ "@fetchproxy/server": "^2.10.0",
50
+ "@modelcontextprotocol/sdk": "^1.30.0",
51
51
  "dotenv": "^17.4.2",
52
- "zod": "^4.4.3"
52
+ "zod": "^4.5.4"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@types/node": "^26.0.0",
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": "0.10.2",
9
+ "version": "0.10.3",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "honeybook-mcp",
14
- "version": "0.10.2",
14
+ "version": "0.10.3",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },