@forestadmin/mcp-server 1.0.0 → 1.1.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/dist/cli.js CHANGED
@@ -6,9 +6,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  const server_1 = __importDefault(require("./server"));
8
8
  // Start the server when run directly as CLI
9
- const server = new server_1.default();
9
+ const server = new server_1.default({
10
+ forestServerUrl: process.env.FOREST_SERVER_URL || 'https://api.forestadmin.com',
11
+ forestAppUrl: process.env.FOREST_APP_URL || 'https://app.forestadmin.com',
12
+ envSecret: process.env.FOREST_ENV_SECRET,
13
+ authSecret: process.env.FOREST_AUTH_SECRET,
14
+ });
10
15
  server.run().catch(error => {
11
16
  console.error('[FATAL] Server crashed:', error);
12
17
  process.exit(1);
13
18
  });
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxzREFBdUM7QUFFdkMsNENBQTRDO0FBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksZ0JBQWUsRUFBRSxDQUFDO0FBRXJDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7SUFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDIn0=
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxzREFBdUM7QUFFdkMsNENBQTRDO0FBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksZ0JBQWUsQ0FBQztJQUNqQyxlQUFlLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSw2QkFBNkI7SUFDL0UsWUFBWSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLDZCQUE2QjtJQUN6RSxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7SUFDeEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCO0NBQzNDLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7SUFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDIn0=
package/dist/server.js CHANGED
@@ -51,6 +51,7 @@ const express_1 = __importDefault(require("express"));
51
51
  const http = __importStar(require("http"));
52
52
  const forest_oauth_provider_1 = __importDefault(require("./forest-oauth-provider"));
53
53
  const mcp_paths_1 = require("./mcp-paths");
54
+ const describe_collection_1 = __importDefault(require("./tools/describe-collection"));
54
55
  const list_1 = __importDefault(require("./tools/list"));
55
56
  const schema_fetcher_1 = require("./utils/schema-fetcher");
56
57
  const sse_error_logger_1 = __importDefault(require("./utils/sse-error-logger"));
