@nodusapi/mcp-server 1.2.1 → 1.4.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.
@@ -0,0 +1,212 @@
1
+ # Migration Guide: Removing PROJECT_SLUG Requirement
2
+
3
+ ## Overview
4
+
5
+ Starting from version 1.3.0, the `NODUS_PROJECT_SLUG` environment variable is **no longer required** in MCP server configuration. This change makes project management more flexible by allowing users to work with multiple projects dynamically through MCP tools.
6
+
7
+ ## What Changed?
8
+
9
+ ### Before (v1.2.x and earlier)
10
+
11
+ ```json
12
+ {
13
+ "mcpServers": {
14
+ "nodus": {
15
+ "command": "npx",
16
+ "args": ["-y", "@nodusapi/mcp-server"],
17
+ "env": {
18
+ "NODUS_API_KEY": "nds_your_key",
19
+ "NODUS_PROJECT_SLUG": "my-project" // ❌ No longer needed
20
+ }
21
+ }
22
+ }
23
+ }
24
+ ```
25
+
26
+ ### After (v1.3.0+)
27
+
28
+ ```json
29
+ {
30
+ "mcpServers": {
31
+ "nodus": {
32
+ "command": "npx",
33
+ "args": ["-y", "@nodusapi/mcp-server"],
34
+ "env": {
35
+ "NODUS_API_KEY": "nds_your_key" // ✅ Only API key needed
36
+ }
37
+ }
38
+ }
39
+ }
40
+ ```
41
+
42
+ ## Why This Change?
43
+
44
+ 1. **More Flexible**: Users can work with multiple projects without reconfiguring
45
+ 2. **Better UX**: No need to know project slug upfront
46
+ 3. **Consistent**: Aligns with how the API and web dashboard work
47
+ 4. **Dynamic**: Use MCP tools to list and switch between projects
48
+
49
+ ## How to Migrate
50
+
51
+ ### Step 1: Update Your Configuration
52
+
53
+ Remove `NODUS_PROJECT_SLUG` from your MCP configuration:
54
+
55
+ **Cursor Settings** (`.cursor/settings.json`):
56
+ ```json
57
+ {
58
+ "mcpServers": {
59
+ "nodus": {
60
+ "command": "npx",
61
+ "args": ["-y", "@nodusapi/mcp-server@latest"],
62
+ "env": {
63
+ "NODUS_API_KEY": "nds_your_key"
64
+ }
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ **Config File** (`~/.nodus-mcp/config.json`):
71
+ ```json
72
+ {
73
+ "apiKey": "nds_your_key",
74
+ "apiUrl": "https://api.nodus.com"
75
+ }
76
+ ```
77
+
78
+ ### Step 2: Use Project Management Tools
79
+
80
+ After connecting, use these MCP tools to manage projects:
81
+
82
+ #### List Available Projects
83
+ ```
84
+ "Show me all my projects"
85
+ ```
86
+
87
+ or explicitly call the tool:
88
+ - Tool: `list_projects`
89
+ - No parameters needed
90
+ - Returns: List of all projects with their IDs and slugs
91
+
92
+ #### Switch to a Project
93
+ ```
94
+ "Switch to project [project-id]"
95
+ ```
96
+
97
+ or explicitly:
98
+ - Tool: `switch_project`
99
+ - Parameters: `{ "projectId": "uuid-here" }`
100
+ - Returns: New project context
101
+
102
+ #### Create a New Project
103
+ ```
104
+ "Create a new project called 'My New Project'"
105
+ ```
106
+
107
+ or explicitly:
108
+ - Tool: `create_project`
109
+ - Parameters: `{ "name": "My New Project" }`
110
+ - Returns: New project with auto-generated API key
111
+
112
+ ## Workflow Example
113
+
114
+ ### Old Way (v1.2.x)
115
+ 1. Know your project slug beforehand
116
+ 2. Configure MCP with `NODUS_PROJECT_SLUG`
117
+ 3. Restart Cursor if you need to switch projects
118
+ 4. Reconfigure MCP with new slug
119
+
120
+ ### New Way (v1.3.0+)
121
+ 1. Configure MCP once with just your API key
122
+ 2. Ask: "List my projects"
123
+ 3. Ask: "Switch to project [id]"
124
+ 4. Start working - no restart needed!
125
+
126
+ ## Breaking Changes
127
+
128
+ ⚠️ **None!** This is a backwards-compatible change.
129
+
130
+ - If you have `NODUS_PROJECT_SLUG` in your config, it will be **ignored** (no errors)
131
+ - Existing configurations will continue to work
132
+ - Just remove the unused parameter when convenient
133
+
134
+ ## Benefits
135
+
136
+ ### For Single Project Users
137
+ - Simpler configuration (one less parameter)
138
+ - Same workflow as before
139
+ - API key automatically works with your project
140
+
141
+ ### For Multi-Project Users
142
+ - No need for multiple MCP server configurations
143
+ - Switch between projects dynamically
144
+ - One connection, all projects
145
+
146
+ ### For Teams
147
+ - Team members can use the same configuration
148
+ - Each person works with their own projects
149
+ - No need to share project-specific settings
150
+
151
+ ## FAQs
152
+
153
+ **Q: Do I need to update immediately?**
154
+ A: No, existing configurations will continue to work. The `NODUS_PROJECT_SLUG` parameter is simply ignored.
155
+
156
+ **Q: How do I know which project I'm currently using?**
157
+ A: Use the `list_projects` tool or ask "Which project am I using?"
158
+
159
+ **Q: Can I still work with one specific project only?**
160
+ A: Yes! Just use `switch_project` once after connecting, then work as usual.
161
+
162
+ **Q: What if I have multiple API keys?**
163
+ A: You can still configure multiple MCP servers with different API keys:
164
+
165
+ ```json
166
+ {
167
+ "mcpServers": {
168
+ "nodus-account-1": {
169
+ "command": "npx",
170
+ "args": ["-y", "@nodusapi/mcp-server@latest"],
171
+ "env": {
172
+ "NODUS_API_KEY": "nds_key_1"
173
+ }
174
+ },
175
+ "nodus-account-2": {
176
+ "command": "npx",
177
+ "args": ["-y", "@nodusapi/mcp-server@latest"],
178
+ "env": {
179
+ "NODUS_API_KEY": "nds_key_2"
180
+ }
181
+ }
182
+ }
183
+ }
184
+ ```
185
+
186
+ **Q: Does this affect the web dashboard?**
187
+ A: No, the web dashboard (`nodusweb`) has also been updated to reflect this change. The MCP button no longer includes `PROJECT_SLUG` in generated configurations.
188
+
189
+ ## Updated Documentation
190
+
191
+ All documentation has been updated to reflect this change:
192
+
193
+ - ✅ README.md
194
+ - ✅ QUICKSTART.md
195
+ - ✅ TROUBLESHOOTING.md
196
+ - ✅ cursor-config.example.json
197
+ - ✅ Web dashboard MCP button
198
+ - ✅ API documentation
199
+
200
+ ## Support
201
+
202
+ If you have any questions or issues with this migration:
203
+
204
+ - Check the [Troubleshooting Guide](TROUBLESHOOTING.md)
205
+ - Open an issue on [GitHub](https://github.com/nodusapi/nodusmcp/issues)
206
+ - Reach out on our community channels
207
+
208
+ ## Version History
209
+
210
+ - **v1.3.0** (Current): `PROJECT_SLUG` removed, project management via tools
211
+ - **v1.2.1**: Last version with `PROJECT_SLUG` support
212
+ - **v1.2.0**: Initial project management tools added
package/QUICKSTART.md CHANGED
@@ -3,10 +3,14 @@
3
3
  ## Installation & Setup
4
4
 
5
5
  ### 1. Get Your API Key
6
- 1. Go to Nodus dashboard
7
- 2. Navigate to Settings API Keys
8
- 3. Create a new API key
9
- 4. Copy the key (starts with `nds_`)
6
+
7
+ 1. Go to Nodus dashboard (http://localhost:3001 for dev)
8
+ 2. Sign in with Google
9
+ 3. Your API key is automatically created on first login
10
+ 4. Navigate to Profile/User Settings → API Keys to view or create additional keys
11
+ 5. Copy the key (starts with `nodus_`)
12
+
13
+ **Important:** Your API key now works across ALL your projects. You just need one key!
10
14
 
11
15
  ### 2. Configure Cursor
12
16
 
@@ -19,14 +23,15 @@ Open Cursor settings and add to MCP servers:
19
23
  "command": "npx",
20
24
  "args": ["-y", "@nodusapi/mcp-server"],
21
25
  "env": {
22
- "NODUS_API_KEY": "nds_your_actual_key_here",
23
- "NODUS_PROJECT_SLUG": "optional_project_slug"
26
+ "NODUS_API_KEY": "nodus_your_actual_key_here"
24
27
  }
25
28
  }
26
29
  }
27
30
  }
28
31
  ```
