@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
@@ -0,0 +1,226 @@
1
+ import { ListToolsRequestSchema, CallToolRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
2
+ import { ListProjectsSchema, CreateProjectSchema, SwitchProjectSchema, ListApiKeysSchema, CreateApiKeySchema, } from '../utils/validation.js';
3
+ export function registerProjectTools(server, client) {
4
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
5
+ const tools = [
6
+ {
7
+ name: 'list_projects',
8
+ description: 'List all projects for the authenticated user',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {},
12
+ },
13
+ },
14
+ {
15
+ name: 'create_project',
16
+ description: 'Create a new project with automatic API key generation',
17
+ inputSchema: {
18
+ type: 'object',
19
+ properties: {
20
+ name: {
21
+ type: 'string',
22
+ description: 'Project name',
23
+ },
24
+ },
25
+ required: ['name'],
26
+ },
27
+ },
28
+ {
29
+ name: 'switch_project',
30
+ description: 'Switch to a different project (returns new JWT token)',
31
+ inputSchema: {
32
+ type: 'object',
33
+ properties: {
34
+ projectId: {
35
+ type: 'string',
36
+ description: 'Project UUID to switch to',
37
+ },
38
+ },
39
+ required: ['projectId'],
40
+ },
41
+ },
42
+ {
43
+ name: 'list_api_keys',
44
+ description: 'List API keys for a project',
45
+ inputSchema: {
46
+ type: 'object',
47
+ properties: {
48
+ projectId: {
49
+ type: 'string',
50
+ description: 'Project UUID (optional, uses current project if not provided)',
51
+ },
52
+ },
53
+ },
54
+ },
55
+ {
56
+ name: 'create_api_key',
57
+ description: 'Create a new API key for a project (key shown only once)',
58
+ inputSchema: {
59
+ type: 'object',
60
+ properties: {
61
+ projectId: {
62
+ type: 'string',
63
+ description: 'Project UUID (optional, uses current project if not provided)',
64
+ },
65
+ name: {
66
+ type: 'string',
67
+ description: 'API key name',
68
+ },
69
+ },
70
+ required: ['name'],
71
+ },
72
+ },
73
+ ];
74
+ return { tools };
75
+ });
76
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
77
+ const { name, arguments: args } = request.params;
78
+ try {
79
+ switch (name) {
80
+ case 'list_projects': {
81
+ ListProjectsSchema.parse(args);
82
+ const projects = await client.getProjects();
83
+ return {
84
+ content: [
85
+ {
86
+ type: 'text',
87
+ text: JSON.stringify({
88
+ projects: projects.map((p) => ({
89
+ id: p.id,
90
+ name: p.name,
91
+ slug: p.slug,
92
+ createdAt: p.createdAt,
93
+ })),
94
+ count: projects.length,
95
+ message: `Found ${projects.length} projects`,
96
+ }, null, 2),
97
+ },
98
+ ],
99
+ };
100
+ }
101
+ case 'create_project': {
102
+ const params = CreateProjectSchema.parse(args);
103
+ const project = await client.createProject(params.name);
104
+ return {
105
+ content: [
106
+ {
107
+ type: 'text',
108
+ text: JSON.stringify({
109
+ project,
110
+ message: `Successfully created project "${project.name}" with ID ${project.id}`,
111
+ note: 'An API key has been automatically generated for this project',
112
+ }, null, 2),
113
+ },
114
+ ],
115
+ };
116
+ }
117
+ case 'switch_project': {
118
+ const params = SwitchProjectSchema.parse(args);
119
+ const result = await client.switchProject(params.projectId);
120
+ return {
121
+ content: [
122
+ {
123
+ type: 'text',
124
+ text: JSON.stringify({
125
+ project: result.project,
126
+ message: `Successfully switched to project "${result.project.name}"`,
127
+ note: 'A new JWT token has been issued. You may need to update your authentication.',
128
+ }, null, 2),
129
+ },
130
+ ],
131
+ };
132
+ }
133
+ case 'list_api_keys': {
134
+ const params = ListApiKeysSchema.parse(args);
135
+ if (!params.projectId) {
136
+ return {
137
+ content: [
138
+ {
139
+ type: 'text',
140
+ text: JSON.stringify({
141
+ error: 'projectId is required for listing API keys',
142
+ message: 'Please provide a projectId parameter',
143
+ }, null, 2),
144
+ },
145
+ ],
146
+ isError: true,
147
+ };
148
+ }
149
+ const apiKeys = await client.getApiKeys(params.projectId);
150
+ return {
151
+ content: [
152
+ {
153
+ type: 'text',
154
+ text: JSON.stringify({
155
+ apiKeys: apiKeys.map((key) => ({
156
+ id: key.id,
157
+ name: key.name,
158
+ prefix: key.prefix,
159
+ createdAt: key.createdAt,
160
+ lastUsedAt: key.lastUsedAt,
161
+ })),
162
+ count: apiKeys.length,
163
+ message: `Found ${apiKeys.length} API keys for the project`,
164
+ note: 'Full API keys are only shown once during creation',
165
+ }, null, 2),
166
+ },
167
+ ],
168
+ };
169
+ }
170
+ case 'create_api_key': {
171
+ const params = CreateApiKeySchema.parse(args);
172
+ if (!params.projectId) {
173
+ return {
174
+ content: [
175
+ {
176
+ type: 'text',
177
+ text: JSON.stringify({
178
+ error: 'projectId is required for creating API keys',
179
+ message: 'Please provide a projectId parameter',
180
+ }, null, 2),
181
+ },
182
+ ],
183
+ isError: true,
184
+ };
185
+ }
186
+ const result = await client.createApiKey(params.projectId, params.name);
187
+ return {
188
+ content: [
189
+ {
190
+ type: 'text',
191
+ text: JSON.stringify({
192
+ apiKey: {
193
+ id: result.apiKey.id,
194
+ name: result.apiKey.name,
195
+ prefix: result.apiKey.prefix,
196
+ },
197
+ fullKey: result.fullKey,
198
+ message: `Successfully created API key "${params.name}"`,
199
+ warning: '⚠️ IMPORTANT: Save this API key now. It will not be shown again!',
200
+ }, null, 2),
201
+ },
202
+ ],
203
+ };
204
+ }
205
+ default:
206
+ throw new Error(`Unknown tool: ${name}`);
207
+ }
208
+ }
209
+ catch (error) {
210
+ const errorMessage = error instanceof Error ? error.message : String(error);
211
+ return {
212
+ content: [
213
+ {
214
+ type: 'text',
215
+ text: JSON.stringify({
216
+ error: errorMessage,
217
+ tool: name,
218
+ }, null, 2),
219
+ },
220
+ ],
221
+ isError: true,
222
+ };
223
+ }
224
+ });
225
+ }
226
+ //# sourceMappingURL=project-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-tools.js","sourceRoot":"","sources":["../../src/tools/project-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 registerSchemaTools(server: Server, client: NodusClient): void;
4
+ //# sourceMappingURL=schema-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-tools.d.ts","sourceRoot":"","sources":["../../src/tools/schema-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAUxD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,QA0TtE"}
@@ -0,0 +1,274 @@
1
+ import { ListToolsRequestSchema, CallToolRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
2
+ import { ListTablesSchema, GetTableSchemaSchema, CreateTableSchema, UpdateTableSchema, AddColumnSchema, UpdateColumnSchema, } from '../utils/validation.js';
3
+ export function registerSchemaTools(server, client) {
4
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
5
+ const tools = [
6
+ {
7
+ name: 'list_tables',
8
+ description: 'List all tables in the project',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {},
12
+ },
13
+ },
14
+ {
15
+ name: 'get_table_schema',
16
+ description: 'Get detailed schema for a specific table including all columns',
17
+ inputSchema: {
18
+ type: 'object',
19
+ properties: {
20
+ tableSlug: {
21
+ type: 'string',
22
+ description: 'Table identifier (slug)',
23
+ },
24
+ },
25
+ required: ['tableSlug'],
26
+ },
27
+ },
28
+ {
29
+ name: 'create_table',
30
+ description: 'Create a new table in the project',
31
+ inputSchema: {
32
+ type: 'object',
33
+ properties: {
34
+ name: {
35
+ type: 'string',
36
+ description: 'Human-readable table name',
37
+ },
38
+ slug: {
39
+ type: 'string',
40
+ description: 'Table slug (lowercase, numbers, underscores only)',
41
+ pattern: '^[a-z0-9_]+$',
42
+ },
43
+ },
44
+ required: ['name', 'slug'],
45
+ },
46
+ },
47
+ {
48
+ name: 'update_table',
49
+ description: 'Update table name',
50
+ inputSchema: {
51
+ type: 'object',
52
+ properties: {
53
+ tableSlug: {
54
+ type: 'string',
55
+ description: 'Current table slug',
56
+ },
57
+ name: {
58
+ type: 'string',
59
+ description: 'New table name',
60
+ },
61
+ },
62
+ required: ['tableSlug', 'name'],
63
+ },
64
+ },
65
+ {
66
+ name: 'add_column',
67
+ description: 'Add a new column to a table',
68
+ inputSchema: {
69
+ type: 'object',
70
+ properties: {
71
+ tableSlug: {
72
+ type: 'string',
73
+ description: 'Table identifier (slug)',
74
+ },
75
+ name: {
76
+ type: 'string',
77
+ description: 'Human-readable column name',
78
+ },
79
+ slug: {
80
+ type: 'string',
81
+ description: 'Column slug (lowercase, numbers, underscores only)',
82
+ pattern: '^[a-z0-9_]+$',
83
+ },
84
+ type: {
85
+ type: 'string',
86
+ enum: ['string', 'text', 'integer', 'float', 'boolean', 'datetime', 'json'],
87
+ description: 'Column data type',
88
+ },
89
+ isRequired: {
90
+ type: 'boolean',
91
+ description: 'Whether the column is required',
92
+ },
93
+ defaultValue: {
94
+ description: 'Default value for the column',
95
+ },
96
+ },
97
+ required: ['tableSlug', 'name', 'slug', 'type'],
98
+ },
99
+ },
100
+ {
101
+ name: 'update_column',
102
+ description: 'Update column properties (name, isRequired, defaultValue)',
103
+ inputSchema: {
104
+ type: 'object',
105
+ properties: {
106
+ tableSlug: {
107
+ type: 'string',
108
+ description: 'Table identifier (slug)',
109
+ },
110
+ columnSlug: {
111
+ type: 'string',
112
+ description: 'Column identifier (slug)',
113
+ },
114
+ name: {
115
+ type: 'string',
116
+ description: 'New column name',
117
+ },
118
+ isRequired: {
119
+ type: 'boolean',
120
+ description: 'Whether the column is required',
121
+ },
122
+ defaultValue: {
123
+ description: 'Default value for the column',
124
+ },
125
+ },
126
+ required: ['tableSlug', 'columnSlug'],
127
+ },
128
+ },
129
+ ];
130
+ return { tools };
131
+ });
132
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
133
+ const { name, arguments: args } = request.params;
134
+ try {
135
+ switch (name) {
136
+ case 'list_tables': {
137
+ ListTablesSchema.parse(args);
138
+ const tables = await client.getTables();
139
+ return {
140
+ content: [
141
+ {
142
+ type: 'text',
143
+ text: JSON.stringify({
144
+ tables: tables.map((t) => ({
145
+ name: t.name,
146
+ slug: t.slug,
147
+ rowCount: t.rowCount,
148
+ createdAt: t.createdAt,
149
+ })),
150
+ count: tables.length,
151
+ message: `Found ${tables.length} tables in the project`,
152
+ }, null, 2),
153
+ },
154
+ ],
155
+ };
156
+ }
157
+ case 'get_table_schema': {
158
+ const params = GetTableSchemaSchema.parse(args);
159
+ const table = await client.getTable(params.tableSlug);
160
+ return {
161
+ content: [
162
+ {
163
+ type: 'text',
164
+ text: JSON.stringify({
165
+ table: {
166
+ name: table.name,
167
+ slug: table.slug,
168
+ createdAt: table.createdAt,
169
+ },
170
+ columns: table.columns.map((c) => ({
171
+ name: c.name,
172
+ slug: c.slug,
173
+ type: c.type,
174
+ isRequired: c.isRequired,
175
+ defaultValue: c.defaultValue,
176
+ })),
177
+ message: `Retrieved schema for table "${table.name}" with ${table.columns.length} columns`,
178
+ }, null, 2),
179
+ },
180
+ ],
181
+ };
182
+ }
183
+ case 'create_table': {
184
+ const params = CreateTableSchema.parse(args);
185
+ const table = await client.createTable(params.name, params.slug);
186
+ return {
187
+ content: [
188
+ {
189
+ type: 'text',
190
+ text: JSON.stringify({
191
+ table,
192
+ message: `Successfully created table "${table.name}" (${table.slug})`,
193
+ }, null, 2),
194
+ },
195
+ ],
196
+ };
197
+ }
198
+ case 'update_table': {
199
+ const params = UpdateTableSchema.parse(args);
200
+ const table = await client.updateTable(params.tableSlug, params.name);
201
+ return {
202
+ content: [
203
+ {
204
+ type: 'text',
205
+ text: JSON.stringify({
206
+ table,
207
+ message: `Successfully updated table "${table.slug}" to "${table.name}"`,
208
+ }, null, 2),
209
+ },
210
+ ],
211
+ };
212
+ }
213
+ case 'add_column': {
214
+ const params = AddColumnSchema.parse(args);
215
+ const table = await client.addColumn(params.tableSlug, {
216
+ name: params.name,
217
+ slug: params.slug,
218
+ type: params.type,
219
+ isRequired: params.isRequired,
220
+ defaultValue: params.defaultValue,
221
+ });
222
+ return {
223
+ content: [
224
+ {
225
+ type: 'text',
226
+ text: JSON.stringify({
227
+ column: table.columns.find((c) => c.slug === params.slug),
228
+ message: `Successfully added column "${params.name}" to table "${params.tableSlug}"`,
229
+ }, null, 2),
230
+ },
231
+ ],
232
+ };
233
+ }
234
+ case 'update_column': {
235
+ const params = UpdateColumnSchema.parse(args);
236
+ const table = await client.updateColumn(params.tableSlug, params.columnSlug, {
237
+ name: params.name,
238
+ isRequired: params.isRequired,
239
+ defaultValue: params.defaultValue,
240
+ });
241
+ return {
242
+ content: [
243
+ {
244
+ type: 'text',
245
+ text: JSON.stringify({
246
+ column: table.columns.find((c) => c.slug === params.columnSlug),
247
+ message: `Successfully updated column "${params.columnSlug}" in table "${params.tableSlug}"`,
248
+ }, null, 2),
249
+ },
250
+ ],
251
+ };
252
+ }
253
+ default:
254
+ throw new Error(`Unknown tool: ${name}`);
255
+ }
256
+ }
257
+ catch (error) {
258
+ const errorMessage = error instanceof Error ? error.message : String(error);
259
+ return {
260
+ content: [
261
+ {
262
+ type: 'text',
263
+ text: JSON.stringify({
264
+ error: errorMessage,
265
+ tool: name,
266
+ }, null, 2),
267
+ },
268
+ ],
269
+ isError: true,
270
+ };
271
+ }
272
+ });
273
+ }
274
+ //# sourceMappingURL=schema-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-tools.js","sourceRoot":"","sources":["../../src/tools/schema-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { NodusConfig } from '../client/types.js';
2
+ export declare function validateApiKey(apiKey: string): boolean;
3
+ export declare function validateConfig(config: NodusConfig): void;
4
+ export declare function maskApiKey(apiKey: string): string;
5
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAkBxD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKjD"}
@@ -0,0 +1,27 @@
1
+ export function validateApiKey(apiKey) {
2
+ return apiKey.startsWith('nds_') && apiKey.length > 10;
3
+ }
4
+ export function validateConfig(config) {
5
+ if (!config.apiKey) {
6
+ throw new Error('API key is required');
7
+ }
8
+ if (!validateApiKey(config.apiKey)) {
9
+ throw new Error('Invalid API key format. API key should start with "nds_"');
10
+ }
11
+ if (!config.apiUrl) {
12
+ throw new Error('API URL is required');
13
+ }
14
+ try {
15
+ new URL(config.apiUrl);
16
+ }
17
+ catch {
18
+ throw new Error('Invalid API URL format');
19
+ }
20
+ }
21
+ export function maskApiKey(apiKey) {
22
+ if (apiKey.length <= 12) {
23
+ return apiKey.substring(0, 4) + '***';
24
+ }
25
+ return apiKey.substring(0, 8) + '***' + apiKey.substring(apiKey.length - 4);
26
+ }
27
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC9E,CAAC"}