@forestadmin/mcp-server 0.1.0 → 1.0.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 +3 -3
- package/dist/index.js +0 -0
- package/dist/tools/list.js +16 -5
- package/package.json +3 -3
- package/dist/factory.d.ts +0 -51
- package/dist/factory.js +0 -40
- package/dist/forest-oauth-provider.test.d.ts +0 -2
- package/dist/forest-oauth-provider.test.js +0 -590
- package/dist/schemas/filter.test.d.ts +0 -2
- package/dist/schemas/filter.test.js +0 -234
- package/dist/server.test.d.ts +0 -2
- package/dist/server.test.js +0 -901
- package/dist/test-utils/mock-server.d.ts +0 -62
- package/dist/test-utils/mock-server.js +0 -187
- package/dist/tools/list.test.d.ts +0 -2
- package/dist/tools/list.test.js +0 -385
- package/dist/utils/activity-logs-creator.test.d.ts +0 -2
- package/dist/utils/activity-logs-creator.test.js +0 -239
- package/dist/utils/agent-caller.test.d.ts +0 -2
- package/dist/utils/agent-caller.test.js +0 -102
- package/dist/utils/error-parser.test.d.ts +0 -2
- package/dist/utils/error-parser.test.js +0 -124
- package/dist/utils/schema-fetcher.test.d.ts +0 -2
- package/dist/utils/schema-fetcher.test.js +0 -212
package/README.md
CHANGED
|
@@ -39,9 +39,9 @@ Or programmatically:
|
|
|
39
39
|
node dist/index.js
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
#### Environment Variables
|
|
43
43
|
|
|
44
|
-
The following environment variables are required to run the server:
|
|
44
|
+
The following environment variables are required to run the server as a standalone:
|
|
45
45
|
|
|
46
46
|
| Variable | Required | Default | Description |
|
|
47
47
|
|----------|----------|---------|-------------|
|
|
@@ -49,7 +49,7 @@ The following environment variables are required to run the server:
|
|
|
49
49
|
| `FOREST_AUTH_SECRET` | **Yes** | - | Your Forest Admin authentication secret (must match your agent) |
|
|
50
50
|
| `MCP_SERVER_PORT` | No | `3931` | Port for the HTTP server |
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
#### Example Configuration
|
|
53
53
|
|
|
54
54
|
```bash
|
|
55
55
|
export FOREST_ENV_SECRET="your-env-secret"
|
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/tools/list.js
CHANGED
|
@@ -50,6 +50,11 @@ const listArgumentSchema = zod_1.z.object({
|
|
|
50
50
|
number: zod_1.z.number().default(1).optional(),
|
|
51
51
|
})
|
|
52
52
|
.optional(),
|
|
53
|
+
enableCount: zod_1.z
|
|
54
|
+
.boolean()
|
|
55
|
+
.optional()
|
|
56
|
+
.default(false)
|
|
57
|
+
.describe('When true, also returns totalCount of matching records'),
|
|
53
58
|
});
|
|
54
59
|
function createListArgumentShape(collectionNames) {
|
|
55
60
|
return {
|
|
@@ -76,10 +81,16 @@ function declareListTool(mcpServer, forestServerUrl, logger, collectionNames = [
|
|
|
76
81
|
collectionName: options.collectionName,
|
|
77
82
|
});
|
|
78
83
|
try {
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
.
|
|
82
|
-
|
|
84
|
+
const collection = rpcClient.collection(options.collectionName);
|
|
85
|
+
if (options.enableCount) {
|
|
86
|
+
const [records, totalCount] = await Promise.all([
|
|
87
|
+
collection.list(options),
|
|
88
|
+
collection.count(options),
|
|
89
|
+
]);
|
|
90
|
+
return { content: [{ type: 'text', text: JSON.stringify({ records, totalCount }) }] };
|
|
91
|
+
}
|
|
92
|
+
const records = await collection.list(options);
|
|
93
|
+
return { content: [{ type: 'text', text: JSON.stringify({ records }) }] };
|
|
83
94
|
}
|
|
84
95
|
catch (error) {
|
|
85
96
|
// Parse error text if it's a JSON string from the agent
|
|
@@ -95,4 +106,4 @@ function declareListTool(mcpServer, forestServerUrl, logger, collectionNames = [
|
|
|
95
106
|
}
|
|
96
107
|
}, logger);
|
|
97
108
|
}
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBeUVBLGtDQXNFQztBQTNJRCw2QkFBd0I7QUFFeEIscUVBQWdEO0FBQ2hELGlHQUFrRTtBQUNsRSwrRUFBbUQ7QUFDbkQsK0VBQXVEO0FBQ3ZELGtFQUFzRjtBQUN0Rix5RkFBb0U7QUFFcEUsNEVBQTRFO0FBQzVFLE1BQU0scUJBQXFCLEdBQUcsT0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUMvQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUV4QyxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHFFQUFxRTtRQUNyRSxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7QUFDSCxDQUFDLEVBQUUsbUJBQVksQ0FBQyxDQUFDO0FBRWpCLE1BQU0sa0JBQWtCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsQyxjQUFjLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUMxQixNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM3QixPQUFPLEVBQUUscUJBQXFCO1NBQzNCLFFBQVEsQ0FDUCxvSkFBb0osQ0FDcko7U0FDQSxRQUFRLEVBQUU7SUFDYixJQUFJLEVBQUUsT0FBQztTQUNKLE1BQU0sQ0FBQztRQUNOLEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO1FBQ2pCLFNBQVMsRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFO0tBQ3ZCLENBQUM7U0FDRCxRQUFRLEVBQUU7SUFDYixzQkFBc0IsRUFBRSxPQUFDO1NBQ3RCLE9BQU8sRUFBRTtTQUNULFFBQVEsRUFBRTtTQUNWLE9BQU8sQ0FBQyxLQUFL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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/mcp-server",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.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": "
|
|
20
|
-
"@forestadmin/forestadmin-client": "
|
|
19
|
+
"@forestadmin/agent-client": "1.0.0",
|
|
20
|
+
"@forestadmin/forestadmin-client": "1.37.0",
|
|
21
21
|
"@modelcontextprotocol/sdk": "^1.25.1",
|
|
22
22
|
"cors": "^2.8.5",
|
|
23
23
|
"express": "^5.2.1",
|
package/dist/factory.d.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import type { HttpCallback } from './server';
|
|
2
|
-
import { Logger } from './server';
|
|
3
|
-
/**
|
|
4
|
-
* Context passed from the Forest Admin agent to the MCP factory.
|
|
5
|
-
*/
|
|
6
|
-
export interface McpFactoryContext {
|
|
7
|
-
/** Forest Admin server URL */
|
|
8
|
-
forestServerUrl: string;
|
|
9
|
-
/** Environment secret */
|
|
10
|
-
envSecret: string;
|
|
11
|
-
/** Authentication secret */
|
|
12
|
-
authSecret: string;
|
|
13
|
-
/** Logger function */
|
|
14
|
-
logger: Logger;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Options for the MCP factory function.
|
|
18
|
-
*/
|
|
19
|
-
export interface McpFactoryOptions {
|
|
20
|
-
/**
|
|
21
|
-
* Optional override for the base URL where the agent is publicly accessible.
|
|
22
|
-
* If not provided, it will be automatically fetched from Forest Admin API
|
|
23
|
-
* (the environment's api_endpoint configuration).
|
|
24
|
-
* Example: 'https://my-app.example.com' or 'http://localhost:3000'
|
|
25
|
-
*/
|
|
26
|
-
baseUrl?: string;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Factory function to create an MCP HTTP callback for use with the Forest Admin agent.
|
|
30
|
-
*
|
|
31
|
-
* This function is designed to be used with the `agent.useMcp()` method:
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```typescript
|
|
35
|
-
* import { createAgent } from '@forestadmin/agent';
|
|
36
|
-
* import { createMcpServer } from '@forestadmin/mcp-server';
|
|
37
|
-
*
|
|
38
|
-
* const agent = createAgent(options)
|
|
39
|
-
* .addDataSource(myDataSource)
|
|
40
|
-
* .useMcp(createMcpServer, { baseUrl: 'https://my-app.example.com' });
|
|
41
|
-
*
|
|
42
|
-
* agent.mountOnExpress(app);
|
|
43
|
-
* agent.start();
|
|
44
|
-
* ```
|
|
45
|
-
*
|
|
46
|
-
* @param context - Context containing Forest Admin configuration (provided by the agent)
|
|
47
|
-
* @param options - Optional configuration for the MCP server
|
|
48
|
-
* @returns An HTTP callback that handles MCP routes
|
|
49
|
-
*/
|
|
50
|
-
export declare function createMcpServer(context: McpFactoryContext, options?: McpFactoryOptions): Promise<HttpCallback>;
|
|
51
|
-
//# sourceMappingURL=factory.d.ts.map
|
package/dist/factory.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
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.createMcpServer = createMcpServer;
|
|
7
|
-
const server_1 = __importDefault(require("./server"));
|
|
8
|
-
/**
|
|
9
|
-
* Factory function to create an MCP HTTP callback for use with the Forest Admin agent.
|
|
10
|
-
*
|
|
11
|
-
* This function is designed to be used with the `agent.useMcp()` method:
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* import { createAgent } from '@forestadmin/agent';
|
|
16
|
-
* import { createMcpServer } from '@forestadmin/mcp-server';
|
|
17
|
-
*
|
|
18
|
-
* const agent = createAgent(options)
|
|
19
|
-
* .addDataSource(myDataSource)
|
|
20
|
-
* .useMcp(createMcpServer, { baseUrl: 'https://my-app.example.com' });
|
|
21
|
-
*
|
|
22
|
-
* agent.mountOnExpress(app);
|
|
23
|
-
* agent.start();
|
|
24
|
-
* ```
|
|
25
|
-
*
|
|
26
|
-
* @param context - Context containing Forest Admin configuration (provided by the agent)
|
|
27
|
-
* @param options - Optional configuration for the MCP server
|
|
28
|
-
* @returns An HTTP callback that handles MCP routes
|
|
29
|
-
*/
|
|
30
|
-
async function createMcpServer(context, options) {
|
|
31
|
-
const mcpServer = new server_1.default({
|
|
32
|
-
forestServerUrl: context.forestServerUrl,
|
|
33
|
-
envSecret: context.envSecret,
|
|
34
|
-
authSecret: context.authSecret,
|
|
35
|
-
logger: context.logger,
|
|
36
|
-
});
|
|
37
|
-
const baseUrl = options?.baseUrl ? new URL('/', options.baseUrl) : undefined;
|
|
38
|
-
return mcpServer.getHttpCallback(baseUrl);
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBcURBLDBDQWNDO0FBakVELHNEQUFtRDtBQTZCbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNJLEtBQUssVUFBVSxlQUFlLENBQ25DLE9BQTBCLEVBQzFCLE9BQTJCO0lBRTNCLE1BQU0sU0FBUyxHQUFHLElBQUksZ0JBQWUsQ0FBQztRQUNwQyxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7UUFDeEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtRQUM5QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLEdBQUcsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRTdFLE9BQU8sU0FBUyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1QyxDQUFDIn0=
|