29
32
 
33
+ **Note:** You don't need to specify a project slug in the config. Use `list_projects` and `switch_project` to work with your projects.
34
+
30
35
  ### 3. Restart Cursor
31
36
 
32
37
  Restart Cursor to load the MCP server.
@@ -36,18 +41,19 @@ Restart Cursor to load the MCP server.
36
41
  Try these commands in Cursor:
37
42
 
38
43
  ```
44
+ "List all my projects"
45
+ "Switch to my first project"
39
46
  "Show me all my database tables"
40
47
  "Create a new table called tasks"
41
48
  "Add a column 'title' of type string to tasks table"
42
49
  "Create a new task with title 'Learn MCP'"
43
- "List all tasks"
44
50
  ```
45
51
 
46
52
  ## Available MCP Tools
47
53
 
48
54
  ### Project Management (3 tools)
49
55
  - `list_projects` - List all your projects
50
- - `create_project` - Create a new project with automatic API key
56
+ - `create_project` - Create a new project
51
57
  - `switch_project` - Switch to a different project
52
58
 
53
59
  ### Schema Management (6 tools)
@@ -112,49 +118,84 @@ Try these commands in Cursor:
112
118
 
113
119
  ### 🎯 Project Management
114
120
 
115
- **Work with projects:**
121
+ **Work with multiple projects:**
116
122
  ```
117
123
  "List all my projects"
118
124
  "Create a new project called 'Production API'"
119
- "Switch to project 'my-dev-project'"
125
+ "Switch to my-dev-project"
126
+ ```
127
+
128
+ **Key Point:** Your API key works across all projects. Use `switch_project` to change which project you're working with. All subsequent table and data operations will use the active project.
129
+
130
+ ## Workflow Example
131
+
132
+ ```
133
+ 1. "List all my projects"
134
+ → Shows: my-app-dev, my-app-prod
135
+
136
+ 2. "Switch to my-app-dev"
137
+ → ✓ Now working with my-app-dev
138
+
139
+ 3. "Create a users table"
140
+ → Table created in my-app-dev
141
+
142
+ 4. "Switch to my-app-prod"
143
+ → ✓ Now working with my-app-prod
144
+
145
+ 5. "Create a users table"
146
+ → Table created in my-app-prod (separate from dev)
120
147
  ```
