@forestadmin/mcp-server 1.21.0 → 1.22.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.
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.default = loadFileUploads;
37
+ const path = __importStar(require("path"));
38
+ // A module is free to throw a non-Error, and reading .message off it yields undefined.
39
+ const describe = (error) => (error instanceof Error ? error.message : String(error));
40
+ // Attached rather than passed to the constructor: the error cause option needs a newer lib than
41
+ // this package targets, while Node itself carries the property fine.
42
+ const withCause = (message, cause) => Object.assign(new Error(message), { cause });
43
+ /**
44
+ * Loads the `fileUploads` options of the standalone server from a module on disk.
45
+ *
46
+ * A storage backend is an object with methods, so it cannot travel through an environment
47
+ * variable like every other standalone option. Without this, file uploads would be reachable
48
+ * only by embedding the server in an agent or by writing a custom entry point.
49
+ *
50
+ * The module default-exports the options, or a function returning them:
51
+ *
52
+ * module.exports = { storage: myS3Storage, maxBytes: 50 * 1024 * 1024 };
53
+ */
54
+ async function loadFileUploads(modulePath) {
55
+ if (!modulePath)
56
+ return undefined;
57
+ const resolved = path.resolve(process.cwd(), modulePath);
58
+ let loaded;
59
+ try {
60
+ // require rather than import(): this package is CommonJS, and Node handles an ESM module here
61
+ // too, whereas a file:// specifier breaks under the test runner.
62
+ // eslint-disable-next-line global-require, import/no-dynamic-require, @typescript-eslint/no-var-requires
63
+ loaded = require(resolved);
64
+ }
65
+ catch (error) {
66
+ // "cannot find it" and "it ran and failed" send the operator to different places, and only the
67
+ // first is about the path they configured.
68
+ const absent = error?.code === 'MODULE_NOT_FOUND' &&
69
+ String(error?.message).includes(resolved);
70
+ throw withCause(absent
71
+ ? `FOREST_MCP_UPLOAD_STORAGE_MODULE "${modulePath}" was not found (resolved to ${resolved}).`
72
+ : `FOREST_MCP_UPLOAD_STORAGE_MODULE "${modulePath}" failed while loading: ${describe(error)}`, error);
73
+ }
74
+ const exported = loaded?.default ?? loaded;
75
+ let options;
76
+ try {
77
+ options = (typeof exported === 'function' ? await exported() : exported);
78
+ }
79
+ catch (error) {
80
+ // The sync path above is wrapped; a rejecting factory would otherwise surface with no mention
81
+ // of the module it came from.
82
+ throw withCause(`FOREST_MCP_UPLOAD_STORAGE_MODULE "${modulePath}" failed while building the options: ${describe(error)}`, error);
83
+ }
84
+ // An object without a storage key is legitimate — it selects the in-memory store. Nothing at all
85
+ // is a mistake, most likely a module that forgot to export.
86
+ if (!options || typeof options !== 'object') {
87
+ throw new Error(`FOREST_MCP_UPLOAD_STORAGE_MODULE "${modulePath}" must export the fileUploads options, or a ` +
88
+ 'function returning them. See the fileUploads section of the mcp-server README.');
89
+ }
90
+ // Whoever sets this variable did it *for* the storage: a bad import or a factory that returned
91
+ // early leaves `{ storage: undefined }`, which the server would silently replace with the
92
+ // in-memory store — putting a deliberately replicated deployment on the one backend that cannot
93
+ // serve it. A missing method fails later, on the first user's upload, so it is checked here too.
94
+ if ('storage' in options) {
95
+ const storage = options.storage;
96
+ const missing = ['createUploadUrl', 'download', 'getSize'].filter(method => typeof storage?.[method] !== 'function');
97
+ if (missing.length) {
98
+ throw new Error(`FOREST_MCP_UPLOAD_STORAGE_MODULE "${modulePath}" exports a storage missing ` +
99
+ `${missing.join(', ')}. An UploadStorage implements createUploadUrl, download and ` +
100
+ 'getSize. Omit the storage entirely to use the in-memory store on purpose.');
101
+ }
102
+ }
103
+ return options;
104
+ }
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1maWxlLXVwbG9hZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvbG9hZC1maWxlLXVwbG9hZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkEsa0NBMkVDO0FBL0ZELDJDQUE2QjtBQUU3Qix1RkFBdUY7QUFDdkYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFOUYsZ0dBQWdHO0FBQ2hHLHFFQUFxRTtBQUNyRSxNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQWUsRUFBRSxLQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBRXBHOzs7Ozs7Ozs7O0dBVUc7QUFDWSxLQUFLLFVBQVUsZUFBZSxDQUMzQyxVQUFtQjtJQUVuQixJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRWxDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELElBQUksTUFBdUQsQ0FBQztJQUU1RCxJQUFJLENBQUM7UUFDSCw4RkFBOEY7UUFDOUYsaUVBQWlFO1FBQ2pFLHlHQUF5RztRQUN6RyxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsK0ZBQStGO1FBQy9GLDJDQUEyQztRQUMzQyxNQUFNLE1BQU0sR0FDVCxLQUErQixFQUFFLElBQUksS0FBSyxrQkFBa0I7WUFDN0QsTUFBTSxDQUFFLEtBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdkQsTUFBTSxTQUFTLENBQ2IsTUFBTTtZQUNKLENBQUMsQ0FBQyxxQ0FBcUMsVUFBVSxnQ0FBZ0MsUUFBUSxJQUFJO1lBQzdGLENBQUMsQ0FBQyxxQ0FBcUMsVUFBVSwyQkFBMkIsUUFBUSxDQUNoRixLQUFLLENBQ04sRUFBRSxFQUNQLEtBQUssQ0FDTixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sRUFBRSxPQUFPLElBQUksTUFBTSxDQUFDO0lBQzNDLElBQUksT0FBdUMsQ0FBQztJQUU1QyxJQUFJLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQyxPQUFPLFFBQVEsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBdUIsQ0FBQztJQUNqRyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLDhGQUE4RjtRQUM5Riw4QkFBOEI7UUFDOUIsTUFBTSxTQUFTLENBQ2IscUNBQXFDLFVBQVUsd0NBQXdDLFFBQVEsQ0FDN0YsS0FBSyxDQUNOLEVBQUUsRUFDSCxLQUFLLENBQ04sQ0FBQztJQUNKLENBQUM7SUFFRCxpR0FBaUc7SUFDakcsNERBQTREO0lBQzVELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FDYixxQ0FBcUMsVUFBVSw4Q0FBOEM7WUFDM0YsZ0ZBQWdGLENBQ25GLENBQUM7SUFDSixDQUFDO0lBRUQsK0ZBQStGO0lBQy9GLDBGQUEwRjtJQUMxRixnR0FBZ0c7SUFDaEcsaUdBQWlHO0lBQ2pHLElBQUksU0FBUyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUF5RCxDQUFDO1FBQ2xGLE1BQU0sT0FBTyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FDL0QsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsQ0FDbEQsQ0FBQztRQUVGLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQ2IscUNBQXFDLFVBQVUsOEJBQThCO2dCQUMzRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDhEQUE4RDtnQkFDbkYsMkVBQTJFLENBQzlFLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forestadmin/mcp-server",
3
- "version": "1.21.0",
3
+ "version": "1.22.0",
4
4
  "description": "Model Context Protocol server for Forest Admin with OAuth authentication",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -16,8 +16,8 @@
16
16
  "directory": "packages/mcp-server"
17
17
  },
18
18
  "dependencies": {
19
- "@forestadmin/agent-client": "1.13.0",
20
- "@forestadmin/forestadmin-client": "1.41.3",
19
+ "@forestadmin/agent-client": "1.14.0",
20
+ "@forestadmin/forestadmin-client": "1.42.1",
21
21
  "@modelcontextprotocol/sdk": "^1.28.0",
22
22
  "cors": "^2.8.5",
23
23
  "express": "^5.2.1",