@nodusapi/mcp-server 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.
Files changed (50) hide show
  1. package/IMPLEMENTATION_SUMMARY.md +210 -0
  2. package/LICENSE +21 -0
  3. package/NPM_TOKEN_GUIDE.md +58 -0
  4. package/PUBLISH_GUIDE.md +152 -0
  5. package/QUICKSTART.md +139 -0
  6. package/README.md +394 -0
  7. package/cursor-config.example.json +13 -0
  8. package/dist/client/nodus-client.d.ts +30 -0
  9. package/dist/client/nodus-client.d.ts.map +1 -0
  10. package/dist/client/nodus-client.js +121 -0
  11. package/dist/client/nodus-client.js.map +1 -0
  12. package/dist/client/types.d.ts +81 -0
  13. package/dist/client/types.d.ts.map +1 -0
  14. package/dist/client/types.js +2 -0
  15. package/dist/client/types.js.map +1 -0
  16. package/dist/config.d.ts +6 -0
  17. package/dist/config.d.ts.map +1 -0
  18. package/dist/config.js +75 -0
  19. package/dist/config.js.map +1 -0
  20. package/dist/index.d.ts +3 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +63 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/resources/schema-resources.d.ts +4 -0
  25. package/dist/resources/schema-resources.d.ts.map +1 -0
  26. package/dist/resources/schema-resources.js +113 -0
  27. package/dist/resources/schema-resources.js.map +1 -0
  28. package/dist/tools/data-tools.d.ts +4 -0
  29. package/dist/tools/data-tools.d.ts.map +1 -0
  30. package/dist/tools/data-tools.js +229 -0
  31. package/dist/tools/data-tools.js.map +1 -0
  32. package/dist/tools/project-tools.d.ts +4 -0
  33. package/dist/tools/project-tools.d.ts.map +1 -0
  34. package/dist/tools/project-tools.js +226 -0
  35. package/dist/tools/project-tools.js.map +1 -0
  36. package/dist/tools/schema-tools.d.ts +4 -0
  37. package/dist/tools/schema-tools.d.ts.map +1 -0
  38. package/dist/tools/schema-tools.js +274 -0
  39. package/dist/tools/schema-tools.js.map +1 -0
  40. package/dist/utils/auth.d.ts +5 -0
  41. package/dist/utils/auth.d.ts.map +1 -0
  42. package/dist/utils/auth.js +27 -0
  43. package/dist/utils/auth.js.map +1 -0
  44. package/dist/utils/validation.d.ts +168 -0
  45. package/dist/utils/validation.d.ts.map +1 -0
  46. package/dist/utils/validation.js +68 -0
  47. package/dist/utils/validation.js.map +1 -0
  48. package/docs/project-goal-mcp.md +129 -0
  49. package/docs/research/mcp-links.md +2 -0
  50. package/package.json +51 -0
