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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/dist/bundle.js +165 -117
- package/dist/index.js +1 -1
- package/package.json +5 -5
- package/server.json +2 -2
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
},
|
|
8
8
|
"metadata": {
|
|
9
9
|
"description": "HoneyBook client-portal tools for Claude Code",
|
|
10
|
-
"version": "0.10.
|
|
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.
|
|
18
|
+
"version": "0.10.3",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Chall"
|
|
21
21
|
},
|
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
|
-
|
|
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:
|
|
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.
|
|
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.
|
|
44504
|
+
"@chrischall/mcp-utils": "^0.26.1",
|
|
44457
44505
|
"@fetchproxy/bootstrap": "^2.7.0",
|
|
44458
|
-
"@fetchproxy/server": "^2.
|
|
44459
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
44506
|
+
"@fetchproxy/server": "^2.10.0",
|
|
44507
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
44460
44508
|
dotenv: "^17.4.2",
|
|
44461
|
-
zod: "^4.4
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
47
|
+
"@chrischall/mcp-utils": "^0.26.1",
|
|
48
48
|
"@fetchproxy/bootstrap": "^2.7.0",
|
|
49
|
-
"@fetchproxy/server": "^2.
|
|
50
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
49
|
+
"@fetchproxy/server": "^2.10.0",
|
|
50
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
51
51
|
"dotenv": "^17.4.2",
|
|
52
|
-
"zod": "^4.4
|
|
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.
|
|
9
|
+
"version": "0.10.3",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "honeybook-mcp",
|
|
14
|
-
"version": "0.10.
|
|
14
|
+
"version": "0.10.3",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|