121
148
 
122
149
  ## Troubleshooting
123
150
 
124
151
  ### Server Not Starting
125
- - Check API key is correct
152
+ - Check API key is correct (starts with `nodus_`)
126
153
  - Verify Node.js version (>= 18)
127
154
  - Look at Cursor's MCP server logs
128
155
 
129
- ### Permission Errors
130
- - Ensure API key has project access
131
- - Check you're using the right project ID
156
+ ### "No project selected" Error
157
+ - Run `list_projects` to see your projects
158
+ - Run `switch_project` with a project ID to select a project
159
+ - All table/data operations require an active project
132
160
 
133
161
  ### Connection Issues
134
- - Verify API URL (default: https://api.nodus.com)
162
+ - Verify API URL (default: http://localhost:3000 for dev, https://api.nodus.com for prod)
135
163
  - Check network connectivity
164
+ - Ensure backend server is running
136
165
 
137
166
  ## Advanced Configuration
138
167
 
139
- ### Multiple Projects
168
+ ### Working with Multiple Projects
169
+
170
+ Your single API key works across all projects. Just switch between them:
171
+
172
+ ```
173
+ "List all my projects"
174
+ "Switch to project abc-123" ← Use project ID
175
+ "Create tables and data..."
176
+ "Switch to project xyz-789" ← Switch to different project
177
+ "Create different tables..."
178
+ ```
179
+
180
+ ### Using Different API Keys
181
+
182
+ If you need to work with multiple user accounts, configure separate MCP servers:
140
183
 
141
184
  ```json
142
185
  {
143
186
  "mcpServers": {
144
- "nodus-dev": {
187
+ "nodus-account1": {
145
188
  "command": "npx",
146
189
  "args": ["-y", "@nodusapi/mcp-server"],
147
190
  "env": {
148
- "NODUS_API_KEY": "nds_dev_key",
149
- "NODUS_PROJECT_SLUG": "dev-project"
191
+ "NODUS_API_KEY": "nodus_account1_key"
150
192
  }
151
193
  },
152
- "nodus-prod": {
194
+ "nodus-account2": {
153
195
  "command": "npx",
154
196
  "args": ["-y", "@nodusapi/mcp-server"],
155
197
  "env": {
156
- "NODUS_API_KEY": "nds_prod_key",
157
- "NODUS_PROJECT_SLUG": "production"
198
+ "NODUS_API_KEY": "nodus_account2_key"
158
199
  }
159
200
  }
160
201
  }
@@ -188,10 +229,26 @@ Try these commands in Cursor:
188
229
 
189
230
  1. **Table schemas are automatic**: The LLM can see all your tables and columns without asking
190
231
  2. **Natural language works**: Don't worry about exact API syntax
191
- 3. **Safe by design**: Cannot delete tables or projects via MCP
232
+ 3. **Safe by design**: For data protection, table deletion, column deletion, and project deletion are not available via MCP
192
233
  4. **Batch operations**: Ask for multiple operations in one message
193
234
  5. **Context aware**: The LLM remembers previous table structures
194
235
 
236
+ ## Safe by Design Features
237
+
238
+ To prevent accidental data loss, the following destructive operations are **intentionally not available** via MCP:
239
+
240
+ - ❌ Delete tables (`DELETE /schemas/tables/:tableSlug`)
241
+ - ❌ Delete columns (`DELETE /schemas/tables/:tableSlug/columns/:columnSlug`)
242
+ - ❌ Delete projects (`DELETE /projects/:projectId`)
243
+ - ❌ Bulk row deletion
244
+
245
+ **Available safe operations:**
246
+ - ✅ Individual row deletion (`delete_row`) - Deletes one specific row at a time
247
+ - ✅ Update operations for tables, columns, and rows
248
+ - ✅ Create operations for all entities
249
+
250
+ **Note:** If you need to perform destructive operations, use the NodusWeb dashboard or make direct API calls.
251
+
195
252
  ## Complete Workflow Examples
196
253
 
197
254
  ### Example 1: Building a Blog System
package/README.md CHANGED
@@ -20,9 +20,10 @@ All through natural language conversations!
20
20
 
21
21
  - **Data CRUD Operations**: List, get, create, update, and delete rows
22
22
  - **Schema Management**: Create tables, add columns, update schemas
23
- - **Project Management**: List projects, create new projects, manage API keys
23
+ - **Project Management**: List projects, create new projects, switch between projects
24
24
  - **Automatic Context**: Table schemas are automatically available to the LLM
25
- - **Secure Authentication**: API key-based authentication with multiple configuration options
25
+ - **Secure Authentication**: User-level API key works across all your projects
26
+ - **Safe by Design**: Destructive operations (delete tables, columns, projects) are not exposed
26
27
  - **TypeScript**: Fully typed with comprehensive error handling
27
28
 
28
29
  ## Installation
@@ -58,18 +59,18 @@ Set these environment variables in your MCP client configuration:
58
59
 
59
60
  ```bash
60
61
  NODUS_API_KEY=nds_your_api_key_here
61
- NODUS_PROJECT_SLUG=your_project_slug (optional)
62
62
  NODUS_API_URL=https://api.nodus.com (optional, defaults to production)
63
63
  ```
64
64
 
65
+ **Note:** You don't need to specify a project slug. Use the `list_projects` and `switch_project` tools to manage your projects.
66
+
65
67
  ### Option 2: Interactive Setup
66
68
 
67
69
  If no configuration is found, the server will prompt you for:
68
70
  - API Key
69
71
  - API URL (defaults to https://api.nodus.com)
70
- - Project Slug (optional)
71
72
 
72
- Configuration is saved to `~/.nodus-mcp/config.json` for future use.
73
+ Configuration is saved to `~/.nodus-mcp/config.json` for future use. After connecting, use project management tools to select and switch between projects.
73
74
 
74
75
  ### Option 3: Manual Configuration
75
76
 
@@ -78,7 +79,6 @@ Create `~/.nodus-mcp/config.json`:
78
79
  ```json
79
80
  {
80
81
  "apiKey": "nds_your_api_key_here",
81
- "projectSlug": "your_project_slug",
82
82
  "apiUrl": "https://api.nodus.com"
83
83
  }
84
84
  ```
@@ -94,14 +94,15 @@ Add to your `.cursor/settings.json` or Cursor MCP settings:
94
94
  "command": "npx",
95
95
  "args": ["-y", "@nodusapi/mcp-server"],
96
96
  "env": {
97
- "NODUS_API_KEY": "nds_your_api_key_here",
98
- "NODUS_PROJECT_SLUG": "your_project_slug"
97
+ "NODUS_API_KEY": "nds_your_api_key_here"
99
98
  }
100
99
  }
101
100
  }
102
101
  }
103
102
  ```
104
103
 
104
+ After connecting, use the `list_projects` tool to see your projects, and `switch_project` to work with a specific project.
105
+
105
106
  Or use a local path during development:
106
107
 
107
108
  ```json
@@ -264,7 +265,7 @@ List all projects for the authenticated user.
264
265
  ```
265
266
 
266
267
  #### `create_project`
267
- Create a new project.
268
+ Create a new project. Your existing user-level API key will automatically work with the new project.
268
269
 
269
270
  **Parameters:**
270
271
  - `name` (string, required): Project name
@@ -274,26 +275,20 @@ Create a new project.
274
275
  "Create a new project called 'My Blog API'"
275
276
  ```
276
277
 
278
+ **Note:** After creating a project, use `switch_project` to start working with it.
279
+
277
280
  #### `switch_project`
278
281
  Switch to a different project.
279
282
 
280
283
  **Parameters:**
281
284
  - `projectId` (string, required): Project UUID
282
285
 
283
- #### `list_api_keys`
284
- List API keys for a project.
285
-
286
- **Parameters:**
287
- - `projectId` (string, required): Project UUID
288
-
289
- #### `create_api_key`
290
- Create a new API key.
291
-
292
- **Parameters:**
293
- - `projectId` (string, required): Project UUID
294
- - `name` (string, required): API key name
286
+ **Example:**
287
+ ```
288
+ "Switch to project abc-123-def-456"
289
+ ```
295
290
 
296
- **Note:** The full API key is only shown once during creation!
291
+ **Note:** Your API key works across all projects. This just changes which project's data you're working with.
297
292
 
298
293
  ## Resources
299
294
 
@@ -329,10 +324,11 @@ Assistant: [Calls list_rows with tableSlug: "users"]
329
324
 
330
325
  ## Security Notes
331
326
 
332
- - **No Delete Operations**: Table and project deletion are NOT exposed through MCP for safety
327
+ - **Safe by Design**: Destructive operations (delete tables, delete columns, delete projects) are NOT exposed through MCP for safety
333
328
  - **API Key Security**: Store API keys securely using environment variables
334
329
  - **Row-Level Operations**: Only individual row deletion is allowed (no bulk delete)
335
330
  - **Validation**: All inputs are validated with Zod schemas
331
+ - **User-Level API Keys**: One API key works across all your projects
336
332
 
337
333
  ## Development
338
334
 
@@ -126,8 +126,7 @@ When running MCP server in Cursor, check the MCP logs:
126
126
  "args": ["-y", "@nodusapi/mcp-server@latest"],
127
127
  "env": {
128
128
  "NODUS_API_URL": "http://localhost:3000",
129
- "NODUS_API_KEY": "nodus_your_full_api_key_here",
130
- "NODUS_PROJECT_SLUG": "your-project-slug"
129
+ "NODUS_API_KEY": "nodus_your_full_api_key_here"
131
130
  }
132
131
  }
133
132
  }
@@ -5,7 +5,6 @@
5
5
  "args": ["-y", "@nodusapi/mcp-server"],
6
6
  "env": {
7
7
  "NODUS_API_KEY": "nds_your_api_key_here",
8
- "NODUS_PROJECT_SLUG": "your_project_slug_here",
9
8
  "NODUS_API_URL": "https://api.nodus.com"
10
9
  }
11
10
  }
@@ -2,14 +2,14 @@ import { Project, Table, TableWithColumns, DataRow, PaginatedResponse, QueryOpti
2
2
  export declare class NodusClient {
3
3
  private client;
4
4
  private apiKey;
5
+ private currentProjectSlug;
5
6
  constructor(apiKey: string, baseURL?: string);
7
+ setProject(slug: string): void;
8
+ getProject(): string | null;
9
+ private getProjectUrl;
6
10
  private request;
7
11
  getProjects(): Promise<Project[]>;
8
12
  createProject(name: string): Promise<Project>;
9
- switchProject(projectId: string): Promise<{
10
- project: Project;
11
- token: string;
12
- }>;
13
13
  getTables(): Promise<Table[]>;
14
14
  getTable(tableSlug: string): Promise<TableWithColumns>;
15
15
  createTable(name: string, slug: string): Promise<Table>;
@@ -1 +1 @@
1
- {"version":3,"file":"nodus-client.d.ts","sourceRoot":"","sources":["../../src/client/nodus-client.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EAEP,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAgC;YAYvD,OAAO;IA0Cf,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAIjC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI7C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAO9E,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAI7B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAItD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAIvD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAI5D,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQ5E,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,GACnD,OAAO,CAAC,gBAAgB,CAAC;IAQtB,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IA6BhC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvD,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrF,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9D"}
1
+ {"version":3,"file":"nodus-client.d.ts","sourceRoot":"","sources":["../../src/client/nodus-client.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EAEP,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,kBAAkB,CAAuB;gBAErC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAgC;IAYrE,UAAU,CAAC,IAAI,EAAE,MAAM;IAIvB,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B,OAAO,CAAC,aAAa;YAOP,OAAO;IA0Cf,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAIjC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI7C,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAI7B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAItD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAIvD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAI5D,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQ5E,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,GACnD,OAAO,CAAC,gBAAgB,CAAC;IAQtB,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IA6BhC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvD,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrF,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9D"}
@@ -2,6 +2,7 @@ import axios from 'axios';
2
2
  export class NodusClient {
3
3
  client;
4
4
  apiKey;
5
+ currentProjectSlug = null;
5
6
  constructor(apiKey, baseURL = 'https://api.nodus.com') {
6
7
  this.apiKey = apiKey;
7
8
  this.client = axios.create({
@@ -13,6 +14,18 @@ export class NodusClient {
13
14
  timeout: 30000,
14
15
  });
15
16
  }
17
+ setProject(slug) {
18
+ this.currentProjectSlug = slug;
19
+ }
20
+ getProject() {
21
+ return this.currentProjectSlug;
22
+ }
23
+ getProjectUrl(path) {
24
+ if (!this.currentProjectSlug) {
25
+ throw new Error('No project selected. Call setProject() or use switch_project tool first');
26
+ }
27
+ return `/api/v1/${this.currentProjectSlug}${path}`;
28
+ }
16
29
  async request(method, url, data, params) {
17
30
  try {
18
31
  const response = await this.client.request({
@@ -54,26 +67,23 @@ export class NodusClient {
54
67
  async createProject(name) {
55
68
  return this.request('post', '/api/v1/projects', { name });
56
69
  }
57
- async switchProject(projectId) {
58
- return this.request('post', `/api/v1/projects/${projectId}/switch`);
59
- }
60
70
  async getTables() {
61
- return this.request('get', '/api/v1/schemas/tables');
71
+ return this.request('get', this.getProjectUrl('/schemas/tables'));
62
72
  }
63
73
  async getTable(tableSlug) {
64
- return this.request('get', `/api/v1/schemas/tables/${tableSlug}`);
74
+ return this.request('get', this.getProjectUrl(`/schemas/tables/${tableSlug}`));
65
75
  }
66
76
  async createTable(name, slug) {
67
- return this.request('post', '/api/v1/schemas/tables', { name, slug });
77
+ return this.request('post', this.getProjectUrl('/schemas/tables'), { name, slug });
68
78
  }
69
79
  async updateTable(tableSlug, name) {
70
- return this.request('put', `/api/v1/schemas/tables/${tableSlug}`, { name });
80
+ return this.request('put', this.getProjectUrl(`/schemas/tables/${tableSlug}`), { name });
71
81
  }
72
82
  async addColumn(tableSlug, column) {
73
- return this.request('post', `/api/v1/schemas/tables/${tableSlug}/columns`, column);
83
+ return this.request('post', this.getProjectUrl(`/schemas/tables/${tableSlug}/columns`), column);
74
84
  }
75
85
  async updateColumn(tableSlug, columnSlug, updates) {
76
- return this.request('put', `/api/v1/schemas/tables/${tableSlug}/columns/${columnSlug}`, updates);
86
+ return this.request('put', this.getProjectUrl(`/schemas/tables/${tableSlug}/columns/${columnSlug}`), updates);
77
87
  }
78
88
  async listRows(tableSlug, options) {
79
89
  const params = {};
@@ -90,7 +100,7 @@ export class NodusClient {
90
100
  params[key] = value;
91
101
  });
92
102
  }
93
- const response = await this.client.get(`/api/v1/data/${tableSlug}`, { params });
103
+ const response = await this.client.get(this.getProjectUrl(`/data/${tableSlug}`), { params });
94
104
  if (!response.data.success) {
95
105
  throw new Error(response.data.error?.message || 'Failed to fetch rows');
96
106
  }
@@ -100,16 +110,16 @@ export class NodusClient {
100
110
  };
101
111
  }
102
112
  async getRow(tableSlug, id) {
103
- return this.request('get', `/api/v1/data/${tableSlug}/${id}`);
113
+ return this.request('get', this.getProjectUrl(`/data/${tableSlug}/${id}`));
104
114
  }
105
115
  async createRow(tableSlug, data) {
106
- return this.request('post', `/api/v1/data/${tableSlug}`, data);
116
+ return this.request('post', this.getProjectUrl(`/data/${tableSlug}`), data);
107
117
  }
108
118
  async updateRow(tableSlug, id, data) {
109
- return this.request('put', `/api/v1/data/${tableSlug}/${id}`, data);
119
+ return this.request('put', this.getProjectUrl(`/data/${tableSlug}/${id}`), data);
110
120
  }
111
121
  async deleteRow(tableSlug, id) {
112
- return this.request('delete', `/api/v1/data/${tableSlug}/${id}`);
122
+ return this.request('delete', this.getProjectUrl(`/data/${tableSlug}/${id}`));
113
123
  }
114
124
  }
115
125
  //# sourceMappingURL=nodus-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nodus-client.js","sourceRoot":"","sources":["../../src/client/nodus-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nodus-client.js","sourceRoot":"","sources":["../../src/client/nodus-client.ts"],"names":[],"mappings":"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"}