honeybook-mcp 0.8.0 → 0.8.2
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 +31 -24
- package/dist/flow-auth.js +24 -4
- package/dist/flow-client.js +30 -19
- package/dist/index.js +1 -1
- package/dist/tools/flows.js +15 -17
- package/package.json +1 -1
- 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.8.
|
|
10
|
+
"version": "0.8.2"
|
|
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.8.
|
|
18
|
+
"version": "0.8.2",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Chall"
|
|
21
21
|
},
|
package/dist/bundle.js
CHANGED
|
@@ -39509,7 +39509,7 @@ function bridgeErrorInfo(err) {
|
|
|
39509
39509
|
// package.json
|
|
39510
39510
|
var package_default = {
|
|
39511
39511
|
name: "honeybook-mcp",
|
|
39512
|
-
version: "0.8.
|
|
39512
|
+
version: "0.8.2",
|
|
39513
39513
|
mcpName: "io.github.chrischall/honeybook-mcp",
|
|
39514
39514
|
description: "HoneyBook client-portal MCP server for Claude",
|
|
39515
39515
|
author: "Claude Code (AI) <https://www.anthropic.com/claude>",
|
|
@@ -39822,7 +39822,11 @@ async function captureFlowCredentialViaFetchproxy(opts) {
|
|
|
39822
39822
|
const errName = e?.name;
|
|
39823
39823
|
if (errName === "FetchproxyScopeError" || /not in declared set/i.test(msg)) {
|
|
39824
39824
|
throw new Error(
|
|
39825
|
-
`HoneyBook flow auth:
|
|
39825
|
+
`HoneyBook flow auth: the extension is refusing a scope this questionnaire needs ("${storageKey}"). The declared scope names ONE key per flow, so each new questionnaire is approved once \u2014 and it is one click, not a re-pair: open the Transporter popup, where honeybook-mcp should be offering to "expand its access" with this key, and press Grant. Then re-run this tool. That keeps the existing pairing.
|
|
39826
|
+
|
|
39827
|
+
Revoking and re-pairing also works \u2014 it is what the underlying error suggests \u2014 but it discards the pairing and makes you approve every scope again, so try Grant first.
|
|
39828
|
+
|
|
39829
|
+
Underlying error: ${msg}`
|
|
39826
39830
|
);
|
|
39827
39831
|
}
|
|
39828
39832
|
if (bridgeError.type === "timeout" || /timeout/i.test(msg)) {
|
|
@@ -39902,21 +39906,28 @@ var FlowClient = class {
|
|
|
39902
39906
|
}
|
|
39903
39907
|
}
|
|
39904
39908
|
/**
|
|
39905
|
-
* Explain
|
|
39909
|
+
* Explain an untyped 400.
|
|
39910
|
+
*
|
|
39911
|
+
* A 400 with no `error_type` says nothing about which input was wrong and
|
|
39912
|
+
* reads exactly like an auth failure; left alone it sends people to
|
|
39913
|
+
* re-capture a credential that is fine, so the auth reading is denied
|
|
39914
|
+
* outright.
|
|
39906
39915
|
*
|
|
39907
|
-
*
|
|
39908
|
-
*
|
|
39909
|
-
*
|
|
39910
|
-
*
|
|
39911
|
-
*
|
|
39916
|
+
* What can NOT reach here is the client version. Probed live 2026-08-31,
|
|
39917
|
+
* every version failure — stale, garbage, empty, omitted — answers 400 with
|
|
39918
|
+
* `error_type: HBWrongAPIVersionError` and `error_data.server_api_version`,
|
|
39919
|
+
* which `hbApiRequest` intercepts and retries once on the server's own
|
|
39920
|
+
* number, so it self-heals a layer below. `ctxc` cannot reach here either:
|
|
39921
|
+
* the API ignores it entirely (omitted, bogus, and `/client/`-less all return
|
|
39922
|
+
* the same 200, byte-identical), and naming it here only misdirected. So the
|
|
39923
|
+
* version is offered as the input to CHECK rather than as a known cause, and
|
|
39924
|
+
* this is deliberately vaguer than 0.8.0's message: no cause is confirmed.
|
|
39912
39925
|
*/
|
|
39913
39926
|
badRequestError(err) {
|
|
39914
39927
|
return new Error(
|
|
39915
39928
|
`${err.message}
|
|
39916
39929
|
|
|
39917
|
-
HoneyBook
|
|
39918
|
-
1. hb-api-client-version \u2014 sent as ${this.apiVersion}. It is read from /api/gon at startup, so it normally tracks HoneyBook; if HONEYBOOK_API_VERSION is pinned in your environment that value can have rotted, so unset it to re-read the live one.
|
|
39919
|
-
2. ctxc \u2014 the company id from /api/v2/flow/<flowId>/minimal, required on every /api/v2/client/\u2026 read.
|
|
39930
|
+
HoneyBook answered this flow read with a 400 carrying no error_type, so nothing in the response says which input it objected to. The input worth checking is hb-api-client-version, sent as ${this.apiVersion}: it is read from /api/gon at startup, so it normally tracks HoneyBook, but a pinned HONEYBOOK_API_VERSION can have rotted \u2014 unset it to re-read the live one. (A version HoneyBook actively rejects answers with error_type HBWrongAPIVersionError and is retried automatically, so it would not surface here.)
|
|
39920
39931
|
This is NOT an auth failure \u2014 the credential is very likely fine, so re-running \`use_flow_link\` will not help.`
|
|
39921
39932
|
);
|
|
39922
39933
|
}
|
|
@@ -39960,7 +39971,7 @@ async function fetchFlowMinimal(flowId, opts) {
|
|
|
39960
39971
|
const detail = body.slice(0, 300);
|
|
39961
39972
|
const cause = response.status === 404 ? `no flow ${flowId} \u2014 it may have been deleted, or the id is wrong` : /WrongAPIVersion/i.test(body) ? `HoneyBook rejected hb-api-client-version ${opts.apiVersion}; this package's pinned value needs updating` : "that route is public, so this is a HoneyBook-side problem rather than a credential one";
|
|
39962
39973
|
throw new Error(
|
|
39963
|
-
`HoneyBook flow: GET /api/v2/flow/${flowId}/minimal answered ${response.status} \u2014 ${cause}. It is where the context id (ctxc)
|
|
39974
|
+
`HoneyBook flow: GET /api/v2/flow/${flowId}/minimal answered ${response.status} \u2014 ${cause}. It is where the context id (ctxc) the questionnaire read sends comes from.` + (detail ? ` Response: ${detail}` : "")
|
|
39964
39975
|
);
|
|
39965
39976
|
}
|
|
39966
39977
|
return await response.json();
|
|
@@ -40003,21 +40014,17 @@ async function getFlow(args) {
|
|
|
40003
40014
|
apiVersion: client.getApiVersion()
|
|
40004
40015
|
});
|
|
40005
40016
|
const contextId = flowContextId(minimal);
|
|
40006
|
-
|
|
40007
|
-
throw new Error(
|
|
40008
|
-
`HoneyBook flow: no context id for flow ${flowId}. The questionnaire read requires \`ctxc\`, the vendor company id, and GET /api/v2/flow/<flowId>/minimal did not carry one at branding_data.company_id. Calling /active without it answers a bare 400 that reads like an auth failure, so this stops here: it is not an auth problem and re-running \`use_flow_link\` will not help.`
|
|
40009
|
-
);
|
|
40010
|
-
}
|
|
40011
|
-
const query = new URLSearchParams({ ctxc: contextId });
|
|
40017
|
+
const path = `/api/v2/client/flow/${encodeURIComponent(flowId)}/active`;
|
|
40012
40018
|
const flow = await client.request(
|
|
40013
40019
|
"GET",
|
|
40014
|
-
|
|
40020
|
+
contextId ? `${path}?${new URLSearchParams({ ctxc: contextId })}` : path
|
|
40015
40021
|
);
|
|
40016
40022
|
const head = {
|
|
40017
40023
|
flowId,
|
|
40018
40024
|
portalOrigin: client.credential.portalOrigin,
|
|
40019
|
-
// Reported because it is a second input the
|
|
40020
|
-
// fails, knowing which company id was
|
|
40025
|
+
// Reported because it is a second input the request carries: when this call
|
|
40026
|
+
// fails, knowing which company id was sent is half the diagnosis. `null` is
|
|
40027
|
+
// a normal outcome, not an error — the read does not require one.
|
|
40021
40028
|
contextId
|
|
40022
40029
|
};
|
|
40023
40030
|
if (args.section === "raw") return textResult({ ...head, flow });
|
|
@@ -40040,7 +40047,7 @@ function registerFlowTools(server) {
|
|
|
40040
40047
|
description: "Capture a HoneyBook QUESTIONNAIRE (flow) credential via the fetchproxy browser extension. Use this for a link shaped https://<vendor>.hbportal.co/flow/<flowId>?hash=\u2026 \u2014 for a client-portal link (/app/link/resolve/\u2026) use `use_magic_link` instead. Prerequisites: install the fetchproxy extension, open the questionnaire link in that browser and let the page render, then run this tool. It snapshots localStorage[\"HONEYBOOK_REACT_WEAK_AUTH_<flowId>\"] into ~/.honeybook-mcp/flows.json. A flow credential is HoneyBook's 'weak auth': it is scoped to that ONE questionnaire and cannot read portal workspaces, files, invoices or payment methods. Because the storage key contains the flow id, the extension asks you to re-approve the scope once per new questionnaire.",
|
|
40041
40048
|
inputSchema: {
|
|
40042
40049
|
flow_link_url: external_exports.string().url().describe(
|
|
40043
|
-
"
|
|
40050
|
+
"Questionnaire link, e.g. https://<vendor>.hbportal.co/flow/<flowId>?hash=\u2026&userId=\u2026 Only the /flow/<flowId> segment is required: the credential is read out of the open page's localStorage, so the rewritten step URL (/flow/<flowId>/1-Questions) works too. The URL's ?hash= is used only as a fallback when the page stored none, so prefer the original email link if the capture reports no hash."
|
|
40044
40051
|
)
|
|
40045
40052
|
},
|
|
40046
40053
|
annotations: { readOnlyHint: false }
|
|
@@ -40050,7 +40057,7 @@ function registerFlowTools(server) {
|
|
|
40050
40057
|
server.registerTool(
|
|
40051
40058
|
"get_flow",
|
|
40052
40059
|
{
|
|
40053
|
-
description: 'Read a HoneyBook questionnaire (flow) \u2014 its pages, questions and any answers already submitted \u2014 using a credential captured by `use_flow_link`. Requires a flow credential; a client-portal session will NOT work here, and vice versa. Defaults to the most recently captured flow. Makes two calls: the public /api/v2/flow/<id>/minimal for the vendor company id, then /api/v2/client/flow/<id>/active?ctxc
|
|
40060
|
+
description: 'Read a HoneyBook questionnaire (flow) \u2014 its pages, questions and any answers already submitted \u2014 using a credential captured by `use_flow_link`. Requires a flow credential; a client-portal session will NOT work here, and vice versa. Defaults to the most recently captured flow. Makes two calls: the public /api/v2/flow/<id>/minimal for the vendor company id, then /api/v2/client/flow/<id>/active, passing that id as ?ctxc= when /minimal supplied one. A questionnaire larger than the default ceiling answers with its size and top-level keys instead; call again with section="raw" for the whole thing.',
|
|
40054
40061
|
inputSchema: {
|
|
40055
40062
|
flow_id: external_exports.string().optional().describe(
|
|
40056
40063
|
"Flow id to read. Omit to use the most recently captured flow credential. Run `list_active_sessions` to see the active flow ids."
|
|
@@ -40513,7 +40520,7 @@ var __dirname = dirname2(fileURLToPath(import.meta.url));
|
|
|
40513
40520
|
await loadDotenvSafely({ path: join6(__dirname, "..", ".env"), override: false });
|
|
40514
40521
|
await runMcp({
|
|
40515
40522
|
name: "honeybook-mcp",
|
|
40516
|
-
version: "0.8.
|
|
40523
|
+
version: "0.8.2",
|
|
40517
40524
|
// x-release-please-version
|
|
40518
40525
|
tools: [
|
|
40519
40526
|
registerSessionTools,
|
package/dist/flow-auth.js
CHANGED
|
@@ -85,10 +85,30 @@ export async function captureFlowCredentialViaFetchproxy(opts) {
|
|
|
85
85
|
// same reasoning as `auth.ts`.
|
|
86
86
|
const errName = e?.name;
|
|
87
87
|
if (errName === 'FetchproxyScopeError' || /not in declared set/i.test(msg)) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
88
|
+
// Lead with GRANT, and put the upstream text LAST.
|
|
89
|
+
//
|
|
90
|
+
// A GROWING scope does not block the session: the extension serves the
|
|
91
|
+
// intersection of approved and declared, stays connected, and queues a
|
|
92
|
+
// non-blocking "<serverName> wants to expand its access" offer carrying a
|
|
93
|
+
// Grant button. Only a domains/serverName change forces a re-pair.
|
|
94
|
+
//
|
|
95
|
+
// Ordering is the whole point and is easy to get wrong. `msg` is the
|
|
96
|
+
// upstream FetchproxyScopeError, and it ends with its OWN remedy —
|
|
97
|
+
// "Revoke this MCP in the Transporter extension popup, then re-run".
|
|
98
|
+
// Interpolating it first (as this did when the Grant advice was added)
|
|
99
|
+
// puts "Revoke" ahead of "Grant" no matter what we append, so a reader
|
|
100
|
+
// still does the expensive thing. It therefore goes at the END, behind an
|
|
101
|
+
// "Underlying error:" label, where it stays available for diagnosis
|
|
102
|
+
// without being the first instruction anyone reads.
|
|
103
|
+
throw new Error('HoneyBook flow auth: the extension is refusing a scope this questionnaire needs ' +
|
|
104
|
+
`("${storageKey}"). The declared scope names ONE key per flow, so each new ` +
|
|
105
|
+
'questionnaire is approved once — and it is one click, not a re-pair: open the ' +
|
|
106
|
+
'Transporter popup, where honeybook-mcp should be offering to "expand its access" ' +
|
|
107
|
+
'with this key, and press Grant. Then re-run this tool. That keeps the existing ' +
|
|
108
|
+
'pairing.\n\n' +
|
|
109
|
+
'Revoking and re-pairing also works — it is what the underlying error suggests — but ' +
|
|
110
|
+
'it discards the pairing and makes you approve every scope again, so try Grant ' +
|
|
111
|
+
`first.\n\nUnderlying error: ${msg}`);
|
|
92
112
|
}
|
|
93
113
|
if (bridgeError.type === 'timeout' || /timeout/i.test(msg)) {
|
|
94
114
|
throw new Error('HoneyBook flow auth: fetchproxy capture timed out. The extension never returned ' +
|
package/dist/flow-client.js
CHANGED
|
@@ -73,23 +73,32 @@ export class FlowClient {
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
|
-
* Explain
|
|
76
|
+
* Explain an untyped 400.
|
|
77
77
|
*
|
|
78
|
-
* A
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
78
|
+
* A 400 with no `error_type` says nothing about which input was wrong and
|
|
79
|
+
* reads exactly like an auth failure; left alone it sends people to
|
|
80
|
+
* re-capture a credential that is fine, so the auth reading is denied
|
|
81
|
+
* outright.
|
|
82
|
+
*
|
|
83
|
+
* What can NOT reach here is the client version. Probed live 2026-08-31,
|
|
84
|
+
* every version failure — stale, garbage, empty, omitted — answers 400 with
|
|
85
|
+
* `error_type: HBWrongAPIVersionError` and `error_data.server_api_version`,
|
|
86
|
+
* which `hbApiRequest` intercepts and retries once on the server's own
|
|
87
|
+
* number, so it self-heals a layer below. `ctxc` cannot reach here either:
|
|
88
|
+
* the API ignores it entirely (omitted, bogus, and `/client/`-less all return
|
|
89
|
+
* the same 200, byte-identical), and naming it here only misdirected. So the
|
|
90
|
+
* version is offered as the input to CHECK rather than as a known cause, and
|
|
91
|
+
* this is deliberately vaguer than 0.8.0's message: no cause is confirmed.
|
|
83
92
|
*/
|
|
84
93
|
badRequestError(err) {
|
|
85
94
|
return new Error(`${err.message}\n\n` +
|
|
86
|
-
'HoneyBook
|
|
87
|
-
'
|
|
88
|
-
`
|
|
89
|
-
'
|
|
90
|
-
'
|
|
91
|
-
'
|
|
92
|
-
'
|
|
95
|
+
'HoneyBook answered this flow read with a 400 carrying no error_type, so nothing in the ' +
|
|
96
|
+
'response says which input it objected to. The input worth checking is ' +
|
|
97
|
+
`hb-api-client-version, sent as ${this.apiVersion}: it is read from /api/gon at startup, ` +
|
|
98
|
+
'so it normally tracks HoneyBook, but a pinned HONEYBOOK_API_VERSION can have rotted — ' +
|
|
99
|
+
'unset it to re-read the live one. (A version HoneyBook actively rejects answers with ' +
|
|
100
|
+
'error_type HBWrongAPIVersionError and is retried automatically, so it would not surface ' +
|
|
101
|
+
'here.)\n' +
|
|
93
102
|
'This is NOT an auth failure — the credential is very likely fine, so re-running ' +
|
|
94
103
|
'`use_flow_link` will not help.');
|
|
95
104
|
}
|
|
@@ -167,7 +176,7 @@ export async function fetchFlowMinimal(flowId, opts) {
|
|
|
167
176
|
? `HoneyBook rejected hb-api-client-version ${opts.apiVersion}; this package's pinned value needs updating`
|
|
168
177
|
: 'that route is public, so this is a HoneyBook-side problem rather than a credential one';
|
|
169
178
|
throw new Error(`HoneyBook flow: GET /api/v2/flow/${flowId}/minimal answered ${response.status} — ${cause}. ` +
|
|
170
|
-
`It is where the context id (ctxc)
|
|
179
|
+
`It is where the context id (ctxc) the questionnaire read sends comes from.` +
|
|
171
180
|
(detail ? ` Response: ${detail}` : ''));
|
|
172
181
|
}
|
|
173
182
|
return (await response.json());
|
|
@@ -176,12 +185,14 @@ export async function fetchFlowMinimal(flowId, opts) {
|
|
|
176
185
|
* The `ctxc` value: the vendor's company id.
|
|
177
186
|
*
|
|
178
187
|
* The app sets `params.ctxc` from `clientPortalConfigStore.clientPortalCompanyId`
|
|
179
|
-
* in its request interceptor, and `branding_data.company_id` is that same id
|
|
180
|
-
*
|
|
188
|
+
* in its request interceptor, and `branding_data.company_id` is that same id.
|
|
189
|
+
* (0.8.0's docblock called it the only 24-hex value in `/minimal`; it is not —
|
|
190
|
+
* `theme._id` is another — so this reads the field by name, as it always did.)
|
|
181
191
|
*
|
|
182
|
-
* Returns `null` rather than guessing
|
|
183
|
-
*
|
|
184
|
-
*
|
|
192
|
+
* Returns `null` rather than guessing, and `null` is a normal outcome: the read
|
|
193
|
+
* omits `ctxc` entirely in that case. The API ignores the value regardless —
|
|
194
|
+
* verified live 2026-08-31 that a bogus one returns the same 200 — so a
|
|
195
|
+
* fabricated id would be neither safer nor more honest than sending none.
|
|
185
196
|
*/
|
|
186
197
|
export function flowContextId(minimal) {
|
|
187
198
|
return minimal.branding_data?.company_id ?? null;
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ import { registerContractTools } from './tools/contracts.js';
|
|
|
13
13
|
import { registerInvoiceTools } from './tools/invoices.js';
|
|
14
14
|
await runMcp({
|
|
15
15
|
name: 'honeybook-mcp',
|
|
16
|
-
version: '0.8.
|
|
16
|
+
version: '0.8.2', // x-release-please-version
|
|
17
17
|
tools: [
|
|
18
18
|
registerSessionTools,
|
|
19
19
|
registerFlowTools,
|
package/dist/tools/flows.js
CHANGED
|
@@ -82,24 +82,22 @@ export async function getFlow(args) {
|
|
|
82
82
|
apiVersion: client.getApiVersion(),
|
|
83
83
|
});
|
|
84
84
|
const contextId = flowContextId(minimal);
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
const query = new URLSearchParams({ ctxc: contextId });
|
|
97
|
-
const flow = await client.request('GET', `/api/v2/client/flow/${encodeURIComponent(flowId)}/active?${query}`);
|
|
85
|
+
// `ctxc` is sent when /minimal carries one and simply omitted when it does
|
|
86
|
+
// not. It is NOT required: probed live on 2026-08-31 with a real credential,
|
|
87
|
+
// omitting it — and sending a bogus one, and dropping `/client/` — returns
|
|
88
|
+
// the same 200 with a byte-identical body. 0.8.0 refused here instead, which
|
|
89
|
+
// could only ever invent a failure for a flow whose /minimal lacks
|
|
90
|
+
// branding_data.company_id. The URL still matches the app's own request,
|
|
91
|
+
// because matching the shipped client is the cheap way to stay right if the
|
|
92
|
+
// server ever does start enforcing it.
|
|
93
|
+
const path = `/api/v2/client/flow/${encodeURIComponent(flowId)}/active`;
|
|
94
|
+
const flow = await client.request('GET', contextId ? `${path}?${new URLSearchParams({ ctxc: contextId })}` : path);
|
|
98
95
|
const head = {
|
|
99
96
|
flowId,
|
|
100
97
|
portalOrigin: client.credential.portalOrigin,
|
|
101
|
-
// Reported because it is a second input the
|
|
102
|
-
// fails, knowing which company id was
|
|
98
|
+
// Reported because it is a second input the request carries: when this call
|
|
99
|
+
// fails, knowing which company id was sent is half the diagnosis. `null` is
|
|
100
|
+
// a normal outcome, not an error — the read does not require one.
|
|
103
101
|
contextId,
|
|
104
102
|
};
|
|
105
103
|
if (args.section === 'raw')
|
|
@@ -126,12 +124,12 @@ export function registerFlowTools(server) {
|
|
|
126
124
|
flow_link_url: z
|
|
127
125
|
.string()
|
|
128
126
|
.url()
|
|
129
|
-
.describe('
|
|
127
|
+
.describe('Questionnaire link, e.g. https://<vendor>.hbportal.co/flow/<flowId>?hash=…&userId=… Only the /flow/<flowId> segment is required: the credential is read out of the open page\'s localStorage, so the rewritten step URL (/flow/<flowId>/1-Questions) works too. The URL\'s ?hash= is used only as a fallback when the page stored none, so prefer the original email link if the capture reports no hash.'),
|
|
130
128
|
},
|
|
131
129
|
annotations: { readOnlyHint: false },
|
|
132
130
|
}, useFlowLink);
|
|
133
131
|
server.registerTool('get_flow', {
|
|
134
|
-
description: 'Read a HoneyBook questionnaire (flow) — its pages, questions and any answers already submitted — using a credential captured by `use_flow_link`. Requires a flow credential; a client-portal session will NOT work here, and vice versa. Defaults to the most recently captured flow. Makes two calls: the public /api/v2/flow/<id>/minimal for the vendor company id, then /api/v2/client/flow/<id>/active?ctxc
|
|
132
|
+
description: 'Read a HoneyBook questionnaire (flow) — its pages, questions and any answers already submitted — using a credential captured by `use_flow_link`. Requires a flow credential; a client-portal session will NOT work here, and vice versa. Defaults to the most recently captured flow. Makes two calls: the public /api/v2/flow/<id>/minimal for the vendor company id, then /api/v2/client/flow/<id>/active, passing that id as ?ctxc= when /minimal supplied one. A questionnaire larger than the default ceiling answers with its size and top-level keys instead; call again with section="raw" for the whole thing.',
|
|
135
133
|
inputSchema: {
|
|
136
134
|
flow_id: z
|
|
137
135
|
.string()
|
package/package.json
CHANGED
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.8.
|
|
9
|
+
"version": "0.8.2",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "honeybook-mcp",
|
|
14
|
-
"version": "0.8.
|
|
14
|
+
"version": "0.8.2",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|