honeybook-mcp 0.4.6 → 0.5.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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/dist/bundle.js +106 -54
- package/dist/index.js +1 -1
- package/mint.yaml +45 -0
- package/package.json +7 -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
|
+
"version": "0.5.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": "0.
|
|
18
|
+
"version": "0.5.0",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Chall"
|
|
21
21
|
},
|
package/dist/bundle.js
CHANGED
|
@@ -34680,55 +34680,19 @@ var StdioServerTransport = class {
|
|
|
34680
34680
|
}
|
|
34681
34681
|
};
|
|
34682
34682
|
|
|
34683
|
-
// node_modules/@chrischall/mcp-utils/dist/server/index.js
|
|
34684
|
-
async function createMcpServer(opts) {
|
|
34685
|
-
const server = new McpServer({ name: opts.name, version: opts.version });
|
|
34686
|
-
if (opts.banner !== void 0) {
|
|
34687
|
-
console.error(opts.banner);
|
|
34688
|
-
}
|
|
34689
|
-
const deps = opts.deps;
|
|
34690
|
-
for (const register of opts.tools) {
|
|
34691
|
-
await register(server, deps);
|
|
34692
|
-
}
|
|
34693
|
-
return server;
|
|
34694
|
-
}
|
|
34695
|
-
function withGracefulShutdown(server, opts = {}) {
|
|
34696
|
-
const shouldExit = opts.exit ?? true;
|
|
34697
|
-
let shuttingDown = false;
|
|
34698
|
-
const handler = (signal) => {
|
|
34699
|
-
if (shuttingDown)
|
|
34700
|
-
return;
|
|
34701
|
-
shuttingDown = true;
|
|
34702
|
-
void (async () => {
|
|
34703
|
-
try {
|
|
34704
|
-
if (opts.onSignal)
|
|
34705
|
-
await opts.onSignal(signal);
|
|
34706
|
-
await server.close();
|
|
34707
|
-
} catch (err) {
|
|
34708
|
-
console.error(`[mcp-utils] error during graceful shutdown on ${signal}: ${err instanceof Error ? err.message : String(err)}`);
|
|
34709
|
-
} finally {
|
|
34710
|
-
if (shouldExit)
|
|
34711
|
-
process.exit(0);
|
|
34712
|
-
}
|
|
34713
|
-
})();
|
|
34714
|
-
};
|
|
34715
|
-
process.on("SIGINT", () => handler("SIGINT"));
|
|
34716
|
-
process.on("SIGTERM", () => handler("SIGTERM"));
|
|
34717
|
-
}
|
|
34718
|
-
async function runMcp(opts) {
|
|
34719
|
-
const server = await createMcpServer(opts);
|
|
34720
|
-
const shutdown = opts.shutdown ?? true;
|
|
34721
|
-
if (shutdown !== false) {
|
|
34722
|
-
withGracefulShutdown(server, shutdown === true ? {} : shutdown);
|
|
34723
|
-
}
|
|
34724
|
-
const spec = opts.transport ?? "stdio";
|
|
34725
|
-
const transport = spec === "stdio" ? new StdioServerTransport() : spec;
|
|
34726
|
-
await server.connect(transport);
|
|
34727
|
-
return server;
|
|
34728
|
-
}
|
|
34729
|
-
|
|
34730
34683
|
// node_modules/@chrischall/mcp-utils/dist/errors/index.js
|
|
34731
34684
|
var DEFAULT_ERROR_MESSAGE_MAX = 500;
|
|
34685
|
+
var McpToolError = class extends Error {
|
|
34686
|
+
/** Actionable remediation text, when one applies. */
|
|
34687
|
+
hint;
|
|
34688
|
+
constructor(message, opts) {
|
|
34689
|
+
super(message, opts?.cause !== void 0 ? { cause: opts.cause } : void 0);
|
|
34690
|
+
this.name = "McpToolError";
|
|
34691
|
+
if (opts?.hint !== void 0)
|
|
34692
|
+
this.hint = opts.hint;
|
|
34693
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
34694
|
+
}
|
|
34695
|
+
};
|
|
34732
34696
|
var BEARER_RE = /(bearer\s+)[A-Za-z0-9._~+/=-]{8,}/gi;
|
|
34733
34697
|
var JWT_RE = /\b[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{8,}\b/g;
|
|
34734
34698
|
var BASIC_AUTH_RE = /(authorization\s*:\s*basic\s+)[A-Za-z0-9+/=_-]{6,}/gi;
|
|
@@ -34778,6 +34742,81 @@ function textResult(data) {
|
|
|
34778
34742
|
function rawTextResult(text) {
|
|
34779
34743
|
return { content: [{ type: "text", text }] };
|
|
34780
34744
|
}
|
|
34745
|
+
function errorResult(message) {
|
|
34746
|
+
return {
|
|
34747
|
+
content: [{ type: "text", text: redactSecrets(message) }],
|
|
34748
|
+
isError: true
|
|
34749
|
+
};
|
|
34750
|
+
}
|
|
34751
|
+
|
|
34752
|
+
// node_modules/@chrischall/mcp-utils/dist/server/index.js
|
|
34753
|
+
function hintResultOrRethrow(err) {
|
|
34754
|
+
if (err instanceof McpToolError && err.hint) {
|
|
34755
|
+
return errorResult(`${err.message}
|
|
34756
|
+
|
|
34757
|
+
Hint: ${err.hint}`);
|
|
34758
|
+
}
|
|
34759
|
+
throw err;
|
|
34760
|
+
}
|
|
34761
|
+
function surfaceToolHints(server) {
|
|
34762
|
+
const register = server.registerTool.bind(server);
|
|
34763
|
+
server.registerTool = (name, config2, cb) => register(name, config2, (...args) => {
|
|
34764
|
+
let result;
|
|
34765
|
+
try {
|
|
34766
|
+
result = cb(...args);
|
|
34767
|
+
} catch (err) {
|
|
34768
|
+
return hintResultOrRethrow(err);
|
|
34769
|
+
}
|
|
34770
|
+
return result instanceof Promise ? result.catch(hintResultOrRethrow) : result;
|
|
34771
|
+
});
|
|
34772
|
+
}
|
|
34773
|
+
async function createMcpServer(opts) {
|
|
34774
|
+
const server = new McpServer({ name: opts.name, version: opts.version });
|
|
34775
|
+
if (opts.surfaceHints !== false)
|
|
34776
|
+
surfaceToolHints(server);
|
|
34777
|
+
if (opts.banner !== void 0) {
|
|
34778
|
+
console.error(opts.banner);
|
|
34779
|
+
}
|
|
34780
|
+
const deps = opts.deps;
|
|
34781
|
+
for (const register of opts.tools) {
|
|
34782
|
+
await register(server, deps);
|
|
34783
|
+
}
|
|
34784
|
+
return server;
|
|
34785
|
+
}
|
|
34786
|
+
function withGracefulShutdown(server, opts = {}) {
|
|
34787
|
+
const shouldExit = opts.exit ?? true;
|
|
34788
|
+
let shuttingDown = false;
|
|
34789
|
+
const handler = (signal) => {
|
|
34790
|
+
if (shuttingDown)
|
|
34791
|
+
return;
|
|
34792
|
+
shuttingDown = true;
|
|
34793
|
+
void (async () => {
|
|
34794
|
+
try {
|
|
34795
|
+
if (opts.onSignal)
|
|
34796
|
+
await opts.onSignal(signal);
|
|
34797
|
+
await server.close();
|
|
34798
|
+
} catch (err) {
|
|
34799
|
+
console.error(`[mcp-utils] error during graceful shutdown on ${signal}: ${err instanceof Error ? err.message : String(err)}`);
|
|
34800
|
+
} finally {
|
|
34801
|
+
if (shouldExit)
|
|
34802
|
+
process.exit(0);
|
|
34803
|
+
}
|
|
34804
|
+
})();
|
|
34805
|
+
};
|
|
34806
|
+
process.on("SIGINT", () => handler("SIGINT"));
|
|
34807
|
+
process.on("SIGTERM", () => handler("SIGTERM"));
|
|
34808
|
+
}
|
|
34809
|
+
async function runMcp(opts) {
|
|
34810
|
+
const server = await createMcpServer(opts);
|
|
34811
|
+
const shutdown = opts.shutdown ?? true;
|
|
34812
|
+
if (shutdown !== false) {
|
|
34813
|
+
withGracefulShutdown(server, shutdown === true ? {} : shutdown);
|
|
34814
|
+
}
|
|
34815
|
+
const spec = opts.transport ?? "stdio";
|
|
34816
|
+
const transport = spec === "stdio" ? new StdioServerTransport() : spec;
|
|
34817
|
+
await server.connect(transport);
|
|
34818
|
+
return server;
|
|
34819
|
+
}
|
|
34781
34820
|
|
|
34782
34821
|
// node_modules/@chrischall/mcp-utils/dist/config/index.js
|
|
34783
34822
|
var PLACEHOLDER_RE = /^\$\{[^}]*\}$/;
|
|
@@ -37141,6 +37180,17 @@ function classifyBridgeError(err) {
|
|
|
37141
37180
|
}
|
|
37142
37181
|
|
|
37143
37182
|
// node_modules/@fetchproxy/server/dist/ws-server.js
|
|
37183
|
+
function envWsPort() {
|
|
37184
|
+
const raw = process.env.FETCHPROXY_WS_PORT;
|
|
37185
|
+
if (raw === void 0 || raw.trim() === "")
|
|
37186
|
+
return void 0;
|
|
37187
|
+
if (!/^\d+$/.test(raw.trim()))
|
|
37188
|
+
return void 0;
|
|
37189
|
+
const port = Number(raw.trim());
|
|
37190
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535)
|
|
37191
|
+
return void 0;
|
|
37192
|
+
return port;
|
|
37193
|
+
}
|
|
37144
37194
|
var FetchproxyProtocolError = class extends Error {
|
|
37145
37195
|
constructor(message) {
|
|
37146
37196
|
super(message);
|
|
@@ -37388,7 +37438,7 @@ var FetchproxyServer = class {
|
|
|
37388
37438
|
}
|
|
37389
37439
|
}
|
|
37390
37440
|
this.opts = {
|
|
37391
|
-
port: opts.port ?? 37149,
|
|
37441
|
+
port: opts.port ?? envWsPort() ?? 37149,
|
|
37392
37442
|
host: opts.host ?? "127.0.0.1",
|
|
37393
37443
|
serverName: opts.serverName,
|
|
37394
37444
|
version: opts.version,
|
|
@@ -39201,7 +39251,7 @@ function bridgeErrorInfo(err) {
|
|
|
39201
39251
|
// package.json
|
|
39202
39252
|
var package_default = {
|
|
39203
39253
|
name: "honeybook-mcp",
|
|
39204
|
-
version: "0.
|
|
39254
|
+
version: "0.5.0",
|
|
39205
39255
|
mcpName: "io.github.chrischall/honeybook-mcp",
|
|
39206
39256
|
description: "HoneyBook client-portal MCP server for Claude",
|
|
39207
39257
|
author: "Claude Code (AI) <https://www.anthropic.com/claude>",
|
|
@@ -39224,7 +39274,8 @@ var package_default = {
|
|
|
39224
39274
|
".claude-plugin",
|
|
39225
39275
|
"skills",
|
|
39226
39276
|
".mcp.json",
|
|
39227
|
-
"server.json"
|
|
39277
|
+
"server.json",
|
|
39278
|
+
"mint.yaml"
|
|
39228
39279
|
],
|
|
39229
39280
|
engines: {
|
|
39230
39281
|
node: ">=20.6.0"
|
|
@@ -39237,11 +39288,12 @@ var package_default = {
|
|
|
39237
39288
|
build: "tsc && npm run bundle",
|
|
39238
39289
|
bundle: `esbuild src/index.ts --bundle --platform=node --format=esm --external:dotenv --banner:js='import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);' --outfile=dist/bundle.js`,
|
|
39239
39290
|
dev: "node --env-file=.env dist/index.js",
|
|
39240
|
-
test: "vitest run",
|
|
39241
|
-
"test:watch": "vitest"
|
|
39291
|
+
test: "npm run typecheck && vitest run",
|
|
39292
|
+
"test:watch": "vitest",
|
|
39293
|
+
typecheck: "tsc -p tsconfig.json --noEmit"
|
|
39242
39294
|
},
|
|
39243
39295
|
dependencies: {
|
|
39244
|
-
"@chrischall/mcp-utils": "^0.
|
|
39296
|
+
"@chrischall/mcp-utils": "^0.15.0",
|
|
39245
39297
|
"@fetchproxy/bootstrap": "^2.0.0",
|
|
39246
39298
|
"@fetchproxy/server": "^2.0.0",
|
|
39247
39299
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
@@ -39841,7 +39893,7 @@ var __dirname = dirname2(fileURLToPath(import.meta.url));
|
|
|
39841
39893
|
await loadDotenvSafely({ path: join4(__dirname, "..", ".env"), override: false });
|
|
39842
39894
|
await runMcp({
|
|
39843
39895
|
name: "honeybook-mcp",
|
|
39844
|
-
version: "0.
|
|
39896
|
+
version: "0.5.0",
|
|
39845
39897
|
// x-release-please-version
|
|
39846
39898
|
tools: [
|
|
39847
39899
|
registerSessionTools,
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@ import { registerContractTools } from './tools/contracts.js';
|
|
|
11
11
|
import { registerInvoiceTools } from './tools/invoices.js';
|
|
12
12
|
await runMcp({
|
|
13
13
|
name: 'honeybook-mcp',
|
|
14
|
-
version: '0.
|
|
14
|
+
version: '0.5.0', // x-release-please-version
|
|
15
15
|
tools: [
|
|
16
16
|
registerSessionTools,
|
|
17
17
|
registerWorkspaceFileTools,
|
package/mint.yaml
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
name: HoneyBook
|
|
3
|
+
slug: honeybook
|
|
4
|
+
summary: >-
|
|
5
|
+
HoneyBook client-portal MCP — view wedding-vendor contracts and invoices
|
|
6
|
+
#
|
|
7
|
+
# Hosting note (a comment, not user-facing summary text): this is a
|
|
8
|
+
# BROWSER-BRIDGE MCP — it reaches its site through the user's signed-in
|
|
9
|
+
# tab via the fetchproxy bridge. A bridged registration also needs runtime
|
|
10
|
+
# `fly-shared`, `bridge: true` and a `bridgePortEnv`, which are registration
|
|
11
|
+
# fields this manifest has no schema for (set them over the control API).
|
|
12
|
+
# `state.dataDir` below is required for `bridge`.
|
|
13
|
+
env:
|
|
14
|
+
- name: HONEYBOOK_API_VERSION
|
|
15
|
+
required: false
|
|
16
|
+
help: >-
|
|
17
|
+
Pins the HoneyBook API version instead of detecting it at startup. Leave
|
|
18
|
+
unset unless a detection failure needs working around.
|
|
19
|
+
- name: HONEYBOOK_DISABLE_FETCHPROXY
|
|
20
|
+
required: false
|
|
21
|
+
help: >-
|
|
22
|
+
Set to 1 to disable the browser-bridge fallback, making missing
|
|
23
|
+
credentials a hard error. Recommended for a hosted registration, which has
|
|
24
|
+
no browser to fall back to.
|
|
25
|
+
- name: HONEYBOOK_SESSIONS_DIR
|
|
26
|
+
required: false
|
|
27
|
+
help: >-
|
|
28
|
+
Directory for persisted session/cache state. Relates to state.dataDir
|
|
29
|
+
below; leave unset to use the default under $HOME.
|
|
30
|
+
state:
|
|
31
|
+
dataDir: true
|
|
32
|
+
reason: >-
|
|
33
|
+
The fetchproxy identity lives at $HOME/.fetchproxy/identity/<name>.json
|
|
34
|
+
and the pair code derives from it. Without a persistent $HOME every cold
|
|
35
|
+
start mints a fresh identity and re-prompts pairing in the browser; the
|
|
36
|
+
API refuses bridge without it.
|
|
37
|
+
egress:
|
|
38
|
+
allow:
|
|
39
|
+
# Only hosts the SERVER process actually fetches. Hosts that appear
|
|
40
|
+
# solely in a URL this server BUILDS and returns are excluded.
|
|
41
|
+
# ONLY the API host: client.ts fetches `${API_BASE}` = https://api.honeybook.com
|
|
42
|
+
# for every call. honeybook.com and hbportal.co are declared to the
|
|
43
|
+
# fetchproxy BRIDGE — the browser reaches those, not this process — so they
|
|
44
|
+
# are not server egress.
|
|
45
|
+
- api.honeybook.com
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "honeybook-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
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>",
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
".claude-plugin",
|
|
24
24
|
"skills",
|
|
25
25
|
".mcp.json",
|
|
26
|
-
"server.json"
|
|
26
|
+
"server.json",
|
|
27
|
+
"mint.yaml"
|
|
27
28
|
],
|
|
28
29
|
"engines": {
|
|
29
30
|
"node": ">=20.6.0"
|
|
@@ -36,11 +37,12 @@
|
|
|
36
37
|
"build": "tsc && npm run bundle",
|
|
37
38
|
"bundle": "esbuild src/index.ts --bundle --platform=node --format=esm --external:dotenv --banner:js='import { createRequire as __createRequire } from \"module\"; const require = __createRequire(import.meta.url);' --outfile=dist/bundle.js",
|
|
38
39
|
"dev": "node --env-file=.env dist/index.js",
|
|
39
|
-
"test": "vitest run",
|
|
40
|
-
"test:watch": "vitest"
|
|
40
|
+
"test": "npm run typecheck && vitest run",
|
|
41
|
+
"test:watch": "vitest",
|
|
42
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
41
43
|
},
|
|
42
44
|
"dependencies": {
|
|
43
|
-
"@chrischall/mcp-utils": "^0.
|
|
45
|
+
"@chrischall/mcp-utils": "^0.15.0",
|
|
44
46
|
"@fetchproxy/bootstrap": "^2.0.0",
|
|
45
47
|
"@fetchproxy/server": "^2.0.0",
|
|
46
48
|
"@modelcontextprotocol/sdk": "^1.29.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.
|
|
9
|
+
"version": "0.5.0",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "honeybook-mcp",
|
|
14
|
-
"version": "0.
|
|
14
|
+
"version": "0.5.0",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|