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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +2 -1
- package/dist/bundle.js +106 -11
- package/dist/index.js +1 -1
- package/package.json +4 -4
- 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": "1.2.
|
|
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.
|
|
18
|
+
"version": "1.2.5",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Chall"
|
|
21
21
|
},
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
69616
|
-
"@fetchproxy/bootstrap": "^3.
|
|
69617
|
-
"@fetchproxy/server": "^3.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
48
|
-
"@fetchproxy/bootstrap": "^3.
|
|
49
|
-
"@fetchproxy/server": "^3.
|
|
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.
|
|
9
|
+
"version": "1.2.5",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "honeybook-mcp",
|
|
14
|
-
"version": "1.2.
|
|
14
|
+
"version": "1.2.5",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|