@forestadmin/mcp-server 1.18.0 → 1.19.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/README.md +1 -0
- package/dist/tools/get-action-form.js +16 -3
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -63,6 +63,7 @@ yarn start:dev # Development (loads .env file automatically)
|
|
|
63
63
|
| `FOREST_AUTH_SECRET` | **Yes** | - | Your Forest Admin authentication secret (must match your agent) |
|
|
64
64
|
| `MCP_SERVER_PORT` | No | `3931` | Port for the HTTP server |
|
|
65
65
|
| `FOREST_MCP_ENABLED_TOOLS` | No | - | Comma-separated list of tools to enable (allowlist) |
|
|
66
|
+
| `FOREST_AGENT_URL` | No | your environment's back-end URL | URL the MCP server uses to reach the back-end's data layer. Set it when the server runs next to a self-hosted back-end at an internal address (e.g. `http://localhost:3310`), instead of the public URL registered in Forest |
|
|
66
67
|
|
|
67
68
|
#### Example Configuration
|
|
68
69
|
|
|
@@ -7,6 +7,14 @@ exports.default = declareGetActionFormTool;
|
|
|
7
7
|
const action_helpers_1 = require("../utils/action-helpers");
|
|
8
8
|
const agent_caller_1 = require("../utils/agent-caller");
|
|
9
9
|
const tool_with_logging_1 = __importDefault(require("../utils/tool-with-logging"));
|
|
10
|
+
// Options may be {value,label} objects or bare primitives — normalize to a consistent shape.
|
|
11
|
+
function toAllowedValue(option) {
|
|
12
|
+
if (option !== null && typeof option === 'object') {
|
|
13
|
+
const { value, label } = option;
|
|
14
|
+
return { value, label };
|
|
15
|
+
}
|
|
16
|
+
return { value: option, label: String(option) };
|
|
17
|
+
}
|
|
10
18
|
function declareGetActionFormTool(mcpServer, ctx) {
|
|
11
19
|
const { forestServerClient, logger, collectionNames } = ctx;
|
|
12
20
|
const argumentShape = (0, action_helpers_1.createActionArgumentShape)(collectionNames);
|
|
@@ -23,7 +31,7 @@ Workflow:
|
|
|
23
31
|
5. Only then call executeAction with the same values
|
|
24
32
|
|
|
25
33
|
The response includes:
|
|
26
|
-
- fields: Array of form fields with name, type, current value, isRequired flag,
|
|
34
|
+
- fields: Array of form fields with name, type, current value, isRequired flag, description (hint), enumValues (Enum fields), and allowedValues (choice widgets — submit the value, not the label)
|
|
27
35
|
- canExecute: Boolean indicating if all required fields have values (ready to execute)
|
|
28
36
|
- requiredFields: Array of field names that are required but missing values (empty when canExecute is true)
|
|
29
37
|
- skippedFields: Array of field names that were skipped because they no longer exist in the form (due to dynamic form behavior)`,
|
|
@@ -52,17 +60,22 @@ The response includes:
|
|
|
52
60
|
type: 'text',
|
|
53
61
|
text: JSON.stringify({
|
|
54
62
|
fields: fields.map(field => {
|
|
63
|
+
const description = field.getPlainField()?.description;
|
|
55
64
|
const baseField = {
|
|
56
65
|
name: field.getName(),
|
|
57
66
|
type: field.getType(),
|
|
58
67
|
value: field.getValue(),
|
|
59
68
|
isRequired: field.isRequired() ?? false,
|
|
69
|
+
...(description ? { description } : {}),
|
|
60
70
|
};
|
|
61
71
|
if (field.getType() === 'Enum') {
|
|
62
72
|
const enumField = action.getEnumField(field.getName());
|
|
63
73
|
return { ...baseField, enumValues: enumField.getOptions() ?? null };
|
|
64
74
|
}
|
|
65
|
-
|
|
75
|
+
const widgetOptions = field.getMultipleChoiceField().getOptions();
|
|
76
|
+
return widgetOptions?.length
|
|
77
|
+
? { ...baseField, allowedValues: widgetOptions.map(toAllowedValue) }
|
|
78
|
+
: baseField;
|
|
66
79
|
}),
|
|
67
80
|
canExecute,
|
|
68
81
|
requiredFields,
|
|
@@ -73,4 +86,4 @@ The response includes:
|
|
|
73
86
|
};
|
|
74
87
|
}, logger);
|
|
75
88
|
}
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWFjdGlvbi1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL2dldC1hY3Rpb24tZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXlCQSwyQ0E0RkM7QUFsSEQsNERBQW9FO0FBQ3BFLHdEQUErRDtBQUMvRCxtRkFBaUU7QUFTakUsNkZBQTZGO0FBQzdGLFNBQVMsY0FBYyxDQUFDLE1BQWU7SUFDckMsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xELE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBMEQsQ0FBQztRQUVwRixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQXlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0FBQ3JFLENBQUM7QUFFRCxTQUF3Qix3QkFBd0IsQ0FBQyxTQUFvQixFQUFFLEdBQWdCO0lBQ3JGLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQzVELE1BQU0sYUFBYSxHQUFHLElBQUEsMENBQXlCLEVBQUMsZUFBZSxDQUFDLENBQUM7SUFFakUsT0FBTyxJQUFBLDJCQUF1QixFQUM1QixTQUFTLEVBQ1QsZUFBZSxFQUNmO1FBQ0UsV0FBVyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRTtRQUNuQyxLQUFLLEVBQUUsc0JBQXNCO1FBQzdCLFdBQVcsRUFBRTs7Ozs7Ozs7Ozs7OztnSUFhNkc7UUFDMUgsV0FBVyxFQUFFLGFBQWE7S0FDM0IsRUFDRCxLQUFLLEVBQUUsT0FBOEIsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM5QyxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFBLHFDQUFzQixFQUNo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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.19.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.
|
|
20
|
-
"@forestadmin/forestadmin-client": "1.
|
|
19
|
+
"@forestadmin/agent-client": "1.12.0",
|
|
20
|
+
"@forestadmin/forestadmin-client": "1.41.1",
|
|
21
21
|
"@modelcontextprotocol/sdk": "^1.28.0",
|
|
22
22
|
"cors": "^2.8.5",
|
|
23
23
|
"express": "^5.2.1",
|