@@ -68,6 +69,7 @@ const defaultLogger = (level, message) => {
68
69
  /** Fields that are safe to log for each tool (non-sensitive data) */
69
70
  const SAFE_ARGUMENTS_FOR_LOGGING = {
70
71
  list: ['collectionName'],
72
+ describeCollection: ['collectionName'],
71
73
  };
72
74
  /**
73
75
  * Forest Admin MCP Server
@@ -83,15 +85,10 @@ const SAFE_ARGUMENTS_FOR_LOGGING = {
83
85
  */
84
86
  class ForestMCPServer {
85
87
  constructor(options) {
86
- this.forestServerUrl =
87
- options?.forestServerUrl ||
88
- process.env.FOREST_SERVER_URL ||
89
- process.env.FOREST_URL ||
90
- 'https://api.forestadmin.com';
91
- this.forestAppUrl =
92
- options?.forestAppUrl || process.env.FOREST_APP_URL || 'https://app.forestadmin.com';
93
- this.envSecret = options?.envSecret || process.env.FOREST_ENV_SECRET;
94
- this.authSecret = options?.authSecret || process.env.FOREST_AUTH_SECRET;
88
+ this.forestServerUrl = options?.forestServerUrl || 'https://api.forestadmin.com';
89
+ this.forestAppUrl = options?.forestAppUrl || 'https://app.forestadmin.com';
90
+ this.envSecret = options?.envSecret;
91
+ this.authSecret = options?.authSecret;
95
92
  this.logger = options?.logger || defaultLogger;
96
93
  this.mcpServer = new mcp_js_1.McpServer({
97
94
  name: version_1.NAME,
@@ -107,6 +104,7 @@ class ForestMCPServer {
107
104
  catch (error) {
108
105
  this.logger('Warn', `Failed to fetch forest schema, collection names will not be available: ${error}`);
109
106
  }
107
+ (0, describe_collection_1.default)(this.mcpServer, this.forestServerUrl, this.logger, collectionNames);
110
108
  (0, list_1.default)(this.mcpServer, this.forestServerUrl, this.logger, collectionNames);
111
109
  }
112
110
  ensureSecretsAreSet() {
@@ -338,4 +336,4 @@ class ForestMCPServer {
338
336
  }
339
337
  }
340
338
  exports.default = ForestMCPServer;
341
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFzRDtBQUN0RCxzRUFBc0U7QUFDdEUsdUJBQXFCO0FBSXJCLDhGQUFtRztBQUNuRyxzRkFBdUY7QUFDdkYsMEdBQW9HO0FBQ3BHLGtHQUFtRztBQUNuRywrRUFHeUQ7QUFDekQsb0VBQW9FO0FBQ3BFLDBGQUFtRztBQUNuRyxnREFBd0I7QUFDeEIsc0RBQThCO0FBQzlCLDJDQUE2QjtBQUU3QixvRkFBMEQ7QUFDMUQsMkNBQXlDO0FBQ3pDLHdEQUEyQztBQUMzQywyREFBK0U7QUFDL0UsZ0ZBQXdFO0FBQ3hFLHVDQUEwQztBQVcxQyxTQUFTLGVBQWUsQ0FBQyxLQUFlO0lBQ3RDLElBQUksS0FBSyxLQUFLLE9BQU87UUFBRSxPQUFPLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLElBQUksS0FBSyxLQUFLLE1BQU07UUFBRSxPQUFPLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRWxGLE9BQU8sQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVELE1BQU0sYUFBYSxHQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQy9DLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUM7QUFFRixxRUFBcUU7QUFDckUsTUFBTSwwQkFBMEIsR0FBNkI7SUFDM0QsSUFBSSxFQUFFLENBQUMsZ0JBQWdCLENB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
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFzRDtBQUN0RCxzRUFBc0U7QUFDdEUsdUJBQXFCO0FBSXJCLDhGQUFtRztBQUNuRyxzRkFBdUY7QUFDdkYsMEdBQW9HO0FBQ3BHLGtHQUFtRztBQUNuRywrRUFHeUQ7QUFDekQsb0VBQW9FO0FBQ3BFLDBGQUFtRztBQUNuRyxnREFBd0I7QUFDeEIsc0RBQThCO0FBQzlCLDJDQUE2QjtBQUU3QixvRkFBMEQ7QUFDMUQsMkNBQXlDO0FBQ3pDLHNGQUF3RTtBQUN4RSx3REFBMkM7QUFDM0MsMkRBQStFO0FBQy9FLGdGQUF3RTtBQUN4RSx1Q0FBMEM7QUFXMUMsU0FBUyxlQUFlLENBQUMsS0FBZTtJQUN0QyxJQUFJLEtBQUssS0FBSyxPQUFPO1FBQUUsT0FBTyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNwRixJQUFJLEtBQUssS0FBSyxNQUFNO1FBQUUsT0FBTyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUVsRixPQUFPLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRCxNQUFNLGFBQWEsR0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUMvQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBRUYscUVBQXFFO0FBQ3JFLE1BQU0sMEJBQTBCLEdBQTZCO0lBQzNELElBQUksRUFBRSxD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
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { Logger } from '../server.js';
3
+ export default function declareDescribeCollectionTool(mcpServer: McpServer, forestServerUrl: string, logger: Logger, collectionNames?: string[]): void;
4
+ //# sourceMappingURL=describe-collection.d.ts.map
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = declareDescribeCollectionTool;
7
+ const zod_1 = require("zod");
8
+ const agent_caller_js_1 = __importDefault(require("../utils/agent-caller.js"));
9
+ const schema_fetcher_js_1 = require("../utils/schema-fetcher.js");
10
+ const tool_with_logging_js_1 = __importDefault(require("../utils/tool-with-logging.js"));
11
+ function createDescribeCollectionArgumentShape(collectionNames) {
12
+ return {
13
+ collectionName: collectionNames.length > 0 ? zod_1.z.enum(collectionNames) : zod_1.z.string(),
14
+ };
15
+ }
16
+ /**
17
+ * Try to fetch capabilities from the agent.
18
+ * Returns undefined if the route is not available (older agent versions).
19
+ * Throws for unexpected errors (network, 500, etc.).
20
+ */
21
+ async function tryFetchCapabilities(rpcClient, collectionName, logger) {
22
+ try {
23
+ return await rpcClient.collection(collectionName).capabilities();
24
+ }
25
+ catch (error) {
26
+ const errorMessage = error instanceof Error ? error.message : String(error);
27
+ const is404 = errorMessage.includes('404') || errorMessage.includes('Not Found');
28
+ if (is404) {
29
+ logger('Debug', `Capabilities route not available for collection ${collectionName}, using schema fallback`);
30
+ return undefined;
31
+ }
32
+ logger('Error', `Failed to fetch capabilities for collection ${collectionName}: ${error}`);
33
+ throw error;
34
+ }
35
+ }
36
+ /**
37
+ * Maps Forest Admin relationship types to simpler relation type names.
38
+ */
39
+ function mapRelationType(relationship) {
40
+ switch (relationship) {
41
+ case 'HasMany':
42
+ return 'one-to-many';
43
+ case 'BelongsToMany':
44
+ return 'many-to-many';
45
+ case 'BelongsTo':
46
+ return 'many-to-one';
47
+ case 'HasOne':
48
+ return 'one-to-one';
49
+ default:
50
+ return relationship || 'unknown';
51
+ }
52
+ }
53
+ function declareDescribeCollectionTool(mcpServer, forestServerUrl, logger, collectionNames = []) {
54
+ const argumentShape = createDescribeCollectionArgumentShape(collectionNames);
55
+ (0, tool_with_logging_js_1.default)(mcpServer, 'describeCollection', {
56
+ title: 'Describe a collection',
57
+ description: "Discover a collection's schema: fields, types, operators, relations, and available actions. Always call this first before querying or modifying data. Check `_meta` for data availability context.",
58
+ inputSchema: argumentShape,
59
+ }, async (options, extra) => {
60
+ const { rpcClient } = await (0, agent_caller_js_1.default)(extra);
61
+ // Get schema from forest server (relations, isFilterable, isSortable, etc.)
62
+ const schema = await (0, schema_fetcher_js_1.fetchForestSchema)(forestServerUrl);
63
+ const schemaFields = (0, schema_fetcher_js_1.getFieldsOfCollection)(schema, options.collectionName);
64
+ // Try to get capabilities from agent (may be unavailable on older versions)
65
+ const collectionCapabilities = await tryFetchCapabilities(rpcClient, options.collectionName, logger);
66
+ // Build fields array - use capabilities if available, otherwise fall back to schema
67
+ const fields = collectionCapabilities?.fields
68
+ ? collectionCapabilities.fields.map(capField => {
69
+ const schemaField = schemaFields.find(f => f.field === capField.name);
70
+ return {
71
+ name: capField.name,
72
+ type: capField.type,
73
+ operators: capField.operators,
74
+ isPrimaryKey: schemaField?.isPrimaryKey || false,
75
+ isReadOnly: schemaField?.isReadOnly || false,
76
+ isRequired: schemaField?.isRequired || false,
77
+ isSortable: schemaField?.isSortable || false,
78
+ };
79
+ })
80
+ : schemaFields
81
+ .filter(f => !f.relationship) // Only non-relation fields
82
+ .map(schemaField => ({
83
+ name: schemaField.field,
84
+ type: schemaField.type,
85
+ operators: null, // Not available without capabilities route
86
+ isPrimaryKey: schemaField.isPrimaryKey,
87
+ isReadOnly: schemaField.isReadOnly,
88
+ isRequired: schemaField.isRequired,
89
+ isSortable: schemaField.isSortable || false,
90
+ }));
91
+ // Extract relations from schema
92
+ const relations = schemaFields
93
+ .filter(f => f.relationship)
94
+ .map(f => ({
95
+ name: f.field,
96
+ type: mapRelationType(f.relationship),
97
+ targetCollection: f.reference?.split('.')[0] || null,
98
+ }));
99
+ // Extract actions from schema
100
+ const schemaActions = (0, schema_fetcher_js_1.getActionsOfCollection)(schema, options.collectionName);
101
+ const actions = schemaActions.map(action => ({
102
+ name: action.name,
103
+ type: action.type, // 'single', 'bulk', or 'global'
104
+ description: action.description || null,
105
+ hasForm: action.fields.length > 0 || action.hooks.load,
106
+ download: action.download,
107
+ }));
108
+ const result = {
109
+ collection: options.collectionName,
110
+ fields,
111
+ relations,
112
+ actions,
113
+ _meta: {
114
+ capabilitiesAvailable: !!collectionCapabilities,
115
+ ...(collectionCapabilities
116
+ ? {}
117
+ : {
118
+ note: 'Operators unavailable (older agent version). Fields have operators: null.',
119
+ }),
120
+ },
121
+ };
122
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
123
+ }, logger);
124
+ }
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9kZXNjcmliZS1jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBNEVBLGdEQWdHQztBQTFLRCw2QkFBd0I7QUFHeEIsK0VBQW1EO0FBQ25ELGtFQUlvQztBQUNwQyx5RkFBb0U7QUFVcEUsU0FBUyxxQ0FBcUMsQ0FBQyxlQUF5QjtJQUN0RSxPQUFPO1FBQ0wsY0FBYyxFQUNaLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFDLENBQUMsSUFBSSxDQUFDLGVBQXdDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRTtLQUM3RixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsb0JBQW9CLENBQ2pDLFNBQXNELEVBQ3RELGNBQXNCLEVBQ3RCLE1BQWM7SUFFZCxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sWUFBWSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RSxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFakYsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sQ0FDSixPQUFPLEVBQ1AsbURBQW1ELGNBQWMseUJBQXlCLENBQzNGLENBQUM7WUFFRixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxDQUFDLE9B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
@@ -18,10 +18,28 @@ export interface ForestField {
18
18
  validations?: unknown[];
19
19
  defaultValue?: unknown;
20
20
  isPrimaryKey: boolean;
21
+ relationship?: 'HasMany' | 'BelongsToMany' | 'BelongsTo' | 'HasOne' | null;
22
+ }
23
+ export interface ForestAction {
24
+ id: string;
25
+ name: string;
26
+ type: 'single' | 'bulk' | 'global';
27
+ endpoint: string;
28
+ description?: string;
29
+ submitButtonLabel?: string;
30
+ download: boolean;
31
+ fields: {
32
+ field: string;
33
+ }[];
34
+ hooks: {
35
+ load: boolean;
36
+ change: unknown[];
37
+ };
21
38
  }
22
39
  export interface ForestCollection {
23
40
  name: string;
24
41
  fields: ForestField[];
42
+ actions?: ForestAction[];
25
43
  }
26
44
  export interface ForestSchema {
27
45
  collections: ForestCollection[];
@@ -50,4 +68,8 @@ export declare function clearSchemaCache(): void;
50
68
  * Sets the schema cache. Useful for testing.
51
69
  */
52
70
  export declare function setSchemaCache(schema: ForestSchema, fetchedAt?: number): void;
71
+ /**
72
+ * Extracts actions from a collection in the Forest Admin schema.
73
+ */
74
+ export declare function getActionsOfCollection(schema: ForestSchema, collectionName: string): ForestAction[];
53
75
  //# sourceMappingURL=schema-fetcher.d.ts.map
@@ -8,6 +8,7 @@ exports.getCollectionNames = getCollectionNames;
8
8
  exports.getFieldsOfCollection = getFieldsOfCollection;
9
9
  exports.clearSchemaCache = clearSchemaCache;
10
10
  exports.setSchemaCache = setSchemaCache;
11
+ exports.getActionsOfCollection = getActionsOfCollection;
11
12
  const jsonapi_serializer_1 = __importDefault(require("jsonapi-serializer"));
12
13
  const ONE_DAY_MS = 24 * 60 * 60 * 1000;
13
14
  let schemaCache = null;
@@ -82,4 +83,14 @@ function setSchemaCache(schema, fetchedAt) {
82
83
  fetchedAt: fetchedAt ?? Date.now(),
83
84
  };
84
85
  }
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWZldGNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2NoZW1hLWZldGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUF5REEsOENBNENDO0FBUUQsZ0RBRUM7QUFFRCxzREFRQztBQUtELDRDQUVDO0FBS0Qsd0NBS0M7QUExSUQsNEVBQW1EO0FBOENuRCxNQUFNLFVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFdkMsSUFBSSxXQUFXLEdBQXVCLElBQUksQ0FBQztBQUUzQzs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBQUMsZUFBdUI7SUFDN0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRXZCLG9FQUFvRTtJQUNwRSxJQUFJLFdBQVcsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLFNBQVMsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUM1RCxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUM7SUFDNUIsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7SUFFaEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLGVBQWUsc0JBQXNCLEVBQUU7UUFDckUsTUFBTSxFQUFFLEtBQUs7UUFDYixPQUFPLEVBQUU7WUFDUCxtQkFBbUIsRUFBRSxTQUFTO1lBQzlCLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkM7S0FDRixDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBSXBDLENBQUM7SUFDRixNQUFNLFVBQVUsR0FBRyxJQUFJLDRCQUFpQixDQUFDLFlBQVksQ0FBQztRQUNwRCxlQUFlLEVBQUUsV0FBVztLQUM3QixDQUFDLENBQUM7SUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBdUIsQ0FBQztJQUVqRixlQUFlO0lBQ2YsV0FBVyxHQUFHO1FBQ1osTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFO1FBQ3ZCLFNBQVMsRUFBRSxHQUFHO0tBQ2YsQ0FBQztJQUVGLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxNQUFvQjtJQUNyRCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxNQUFvQixFQUFFLGNBQXNCO0lBQ2hGLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsQ0FBQztJQUUvRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLGNBQWMsdUJBQXVCLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDO0FBQzNCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGdCQUFnQjtJQUM5QixXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxNQUFvQixFQUFFLFNBQWtCO0lBQ3JFLFdBQVcsR0FBRztRQUNaLE1BQU07UUFDTixTQUFTLEVBQUUsU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7S0FDbkMsQ0FBQztBQUNKLENBQUMifQ==
86
+ /**
87
+ * Extracts actions from a collection in the Forest Admin schema.
88
+ */
89
+ function getActionsOfCollection(schema, collectionName) {
90
+ const collection = schema.collections.find(col => col.name === collectionName);
91
+ if (!collection) {
92
+ throw new Error(`Collection "${collectionName}" not found in schema`);
93
+ }
94
+ return collection.actions || [];
95
+ }
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWZldGNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2NoZW1hLWZldGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUEwRUEsOENBNENDO0FBUUQsZ0RBRUM7QUFFRCxzREFRQztBQUtELDRDQUVDO0FBS0Qsd0NBS0M7QUFLRCx3REFXQztBQTNLRCw0RUFBbUQ7QUErRG5ELE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV2QyxJQUFJLFdBQVcsR0FBdUIsSUFBSSxDQUFDO0FBRTNDOzs7Ozs7R0FNRztBQUNJLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxlQUF1QjtJQUM3RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFdkIsb0VBQW9FO0lBQ3BFLElBQUksV0FBVyxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsU0FBUyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzVELE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUM1QixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztJQUVoRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsZUFBZSxzQkFBc0IsRUFBRTtRQUNyRSxNQUFNLEVBQUUsS0FBSztRQUNiLE9BQU8sRUFBRTtZQUNQLG1CQUFtQixFQUFFLFNBQVM7WUFDOUIsY0FBYyxFQUFFLGtCQUFrQjtTQUNuQztLQUNGLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FJcEMsQ0FBQztJQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksNEJBQWlCLENBQUMsWUFBWSxDQUFDO1FBQ3BELGVBQWUsRUFBRSxXQUFXO0tBQzdCLENBQUMsQ0FBQztJQUNILE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUF1QixDQUFDO0lBRWpGLGVBQWU7SUFDZixXQUFXLEdBQUc7UUFDWixNQUFNLEVBQUUsRUFBRSxXQUFXLEVBQUU7UUFDdkIsU0FBUyxFQUFFLEdBQUc7S0FDZixDQUFDO0lBRUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLE1BQW9CO0lBQ3JELE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELFNBQWdCLHFCQUFxQixDQUFDLE1BQW9CLEVBQUUsY0FBc0I7SUFDaEYsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxDQUFDO0lBRS9FLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsY0FBYyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUM7QUFDM0IsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsZ0JBQWdCO0lBQzlCLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDckIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLE1BQW9CLEVBQUUsU0FBa0I7SUFDckUsV0FBVyxHQUFHO1FBQ1osTUFBTTtRQUNOLFNBQVMsRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRTtLQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQ3BDLE1BQW9CLEVBQ3BCLGNBQXNCO0lBRXRCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsQ0FBQztJQUUvRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLGNBQWMsdUJBQXVCLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztBQUNsQyxDQUFDIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forestadmin/mcp-server",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Model Context Protocol server for Forest Admin with OAuth authentication",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -16,7 +16,7 @@
16
16
  "directory": "packages/mcp-server"
17
17
  },
18
18
  "dependencies": {
19
- "@forestadmin/agent-client": "1.0.0",
19
+ "@forestadmin/agent-client": "1.1.0",
20
20
  "@forestadmin/forestadmin-client": "1.37.0",
21
21
  "@modelcontextprotocol/sdk": "^1.25.1",
22
22
  "cors": "^2.8.5",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/cors": "^2.8.17",
43
- "@types/express": "^4.17.21",
43
+ "@types/express": "^5.0.0",
44
44
  "@types/node": "^18.11.18",
45
45
  "@types/supertest": "^6.0.2",
46
46
  "supertest": "^7.1.3",