flowpad-mcp 0.1.0 → 0.1.1
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/dist/index.js +26 -26
- package/package.json +11 -11
- package/dist/client.js +0 -281
- package/dist/client.js.map +0 -1
- package/dist/diff.js +0 -58
- package/dist/diff.js.map +0 -1
- package/dist/http.js +0 -174
- package/dist/http.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib.js +0 -10
- package/dist/lib.js.map +0 -1
- package/dist/local-engine.js +0 -82
- package/dist/local-engine.js.map +0 -1
- package/dist/server.js +0 -956
- package/dist/server.js.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/version.js +0 -8
- package/dist/version.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flowpad-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "MCP server for Flowpad — lets an external AI (Claude Desktop, Cursor, Claude Code) find projects and edit canvas nodes through flowpad-be.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"private": false,
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
"flowpad-mcp": "dist/index.js"
|
|
13
13
|
},
|
|
14
14
|
"files": [
|
|
15
|
-
"dist"
|
|
15
|
+
"dist/index.js"
|
|
16
16
|
],
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "tsc",
|
|
19
19
|
"build:bundle": "esbuild src/index.ts --bundle --minify --platform=node --format=esm --target=node18 --outfile=dist/index.js",
|
|
20
|
-
"prepare": "husky
|
|
21
|
-
"
|
|
20
|
+
"prepare": "husky",
|
|
21
|
+
"prepack": "yarn build:bundle",
|
|
22
22
|
"dev": "tsx src/index.ts",
|
|
23
23
|
"start": "node dist/index.js",
|
|
24
24
|
"typecheck": "tsc --noEmit",
|
|
@@ -33,28 +33,28 @@
|
|
|
33
33
|
"engines": {
|
|
34
34
|
"node": ">=18"
|
|
35
35
|
},
|
|
36
|
-
"
|
|
37
|
-
|
|
38
|
-
"dotenv": "^17.4.2",
|
|
39
|
-
"flowpad-core": "git+https://github.com/demirsefa/flowpad-core.git#semver:^0.1.0",
|
|
40
|
-
"zod": "^3.23.8"
|
|
41
|
-
},
|
|
36
|
+
"comment": "No runtime dependencies on purpose: esbuild (prepack) inlines everything into dist/index.js, so the published npx tool installs nothing and never tries to fetch the PRIVATE flowpad-core. All deps below are BUILD-time (devDependencies). Hosted HTTP deploy uses `yarn build` (tsc) + a normal install, which gets devDeps too.",
|
|
37
|
+
"dependencies": {},
|
|
42
38
|
"resolutions": {
|
|
43
39
|
"//": "Force a single zod across the tree. The MCP SDK allows zod ^3.25 || ^4.0; without this, yarn installs a separate zod@4 under the SDK, so app zod@3 schemas mismatch the SDK's .tool() types (TS2589 / heap OOM in tsc). npm deduped to one zod; this makes yarn do the same.",
|
|
44
40
|
"zod": "3.25.76"
|
|
45
41
|
},
|
|
46
42
|
"devDependencies": {
|
|
47
43
|
"@eslint/js": "^10.0.1",
|
|
44
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
48
45
|
"@types/node": "^22.10.0",
|
|
46
|
+
"dotenv": "^17.4.2",
|
|
49
47
|
"esbuild": "^0.24.0",
|
|
50
48
|
"eslint": "^10.5.0",
|
|
49
|
+
"flowpad-core": "git+https://github.com/demirsefa/flowpad-core.git#semver:^0.1.0",
|
|
51
50
|
"husky": "^9.1.7",
|
|
52
51
|
"lint-staged": "^17.0.7",
|
|
53
52
|
"prettier": "^3.8.4",
|
|
54
53
|
"ts-unused-exports": "^11.0.1",
|
|
55
54
|
"tsx": "^4.19.0",
|
|
56
55
|
"typescript": "^5.7.0",
|
|
57
|
-
"typescript-eslint": "^8.61.0"
|
|
56
|
+
"typescript-eslint": "^8.61.0",
|
|
57
|
+
"zod": "^3.23.8"
|
|
58
58
|
},
|
|
59
59
|
"lint-staged": {
|
|
60
60
|
"*.ts": [
|
package/dist/client.js
DELETED
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
import { MCP_VERSION } from './version.js';
|
|
2
|
-
/** Hard upper bound for every backend call. Node's built-in fetch has no default
|
|
3
|
-
* timeout; without this a stalled/dropped connection hangs the agent forever. */
|
|
4
|
-
const REQUEST_TIMEOUT_MS = 30_000;
|
|
5
|
-
export function isProposedEdit(result) {
|
|
6
|
-
return result?.proposed === true;
|
|
7
|
-
}
|
|
8
|
-
// Thrown internally by FlowpadClient; not exported (nothing outside this module
|
|
9
|
-
// consumes it). Re-export if a consumer ever needs `instanceof` checks.
|
|
10
|
-
class FlowpadError extends Error {
|
|
11
|
-
status;
|
|
12
|
-
constructor(message, status) {
|
|
13
|
-
super(message);
|
|
14
|
-
this.name = 'FlowpadError';
|
|
15
|
-
this.status = status;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Thin HTTP client over flowpad-be's `/mcp/*` facade.
|
|
20
|
-
*
|
|
21
|
-
* Auth mirrors the in-app user auth, with its own entry point: the
|
|
22
|
-
* `FLOWPAD_API_KEY` is exchanged at `POST /mcp/auth/login` (sent as `x-mcp-key`)
|
|
23
|
-
* for a standard, expiring user JWT, which is then cached and sent as a Bearer
|
|
24
|
-
* token on every call — re-logging in once on a 401. No account password lives in
|
|
25
|
-
* this process; the key is the credential, the JWT is the session token.
|
|
26
|
-
*
|
|
27
|
-
* All canvas retrieval and analysis is computed server-side; this client just
|
|
28
|
-
* relays compact text. The raw node list is fetched (cached by revision) only
|
|
29
|
-
* for edit operations, where the diff must be merged against current state.
|
|
30
|
-
*/
|
|
31
|
-
export class FlowpadClient {
|
|
32
|
-
cfg;
|
|
33
|
-
token;
|
|
34
|
-
/** Per-project cache of the full project keyed by its revision. */
|
|
35
|
-
cache = new Map();
|
|
36
|
-
/**
|
|
37
|
-
* The MCP host that initialized this session (e.g. `cursor-vscode`,
|
|
38
|
-
* `claude-ai`, `cli`), captured from the protocol `clientInfo` handshake and
|
|
39
|
-
* forwarded to the backend as `x-mcp-client` so audit/presence can attribute
|
|
40
|
-
* each write to the hand that drove it. Undefined until `initialize` lands.
|
|
41
|
-
*/
|
|
42
|
-
clientName;
|
|
43
|
-
/**
|
|
44
|
-
* Set when the backend's soft version gate (Faz 2) reports a newer tool exists
|
|
45
|
-
* — the latest version string from the `x-flowpad-mcp-update` response headers.
|
|
46
|
-
* createServer folds this into the MCP `instructions` so the agent nudges the
|
|
47
|
-
* user to update. Advisory only; never blocks a call.
|
|
48
|
-
*/
|
|
49
|
-
updateAdvisory;
|
|
50
|
-
constructor(cfg) {
|
|
51
|
-
this.cfg = cfg;
|
|
52
|
-
if (cfg.token) {
|
|
53
|
-
// OAuth path: use the provided JWT directly; no login exchange needed.
|
|
54
|
-
this.token = cfg.token;
|
|
55
|
-
}
|
|
56
|
-
else if (!cfg.mcpKey) {
|
|
57
|
-
throw new FlowpadError('Missing credential: provide an OAuth access token, or a FLOWPAD_API_KEY (Settings → Integrations) for the MCP server env.');
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
url(path) {
|
|
61
|
-
return `${this.cfg.baseUrl.replace(/\/$/, '')}${path}`;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Record the initializing host's identity from the MCP `clientInfo`. Called
|
|
65
|
-
* once per session when the protocol `initialize` completes (see
|
|
66
|
-
* `createServer`'s `oninitialized`). Best-effort attribution only — a missing
|
|
67
|
-
* or malformed name simply leaves writes unattributed.
|
|
68
|
-
*/
|
|
69
|
-
setClientName(name) {
|
|
70
|
-
const trimmed = name?.trim();
|
|
71
|
-
this.clientName = trimmed ? trimmed.slice(0, 64) : undefined;
|
|
72
|
-
}
|
|
73
|
-
/** Latest tool version the backend advertised (soft version gate), or undefined
|
|
74
|
-
* if up to date. Read after the first call (e.g. the guidance fetch). */
|
|
75
|
-
getUpdateAdvisory() {
|
|
76
|
-
return this.updateAdvisory;
|
|
77
|
-
}
|
|
78
|
-
/** Exchange the static MCP key for a user JWT (separate from panel login). */
|
|
79
|
-
async login() {
|
|
80
|
-
if (!this.cfg.mcpKey) {
|
|
81
|
-
throw new FlowpadError('Access token rejected and no MCP key to re-authenticate — the OAuth token is likely expired; reconnect the connector.', 401);
|
|
82
|
-
}
|
|
83
|
-
let res;
|
|
84
|
-
try {
|
|
85
|
-
res = await fetch(this.url('/mcp/auth/login'), {
|
|
86
|
-
method: 'POST',
|
|
87
|
-
headers: {
|
|
88
|
-
'Content-Type': 'application/json',
|
|
89
|
-
'x-mcp-key': this.cfg.mcpKey,
|
|
90
|
-
// Every call carries the tool version so be can advise/require an update
|
|
91
|
-
// (the version gate). See src/version.ts.
|
|
92
|
-
'X-Flowpad-MCP-Version': MCP_VERSION,
|
|
93
|
-
},
|
|
94
|
-
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
if (err instanceof Error && err.name === 'TimeoutError') {
|
|
99
|
-
throw new FlowpadError('Backend timed out — retry');
|
|
100
|
-
}
|
|
101
|
-
throw err;
|
|
102
|
-
}
|
|
103
|
-
if (!res.ok) {
|
|
104
|
-
throw new FlowpadError(`MCP login failed (${res.status}): ${await res.text()}. Check FLOWPAD_API_KEY is a valid, non-revoked key and FLOWPAD_API_URL points at the right backend.`, res.status);
|
|
105
|
-
}
|
|
106
|
-
const data = (await res.json());
|
|
107
|
-
if (!data.access_token) {
|
|
108
|
-
throw new FlowpadError('MCP login response did not contain access_token.');
|
|
109
|
-
}
|
|
110
|
-
this.token = data.access_token;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Fetch the server-side design guidance (the MCP instructions). Served from be
|
|
114
|
-
* via GET /mcp/guidance so the contract is never bundled into the published tool;
|
|
115
|
-
* authed like every other call (lazy-login happens inside `request`).
|
|
116
|
-
*/
|
|
117
|
-
async guidance() {
|
|
118
|
-
const res = await this.request('/mcp/guidance');
|
|
119
|
-
return res.instructions;
|
|
120
|
-
}
|
|
121
|
-
async request(path, init = {}, allowRetry = true) {
|
|
122
|
-
if (!this.token)
|
|
123
|
-
await this.login();
|
|
124
|
-
let res;
|
|
125
|
-
try {
|
|
126
|
-
res = await fetch(this.url(path), {
|
|
127
|
-
...init,
|
|
128
|
-
headers: {
|
|
129
|
-
'Content-Type': 'application/json',
|
|
130
|
-
'X-Flowpad-MCP-Version': MCP_VERSION,
|
|
131
|
-
...(this.clientName ? { 'x-mcp-client': this.clientName } : {}),
|
|
132
|
-
...(init.headers ?? {}),
|
|
133
|
-
Authorization: `Bearer ${this.token}`,
|
|
134
|
-
},
|
|
135
|
-
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
catch (err) {
|
|
139
|
-
if (err instanceof Error && err.name === 'TimeoutError') {
|
|
140
|
-
throw new FlowpadError('Backend timed out — retry');
|
|
141
|
-
}
|
|
142
|
-
throw err;
|
|
143
|
-
}
|
|
144
|
-
// Soft version gate (Faz 2): the backend flags an available update via headers.
|
|
145
|
-
if (res.headers.get('x-flowpad-mcp-update') === 'available') {
|
|
146
|
-
this.updateAdvisory = res.headers.get('x-flowpad-mcp-latest') ?? 'newer';
|
|
147
|
-
}
|
|
148
|
-
// Token expired/invalid → re-login once and retry. Only possible in key mode;
|
|
149
|
-
// in OAuth-token mode there is no key to re-login with, so the 401 surfaces.
|
|
150
|
-
if (res.status === 401 && allowRetry && this.cfg.mcpKey) {
|
|
151
|
-
this.token = undefined;
|
|
152
|
-
await this.login();
|
|
153
|
-
return this.request(path, init, false);
|
|
154
|
-
}
|
|
155
|
-
if (!res.ok) {
|
|
156
|
-
throw new FlowpadError(`${init.method ?? 'GET'} ${path} failed (${res.status}): ${await res.text()}`, res.status);
|
|
157
|
-
}
|
|
158
|
-
if (res.status === 204)
|
|
159
|
-
return undefined;
|
|
160
|
-
return (await res.json());
|
|
161
|
-
}
|
|
162
|
-
// ── Discovery ────────────────────────────────────────────────
|
|
163
|
-
async listProjects(query) {
|
|
164
|
-
const qs = query ? `?query=${encodeURIComponent(query)}` : '';
|
|
165
|
-
return this.request(`/mcp/projects${qs}`);
|
|
166
|
-
}
|
|
167
|
-
/** Full project incl. latestData — used to build/merge edits and reserve ids. */
|
|
168
|
-
async getProjectRaw(id) {
|
|
169
|
-
return this.request(`/mcp/projects/${id}/raw`);
|
|
170
|
-
}
|
|
171
|
-
async getRevision(id) {
|
|
172
|
-
return this.request(`/mcp/projects/${id}/revision`);
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Returns the full project, reusing a cached copy when the server revision is
|
|
176
|
-
* unchanged. A cheap revision check avoids re-downloading a large latestData
|
|
177
|
-
* on every edit-tool call.
|
|
178
|
-
*/
|
|
179
|
-
async getProjectRawCached(id) {
|
|
180
|
-
const cached = this.cache.get(id);
|
|
181
|
-
if (cached) {
|
|
182
|
-
try {
|
|
183
|
-
const { revision } = await this.getRevision(id);
|
|
184
|
-
if (revision === cached.version)
|
|
185
|
-
return cached.project;
|
|
186
|
-
}
|
|
187
|
-
catch {
|
|
188
|
-
// fall through to a full fetch
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
const project = await this.getProjectRaw(id);
|
|
192
|
-
this.cache.set(id, { version: project.version, project });
|
|
193
|
-
return project;
|
|
194
|
-
}
|
|
195
|
-
invalidate(id) {
|
|
196
|
-
this.cache.delete(id);
|
|
197
|
-
}
|
|
198
|
-
// ── Retrieval / analysis (server-computed compact text) ──────
|
|
199
|
-
async outline(id, maxDepth) {
|
|
200
|
-
const qs = maxDepth !== undefined ? `?maxDepth=${maxDepth}` : '';
|
|
201
|
-
const { text } = await this.request(`/mcp/projects/${id}/outline${qs}`);
|
|
202
|
-
return text;
|
|
203
|
-
}
|
|
204
|
-
async searchNodes(id, args) {
|
|
205
|
-
const params = new URLSearchParams();
|
|
206
|
-
for (const [k, v] of Object.entries(args)) {
|
|
207
|
-
if (v !== undefined && v !== '')
|
|
208
|
-
params.set(k, String(v));
|
|
209
|
-
}
|
|
210
|
-
const qs = params.toString() ? `?${params.toString()}` : '';
|
|
211
|
-
const { text } = await this.request(`/mcp/projects/${id}/search${qs}`);
|
|
212
|
-
return text;
|
|
213
|
-
}
|
|
214
|
-
async getNode(id, nodeId, depth) {
|
|
215
|
-
const qs = depth !== undefined ? `?depth=${depth}` : '';
|
|
216
|
-
const { text } = await this.request(`/mcp/projects/${id}/nodes/${encodeURIComponent(nodeId)}${qs}`);
|
|
217
|
-
return text;
|
|
218
|
-
}
|
|
219
|
-
async analyze(id) {
|
|
220
|
-
const { text } = await this.request(`/mcp/projects/${id}/analyze`);
|
|
221
|
-
return text;
|
|
222
|
-
}
|
|
223
|
-
async connections(id, opts = {}) {
|
|
224
|
-
const params = new URLSearchParams();
|
|
225
|
-
if (opts.nodeId)
|
|
226
|
-
params.set('nodeId', opts.nodeId);
|
|
227
|
-
if (opts.nodeName)
|
|
228
|
-
params.set('nodeName', opts.nodeName);
|
|
229
|
-
const qs = params.toString() ? `?${params.toString()}` : '';
|
|
230
|
-
const { text } = await this.request(`/mcp/projects/${id}/connections${qs}`);
|
|
231
|
-
return text;
|
|
232
|
-
}
|
|
233
|
-
// ── Edits ────────────────────────────────────────────────────
|
|
234
|
-
async updateProject(id, body) {
|
|
235
|
-
const saved = await this.request(`/mcp/projects/${id}`, {
|
|
236
|
-
method: 'PUT',
|
|
237
|
-
body: JSON.stringify(body),
|
|
238
|
-
});
|
|
239
|
-
// When the owner is viewing the project the backend turns the edit into a
|
|
240
|
-
// proposal (no apply yet), so there is no new state to cache — drop the
|
|
241
|
-
// stale copy. Otherwise keep the cache warm with the freshly-saved state.
|
|
242
|
-
if (isProposedEdit(saved)) {
|
|
243
|
-
this.invalidate(id);
|
|
244
|
-
}
|
|
245
|
-
else if (saved && typeof saved.version === 'number' && saved.latestData) {
|
|
246
|
-
this.cache.set(id, { version: saved.version, project: saved });
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
this.invalidate(id);
|
|
250
|
-
}
|
|
251
|
-
return saved;
|
|
252
|
-
}
|
|
253
|
-
/** Create a fresh, empty project. Returns `{ proposed: true }` when the user
|
|
254
|
-
* has a live client (a name-confirm surfaces on their screen) or the created
|
|
255
|
-
* Project when applied directly (no live client to confirm on). */
|
|
256
|
-
async createProject(body) {
|
|
257
|
-
return this.request('/mcp/projects', {
|
|
258
|
-
method: 'POST',
|
|
259
|
-
body: JSON.stringify(body),
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
/** Delete a project. Returns `{ proposed: true }` if the owner is viewing it
|
|
263
|
-
* (routed to their confirm overlay) or `{ deleted: true }` if applied. */
|
|
264
|
-
async deleteProject(id) {
|
|
265
|
-
return this.request(`/mcp/projects/${id}`, { method: 'DELETE' });
|
|
266
|
-
}
|
|
267
|
-
/** Install a template project into `id`. Returns `{ proposed: true }` if the
|
|
268
|
-
* owner is viewing (routed to their template-confirm) or `{ bound: true }`. */
|
|
269
|
-
async bindTemplate(id, templateProjectId) {
|
|
270
|
-
return this.request(`/mcp/projects/${id}/bind-template`, {
|
|
271
|
-
method: 'POST',
|
|
272
|
-
body: JSON.stringify({ templateProjectId }),
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
/** The bindable template catalog: bundled built-ins + the user's own template
|
|
276
|
-
* projects. Each item's `id` is what bind_template's templateProjectId wants. */
|
|
277
|
-
async listTemplates() {
|
|
278
|
-
return this.request('/mcp/templates');
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/diff.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
/**
|
|
3
|
-
* Fresh, collision-free node id (UUID). Node ids are UUID strings across
|
|
4
|
-
* flowpad — two concurrent sessions (and server/AI/MCP-generated nodes) never
|
|
5
|
-
* produce the same id, so there is no "next id" to compute anymore.
|
|
6
|
-
*/
|
|
7
|
-
export function newNodeId() {
|
|
8
|
-
return randomUUID();
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Build a single new node for the deterministic `add_node` tool (no AI).
|
|
12
|
-
* Defaults follow engine-base bounds rules (positive width/height).
|
|
13
|
-
*/
|
|
14
|
-
export function buildSimpleNode(params) {
|
|
15
|
-
const bounds = {
|
|
16
|
-
x: params.bounds?.x ?? 0,
|
|
17
|
-
y: params.bounds?.y ?? 0,
|
|
18
|
-
width: params.bounds?.width ?? 240,
|
|
19
|
-
height: params.bounds?.height ?? 120,
|
|
20
|
-
};
|
|
21
|
-
return rescueTextContent({
|
|
22
|
-
id: params.id,
|
|
23
|
-
bounds,
|
|
24
|
-
children: [],
|
|
25
|
-
parent: params.parentId ?? null,
|
|
26
|
-
edges: [],
|
|
27
|
-
...(params.type ? { type: params.type } : {}),
|
|
28
|
-
...(params.name ? { name: params.name } : {}),
|
|
29
|
-
...(params.description ? { description: params.description } : {}),
|
|
30
|
-
...(params.isAutoLayout != null
|
|
31
|
-
? { isAutoLayout: params.isAutoLayout }
|
|
32
|
-
: {}),
|
|
33
|
-
...(params.layout ? { layout: params.layout } : {}),
|
|
34
|
-
...(params.style ?? {}),
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* A text node paints `content`, NOT name/description (those are metadata, never
|
|
39
|
-
* drawn). The `description` field is labelled "Node body" in the tool schema, so
|
|
40
|
-
* agents routinely put the visible string there (or in `name`) and the node
|
|
41
|
-
* renders blank on canvas. Rescue: a text node lacking `content` inherits it
|
|
42
|
-
* from description, then name. No-op for every other type or when content is set.
|
|
43
|
-
*/
|
|
44
|
-
export function rescueTextContent(node) {
|
|
45
|
-
if (node.type !== 'text')
|
|
46
|
-
return node;
|
|
47
|
-
const content = node.content;
|
|
48
|
-
if (typeof content === 'string' && content.length > 0)
|
|
49
|
-
return node;
|
|
50
|
-
const fallback = node.description ?? node.name;
|
|
51
|
-
if (!fallback)
|
|
52
|
-
return node;
|
|
53
|
-
return { ...node, content: fallback };
|
|
54
|
-
}
|
|
55
|
-
export function diffIsEmpty(diff) {
|
|
56
|
-
return (!diff.added?.length && !diff.updated?.length && !diff.removedIds?.length);
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=diff.js.map
|
package/dist/diff.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;GAIG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAW/B;IACC,MAAM,MAAM,GAAS;QACnB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;QACxB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,GAAG;QAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG;KACrC,CAAC;IACF,OAAO,iBAAiB,CAAC;QACvB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM;QACN,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;QAC/B,KAAK,EAAE,EAAE;QACT,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI;YAC7B,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE;YACvC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;KACxB,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC;IAC/C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAe;IACzC,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CACzE,CAAC;AACJ,CAAC"}
|
package/dist/http.js
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
import { createServer as createHttpServer, } from 'node:http';
|
|
2
|
-
import { randomUUID } from 'node:crypto';
|
|
3
|
-
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
4
|
-
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
-
import { FlowpadClient } from './client.js';
|
|
6
|
-
import { createServer } from './server.js';
|
|
7
|
-
const SESSION_HEADER = 'mcp-session-id';
|
|
8
|
-
const FP_KEY_PREFIX = 'fp_live_';
|
|
9
|
-
const PROTECTED_RESOURCE_PATH = '/.well-known/oauth-protected-resource';
|
|
10
|
-
/**
|
|
11
|
-
* Pull the acting user's credential off an incoming request.
|
|
12
|
-
*
|
|
13
|
-
* Two shapes, both via `Authorization: Bearer …` (or `x-mcp-key`):
|
|
14
|
-
* - `fp_live_…` → a raw per-user MCP key (local/stdio bridge; exchanged for a JWT).
|
|
15
|
-
* - anything else → an OAuth 2.1 access token (Faz B), which IS an mcp-scoped
|
|
16
|
-
* flowpad JWT and is used directly.
|
|
17
|
-
*/
|
|
18
|
-
function extractCredential(req) {
|
|
19
|
-
const headerKey = req.headers['x-mcp-key'];
|
|
20
|
-
const rawKey = Array.isArray(headerKey) ? headerKey[0] : headerKey;
|
|
21
|
-
if (typeof rawKey === 'string' && rawKey.startsWith(FP_KEY_PREFIX)) {
|
|
22
|
-
return { mcpKey: rawKey };
|
|
23
|
-
}
|
|
24
|
-
const auth = req.headers['authorization'];
|
|
25
|
-
if (typeof auth === 'string' && auth.toLowerCase().startsWith('bearer ')) {
|
|
26
|
-
const value = auth.slice(7).trim();
|
|
27
|
-
if (!value)
|
|
28
|
-
return {};
|
|
29
|
-
return value.startsWith(FP_KEY_PREFIX)
|
|
30
|
-
? { mcpKey: value }
|
|
31
|
-
: { token: value };
|
|
32
|
-
}
|
|
33
|
-
return {};
|
|
34
|
-
}
|
|
35
|
-
function readJsonBody(req) {
|
|
36
|
-
return new Promise((resolve, reject) => {
|
|
37
|
-
const chunks = [];
|
|
38
|
-
req.on('data', (c) => chunks.push(c));
|
|
39
|
-
req.on('end', () => {
|
|
40
|
-
const text = Buffer.concat(chunks).toString('utf8');
|
|
41
|
-
if (!text)
|
|
42
|
-
return resolve(undefined);
|
|
43
|
-
try {
|
|
44
|
-
resolve(JSON.parse(text));
|
|
45
|
-
}
|
|
46
|
-
catch (e) {
|
|
47
|
-
reject(e instanceof Error ? e : new Error(String(e)));
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
req.on('error', reject);
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
function sendJson(res, status, body) {
|
|
54
|
-
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
55
|
-
res.end(JSON.stringify(body));
|
|
56
|
-
}
|
|
57
|
-
// JSON-RPC error shaped so MCP hosts surface it (id null = no request context).
|
|
58
|
-
function rpcError(res, status, message) {
|
|
59
|
-
sendJson(res, status, {
|
|
60
|
-
jsonrpc: '2.0',
|
|
61
|
-
error: { code: -32000, message },
|
|
62
|
-
id: null,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
/** `${proto}://${host}` for the incoming request, honoring an nginx proxy. */
|
|
66
|
-
function requestOrigin(req) {
|
|
67
|
-
const proto = req.headers['x-forwarded-proto']?.split(',')[0] ||
|
|
68
|
-
'http';
|
|
69
|
-
const host = req.headers['x-forwarded-host'] ?? req.headers.host ?? 'localhost';
|
|
70
|
-
return `${proto}://${Array.isArray(host) ? host[0] : host}`;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Start the multi-tenant Streamable HTTP transport (resource server).
|
|
74
|
-
*
|
|
75
|
-
* Stateful session pattern (SDK canonical): an `initialize` POST with no session
|
|
76
|
-
* id and a valid credential mints a fresh session — its OWN McpServer +
|
|
77
|
-
* FlowpadClient bound to the caller's token. A request with no credential gets a
|
|
78
|
-
* 401 whose `WWW-Authenticate` points at the protected-resource metadata, which
|
|
79
|
-
* is what triggers a host's OAuth discovery + authorization (Faz B).
|
|
80
|
-
*/
|
|
81
|
-
export async function startHttpServer(opts) {
|
|
82
|
-
const mcpPath = opts.path ?? '/mcp';
|
|
83
|
-
const transports = new Map();
|
|
84
|
-
const resourceUrl = (req) => opts.publicResourceUrl ?? `${requestOrigin(req)}${mcpPath}`;
|
|
85
|
-
const metadataUrl = (req) => {
|
|
86
|
-
const origin = opts.publicResourceUrl
|
|
87
|
-
? new URL(opts.publicResourceUrl).origin
|
|
88
|
-
: requestOrigin(req);
|
|
89
|
-
return `${origin}${PROTECTED_RESOURCE_PATH}`;
|
|
90
|
-
};
|
|
91
|
-
const httpServer = createHttpServer((req, res) => {
|
|
92
|
-
void handle(req, res).catch((e) => {
|
|
93
|
-
console.error('Unhandled request error:', e);
|
|
94
|
-
if (!res.headersSent)
|
|
95
|
-
rpcError(res, 500, 'Internal server error');
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
function challenge(req, res) {
|
|
99
|
-
res.setHeader('WWW-Authenticate', `Bearer resource_metadata="${metadataUrl(req)}"`);
|
|
100
|
-
rpcError(res, 401, 'Authorization required. Connect via OAuth.');
|
|
101
|
-
}
|
|
102
|
-
async function handle(req, res) {
|
|
103
|
-
const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
|
|
104
|
-
// RFC 9728 protected-resource metadata — tells the host which AS to use.
|
|
105
|
-
if (url.pathname === PROTECTED_RESOURCE_PATH) {
|
|
106
|
-
sendJson(res, 200, {
|
|
107
|
-
resource: resourceUrl(req),
|
|
108
|
-
authorization_servers: opts.authorizationServers ?? [],
|
|
109
|
-
});
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
if (url.pathname !== mcpPath) {
|
|
113
|
-
rpcError(res, 404, `Not found. MCP endpoint is ${mcpPath}.`);
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
const sessionId = req.headers[SESSION_HEADER];
|
|
117
|
-
const sid = Array.isArray(sessionId) ? sessionId[0] : sessionId;
|
|
118
|
-
// Reuse an existing session.
|
|
119
|
-
if (sid && transports.has(sid)) {
|
|
120
|
-
const transport = transports.get(sid);
|
|
121
|
-
const body = req.method === 'POST' ? await readJsonBody(req) : undefined;
|
|
122
|
-
await transport.handleRequest(req, res, body);
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
// A session id we DON'T know (server restarted / it was GC'd) → 404, the
|
|
126
|
-
// MCP spec's signal for "session gone, re-initialize". Without this, every
|
|
127
|
-
// deploy/restart would strand connected hosts on a dead session (they'd get
|
|
128
|
-
// 400 and not auto-reconnect). 404 makes hosts transparently re-handshake.
|
|
129
|
-
if (sid) {
|
|
130
|
-
rpcError(res, 404, 'Session not found or expired — reinitialize.');
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
if (req.method !== 'POST') {
|
|
134
|
-
rpcError(res, 400, 'Missing mcp-session-id.');
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
const body = await readJsonBody(req);
|
|
138
|
-
// A non-initialize POST without a known session is invalid.
|
|
139
|
-
if (!isInitializeRequest(body)) {
|
|
140
|
-
rpcError(res, 400, 'Bad Request: no valid session id, and not an initialize request.');
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
// New session: a credential must be present (OAuth token or fp_live_ key).
|
|
144
|
-
const cred = extractCredential(req);
|
|
145
|
-
if (!cred.token && !cred.mcpKey) {
|
|
146
|
-
challenge(req, res);
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
const client = new FlowpadClient({
|
|
150
|
-
baseUrl: opts.baseUrl,
|
|
151
|
-
token: cred.token,
|
|
152
|
-
mcpKey: cred.mcpKey,
|
|
153
|
-
});
|
|
154
|
-
const transport = new StreamableHTTPServerTransport({
|
|
155
|
-
sessionIdGenerator: () => randomUUID(),
|
|
156
|
-
onsessioninitialized: (newId) => {
|
|
157
|
-
transports.set(newId, transport);
|
|
158
|
-
},
|
|
159
|
-
});
|
|
160
|
-
transport.onclose = () => {
|
|
161
|
-
if (transport.sessionId)
|
|
162
|
-
transports.delete(transport.sessionId);
|
|
163
|
-
};
|
|
164
|
-
const server = await createServer(client);
|
|
165
|
-
await server.connect(transport);
|
|
166
|
-
await transport.handleRequest(req, res, body);
|
|
167
|
-
}
|
|
168
|
-
await new Promise((resolve) => {
|
|
169
|
-
httpServer.listen(opts.port, () => resolve());
|
|
170
|
-
});
|
|
171
|
-
// stderr keeps stdout clean (stdio transport contract); harmless over HTTP.
|
|
172
|
-
console.error(`flowpad-mcp HTTP transport listening on :${opts.port}${mcpPath}`);
|
|
173
|
-
}
|
|
174
|
-
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,IAAI,gBAAgB,GAGjC,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,cAAc,GAAG,gBAAgB,CAAC;AACxC,MAAM,aAAa,GAAG,UAAU,CAAC;AACjC,MAAM,uBAAuB,GAAG,uCAAuC,CAAC;AAuBxE;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,GAAoB;IAC7C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACnE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;YACpC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE;YACnB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,GAAoB;IACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI;gBAAE,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;IAClE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,gFAAgF;AAChF,SAAS,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,OAAe;IACpE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE;QACpB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE;QAChC,EAAE,EAAE,IAAI;KACT,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,SAAS,aAAa,CAAC,GAAoB;IACzC,MAAM,KAAK,GACR,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAwB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC;IACT,MAAM,IAAI,GACR,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IACrE,OAAO,GAAG,KAAK,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAuB;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyC,CAAC;IAEpE,MAAM,WAAW,GAAG,CAAC,GAAoB,EAAU,EAAE,CACnD,IAAI,CAAC,iBAAiB,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC;IAC9D,MAAM,WAAW,GAAG,CAAC,GAAoB,EAAU,EAAE;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB;YACnC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM;YACxC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,GAAG,MAAM,GAAG,uBAAuB,EAAE,CAAC;IAC/C,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,gBAAgB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YAChC,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,WAAW;gBAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,SAAS,CAAC,GAAoB,EAAE,GAAmB;QAC1D,GAAG,CAAC,SAAS,CACX,kBAAkB,EAClB,6BAA6B,WAAW,CAAC,GAAG,CAAC,GAAG,CACjD,CAAC;QACF,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,4CAA4C,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,UAAU,MAAM,CACnB,GAAoB,EACpB,GAAmB;QAEnB,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,GAAG,CAAC,GAAG,IAAI,GAAG,EACd,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAC5C,CAAC;QAEF,yEAAyE;QACzE,IAAI,GAAG,CAAC,QAAQ,KAAK,uBAAuB,EAAE,CAAC;YAC7C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE;gBACjB,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC;gBAC1B,qBAAqB,EAAE,IAAI,CAAC,oBAAoB,IAAI,EAAE;aACvD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC7B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,8BAA8B,OAAO,GAAG,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEhE,6BAA6B;QAC7B,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;YACvC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACzE,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,yEAAyE;QACzE,2EAA2E;QAC3E,4EAA4E;QAC5E,2EAA2E;QAC3E,IAAI,GAAG,EAAE,CAAC;YACR,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,8CAA8C,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,yBAAyB,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QAErC,4DAA4D;QAC5D,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,QAAQ,CACN,GAAG,EACH,GAAG,EACH,kEAAkE,CACnE,CAAC;YACF,OAAO;QACT,CAAC;QAED,2EAA2E;QAC3E,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;YAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;YACtC,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC9B,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACnC,CAAC;SACF,CAAC,CAAC;QACH,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;YACvB,IAAI,SAAS,CAAC,SAAS;gBAAE,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAClE,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,4EAA4E;IAC5E,OAAO,CAAC,KAAK,CACX,4CAA4C,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAClE,CAAC;AACJ,CAAC"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,kFAAkF;AAClF,kFAAkF;AAClF,gFAAgF;AAChF,wBAAwB;AACxB,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,sFAAsF;AACtF,SAAS,SAAS;IAChB,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,+DAA+D;IAC/D,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;QAC/B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,gBAAgB;QACxD,2EAA2E;QAC3E,kDAAkD;QAClD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW;KAC/D,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,wDAAwD;IACxD,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,iBAAiB,CAAC,CAAC;IAC/D,2EAA2E;IAC3E,kEAAkE;IAClE,gFAAgF;IAChF,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;SACvD,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,eAAe,CAAC;QACpB,IAAI;QACJ,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,gBAAgB;QACxD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,MAAM;QACpC,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;QAC7C,oBAAoB,EAAE,WAAW;KAClC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,SAAS,EAAE,EAAE,CAAC;QAChB,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/lib.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
// Library entry — lets flowpad-mcp-local (the bundled PUBLIC stdio tool) reuse the
|
|
2
|
-
// server + client WITHOUT copying any logic. flowpad-mcp-local imports these, attaches
|
|
3
|
-
// a StdioServerTransport, and esbuild-bundles the whole tree (this + flowpad-core) into
|
|
4
|
-
// one self-contained minified file. The CLI entry (index.ts / bin) stays the
|
|
5
|
-
// hosted-HTTP + local-dev runner.
|
|
6
|
-
// ts-unused-exports:disable-next-line
|
|
7
|
-
export { createServer } from './server.js';
|
|
8
|
-
// ts-unused-exports:disable-next-line
|
|
9
|
-
export { FlowpadClient } from './client.js';
|
|
10
|
-
//# sourceMappingURL=lib.js.map
|
package/dist/lib.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,uFAAuF;AACvF,wFAAwF;AACxF,6EAA6E;AAC7E,kCAAkC;AAClC,sCAAsC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,sCAAsC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|