@reverso/mcp 0.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/README.md +64 -0
- package/dist/bin.d.ts +10 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +87 -0
- package/dist/bin.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +51 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +193 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/content.d.ts +177 -0
- package/dist/tools/content.d.ts.map +1 -0
- package/dist/tools/content.js +143 -0
- package/dist/tools/content.js.map +1 -0
- package/dist/tools/forms.d.ts +197 -0
- package/dist/tools/forms.d.ts.map +1 -0
- package/dist/tools/forms.js +132 -0
- package/dist/tools/forms.js.map +1 -0
- package/dist/tools/generation.d.ts +98 -0
- package/dist/tools/generation.d.ts.map +1 -0
- package/dist/tools/generation.js +213 -0
- package/dist/tools/generation.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/media.d.ts +160 -0
- package/dist/tools/media.d.ts.map +1 -0
- package/dist/tools/media.js +143 -0
- package/dist/tools/media.js.map +1 -0
- package/dist/tools/schema.d.ts +86 -0
- package/dist/tools/schema.d.ts.map +1 -0
- package/dist/tools/schema.js +263 -0
- package/dist/tools/schema.js.map +1 -0
- package/dist/types.d.ts +39 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +65 -0
package/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# @reverso/mcp
|
|
2
|
+
|
|
3
|
+
MCP Server for AI integration with Reverso CMS.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @reverso/mcp
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
Start the MCP server:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
reverso-mcp --database ./data/reverso.db
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Claude Desktop Configuration
|
|
20
|
+
|
|
21
|
+
Add to `claude_desktop_config.json`:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"mcpServers": {
|
|
26
|
+
"reverso": {
|
|
27
|
+
"command": "npx",
|
|
28
|
+
"args": ["@reverso/mcp", "--database", "/path/to/reverso.db"]
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Available Tools
|
|
35
|
+
|
|
36
|
+
### Content Management
|
|
37
|
+
- `list_pages` - List all pages
|
|
38
|
+
- `get_page` - Get page details
|
|
39
|
+
- `get_content` - Get content by path
|
|
40
|
+
- `update_content` - Update content
|
|
41
|
+
- `publish_content` / `unpublish_content`
|
|
42
|
+
|
|
43
|
+
### Schema
|
|
44
|
+
- `get_schema` - Get full schema
|
|
45
|
+
- `get_fields` - Get fields for a page
|
|
46
|
+
- `suggest_field_type` - AI field type suggestion
|
|
47
|
+
|
|
48
|
+
### Media
|
|
49
|
+
- `list_media` - Browse media library
|
|
50
|
+
- `search_media` - Search files
|
|
51
|
+
- `get_media_stats` - Library statistics
|
|
52
|
+
|
|
53
|
+
### Forms
|
|
54
|
+
- `list_forms` - List all forms
|
|
55
|
+
- `get_form` - Get form details
|
|
56
|
+
- `list_submissions` - View submissions
|
|
57
|
+
|
|
58
|
+
## Documentation
|
|
59
|
+
|
|
60
|
+
See [https://reverso.dev/docs/packages/mcp](https://reverso.dev/docs/packages/mcp)
|
|
61
|
+
|
|
62
|
+
## License
|
|
63
|
+
|
|
64
|
+
MIT
|
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;GAMG"}
|
package/dist/bin.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Reverso MCP Server CLI entry point.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* reverso-mcp --database .reverso/dev.db
|
|
7
|
+
* reverso-mcp -d /path/to/database.db
|
|
8
|
+
*/
|
|
9
|
+
import { resolve } from 'node:path';
|
|
10
|
+
import { startMcpServer } from './server.js';
|
|
11
|
+
import { VERSION } from './index.js';
|
|
12
|
+
function parseArgs(args) {
|
|
13
|
+
const result = {
|
|
14
|
+
database: '.reverso/dev.db',
|
|
15
|
+
help: false,
|
|
16
|
+
version: false,
|
|
17
|
+
};
|
|
18
|
+
for (let i = 0; i < args.length; i++) {
|
|
19
|
+
const arg = args[i];
|
|
20
|
+
if (arg === '--help' || arg === '-h') {
|
|
21
|
+
result.help = true;
|
|
22
|
+
}
|
|
23
|
+
else if (arg === '--version' || arg === '-v') {
|
|
24
|
+
result.version = true;
|
|
25
|
+
}
|
|
26
|
+
else if (arg === '--database' || arg === '-d') {
|
|
27
|
+
result.database = args[++i] ?? result.database;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
function printHelp() {
|
|
33
|
+
console.info(`
|
|
34
|
+
Reverso MCP Server - AI integration for Reverso CMS
|
|
35
|
+
|
|
36
|
+
Usage:
|
|
37
|
+
reverso-mcp [options]
|
|
38
|
+
|
|
39
|
+
Options:
|
|
40
|
+
-d, --database <path> Database file path (default: .reverso/dev.db)
|
|
41
|
+
-h, --help Show this help message
|
|
42
|
+
-v, --version Show version number
|
|
43
|
+
|
|
44
|
+
Examples:
|
|
45
|
+
reverso-mcp
|
|
46
|
+
reverso-mcp --database ./data/cms.db
|
|
47
|
+
reverso-mcp -d /path/to/project/.reverso/dev.db
|
|
48
|
+
|
|
49
|
+
MCP Configuration:
|
|
50
|
+
Add to your Claude Desktop config (claude_desktop_config.json):
|
|
51
|
+
|
|
52
|
+
{
|
|
53
|
+
"mcpServers": {
|
|
54
|
+
"reverso": {
|
|
55
|
+
"command": "npx",
|
|
56
|
+
"args": ["reverso-mcp", "-d", "/path/to/your/.reverso/dev.db"]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
`);
|
|
61
|
+
}
|
|
62
|
+
function printVersion() {
|
|
63
|
+
console.info(`reverso-mcp v${VERSION}`);
|
|
64
|
+
}
|
|
65
|
+
async function main() {
|
|
66
|
+
const args = parseArgs(process.argv.slice(2));
|
|
67
|
+
if (args.help) {
|
|
68
|
+
printHelp();
|
|
69
|
+
process.exit(0);
|
|
70
|
+
}
|
|
71
|
+
if (args.version) {
|
|
72
|
+
printVersion();
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
const databasePath = resolve(args.database);
|
|
76
|
+
// Start the MCP server
|
|
77
|
+
await startMcpServer({
|
|
78
|
+
databasePath,
|
|
79
|
+
name: 'reverso-mcp',
|
|
80
|
+
version: VERSION,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
main().catch((error) => {
|
|
84
|
+
console.error('Failed to start MCP server:', error);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAAG;QACb,QAAQ,EAAE,iBAAiB;QAC3B,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,KAAK;KACf,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC/C,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAChD,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Bd,CAAC,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,CAAC,IAAI,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE5C,uBAAuB;IACvB,MAAM,cAAc,CAAC;QACnB,YAAY;QACZ,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @reverso/mcp
|
|
3
|
+
*
|
|
4
|
+
* MCP Server for AI integration with Reverso CMS.
|
|
5
|
+
* Allows AI assistants to interact with CMS content via Model Context Protocol.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createMcpServer, startMcpServer } from '@reverso/mcp';
|
|
10
|
+
*
|
|
11
|
+
* // Start the server
|
|
12
|
+
* await startMcpServer({
|
|
13
|
+
* databasePath: '.reverso/dev.db',
|
|
14
|
+
* });
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* Add to Claude Desktop config (claude_desktop_config.json):
|
|
19
|
+
* ```json
|
|
20
|
+
* {
|
|
21
|
+
* "mcpServers": {
|
|
22
|
+
* "reverso": {
|
|
23
|
+
* "command": "npx",
|
|
24
|
+
* "args": ["reverso-mcp", "-d", "/path/to/.reverso/dev.db"]
|
|
25
|
+
* }
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare const VERSION = "0.0.0";
|
|
31
|
+
export { ReversoMcpServer, createMcpServer, startMcpServer } from './server.js';
|
|
32
|
+
export { contentTools } from './tools/content.js';
|
|
33
|
+
export { schemaTools } from './tools/schema.js';
|
|
34
|
+
export { mediaTools } from './tools/media.js';
|
|
35
|
+
export { formsTools } from './tools/forms.js';
|
|
36
|
+
export { generationTools } from './tools/generation.js';
|
|
37
|
+
export type { McpServerConfig, ContentUpdateInput, ContentGenerationInput, FieldTypeSuggestion, ContentAnalysis } from './types.js';
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,eAAO,MAAM,OAAO,UAAU,CAAC;AAG/B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGhF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @reverso/mcp
|
|
3
|
+
*
|
|
4
|
+
* MCP Server for AI integration with Reverso CMS.
|
|
5
|
+
* Allows AI assistants to interact with CMS content via Model Context Protocol.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createMcpServer, startMcpServer } from '@reverso/mcp';
|
|
10
|
+
*
|
|
11
|
+
* // Start the server
|
|
12
|
+
* await startMcpServer({
|
|
13
|
+
* databasePath: '.reverso/dev.db',
|
|
14
|
+
* });
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* Add to Claude Desktop config (claude_desktop_config.json):
|
|
19
|
+
* ```json
|
|
20
|
+
* {
|
|
21
|
+
* "mcpServers": {
|
|
22
|
+
* "reverso": {
|
|
23
|
+
* "command": "npx",
|
|
24
|
+
* "args": ["reverso-mcp", "-d", "/path/to/.reverso/dev.db"]
|
|
25
|
+
* }
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export const VERSION = '0.0.0';
|
|
31
|
+
// Server exports
|
|
32
|
+
export { ReversoMcpServer, createMcpServer, startMcpServer } from './server.js';
|
|
33
|
+
// Tool exports
|
|
34
|
+
export { contentTools } from './tools/content.js';
|
|
35
|
+
export { schemaTools } from './tools/schema.js';
|
|
36
|
+
export { mediaTools } from './tools/media.js';
|
|
37
|
+
export { formsTools } from './tools/forms.js';
|
|
38
|
+
export { generationTools } from './tools/generation.js';
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,iBAAiB;AACjB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhF,eAAe;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reverso MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides AI assistants with tools to interact with Reverso CMS content.
|
|
5
|
+
*/
|
|
6
|
+
import type { McpServerConfig } from './types.js';
|
|
7
|
+
export declare class ReversoMcpServer {
|
|
8
|
+
private server;
|
|
9
|
+
private db;
|
|
10
|
+
private config;
|
|
11
|
+
private isAuthenticated;
|
|
12
|
+
constructor(config: McpServerConfig);
|
|
13
|
+
/**
|
|
14
|
+
* Validate that the server is authenticated.
|
|
15
|
+
* Throws if auth is required but not provided.
|
|
16
|
+
*/
|
|
17
|
+
private validateAuth;
|
|
18
|
+
/**
|
|
19
|
+
* Register all tools with the MCP server.
|
|
20
|
+
*/
|
|
21
|
+
private registerTools;
|
|
22
|
+
/**
|
|
23
|
+
* Register a group of tools.
|
|
24
|
+
*/
|
|
25
|
+
private registerToolGroup;
|
|
26
|
+
/**
|
|
27
|
+
* Register resources with the MCP server.
|
|
28
|
+
*/
|
|
29
|
+
private registerResources;
|
|
30
|
+
/**
|
|
31
|
+
* Get or create database connection.
|
|
32
|
+
*/
|
|
33
|
+
private getDatabase;
|
|
34
|
+
/**
|
|
35
|
+
* Start the MCP server with stdio transport.
|
|
36
|
+
*/
|
|
37
|
+
start(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Close the server and database connection.
|
|
40
|
+
*/
|
|
41
|
+
close(): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create and start a Reverso MCP server.
|
|
45
|
+
*/
|
|
46
|
+
export declare function createMcpServer(config: McpServerConfig): Promise<ReversoMcpServer>;
|
|
47
|
+
/**
|
|
48
|
+
* Start the MCP server with the given configuration.
|
|
49
|
+
*/
|
|
50
|
+
export declare function startMcpServer(config: McpServerConfig): Promise<void>;
|
|
51
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAOlD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,EAAE,CAAgC;IAC1C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,eAAe,CAAS;gBAEpB,MAAM,EAAE,eAAe;IAwBnC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgDzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6DzB;;OAEG;YACW,WAAW;IAOzB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAGxF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reverso MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides AI assistants with tools to interact with Reverso CMS content.
|
|
5
|
+
*/
|
|
6
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { createDatabase } from '@reverso/db';
|
|
10
|
+
import { contentTools } from './tools/content.js';
|
|
11
|
+
import { schemaTools } from './tools/schema.js';
|
|
12
|
+
import { mediaTools } from './tools/media.js';
|
|
13
|
+
import { formsTools } from './tools/forms.js';
|
|
14
|
+
import { generationTools } from './tools/generation.js';
|
|
15
|
+
export class ReversoMcpServer {
|
|
16
|
+
server;
|
|
17
|
+
db = null;
|
|
18
|
+
config;
|
|
19
|
+
isAuthenticated = false;
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.config = config;
|
|
22
|
+
// Validate API key if authentication is enabled
|
|
23
|
+
const apiKey = config.apiKey || process.env.REVERSO_MCP_API_KEY;
|
|
24
|
+
const authEnabled = config.authEnabled ?? !!apiKey;
|
|
25
|
+
if (authEnabled && !apiKey) {
|
|
26
|
+
console.error('[MCP] Warning: Authentication enabled but no API key provided.');
|
|
27
|
+
console.error('[MCP] Set REVERSO_MCP_API_KEY environment variable or pass apiKey in config.');
|
|
28
|
+
}
|
|
29
|
+
// In production-like environments, authentication is validated at startup
|
|
30
|
+
this.isAuthenticated = !authEnabled || !!apiKey;
|
|
31
|
+
this.server = new McpServer({
|
|
32
|
+
name: config.name ?? 'reverso-mcp',
|
|
33
|
+
version: config.version ?? '0.0.0',
|
|
34
|
+
});
|
|
35
|
+
this.registerTools();
|
|
36
|
+
this.registerResources();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validate that the server is authenticated.
|
|
40
|
+
* Throws if auth is required but not provided.
|
|
41
|
+
*/
|
|
42
|
+
validateAuth() {
|
|
43
|
+
if (!this.isAuthenticated) {
|
|
44
|
+
throw new Error('MCP Server requires authentication. Set REVERSO_MCP_API_KEY environment variable.');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Register all tools with the MCP server.
|
|
49
|
+
*/
|
|
50
|
+
registerTools() {
|
|
51
|
+
// Content tools
|
|
52
|
+
this.registerToolGroup(contentTools, 'content');
|
|
53
|
+
// Schema tools
|
|
54
|
+
this.registerToolGroup(schemaTools, 'schema');
|
|
55
|
+
// Media tools
|
|
56
|
+
this.registerToolGroup(mediaTools, 'media');
|
|
57
|
+
// Forms tools
|
|
58
|
+
this.registerToolGroup(formsTools, 'forms');
|
|
59
|
+
// Generation tools
|
|
60
|
+
this.registerToolGroup(generationTools, 'ai');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Register a group of tools.
|
|
64
|
+
*/
|
|
65
|
+
registerToolGroup(
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
67
|
+
tools, prefix) {
|
|
68
|
+
for (const [name, tool] of Object.entries(tools)) {
|
|
69
|
+
const toolName = `${prefix}_${name}`;
|
|
70
|
+
this.server.tool(toolName, tool.description, tool.inputSchema instanceof z.ZodObject
|
|
71
|
+
? tool.inputSchema.shape
|
|
72
|
+
: {}, async (input) => {
|
|
73
|
+
try {
|
|
74
|
+
// Validate authentication before executing any tool
|
|
75
|
+
this.validateAuth();
|
|
76
|
+
const db = await this.getDatabase();
|
|
77
|
+
const result = await tool.handler(db, input);
|
|
78
|
+
return {
|
|
79
|
+
content: [
|
|
80
|
+
{
|
|
81
|
+
type: 'text',
|
|
82
|
+
text: JSON.stringify(result, null, 2),
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
return {
|
|
89
|
+
content: [
|
|
90
|
+
{
|
|
91
|
+
type: 'text',
|
|
92
|
+
text: JSON.stringify({
|
|
93
|
+
error: true,
|
|
94
|
+
message: error instanceof Error ? error.message : String(error),
|
|
95
|
+
}),
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
isError: true,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Register resources with the MCP server.
|
|
106
|
+
*/
|
|
107
|
+
registerResources() {
|
|
108
|
+
// Schema resource
|
|
109
|
+
this.server.resource('schema', 'reverso://schema', async () => {
|
|
110
|
+
const db = await this.getDatabase();
|
|
111
|
+
const result = await schemaTools.get_schema.handler(db, {});
|
|
112
|
+
return {
|
|
113
|
+
contents: [
|
|
114
|
+
{
|
|
115
|
+
uri: 'reverso://schema',
|
|
116
|
+
mimeType: 'application/json',
|
|
117
|
+
text: JSON.stringify(result, null, 2),
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
// Pages resource template
|
|
123
|
+
this.server.resource('page', 'reverso://pages/{slug}', async (uri) => {
|
|
124
|
+
const db = await this.getDatabase();
|
|
125
|
+
const slug = uri.pathname.split('/').pop() ?? '';
|
|
126
|
+
const result = await contentTools.get_page.handler(db, { slug });
|
|
127
|
+
return {
|
|
128
|
+
contents: [
|
|
129
|
+
{
|
|
130
|
+
uri: uri.href,
|
|
131
|
+
mimeType: 'application/json',
|
|
132
|
+
text: JSON.stringify(result, null, 2),
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
// Content resource template
|
|
138
|
+
this.server.resource('content', 'reverso://content/{path}', async (uri) => {
|
|
139
|
+
const db = await this.getDatabase();
|
|
140
|
+
const path = uri.pathname.replace('/content/', '');
|
|
141
|
+
const result = await contentTools.get_content.handler(db, { path });
|
|
142
|
+
return {
|
|
143
|
+
contents: [
|
|
144
|
+
{
|
|
145
|
+
uri: uri.href,
|
|
146
|
+
mimeType: 'application/json',
|
|
147
|
+
text: JSON.stringify(result, null, 2),
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
};
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get or create database connection.
|
|
155
|
+
*/
|
|
156
|
+
async getDatabase() {
|
|
157
|
+
if (!this.db) {
|
|
158
|
+
this.db = await createDatabase({ url: this.config.databasePath });
|
|
159
|
+
}
|
|
160
|
+
return this.db;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Start the MCP server with stdio transport.
|
|
164
|
+
*/
|
|
165
|
+
async start() {
|
|
166
|
+
const transport = new StdioServerTransport();
|
|
167
|
+
await this.server.connect(transport);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Close the server and database connection.
|
|
171
|
+
*/
|
|
172
|
+
async close() {
|
|
173
|
+
if (this.db) {
|
|
174
|
+
// Database cleanup if needed
|
|
175
|
+
this.db = null;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Create and start a Reverso MCP server.
|
|
181
|
+
*/
|
|
182
|
+
export async function createMcpServer(config) {
|
|
183
|
+
const server = new ReversoMcpServer(config);
|
|
184
|
+
return server;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Start the MCP server with the given configuration.
|
|
188
|
+
*/
|
|
189
|
+
export async function startMcpServer(config) {
|
|
190
|
+
const server = await createMcpServer(config);
|
|
191
|
+
await server.start();
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|