@forestadmin/mcp-server 1.2.1 → 1.4.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/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 create_1 = __importDefault(require("./tools/create"));
54
55
  const describe_collection_1 = __importDefault(require("./tools/describe-collection"));
55
56
  const list_1 = __importDefault(require("./tools/list"));
56
57
  const list_related_1 = __importDefault(require("./tools/list-related"));
@@ -71,6 +72,7 @@ const defaultLogger = (level, message) => {
71
72
  const SAFE_ARGUMENTS_FOR_LOGGING = {
72
73
  list: ['collectionName'],
73
74
  listRelated: ['collectionName', 'relationName', 'parentRecordId'],
75
+ create: ['collectionName'],
74
76
  describeCollection: ['collectionName'],
75
77
  };
76
78
  /**
@@ -106,9 +108,13 @@ class ForestMCPServer {
106
108
  catch (error) {
107
109
  this.logger('Warn', `Failed to fetch forest schema, collection names will not be available: ${error}`);
108
110
  }
109
- (0, describe_collection_1.default)(this.mcpServer, this.forestServerUrl, this.logger, collectionNames);
110
- (0, list_1.default)(this.mcpServer, this.forestServerUrl, this.logger, collectionNames);
111
- (0, list_related_1.default)(this.mcpServer, this.forestServerUrl, this.logger, collectionNames);
111
+ const toolNames = [
112
+ (0, describe_collection_1.default)(this.mcpServer, this.forestServerUrl, this.logger, collectionNames),
113
+ (0, list_1.default)(this.mcpServer, this.forestServerUrl, this.logger, collectionNames),
114
+ (0, list_related_1.default)(this.mcpServer, this.forestServerUrl, this.logger, collectionNames),
115
+ (0, create_1.default)(this.mcpServer, this.forestServerUrl, this.logger, collectionNames),
116
+ ];
117
+ this.logger('Info', `[MCP] Registered ${toolNames.length} tools: ${toolNames.join(', ')}`);
112
118
  }
113
119
  ensureSecretsAreSet() {
114
120
  if (!this.envSecret) {
@@ -339,4 +345,4 @@ class ForestMCPServer {
339
345
  }
340
346
  }
341
347
  exports.default = ForestMCPServer;
342
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFzRDtBQUN0RCxzRUFBc0U7QUFDdEUsdUJBQXFCO0FBSXJCLDhGQUFtRztBQUNuRyxzRkFBdUY7QUFDdkYsMEdBQW9HO0FBQ3BHLGtHQUFtRztBQUNuRywrRUFHeUQ7QUFDekQsb0VBQW9FO0FBQ3BFLDBGQUFtRztBQUNuRyxnREFBd0I7QUFDeEIsc0RBQThCO0FBQzlCLDJDQUE2QjtBQUU3QixvRkFBMEQ7QUFDMUQsMkNBQXlDO0FBQ3pDLHNGQUF3RTtBQUN4RSx3REFBMkM7QUFDM0Msd0VBQTBEO0FBQzFELDJEQUErRTtBQUMvRSxnRkFBd0U7QUFDeEUsdUNBQTBDO0FBVzFDLFNBQVMsZUFBZSxDQUFDLEtBQWU7SUFDdEMsSUFBSSxLQUFLLEtBQUssT0FBTztRQUFFLE9BQU8sQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDcEYsSUFBSSxLQUFLLEtBQUssTUFBTTtRQUFFLE9BQU8sQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFFbEYsT0FBTyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsTUFBTSxhQUFhLEdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDL0MsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2xDLENBQUMsQ0FBQztBQUVGLHFFQUFxRTtBQUNyRSxNQUFNLDBCQUEwQixHQUE2QjtJQUMz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
348
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFzRDtBQUN0RCxzRUFBc0U7QUFDdEUsdUJBQXFCO0FBSXJCLDhGQUFtRztBQUNuRyxzRkFBdUY7QUFDdkYsMEdBQW9HO0FBQ3BHLGtHQUFtRztBQUNuRywrRUFHeUQ7QUFDekQsb0VBQW9FO0FBQ3BFLDBGQUFtRztBQUNuRyxnREFBd0I7QUFDeEIsc0RBQThCO0FBQzlCLDJDQUE2QjtBQUU3QixvRkFBMEQ7QUFDMUQsMkNBQXlDO0FBQ3pDLDREQUErQztBQUMvQyxzRkFBd0U7QUFDeEUsd0RBQTJDO0FBQzNDLHdFQUEwRDtBQUMxRCwyREFBK0U7QUFDL0UsZ0ZBQXdFO0FBQ3hFLHVDQUEwQztBQVcxQyxTQUFTLGVBQWUsQ0FBQyxLQUFlO0lBQ3RDLElBQUksS0FBSyxLQUFLLE9BQU87UUFBRSxPQUFPLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLElBQUksS0FBSyxLQUFLLE1BQU07UUFBRSxPQUFPLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRWxGLE9BQU8sQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVELE1BQU0sYUFBYSxHQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQy9DLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUM7QUFFRixxRUFBcUU7QUFDckUsTUFBTSwwQkFB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
@@ -0,0 +1,4 @@
1
+ import type { Logger } from '../server';
2
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ export default function declareCreateTool(mcpServer: McpServer, forestServerUrl: string, logger: Logger, collectionNames?: string[]): string;
4
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1,51 @@
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 = declareCreateTool;
7
+ const zod_1 = require("zod");
8
+ const agent_caller_js_1 = __importDefault(require("../utils/agent-caller.js"));
9
+ const tool_with_logging_js_1 = __importDefault(require("../utils/tool-with-logging.js"));
10
+ const with_activity_log_js_1 = __importDefault(require("../utils/with-activity-log.js"));
11
+ // Preprocess to handle LLM sending attributes as JSON string instead of object
12
+ const attributesWithPreprocess = zod_1.z.preprocess(val => {
13
+ if (typeof val !== 'string')
14
+ return val;
15
+ try {
16
+ return JSON.parse(val);
17
+ }
18
+ catch {
19
+ return val;
20
+ }
21
+ }, zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()));
22
+ function createArgumentShape(collectionNames) {
23
+ return {
24
+ collectionName: collectionNames.length > 0 ? zod_1.z.enum(collectionNames) : zod_1.z.string(),
25
+ attributes: attributesWithPreprocess.describe('The attributes of the record to create. Must be an object with field names as keys.'),
26
+ };
27
+ }
28
+ function declareCreateTool(mcpServer, forestServerUrl, logger, collectionNames = []) {
29
+ const argumentShape = createArgumentShape(collectionNames);
30
+ return (0, tool_with_logging_js_1.default)(mcpServer, 'create', {
31
+ title: 'Create a record',
32
+ description: 'Create a new record in the specified collection.',
33
+ inputSchema: argumentShape,
34
+ }, async (options, extra) => {
35
+ const { rpcClient } = (0, agent_caller_js_1.default)(extra);
36
+ return (0, with_activity_log_js_1.default)({
37
+ forestServerUrl,
38
+ request: extra,
39
+ action: 'create',
40
+ context: { collectionName: options.collectionName },
41
+ logger,
42
+ operation: async () => {
43
+ const record = await rpcClient
44
+ .collection(options.collectionName)
45
+ .create(options.attributes);
46
+ return { content: [{ type: 'text', text: JSON.stringify({ record }) }] };
47
+ },
48
+ });
49
+ }, logger);
50
+ }
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL2NyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQW1DQSxvQ0FvQ0M7QUFwRUQsNkJBQXdCO0FBRXhCLCtFQUFtRDtBQUNuRCx5RkFBb0U7QUFDcEUseUZBQTREO0FBRTVELCtFQUErRTtBQUMvRSxNQUFNLHdCQUF3QixHQUFHLE9BQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDbEQsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFFeEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7QUFDSCxDQUFDLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztBQU90QyxTQUFTLG1CQUFtQixDQUFDLGVBQXlCO0lBQ3BELE9BQU87UUFDTCxjQUFjLEVBQ1osZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQUMsQ0FBQyxJQUFJLENBQUMsZUFBd0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFO1FBQzVGLFVBQVUsRUFBRSx3QkFBd0IsQ0FBQyxRQUFRLENBQzNDLHFGQUFxRixDQUN0RjtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBd0IsaUJBQWlCLENBQ3ZDLFNBQW9CLEVBQ3BCLGVBQXVCLEVBQ3ZCLE1BQWMsRUFDZCxrQkFBNEIsRUFBRTtJQUU5QixNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUUzRCxPQUFPLElBQUEsOEJBQXVCLEVBQzVCLFNBQVMsRUFDVCxRQUFRLEVBQ1I7UUFDRSxLQUFLLEVBQUUsaUJBQWlCO1FBQ3hCLFdBQVcsRUFBRSxrREFBa0Q7UUFDL0QsV0FBVyxFQUFFLGFBQWE7S0FDM0IsRUFDRCxLQUFLLEVBQUUsT0FBdUIsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBQSx5QkFBVyxFQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXpDLE9BQU8sSUFBQSw4QkFBZSxFQUFDO1lBQ3JCLGVBQWU7WUFDZixPQUFPLEVBQUUsS0FBSztZQUNkLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYyxFQUFFO1lBQ25ELE1BQU07WUFDTixTQUFTLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUztxQkFDM0IsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7cUJBQ2xDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBRTlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzNFLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLEVBQ0QsTUFBTSxDQUNQLENBQUM7QUFDSixDQUFDIn0=
@@ -1,4 +1,4 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { Logger } from '../server.js';
3
- export default function declareDescribeCollectionTool(mcpServer: McpServer, forestServerUrl: string, logger: Logger, collectionNames?: string[]): void;
3
+ export default function declareDescribeCollectionTool(mcpServer: McpServer, forestServerUrl: string, logger: Logger, collectionNames?: string[]): string;
4
4
  //# sourceMappingURL=describe-collection.d.ts.map
@@ -8,6 +8,7 @@ const zod_1 = require("zod");
8
8
  const agent_caller_js_1 = __importDefault(require("../utils/agent-caller.js"));
9
9
  const schema_fetcher_js_1 = require("../utils/schema-fetcher.js");
10
10
  const tool_with_logging_js_1 = __importDefault(require("../utils/tool-with-logging.js"));
11
+ const with_activity_log_js_1 = __importDefault(require("../utils/with-activity-log.js"));
11
12
  function createDescribeCollectionArgumentShape(collectionNames) {
12
13
  return {
13
14
  collectionName: collectionNames.length > 0 ? zod_1.z.enum(collectionNames) : zod_1.z.string(),
@@ -52,74 +53,83 @@ function mapRelationType(relationship) {
52
53
  }
53
54
  function declareDescribeCollectionTool(mcpServer, forestServerUrl, logger, collectionNames = []) {
54
55
  const argumentShape = createDescribeCollectionArgumentShape(collectionNames);
55
- (0, tool_with_logging_js_1.default)(mcpServer, 'describeCollection', {
56
+ return (0, tool_with_logging_js_1.default)(mcpServer, 'describeCollection', {
56
57
  title: 'Describe a collection',
57
58
  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
59
  inputSchema: argumentShape,
59
60
  }, async (options, extra) => {
60
61
  const { rpcClient } = (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,
62
+ return (0, with_activity_log_js_1.default)({
63
+ forestServerUrl,
64
+ request: extra,
65
+ action: 'describeCollection',
66
+ context: { collectionName: options.collectionName },
67
+ logger,
68
+ operation: async () => {
69
+ // Get schema from forest server (relations, isFilterable, isSortable, etc.)
70
+ const schema = await (0, schema_fetcher_js_1.fetchForestSchema)(forestServerUrl);
71
+ const schemaFields = (0, schema_fetcher_js_1.getFieldsOfCollection)(schema, options.collectionName);
72
+ // Try to get capabilities from agent (may be unavailable on older versions)
73
+ const collectionCapabilities = await tryFetchCapabilities(rpcClient, options.collectionName, logger);
74
+ // Build fields array - use capabilities if available, otherwise fall back to schema
75
+ const fields = collectionCapabilities?.fields
76
+ ? collectionCapabilities.fields.map(capField => {
77
+ const schemaField = schemaFields.find(f => f.field === capField.name);
78
+ return {
79
+ name: capField.name,
80
+ type: capField.type,
81
+ operators: capField.operators,
82
+ isPrimaryKey: schemaField?.isPrimaryKey || false,
83
+ isReadOnly: schemaField?.isReadOnly || false,
84
+ isRequired: schemaField?.isRequired || false,
85
+ isSortable: schemaField?.isSortable || false,
86
+ };
87
+ })
88
+ : schemaFields
89
+ .filter(f => !f.relationship) // Only non-relation fields
90
+ .map(schemaField => ({
91
+ name: schemaField.field,
92
+ type: schemaField.type,
93
+ operators: null, // Not available without capabilities route
94
+ isPrimaryKey: schemaField.isPrimaryKey,
95
+ isReadOnly: schemaField.isReadOnly,
96
+ isRequired: schemaField.isRequired,
97
+ isSortable: schemaField.isSortable || false,
98
+ }));
99
+ // Extract relations from schema
100
+ const relations = schemaFields
101
+ .filter(f => f.relationship)
102
+ .map(f => ({
103
+ name: f.field,
104
+ type: mapRelationType(f.relationship),
105
+ targetCollection: f.reference?.split('.')[0] || null,
106
+ }));
107
+ // Extract actions from schema
108
+ const schemaActions = (0, schema_fetcher_js_1.getActionsOfCollection)(schema, options.collectionName);
109
+ const actions = schemaActions.map(action => ({
110
+ name: action.name,
111
+ type: action.type, // 'single', 'bulk', or 'global'
112
+ description: action.description || null,
113
+ hasForm: action.fields.length > 0 || action.hooks.load,
114
+ download: action.download,
115
+ }));
116
+ const result = {
117
+ collection: options.collectionName,
118
+ fields,
119
+ relations,
120
+ actions,
121
+ _meta: {
122
+ capabilitiesAvailable: !!collectionCapabilities,
123
+ ...(collectionCapabilities
124
+ ? {}
125
+ : {
126
+ note: 'Operators unavailable (older agent version). Fields have operators: null.',
127
+ }),
128
+ },
78
129
  };
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
- }),
130
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
120
131
  },
121
- };
122
- return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
132
+ });
123
133
  }, logger);
124
134
  }
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9kZXNjcmliZS1jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBNEVBLGdEQWdHQztBQTFLRCw2QkFBd0I7QUFHeEIsK0VBQW1EO0FBQ25ELGtFQUlvQztBQUNwQyx5RkFBb0U7QUFVcEUsU0FBUyxxQ0FBcUMsQ0FBQyxlQUF5QjtJQUN0RSxPQUFPO1FBQ0wsY0FBYyxFQUNaLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFDLENBQUMsSUFBSSxDQUFDLGVBQXdDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRTtLQUM3RixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsb0JBQW9CLENBQ2pDLFNBQXNELEVBQ3RELGNBQXNCLEVBQ3RCLE1BQWM7SUFFZCxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sWUFBWSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RSxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFakYsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sQ0FDSixPQUFPLEVBQ1AsbURBQW1ELGNBQWMseUJBQXlCLENBQzNGLENBQUM7WUFFRixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxDQUFDLE9B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
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9kZXNjcmliZS1jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBNkVBLGdEQXlHQztBQXBMRCw2QkFBd0I7QUFHeEIsK0VBQW1EO0FBQ25ELGtFQUlvQztBQUNwQyx5RkFBb0U7QUFDcEUseUZBQTREO0FBVTVELFNBQVMscUNBQXFDLENBQUMsZUFBeUI7SUFDdEUsT0FBTztRQUNMLGNBQWMsRUFDWixlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBQyxDQUFDLElBQUksQ0FBQyxlQUF3QyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUU7S0FDN0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLG9CQUFvQixDQUNqQyxTQUFzRCxFQUN0RCxjQUFzQixFQUN0QixNQUFjO0lBRWQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLFlBQVksR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUUsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWpGLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLENBQ0osT0FBTyxFQUNQLG1EQUFtRCxjQUFjLHlCQUF5QixDQUMzRixDQUFDO1lBRUYsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVE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
@@ -1,4 +1,4 @@
1
+ import type { Logger } from '../server.js';
1
2
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { Logger } from '../server.js';
3
- export default function declareListRelatedTool(mcpServer: McpServer, forestServerUrl: string, logger: Logger, collectionNames?: string[]): void;
3
+ export default function declareListRelatedTool(mcpServer: McpServer, forestServerUrl: string, logger: Logger, collectionNames?: string[]): string;
4
4
  //# sourceMappingURL=list-related.d.ts.map
@@ -6,11 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.default = declareListRelatedTool;
7
7
  const zod_1 = require("zod");
8
8
  const list_js_1 = require("./list.js");
9
- const activity_logs_creator_js_1 = __importDefault(require("../utils/activity-logs-creator.js"));
10
9
  const agent_caller_js_1 = __importDefault(require("../utils/agent-caller.js"));
11
- const error_parser_js_1 = __importDefault(require("../utils/error-parser.js"));
12
10
  const schema_fetcher_js_1 = require("../utils/schema-fetcher.js");
13
11
  const tool_with_logging_js_1 = __importDefault(require("../utils/tool-with-logging.js"));
12
+ const with_activity_log_js_1 = __importDefault(require("../utils/with-activity-log.js"));
14
13
  function createHasManyArgumentShape(collectionNames) {
15
14
  return {
16
15
  ...(0, list_js_1.createListArgumentShape)(collectionNames),
@@ -19,34 +18,34 @@ function createHasManyArgumentShape(collectionNames) {
19
18
  };
20
19
  }
21
20
  /**
21
+ * Creates an error enhancer for list-related operations.
22
22
  * Enhances error messages with helpful context about available relations and sortable fields.
23
- * Returns an enhanced error or the original error if enhancement fails.
24
23
  */
25
- async function enhanceErrorWithContext(error, forestServerUrl, options) {
26
- const errorDetail = (0, error_parser_js_1.default)(error);
27
- const errorMessage = error instanceof Error ? error.message : String(error);
28
- try {
29
- const fields = (0, schema_fetcher_js_1.getFieldsOfCollection)(await (0, schema_fetcher_js_1.fetchForestSchema)(forestServerUrl), options.collectionName);
30
- const toManyRelations = fields.filter(field => field.relationship === 'HasMany' || field.relationship === 'BelongsToMany');
31
- if (errorMessage?.toLowerCase()?.includes('not found') &&
32
- !toManyRelations.some(field => field.field === options.relationName)) {
33
- return new Error(`The relation name provided is invalid for this collection. Available relations for collection ${options.collectionName} are: ${toManyRelations.map(field => field.field).join(', ')}.`);
24
+ function createErrorEnhancer(forestServerUrl, options, logger) {
25
+ return async (errorMessage) => {
26
+ try {
27
+ const fields = (0, schema_fetcher_js_1.getFieldsOfCollection)(await (0, schema_fetcher_js_1.fetchForestSchema)(forestServerUrl), options.collectionName);
28
+ const toManyRelations = fields.filter(field => field.relationship === 'HasMany' || field.relationship === 'BelongsToMany');
29
+ if (errorMessage?.toLowerCase()?.includes('not found') &&
30
+ !toManyRelations.some(field => field.field === options.relationName)) {
31
+ return `The relation name provided is invalid for this collection. Available relations for collection ${options.collectionName} are: ${toManyRelations.map(field => field.field).join(', ')}.`;
32
+ }
33
+ if (errorMessage?.includes('Invalid sort')) {
34
+ return `The sort field provided is invalid for this collection. Available fields for the collection ${options.collectionName} are: ${fields
35
+ .filter(field => field.isSortable)
36
+ .map(field => field.field)
37
+ .join(', ')}.`;
38
+ }
34
39
  }
35
- if (errorDetail?.includes('Invalid sort')) {
36
- return new Error(`The sort field provided is invalid for this collection. Available fields for the collection ${options.collectionName} are: ${fields
37
- .filter(field => field.isSortable)
38
- .map(field => field.field)
39
- .join(', ')}.`);
40
+ catch (schemaError) {
41
+ logger('Debug', `Failed to fetch schema for error enhancement: ${schemaError}`);
40
42
  }
41
- }
42
- catch {
43
- // Schema fetch failed, fall through to return original error
44
- }
45
- return errorDetail ? new Error(errorDetail) : error;
43
+ return errorMessage;
44
+ };
46
45
  }
47
46
  function declareListRelatedTool(mcpServer, forestServerUrl, logger, collectionNames = []) {
48
47
  const listArgumentShape = createHasManyArgumentShape(collectionNames);
49
- (0, tool_with_logging_js_1.default)(mcpServer, 'listRelated', {
48
+ return (0, tool_with_logging_js_1.default)(mcpServer, 'listRelated', {
50
49
  title: 'List records from a relation',
51
50
  description: 'Retrieve a list of records from a one-to-many or many-to-many relation.',
52
51
  inputSchema: listArgumentShape,
@@ -60,28 +59,36 @@ function declareListRelatedTool(mcpServer, forestServerUrl, logger, collectionNa
60
59
  labelParts.push('filter');
61
60
  }
62
61
  const extraLabel = labelParts.length > 0 ? ` with ${labelParts.join(' and ')}` : '';
63
- await (0, activity_logs_creator_js_1.default)(forestServerUrl, extra, 'listRelatedData', {
64
- collectionName: options.collectionName,
65
- recordId: options.parentRecordId,
66
- label: `list relation "${options.relationName}"${extraLabel}`,
62
+ return (0, with_activity_log_js_1.default)({
63
+ forestServerUrl,
64
+ request: extra,
65
+ action: 'listRelatedData',
66
+ context: {
67
+ collectionName: options.collectionName,
68
+ recordId: options.parentRecordId,
69
+ label: `list relation "${options.relationName}"${extraLabel}`,
70
+ },
71
+ logger,
72
+ operation: async () => {
73
+ const relation = rpcClient
74
+ .collection(options.collectionName)
75
+ .relation(options.relationName, options.parentRecordId);
76
+ let response;
77
+ if (options.enableCount) {
78
+ const [records, totalCount] = await Promise.all([
79
+ relation.list(options),
80
+ relation.count(options),
81
+ ]);
82
+ response = { records, totalCount };
83
+ }
84
+ else {
85
+ const records = await relation.list(options);
86
+ response = { records };
87
+ }
88
+ return { content: [{ type: 'text', text: JSON.stringify(response) }] };
89
+ },
90
+ errorEnhancer: createErrorEnhancer(forestServerUrl, options, logger),
67
91
  });
68
- try {
69
- const relation = rpcClient
70
- .collection(options.collectionName)
71
- .relation(options.relationName, options.parentRecordId);
72
- if (options.enableCount) {
73
- const [records, totalCount] = await Promise.all([
74
- relation.list(options),
75
- relation.count(options),
76
- ]);
77
- return { content: [{ type: 'text', text: JSON.stringify({ records, totalCount }) }] };
78
- }
79
- const records = await relation.list(options);
80
- return { content: [{ type: 'text', text: JSON.stringify({ records }) }] };
81
- }
82
- catch (error) {
83
- throw await enhanceErrorWithContext(error, forestServerUrl, options);
84
- }
85
92
  }, logger);
86
93
  }
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1yZWxhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL2xpc3QtcmVsYXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQTZFQSx5Q0E0REM7QUFySUQsNkJBQXdCO0FBRXhCLHVDQUFvRDtBQUVwRCxpR0FBa0U7QUFDbEUsK0VBQW1EO0FBQ25ELCtFQUF1RDtBQUN2RCxrRUFBc0Y7QUFDdEYseUZBQW9FO0FBRXBFLFNBQVMsMEJBQTBCLENBQUMsZUFBeUI7SUFDM0QsT0FBTztRQUNMLEdBQUcsSUFBQSxpQ0FBdUIsRUFBQyxlQUFlLENBQUM7UUFDM0MsWUFBWSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDeEIsY0FBYyxFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7S0FDbEQsQ0FBQztBQUNKLENBQUM7QUFPRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsdUJBQXVCLENBQ3BDLEtBQWMsRUFDZCxlQUF1QixFQUN2QixPQUF3QjtJQUV4QixNQUFNLFdBQVcsR0FBRyxJQUFBLHlCQUFlLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsTUFBTSxZQUFZLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVFLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUEseUNBQXFCLEVBQ2xDLE1BQU0sSUFBQSxxQ0FBaUIsRUFBQyxlQUFlLENBQUMsRUFDeEMsT0FBTyxDQUFDLGNBQWMsQ0FDdkIsQ0FBQztRQUVGLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ25DLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksS0FBSyxTQUFTLElBQUksS0FB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
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1yZWxhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL2xpc3QtcmVsYXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXVFQSx5Q0FrRUM7QUFwSUQsNkJBQXdCO0FBRXhCLHVDQUFvRDtBQUNwRCwrRUFBbUQ7QUFDbkQsa0VBQXNGO0FBQ3RGLHlGQUFvRTtBQUNwRSx5RkFBNEQ7QUFFNUQsU0FBUywwQkFBMEIsQ0FBQyxlQUF5QjtJQUMzRCxPQUFPO1FBQ0wsR0FBRyxJQUFBLGlDQUF1QixFQUFDLGVBQWUsQ0FBQztRQUMzQyxZQUFZLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtRQUN4QixjQUFjLEVBQUUsT0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztLQUNsRCxDQUFDO0FBQ0osQ0FBQztBQU9EOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQzFCLGVBQXVCLEVBQ3ZCLE9BQXdCLEVBQ3hCLE1BQWM7SUFFZCxPQUFPLEtBQUssRUFBRSxZQUFvQixFQUFFLEVBQUU7UUFDcEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBQSx5Q0FBcUIsRUFDbEMsTUFBTSxJQUFBLHFDQUFpQixFQUFDLGVBQWUsQ0FBQyxFQUN4QyxPQUFPLENBQUMsY0FBYyxDQUN2QixDQUFDO1lBRUYsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDbkMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsWUFBWSxLQUFLLGVBQWUsQ0FDcEYsQ0FBQztZQUVGLElBQ0UsWUFBWSxFQUFFLFdBQVcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUM7Z0JBQ2xELENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFD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
@@ -36,6 +36,6 @@ export declare function createListArgumentShape(collectionNames: string[]): {
36
36
  }, z.core.$strip>>;
37
37
  enableCount: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
38
38
  };
39
- export default function declareListTool(mcpServer: McpServer, forestServerUrl: string, logger: Logger, collectionNames?: string[]): void;
39
+ export default function declareListTool(mcpServer: McpServer, forestServerUrl: string, logger: Logger, collectionNames?: string[]): string;
40
40
  export {};
41
41
  //# sourceMappingURL=list.d.ts.map
@@ -7,11 +7,10 @@ exports.createListArgumentShape = createListArgumentShape;
7
7
  exports.default = declareListTool;
8
8
  const zod_1 = require("zod");
9
9
  const filter_js_1 = __importDefault(require("../schemas/filter.js"));
10
- const activity_logs_creator_js_1 = __importDefault(require("../utils/activity-logs-creator.js"));
11
10
  const agent_caller_js_1 = __importDefault(require("../utils/agent-caller.js"));
12
- const error_parser_js_1 = __importDefault(require("../utils/error-parser.js"));
13
11
  const schema_fetcher_js_1 = require("../utils/schema-fetcher.js");
14
12
  const tool_with_logging_js_1 = __importDefault(require("../utils/tool-with-logging.js"));
13
+ const with_activity_log_js_1 = __importDefault(require("../utils/with-activity-log.js"));
15
14
  // Preprocess to handle LLM sending filters as JSON string instead of object
16
15
  const filtersWithPreprocess = zod_1.z.preprocess(val => {
17
16
  if (typeof val !== 'string')
@@ -65,7 +64,7 @@ function createListArgumentShape(collectionNames) {
65
64
  }
66
65
  function declareListTool(mcpServer, forestServerUrl, logger, collectionNames = []) {
67
66
  const listArgumentShape = createListArgumentShape(collectionNames);
68
- (0, tool_with_logging_js_1.default)(mcpServer, 'list', {
67
+ return (0, tool_with_logging_js_1.default)(mcpServer, 'list', {
69
68
  title: 'List records from a collection',
70
69
  description: 'Retrieve a list of records from the specified collection.',
71
70
  inputSchema: listArgumentShape,
@@ -78,33 +77,45 @@ function declareListTool(mcpServer, forestServerUrl, logger, collectionNames = [
78
77
  else if (options.filters) {
79
78
  actionType = 'filter';
80
79
  }
81
- await (0, activity_logs_creator_js_1.default)(forestServerUrl, extra, actionType, {
82
- collectionName: options.collectionName,
80
+ return (0, with_activity_log_js_1.default)({
81
+ forestServerUrl,
82
+ request: extra,
83
+ action: actionType,
84
+ context: { collectionName: options.collectionName },
85
+ logger,
86
+ operation: async () => {
87
+ const collection = rpcClient.collection(options.collectionName);
88
+ let response;
89
+ if (options.enableCount) {
90
+ const [records, totalCount] = await Promise.all([
91
+ collection.list(options),
92
+ collection.count(options),
93
+ ]);
94
+ response = { records, totalCount };
95
+ }
96
+ else {
97
+ const records = await collection.list(options);
98
+ response = { records };
99
+ }
100
+ return { content: [{ type: 'text', text: JSON.stringify(response) }] };
101
+ },
102
+ errorEnhancer: async (errorMessage) => {
103
+ // Enhance "Invalid sort" errors with available sortable fields
104
+ if (errorMessage?.includes('Invalid sort')) {
105
+ try {
106
+ const fields = (0, schema_fetcher_js_1.getFieldsOfCollection)(await (0, schema_fetcher_js_1.fetchForestSchema)(forestServerUrl), options.collectionName);
107
+ return `The sort field provided is invalid for this collection. Available fields for the collection ${options.collectionName} are: ${fields
108
+ .filter(field => field.isSortable)
109
+ .map(field => field.field)
110
+ .join(', ')}.`;
111
+ }
112
+ catch (schemaError) {
113
+ logger('Debug', `Failed to fetch schema for error enhancement: ${schemaError}`);
114
+ }
115
+ }
116
+ return errorMessage;
117
+ },
83
118
  });
84
- try {
85
- const collection = rpcClient.collection(options.collectionName);
86
- if (options.enableCount) {
87
- const [records, totalCount] = await Promise.all([
88
- collection.list(options),
89
- collection.count(options),
90
- ]);
91
- return { content: [{ type: 'text', text: JSON.stringify({ records, totalCount }) }] };
92
- }
93
- const records = await collection.list(options);
94
- return { content: [{ type: 'text', text: JSON.stringify({ records }) }] };
95
- }
96
- catch (error) {
97
- // Parse error text if it's a JSON string from the agent
98
- const errorDetail = (0, error_parser_js_1.default)(error);
99
- if (errorDetail?.includes('Invalid sort')) {
100
- const fields = (0, schema_fetcher_js_1.getFieldsOfCollection)(await (0, schema_fetcher_js_1.fetchForestSchema)(forestServerUrl), options.collectionName);
101
- throw new Error(`The sort field provided is invalid for this collection. Available fields for the collection ${options.collectionName} are: ${fields
102
- .filter(field => field.isSortable)
103
- .map(field => field.field)
104
- .join(', ')}.`);
105
- }
106
- throw errorDetail ? new Error(errorDetail) : error;
107
- }
108
119
  }, logger);
109
120
  }
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBaUVBLDBEQU1DO0FBRUQsa0NBc0VDO0FBM0lELDZCQUF3QjtBQUV4QixxRUFBZ0Q7QUFDaEQsaUdBQWtFO0FBQ2xFLCtFQUFtRDtBQUNuRCwrRUFBdUQ7QUFDdkQsa0VBQXNGO0FBQ3RGLHlGQUFvRTtBQUVwRSw0RUFBNEU7QUFDNUUsTUFBTSxxQkFBcUIsR0FBRyxPQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQy9DLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sR0FBRyxDQUFDO0lBRXhDLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AscUVBQXFFO1FBQ3JFLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztBQUNILENBQUMsRUFBRSxtQkFBWSxDQUFDLENBQUM7QUFFakIsTUFBTSxrQkFBa0IsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2xDLGNBQWMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0lBQzFCLE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzdCLE9BQU8sRUFBRSxxQkFBcUI7U0FDM0IsUUFBUSxDQUNQLG9KQUFvSixDQUNySjtTQUNBLFFBQVEsRUFBRTtJQUNiLElBQUksRUFBRSxPQUFDO1NBQ0osTUFBTSxDQUFDO1FBQ04sS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDakIsU0FBUyxFQUFFLE9BQUMsQ0FBQyxPQUFPLEVBQUU7S0FDdkIsQ0FBQztTQUNELFFBQVEsRUFBRTtJQUNiLHNCQUFzQixFQUFFLE9BQUM7U0FDdEIsT0FBTyxFQUFFO1NBQ1QsUUFBUSxFQUFFO1NBQ1YsT0FB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
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0VBLDBEQU1DO0FBRUQsa0NBOEVDO0FBbEpELDZCQUF3QjtBQUV4QixxRUFBZ0Q7QUFDaEQsK0VBQW1EO0FBQ25ELGtFQUFzRjtBQUN0Rix5RkFBb0U7QUFDcEUseUZBQTREO0FBRTVELDRFQUE0RTtBQUM1RSxNQUFNLHFCQUFxQixHQUFHLE9BQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDL0MsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFFeEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxxRUFBcUU7UUFDckUsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0FBQ0gsQ0FBQyxFQUFFLG1CQUFZLENBQUMsQ0FBQztBQUVqQixNQUFNLGtCQUFrQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDbEMsY0FBYyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDMUIsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsT0FBTyxFQUFFLHFCQUFxQjtTQUMzQixRQUFRLENBQ1Asb0pBQW9KLENBQ3JKO1NBQ0EsUUFBUSxFQUFFO0lBQ2IsSUFBSSxFQUFFLE9BQUM7U0FDSixNQUFNLENBQUM7UUFDTixLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtRQUNqQixTQUFTLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRTtLQUN2QixDQUFDO1NBQ0QsUUFBUSxFQUFFO0lBQ2Isc0JBQXNCLEVBQUUsT0FBQztTQUN0QixPQUFPLEVBQUU7U0FDVCxRQUFRLEVBQUU7U0FDVixPQUFPLENBQUMsS0FBSyxD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
@@ -1,3 +1,4 @@
1
+ import type { Logger } from '../server.js';
1
2
  import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol';
2
3
  import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types';
3
4
  /**
@@ -5,11 +6,33 @@ import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sd
5
6
  * These must match ActivityLogActions enum in forestadmin-server.
6
7
  * @see packages/private-api/src/config/activity-logs.ts
7
8
  */
8
- export type ActivityLogAction = 'index' | 'search' | 'filter' | 'action' | 'create' | 'update' | 'delete' | 'listRelatedData';
9
- export default function createActivityLog(forestServerUrl: string, request: RequestHandlerExtra<ServerRequest, ServerNotification>, action: ActivityLogAction, extra?: {
9
+ export type ActivityLogAction = 'index' | 'search' | 'filter' | 'action' | 'create' | 'update' | 'delete' | 'listRelatedData' | 'describeCollection';
10
+ type ActivityLogResponse = {
11
+ id: string;
12
+ attributes: {
13
+ index: string;
14
+ };
15
+ };
16
+ export default function createPendingActivityLog(forestServerUrl: string, request: RequestHandlerExtra<ServerRequest, ServerNotification>, action: ActivityLogAction, extra?: {
10
17
  collectionName?: string;
11
18
  recordId?: string | number;
12
19
  recordIds?: string[] | number[];
13
20
  label?: string;
14
- }): Promise<void>;
21
+ }): Promise<ActivityLogResponse>;
22
+ interface MarkActivityLogAsFailedOptions {
23
+ forestServerUrl: string;
24
+ request: RequestHandlerExtra<ServerRequest, ServerNotification>;
25
+ activityLog: ActivityLogResponse;
26
+ errorMessage: string;
27
+ logger: Logger;
28
+ }
29
+ export declare function markActivityLogAsFailed(options: MarkActivityLogAsFailedOptions): void;
30
+ interface MarkActivityLogAsSucceededOptions {
31
+ forestServerUrl: string;
32
+ request: RequestHandlerExtra<ServerRequest, ServerNotification>;
33
+ activityLog: ActivityLogResponse;
34
+ logger: Logger;
35
+ }
36
+ export declare function markActivityLogAsSucceeded(options: MarkActivityLogAsSucceededOptions): void;
37
+ export {};
15
38
  //# sourceMappingURL=activity-logs-creator.d.ts.map
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = createActivityLog;
3
+ exports.default = createPendingActivityLog;
4
+ exports.markActivityLogAsFailed = markActivityLogAsFailed;
5
+ exports.markActivityLogAsSucceeded = markActivityLogAsSucceeded;
4
6
  const ACTION_TO_TYPE = {
5
7
  index: 'read',
6
8
  search: 'read',
@@ -10,8 +12,9 @@ const ACTION_TO_TYPE = {
10
12
  update: 'write',
11
13
  delete: 'write',
12
14
  listRelatedData: 'read',
15
+ describeCollection: 'read',
13
16
  };
14
- async function createActivityLog(forestServerUrl, request, action, extra) {
17
+ async function createPendingActivityLog(forestServerUrl, request, action, extra) {
15
18
  const type = ACTION_TO_TYPE[action];
16
19
  const forestServerToken = request.authInfo?.extra?.forestServerToken;
17
20
  const renderingId = request.authInfo?.extra?.renderingId;
@@ -30,6 +33,7 @@ async function createActivityLog(forestServerUrl, request, action, extra) {
30
33
  type,
31
34
  action,
32
35
  label: extra?.label,
36
+ status: 'pending',
33
37
  records: (extra?.recordIds || (extra?.recordId ? [extra.recordId] : [])),
34
38
  },
35
39
  relationships: {
@@ -54,5 +58,63 @@ async function createActivityLog(forestServerUrl, request, action, extra) {
54
58
  if (!response.ok) {
55
59
  throw new Error(`Failed to create activity log: ${await response.text()}`);
56
60
  }
61
+ const { data: activityLog } = (await response.json());
62
+ return activityLog;
57
63
  }
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktbG9ncy1jcmVhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2FjdGl2aXR5LWxvZ3MtY3JlYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZCQSxvQ0F3REM7QUFuRUQsTUFBTSxjQUFjLEdBQWdEO0lBQ2xFLEtBQUssRUFBRSxNQUFNO0lBQ2IsTUFBTSxFQUFFLE1BQU07SUFDZCxNQUFNLEVBQUUsTUFBTTtJQUNkLE1BQU0sRUFBRSxPQUFPO0lBQ2YsTUFBTSxFQUFFLE9BQU87SUFDZixNQUFNLEVBQUUsT0FBTztJQUNmLE1BQU0sRUFBRSxPQUFPO0lBQ2YsZUFBZSxFQUFFLE1BQU07Q0FDeEIsQ0FBQztBQUVhLEtBQUssVUFBVSxpQkFBaUIsQ0FDN0MsZUFBdUIsRUFDdkIsT0FBK0QsRUFDL0QsTUFBeUIsRUFDekIsS0FLQztJQUVELE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVwQyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLGlCQUEyQixDQUFDO0lBQy9FLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFdBQXFCLENBQUM7SUFFbkUsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxlQUFlLDZCQUE2QixFQUFFO1FBQzVFLE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFO1lBQ1AsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQywyQkFBMkIsRUFBRSxLQUFLO1lBQ2xDLGFBQWEsRUFBRSxVQUFVLGlCQUFpQixFQUFFO1NBQzdDO1FBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbkIsSUFBSSxFQUFFO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLElBQUksRUFBRSx3QkFBd0I7Z0JBQzlCLFVBQVUsRUFBRTtvQkFDVixJQUFJO29CQUNKLE1BQU07b0JBQ04sS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO29CQUNuQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFhO2lCQUNyRjtnQkFDRCxhQUFhLEVBQUU7b0JBQ2IsU0FBUyxFQUFFO3dCQUNULElBQUksRUFBRTs0QkFDSixFQUFFLEVBQUUsV0FBVzs0QkFDZixJQUFJLEVBQUUsWUFBWTt5QkFDbkI7cUJBQ0Y7b0JBQ0QsVUFBVSxFQUFFO3dCQUNWLElBQUksRUFBRSxLQUFLLEVBQUUsY0FBYzs0QkFDekIsQ0FBQyxDQUFDO2dDQUNFLEVBQUUsRUFBRSxLQUFLLENBQUMsY0FBYztnQ0FDeEIsSUFBSSxFQUFFLGFBQWE7NkJBQ3BCOzRCQUNILENBQUMsQ0FBQyxJQUFJO3FCQUNUO2lCQUNGO2FBQ0Y7U0FDRixDQUFDO0tBQ0gsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0UsQ0FBQztBQUNILENBQUMifQ==
64
+ const MAX_RETRIES = 5;
65
+ const RETRY_DELAY_MS = 500;
66
+ async function updateActivityLogStatus(options, attempt = 1) {
67
+ const { forestServerUrl, request, activityLog, status, errorMessage, logger } = options;
68
+ const forestServerToken = request.authInfo?.extra?.forestServerToken;
69
+ const response = await fetch(`${forestServerUrl}/api/activity-logs-requests/${activityLog.attributes.index}/${activityLog.id}/status`, {
70
+ method: 'PATCH',
71
+ headers: {
72
+ 'Content-Type': 'application/json',
73
+ 'Forest-Application-Source': 'MCP',
74
+ Authorization: `Bearer ${forestServerToken}`,
75
+ },
76
+ body: JSON.stringify({
77
+ status,
78
+ ...(errorMessage && { errorMessage }),
79
+ }),
80
+ });
81
+ if (response.status === 404 && attempt < MAX_RETRIES) {
82
+ logger('Debug', `Activity log not found (attempt ${attempt}/${MAX_RETRIES}), retrying...`);
83
+ await new Promise(resolve => {
84
+ setTimeout(resolve, RETRY_DELAY_MS);
85
+ });
86
+ return updateActivityLogStatus(options, attempt + 1);
87
+ }
88
+ if (!response.ok) {
89
+ const responseText = await response.text();
90
+ logger('Error', `Failed to update activity log status to '${status}': ${responseText}`);
91
+ }
92
+ }
93
+ function markActivityLogAsFailed(options) {
94
+ const { forestServerUrl, request, activityLog, errorMessage, logger } = options;
95
+ // Fire-and-forget: don't block error response on activity log update
96
+ updateActivityLogStatus({
97
+ forestServerUrl,
98
+ request,
99
+ activityLog,
100
+ status: 'failed',
101
+ errorMessage,
102
+ logger,
103
+ }).catch(error => {
104
+ logger('Error', `Unexpected error updating activity log to 'failed': ${error}`);
105
+ });
106
+ }
107
+ function markActivityLogAsSucceeded(options) {
108
+ const { forestServerUrl, request, activityLog, logger } = options;
109
+ // Fire-and-forget: don't block successful response on activity log update
110
+ updateActivityLogStatus({
111
+ forestServerUrl,
112
+ request,
113
+ activityLog,
114
+ status: 'completed',
115
+ logger,
116
+ }).catch(error => {
117
+ logger('Error', `Unexpected error updating activity log to 'succeeded': ${error}`);
118
+ });
119
+ }
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktbG9ncy1jcmVhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2FjdGl2aXR5LWxvZ3MtY3JlYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXVDQSwyQ0E2REM7QUE0REQsMERBYUM7QUFTRCxnRUFZQztBQTlLRCxNQUFNLGNBQWMsR0FBZ0Q7SUFDbEUsS0FBSyxFQUFFLE1BQU07SUFDYixNQUFNLEVBQUUsTUFBTTtJQUNkLE1BQU0sRUFBRSxNQUFNO0lBQ2QsTUFBTSxFQUFFLE9BQU87SUFDZixNQUFNLEVBQUUsT0FBTztJQUNmLE1BQU0sRUFBRSxPQUFPO0lBQ2YsTUFBTSxFQUFFLE9BQU87SUFDZixlQUFlLEVBQUUsTUFBTTtJQUN2QixrQkFBa0IsRUFBRSxNQUFNO0NBQzNCLENBQUM7QUFTYSxLQUFLLFVBQVUsd0JBQXdCLENBQ3BELGVBQXVCLEVBQ3ZCLE9BQStELEVBQy9ELE1BQXlCLEVBQ3pCLEtBS0M7SUFFRCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFcEMsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxpQkFBMkIsQ0FBQztJQUMvRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFxQixDQUFDO0lBRW5FLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsZUFBZSw2QkFBNkIsRUFBRTtRQUM1RSxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRTtZQUNQLGNBQWMsRUFBRSxrQkFBa0I7WUFDbEMsMkJBQTJCLEVBQUUsS0FBSztZQUNsQyxhQUFhLEVBQUUsVUFBVSxpQkFBaUIsRUFBRTtTQUM3QztRQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ25CLElBQUksRUFBRTtnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxJQUFJLEVBQUUsd0JBQXdCO2dCQUM5QixVQUFVLEVBQUU7b0JBQ1YsSUFBSTtvQkFDSixNQUFNO29CQUNOLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztvQkFDbkIsTUFBTSxFQUFFLFNBQVM7b0JBQ2pCLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxTQUFTLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQWE7aUJBQ3JGO2dCQUNELGFBQWEsRUFBRTtvQkFDYixTQUFTLEVBQUU7d0JBQ1QsSUFBSSxFQUFFOzRCQUNKLEVBQUUsRUFBRSxXQUFXOzRCQUNmLElBQUksRUFBRSxZQUFZO3lCQUNuQjtxQkFDRjtvQkFDRCxVQUFVLEVBQUU7d0JBQ1YsSUFBSSxFQUFFLEtBQUssRUFBRSxjQUFjOzRCQUN6QixDQUFDLENBQUM7Z0NBQ0UsRUFBRSxFQUFFLEtBQUssQ0FBQyxjQUFjO2dDQUN4QixJQUFJLEVBQUUsYUFBYTs2QkFDcEI7NEJBQ0gsQ0FBQyxDQUFDLElBQUk7cUJBQ1Q7aUJBQ0Y7YUFDRjtTQUNGLENBQUM7S0FDSCxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFrQyxDQUFDO0lBRXZGLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFXRCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDdEIsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDO0FBRTNCLEtBQUssVUFBVSx1QkFBdUIsQ0FDcEMsT0FBaUMsRUFDakMsT0FBTyxHQUFHLENBQUM7SUFFWCxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDeEYsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxpQkFBMkIsQ0FBQztJQUUvRSxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FDMUIsR0FBRyxlQUFlLCtCQUErQixXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQ3hHO1FBQ0UsTUFBTSxFQUFFLE9BQU87UUFDZixPQUFPLEVBQUU7WUFDUCxjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLDJCQUEyQixFQUFFLEtBQUs7WUFDbEMsYUFBYSxFQUFFLFVBQVUsaUJBQWlCLEVBQUU7U0FDN0M7UUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNuQixNQUFNO1lBQ04sR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO1NBQ3RDLENBQUM7S0FDSCxDQUNGLENBQUM7SUFFRixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUNyRCxNQUFNLENBQUMsT0FBTyxFQUFFLG1DQUFtQyxPQUFPLElBQUksV0FBVyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNGLE1BQU0sSUFBSSxPQUFPLENBQU8sT0FBTyxDQUFDLEVBQUU7WUFDaEMsVUFBVSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sdUJBQXVCLENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQixNQUFNLFlBQVksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQyxNQUFNLENBQUMsT0FBTyxFQUFFLDRDQUE0QyxNQUFNLE1BQU0sWUFBWSxFQUFFLENBQUMsQ0FBQztJQUMxRixDQUFDO0FBQ0gsQ0FBQztBQVVELFNBQWdCLHVCQUF1QixDQUFDLE9BQXVDO0lBQzdFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ2hGLHFFQUFxRTtJQUNyRSx1QkFBdUIsQ0FBQztRQUN0QixlQUFlO1FBQ2YsT0FBTztRQUNQLFdBQVc7UUFDWCxNQUFNLEVBQUUsUUFBUTtRQUNoQixZQUFZO1FBQ1osTUFBTTtLQUNQLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDZixNQUFNLENBQUMsT0FBTyxFQUFFLHVEQUF1RCxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQVNELFNBQWdCLDBCQUEwQixDQUFDLE9BQTBDO0lBQ25GLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDbEUsMEVBQTBFO0lBQzFFLHVCQUF1QixDQUFDO1FBQ3RCLGVBQWU7UUFDZixPQUFPO1FBQ1AsV0FBVztRQUNYLE1BQU0sRUFBRSxXQUFXO1FBQ25CLE1BQU07S0FDUCxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsTUFBTSxDQUFDLE9BQU8sRUFBRSwwREFBMEQsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNyRixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
@@ -39,6 +39,6 @@ type ToolResult = {
39
39
  * logger,
40
40
  * );
41
41
  */
42
- export default function registerToolWithLogging<TSchema extends ZodRawShape, TArgs = z.infer<z.ZodObject<TSchema>>>(mcpServer: McpServer, toolName: string, config: ToolConfig<TSchema>, handler: (args: TArgs, extra: any) => Promise<ToolResult>, logger: Logger): void;
42
+ export default function registerToolWithLogging<TSchema extends ZodRawShape, TArgs = z.infer<z.ZodObject<TSchema>>>(mcpServer: McpServer, toolName: string, config: ToolConfig<TSchema>, handler: (args: TArgs, extra: any) => Promise<ToolResult>, logger: Logger): string;
43
43
  export {};
44
44
  //# sourceMappingURL=tool-with-logging.d.ts.map
@@ -62,5 +62,6 @@ handler, logger) {
62
62
  return handler(args, extra);
63
63
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
64
  }));
65
+ return toolName;
65
66
  }
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC13aXRoLWxvZ2dpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdG9vbC13aXRoLWxvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpRkEsMENBd0JDO0FBdEdELDZCQUF3QjtBQW1CeEIsZ0ZBQWdGO0FBQ2hGLHFCQUFxQjtBQUNyQixnRkFBZ0Y7QUFFaEY7OztHQUdHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBaUI7SUFDdkMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNGLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHdCQUF3QixDQUMvQixJQUFhLEVBQ2IsTUFBbUIsRUFDbkIsUUFBZ0IsRUFDaEIsTUFBYztJQUVkLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxPQUFPLEVBQUUsZUFBZSxRQUFRLHVCQUF1QixZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7QUFDSCxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLG9CQUFvQjtBQUNwQixnRkFBZ0Y7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILFNBQXdCLHVCQUF1QixDQUk3QyxTQUFvQixFQUNwQixRQUFnQixFQUNoQixNQUEyQjtBQUMzQiw4REFBOEQ7QUFDOUQsT0FBeUQsRUFDekQsTUFBYztJQUVkLE1BQU0sTUFBTSxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTVDLFNBQVMsQ0FBQyxZQUFZLENBQ3BCLFFBQVEsRUFDUixNQUFNO0lBQ04sOERBQThEO0lBQzlELENBQUMsS0FBSyxFQUFFLElBQVMsRUFBRSxLQUFVLEVBQUUsRUFBRTtRQUMvQix3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6RCxPQUFPLE9BQU8sQ0FBQyxJQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckMsOERBQThEO0lBQ2hFLENBQUMsQ0FBUSxDQUNWLENBQUM7QUFDSixDQUFDIn0=
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC13aXRoLWxvZ2dpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdG9vbC13aXRoLWxvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpRkEsMENBMEJDO0FBeEdELDZCQUF3QjtBQW1CeEIsZ0ZBQWdGO0FBQ2hGLHFCQUFxQjtBQUNyQixnRkFBZ0Y7QUFFaEY7OztHQUdHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBaUI7SUFDdkMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNGLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHdCQUF3QixDQUMvQixJQUFhLEVBQ2IsTUFBbUIsRUFDbkIsUUFBZ0IsRUFDaEIsTUFBYztJQUVkLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxPQUFPLEVBQUUsZUFBZSxRQUFRLHVCQUF1QixZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7QUFDSCxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLG9CQUFvQjtBQUNwQixnRkFBZ0Y7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILFNBQXdCLHVCQUF1QixDQUk3QyxTQUFvQixFQUNwQixRQUFnQixFQUNoQixNQUEyQjtBQUMzQiw4REFBOEQ7QUFDOUQsT0FBeUQsRUFDekQsTUFBYztJQUVkLE1BQU0sTUFBTSxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTVDLFNBQVMsQ0FBQyxZQUFZLENBQ3BCLFFBQVEsRUFDUixNQUFNO0lBQ04sOERBQThEO0lBQzlELENBQUMsS0FBSyxFQUFFLElBQVMsRUFBRSxLQUFVLEVBQUUsRUFBRTtRQUMvQix3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6RCxPQUFPLE9BQU8sQ0FBQyxJQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckMsOERBQThEO0lBQ2hFLENBQUMsQ0FBUSxDQUNWLENBQUM7SUFFRixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIn0=
@@ -0,0 +1,31 @@
1
+ import type { Logger } from '../server.js';
2
+ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol';
3
+ import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types';
4
+ import { ActivityLogAction } from './activity-logs-creator.js';
5
+ interface ActivityLogContext {
6
+ collectionName?: string;
7
+ recordId?: string | number;
8
+ recordIds?: string[] | number[];
9
+ label?: string;
10
+ }
11
+ interface WithActivityLogOptions<T> {
12
+ forestServerUrl: string;
13
+ request: RequestHandlerExtra<ServerRequest, ServerNotification>;
14
+ action: ActivityLogAction;
15
+ context?: ActivityLogContext;
16
+ logger: Logger;
17
+ operation: () => Promise<T>;
18
+ /**
19
+ * Optional function to enhance error messages before logging and throwing.
20
+ * Receives the parsed error message and the original error.
21
+ * Should return the enhanced error message to use.
22
+ */
23
+ errorEnhancer?: (parsedMessage: string, originalError: unknown) => Promise<string>;
24
+ }
25
+ /**
26
+ * Wraps an operation with activity log lifecycle management.
27
+ * Creates a pending activity log, executes the operation, and marks it as succeeded or failed.
28
+ */
29
+ export default function withActivityLog<T>(options: WithActivityLogOptions<T>): Promise<T>;
30
+ export {};
31
+ //# sourceMappingURL=with-activity-log.d.ts.map
@@ -0,0 +1,83 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.default = withActivityLog;
40
+ const activity_logs_creator_js_1 = __importStar(require("./activity-logs-creator.js"));
41
+ const error_parser_js_1 = __importDefault(require("./error-parser.js"));
42
+ /**
43
+ * Wraps an operation with activity log lifecycle management.
44
+ * Creates a pending activity log, executes the operation, and marks it as succeeded or failed.
45
+ */
46
+ async function withActivityLog(options) {
47
+ const { forestServerUrl, request, action, context, logger, operation, errorEnhancer } = options;
48
+ // We want to create the activity log before executing the operation
49
+ // If activity log creation fails, we must prevent the execution of the operation
50
+ const activityLog = await (0, activity_logs_creator_js_1.default)(forestServerUrl, request, action, context);
51
+ try {
52
+ const result = await operation();
53
+ (0, activity_logs_creator_js_1.markActivityLogAsSucceeded)({
54
+ forestServerUrl,
55
+ request,
56
+ activityLog,
57
+ logger,
58
+ });
59
+ return result;
60
+ }
61
+ catch (error) {
62
+ const errorDetail = (0, error_parser_js_1.default)(error);
63
+ let errorMessage = errorDetail || (error instanceof Error ? error.message : String(error));
64
+ // Apply error enhancer if provided (e.g., to add helpful context about available fields)
65
+ if (errorEnhancer) {
66
+ try {
67
+ errorMessage = await errorEnhancer(errorMessage, error);
68
+ }
69
+ catch {
70
+ // If enhancement fails, use the original parsed message
71
+ }
72
+ }
73
+ (0, activity_logs_creator_js_1.markActivityLogAsFailed)({
74
+ forestServerUrl,
75
+ request,
76
+ activityLog,
77
+ errorMessage,
78
+ logger,
79
+ });
80
+ throw new Error(errorMessage);
81
+ }
82
+ }
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1hY3Rpdml0eS1sb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvd2l0aC1hY3Rpdml0eS1sb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQ0Esa0NBeUNDO0FBMUVELHVGQUlvQztBQUNwQyx3RUFBZ0Q7QUF3QmhEOzs7R0FHRztBQUNZLEtBQUssVUFBVSxlQUFlLENBQUksT0FBa0M7SUFDakYsTUFBTSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUVoRyxvRUFBb0U7SUFDcEUsaUZBQWlGO0lBQ2pGLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBQSxrQ0FBd0IsRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU5RixJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsRUFBRSxDQUFDO1FBRWpDLElBQUEscURBQTBCLEVBQUM7WUFDekIsZUFBZTtZQUNmLE9BQU87WUFDUCxXQUFXO1lBQ1gsTUFBTTtTQUNQLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxXQUFXLEdBQUcsSUFBQSx5QkFBZSxFQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLElBQUksWUFBWSxHQUFHLFdBQVcsSUFBSSxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRTNGLHlGQUF5RjtRQUN6RixJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQztnQkFDSCxZQUFZLEdBQUcsTUFBTSxhQUFhLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1Asd0RBQXdEO1lBQzFELENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBQSxrREFBdUIsRUFBQztZQUN0QixlQUFlO1lBQ2YsT0FBTztZQUNQLFdBQVc7WUFDWCxZQUFZO1lBQ1osTUFBTTtTQUNQLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEMsQ0FBQztBQUNILENBQUMifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forestadmin/mcp-server",
3
- "version": "1.2.1",
3
+ "version": "1.4.0",
4
4
  "description": "Model Context Protocol server for Forest Admin with OAuth authentication",
5
5
  "main": "dist/index.js",
6
6
  "bin": {