package/dist/config.js ADDED
@@ -0,0 +1,75 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ const CONFIG_DIR = path.join(os.homedir(), '.nodus-mcp');
5
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
6
+ export async function loadConfig() {
7
+ try {
8
+ const configData = await fs.readFile(CONFIG_FILE, 'utf-8');
9
+ return JSON.parse(configData);
10
+ }
11
+ catch (error) {
12
+ return null;
13
+ }
14
+ }
15
+ export async function saveConfig(config) {
16
+ try {
17
+ await fs.mkdir(CONFIG_DIR, { recursive: true });
18
+ await fs.writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
19
+ }
20
+ catch (error) {
21
+ throw new Error(`Failed to save configuration: ${error}`);
22
+ }
23
+ }
24
+ export async function getConfig() {
25
+ const apiKey = process.env.NODUS_API_KEY;
26
+ const projectId = process.env.NODUS_PROJECT_ID;
27
+ const apiUrl = process.env.NODUS_API_URL || 'https://api.nodus.com';
28
+ if (apiKey) {
29
+ return {
30
+ apiKey,
31
+ projectId,
32
+ apiUrl,
33
+ };
34
+ }
35
+ const savedConfig = await loadConfig();
36
+ if (savedConfig) {
37
+ return savedConfig;
38
+ }
39
+ throw new Error('No API key found. Please set NODUS_API_KEY environment variable or run the interactive setup.');
40
+ }
41
+ export async function promptForConfig() {
42
+ console.error('\n=== Nodus MCP Server Configuration ===\n');
43
+ console.error('No configuration found. Please provide your Nodus API credentials.\n');
44
+ console.error('You can get your API key from the Nodus dashboard.\n');
45
+ const readline = await import('readline');
46
+ const rl = readline.createInterface({
47
+ input: process.stdin,
48
+ output: process.stderr,
49
+ });
50
+ const question = (query) => {
51
+ return new Promise((resolve) => {
52
+ rl.question(query, resolve);
53
+ });
54
+ };
55
+ try {
56
+ const apiKey = await question('API Key: ');
57
+ if (!apiKey || !apiKey.trim()) {
58
+ throw new Error('API Key is required');
59
+ }
60
+ const apiUrl = await question('API URL (default: https://api.nodus.com): ');
61
+ const projectId = await question('Project ID (optional, press Enter to skip): ');
62
+ const config = {
63
+ apiKey: apiKey.trim(),
64
+ apiUrl: apiUrl.trim() || 'https://api.nodus.com',
65
+ projectId: projectId.trim() || undefined,
66
+ };
67
+ await saveConfig(config);
68
+ console.error('\n✓ Configuration saved successfully!\n');
69
+ return config;
70
+ }
71
+ finally {
72
+ rl.close();
73
+ }
74
+ }
75
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACzD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAmB;IAClD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,uBAAuB,CAAC;IAEpE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,MAAM;YACN,SAAS;YACT,MAAM;SACP,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,UAAU,EAAE,CAAC;IACvC,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC5D,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;IACtF,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAEtE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAmB,EAAE;QAClD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,4CAA4C,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,8CAA8C,CAAC,CAAC;QAEjF,MAAM,MAAM,GAAgB;YAC1B,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;YACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,uBAAuB;YAChD,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,SAAS;SACzC,CAAC;QAEF,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAEzD,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { NodusClient } from './client/nodus-client.js';
5
+ import { getConfig, promptForConfig } from './config.js';
6
+ import { validateConfig, maskApiKey } from './utils/auth.js';
7
+ import { registerDataTools } from './tools/data-tools.js';
8
+ import { registerSchemaTools } from './tools/schema-tools.js';
9
+ import { registerProjectTools } from './tools/project-tools.js';
10
+ import { registerResources } from './resources/schema-resources.js';
11
+ async function main() {
12
+ console.error('Starting Nodus MCP Server...\n');
13
+ let config;
14
+ try {
15
+ config = await getConfig();
16
+ }
17
+ catch (error) {
18
+ console.error('No configuration found. Starting interactive setup...\n');
19
+ config = await promptForConfig();
20
+ }
21
+ try {
22
+ validateConfig(config);
23
+ console.error(`✓ Configuration validated`);
24
+ console.error(`✓ API Key: ${maskApiKey(config.apiKey)}`);
25
+ console.error(`✓ API URL: ${config.apiUrl}`);
26
+ if (config.projectId) {
27
+ console.error(`✓ Project ID: ${config.projectId}`);
28
+ }
29
+ console.error('');
30
+ }
31
+ catch (error) {
32
+ console.error(`❌ Configuration error: ${error instanceof Error ? error.message : String(error)}`);
33
+ process.exit(1);
34
+ }
35
+ const client = new NodusClient(config.apiKey, config.apiUrl);
36
+ const server = new Server({
37
+ name: 'nodus-mcp-server',
38
+ version: '1.0.0',
39
+ }, {
40
+ capabilities: {
41
+ tools: {},
42
+ resources: {},
43
+ },
44
+ });
45
+ registerDataTools(server, client);
46
+ registerSchemaTools(server, client);
47
+ registerProjectTools(server, client);
48
+ registerResources(server, client);
49
+ const transport = new StdioServerTransport();
50
+ await server.connect(transport);
51
+ console.error('✓ Nodus MCP Server is running!\n');
52
+ console.error('Available capabilities:');
53
+ console.error(' - Data CRUD: list_rows, get_row, create_row, update_row, delete_row');
54
+ console.error(' - Schema Management: list_tables, get_table_schema, create_table, update_table, add_column, update_column');
55
+ console.error(' - Project Management: list_projects, create_project, switch_project, list_api_keys, create_api_key');
56
+ console.error(' - Resources: nodus://schemas/tables\n');
57
+ console.error('Server is ready to receive requests from MCP clients.\n');
58
+ }
59
+ main().catch((error) => {
60
+ console.error('Fatal error:', error);
61
+ process.exit(1);
62
+ });
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { NodusClient } from '../client/nodus-client.js';
3
+ export declare function registerResources(server: Server, client: NodusClient): void;
4
+ //# sourceMappingURL=schema-resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-resources.d.ts","sourceRoot":"","sources":["../../src/resources/schema-resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,QA6HpE"}
@@ -0,0 +1,113 @@
1
+ import { ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
2
+ export function registerResources(server, client) {
3
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
4
+ return {
5
+ resources: [
6
+ {
7
+ uri: 'nodus://schemas/tables',
8
+ name: 'Database Tables',
9
+ description: 'List of all database tables and their schemas',
10
+ mimeType: 'application/json',
11
+ },
12
+ ],
13
+ };
14
+ });
15
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
16
+ const { uri } = request.params;
17
+ try {
18
+ if (uri === 'nodus://schemas/tables') {
19
+ const tables = await client.getTables();
20
+ const tablesWithSchemas = await Promise.all(tables.map(async (table) => {
21
+ try {
22
+ const fullTable = await client.getTable(table.slug);
23
+ return {
24
+ name: fullTable.name,
25
+ slug: fullTable.slug,
26
+ rowCount: table.rowCount || 0,
27
+ columns: fullTable.columns.map((col) => ({
28
+ name: col.name,
29
+ slug: col.slug,
30
+ type: col.type,
31
+ isRequired: col.isRequired,
32
+ defaultValue: col.defaultValue,
33
+ })),
34
+ };
35
+ }
36
+ catch (error) {
37
+ return {
38
+ name: table.name,
39
+ slug: table.slug,
40
+ rowCount: table.rowCount || 0,
41
+ columns: [],
42
+ error: 'Failed to load column details',
43
+ };
44
+ }
45
+ }));
46
+ const resourceContent = {
47
+ description: 'Database schema information for all tables in the project',
48
+ tables: tablesWithSchemas,
49
+ totalTables: tablesWithSchemas.length,
50
+ summary: `This project has ${tablesWithSchemas.length} table(s). Use the schema tools to create new tables or modify existing ones. Use the data tools to query and manipulate rows.`,
51
+ };
52
+ return {
53
+ contents: [
54
+ {
55
+ uri,
56
+ mimeType: 'application/json',
57
+ text: JSON.stringify(resourceContent, null, 2),
58
+ },
59
+ ],
60
+ };
61
+ }
62
+ const tableSlugMatch = uri.match(/^nodus:\/\/schemas\/tables\/(.+)$/);
63
+ if (tableSlugMatch) {
64
+ const tableSlug = tableSlugMatch[1];
65
+ const table = await client.getTable(tableSlug);
66
+ const resourceContent = {
67
+ table: {
68
+ name: table.name,
69
+ slug: table.slug,
70
+ createdAt: table.createdAt,
71
+ updatedAt: table.updatedAt,
72
+ },
73
+ columns: table.columns.map((col) => ({
74
+ name: col.name,
75
+ slug: col.slug,
76
+ type: col.type,
77
+ isRequired: col.isRequired,
78
+ defaultValue: col.defaultValue,
79
+ createdAt: col.createdAt,
80
+ })),
81
+ columnCount: table.columns.length,
82
+ summary: `Table "${table.name}" has ${table.columns.length} column(s). Use data tools to query rows from this table.`,
83
+ };
84
+ return {
85
+ contents: [
86
+ {
87
+ uri,
88
+ mimeType: 'application/json',
89
+ text: JSON.stringify(resourceContent, null, 2),
90
+ },
91
+ ],
92
+ };
93
+ }
94
+ throw new Error(`Unknown resource URI: ${uri}`);
95
+ }
96
+ catch (error) {
97
+ const errorMessage = error instanceof Error ? error.message : String(error);
98
+ return {
99
+ contents: [
100
+ {
101
+ uri,
102
+ mimeType: 'application/json',
103
+ text: JSON.stringify({
104
+ error: errorMessage,
105
+ uri,
106
+ }, null, 2),
107
+ },
108
+ ],
109
+ };
110
+ }
111
+ });
112
+ }
113
+ //# sourceMappingURL=schema-resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-resources.js","sourceRoot":"","sources":["../../src/resources/schema-resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { NodusClient } from '../client/nodus-client.js';
3
+ export declare function registerDataTools(server: Server, client: NodusClient): void;
4
+ //# sourceMappingURL=data-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-tools.d.ts","sourceRoot":"","sources":["../../src/tools/data-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AASxD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,QAuQpE"}
@@ -0,0 +1,229 @@
1
+ import { ListToolsRequestSchema, CallToolRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
2
+ import { ListRowsSchema, GetRowSchema, CreateRowSchema, UpdateRowSchema, DeleteRowSchema, } from '../utils/validation.js';
3
+ export function registerDataTools(server, client) {
4
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
5
+ const tools = [
6
+ {
7
+ name: 'list_rows',
8
+ description: 'List rows from a table with pagination and filtering support',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ tableSlug: {
13
+ type: 'string',
14
+ description: 'Table identifier (slug)',
15
+ },
16
+ page: {
17
+ type: 'number',
18
+ description: 'Page number for pagination',
19
+ default: 1,
20
+ },
21
+ limit: {
22
+ type: 'number',
23
+ description: 'Number of rows per page (max 100)',
24
+ default: 20,
25
+ },
26
+ orderBy: {
27
+ type: 'string',
28
+ description: 'Column to order by',
29
+ },
30
+ orderDir: {
31
+ type: 'string',
32
+ enum: ['ASC', 'DESC'],
33
+ description: 'Sort direction',
34
+ },
35
+ filters: {
36
+ type: 'object',
37
+ description: 'Filters to apply (column: value pairs)',
38
+ },
39
+ },
40
+ required: ['tableSlug'],
41
+ },
42
+ },
43
+ {
44
+ name: 'get_row',
45
+ description: 'Get a single row by ID from a table',
46
+ inputSchema: {
47
+ type: 'object',
48
+ properties: {
49
+ tableSlug: {
50
+ type: 'string',
51
+ description: 'Table identifier (slug)',
52
+ },
53
+ id: {
54
+ type: 'string',
55
+ description: 'Row UUID',
56
+ },
57
+ },
58
+ required: ['tableSlug', 'id'],
59
+ },
60
+ },
61
+ {
62
+ name: 'create_row',
63
+ description: 'Create a new row in a table',
64
+ inputSchema: {
65
+ type: 'object',
66
+ properties: {
67
+ tableSlug: {
68
+ type: 'string',
69
+ description: 'Table identifier (slug)',
70
+ },
71
+ data: {
72
+ type: 'object',
73
+ description: 'Row data matching table schema',
74
+ },
75
+ },
76
+ required: ['tableSlug', 'data'],
77
+ },
78
+ },
79
+ {
80
+ name: 'update_row',
81
+ description: 'Update an existing row in a table',
82
+ inputSchema: {
83
+ type: 'object',
84
+ properties: {
85
+ tableSlug: {
86
+ type: 'string',
87
+ description: 'Table identifier (slug)',
88
+ },
89
+ id: {
90
+ type: 'string',
91
+ description: 'Row UUID',
92
+ },
93
+ data: {
94
+ type: 'object',
95
+ description: 'Partial row data to update',
96
+ },
97
+ },
98
+ required: ['tableSlug', 'id', 'data'],
99
+ },
100
+ },
101
+ {
102
+ name: 'delete_row',
103
+ description: 'Delete a row from a table',
104
+ inputSchema: {
105
+ type: 'object',
106
+ properties: {
107
+ tableSlug: {
108
+ type: 'string',
109
+ description: 'Table identifier (slug)',
110
+ },
111
+ id: {
112
+ type: 'string',
113
+ description: 'Row UUID to delete',
114
+ },
115
+ },
116
+ required: ['tableSlug', 'id'],
117
+ },
118
+ },
119
+ ];
120
+ return { tools };
121
+ });
122
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
123
+ const { name, arguments: args } = request.params;
124
+ try {
125
+ switch (name) {
126
+ case 'list_rows': {
127
+ const params = ListRowsSchema.parse(args);
128
+ const result = await client.listRows(params.tableSlug, {
129
+ page: params.page,
130
+ limit: params.limit,
131
+ orderBy: params.orderBy,
132
+ orderDir: params.orderDir,
133
+ filters: params.filters,
134
+ });
135
+ return {
136
+ content: [
137
+ {
138
+ type: 'text',
139
+ text: JSON.stringify({
140
+ rows: result.data,
141
+ pagination: result.meta,
142
+ message: `Found ${result.meta.total} rows in table "${params.tableSlug}"`,
143
+ }, null, 2),
144
+ },
145
+ ],
146
+ };
147
+ }
148
+ case 'get_row': {
149
+ const params = GetRowSchema.parse(args);
150
+ const row = await client.getRow(params.tableSlug, params.id);
151
+ return {
152
+ content: [
153
+ {
154
+ type: 'text',
155
+ text: JSON.stringify({
156
+ row,
157
+ message: `Retrieved row ${params.id} from table "${params.tableSlug}"`,
158
+ }, null, 2),
159
+ },
160
+ ],
161
+ };
162
+ }
163
+ case 'create_row': {
164
+ const params = CreateRowSchema.parse(args);
165
+ const row = await client.createRow(params.tableSlug, params.data);
166
+ return {
167
+ content: [
168
+ {
169
+ type: 'text',
170
+ text: JSON.stringify({
171
+ row,
172
+ message: `Successfully created row in table "${params.tableSlug}"`,
173
+ }, null, 2),
174
+ },
175
+ ],
176
+ };
177
+ }
178
+ case 'update_row': {
179
+ const params = UpdateRowSchema.parse(args);
180
+ const row = await client.updateRow(params.tableSlug, params.id, params.data);
181
+ return {
182
+ content: [
183
+ {
184
+ type: 'text',
185
+ text: JSON.stringify({
186
+ row,
187
+ message: `Successfully updated row ${params.id} in table "${params.tableSlug}"`,
188
+ }, null, 2),
189
+ },
190
+ ],
191
+ };
192
+ }
193
+ case 'delete_row': {
194
+ const params = DeleteRowSchema.parse(args);
195
+ await client.deleteRow(params.tableSlug, params.id);
196
+ return {
197
+ content: [
198
+ {
199
+ type: 'text',
200
+ text: JSON.stringify({
201
+ success: true,
202
+ message: `Successfully deleted row ${params.id} from table "${params.tableSlug}"`,
203
+ }, null, 2),
204
+ },
205
+ ],
206
+ };
207
+ }
208
+ default:
209
+ throw new Error(`Unknown tool: ${name}`);
210
+ }
211
+ }
212
+ catch (error) {
213
+ const errorMessage = error instanceof Error ? error.message : String(error);
214
+ return {
215
+ content: [
216
+ {
217
+ type: 'text',
218
+ text: JSON.stringify({
219
+ error: errorMessage,
220
+ tool: name,
221
+ }, null, 2),
222
+ },
223
+ ],
224
+ isError: true,
225
+ };
226
+ }
227
+ });
228
+ }
229
+ //# sourceMappingURL=data-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-tools.js","sourceRoot":"","sources":["../../src/tools/data-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { NodusClient } from '../client/nodus-client.js';
3
+ export declare function registerProjectTools(server: Server, client: NodusClient): void;
4
+ //# sourceMappingURL=project-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-tools.d.ts","sourceRoot":"","sources":["../../src/tools/project-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AASxD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,QAgRvE"}