@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.
- package/MIGRATION_GUIDE.md +212 -0
- package/QUICKSTART.md +80 -23
- package/README.md +19 -23
- package/TROUBLESHOOTING.md +1 -2
- package/cursor-config.example.json +0 -1
- package/dist/client/nodus-client.d.ts +4 -4
- package/dist/client/nodus-client.d.ts.map +1 -1
- package/dist/client/nodus-client.js +24 -14
- package/dist/client/nodus-client.js.map +1 -1
- package/dist/client/types.d.ts +0 -1
- package/dist/client/types.d.ts.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -4
- package/dist/config.js.map +1 -1
- package/dist/index.js +0 -3
- package/dist/index.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +19 -8
- package/dist/tools/index.js.map +1 -1
- package/docs/project-goal-mcp.md +3 -3
- package/package.json +1 -1
- package/dist/tools/data-tools.d.ts +0 -4
- package/dist/tools/data-tools.d.ts.map +0 -1
- package/dist/tools/data-tools.js +0 -100
- package/dist/tools/data-tools.js.map +0 -1
- package/dist/tools/project-tools.d.ts +0 -4
- package/dist/tools/project-tools.d.ts.map +0 -1
- package/dist/tools/project-tools.js +0 -123
- package/dist/tools/project-tools.js.map +0 -1
- package/dist/tools/schema-tools.d.ts +0 -4
- package/dist/tools/schema-tools.d.ts.map +0 -1
- package/dist/tools/schema-tools.js +0 -274
- package/dist/tools/schema-tools.js.map +0 -1
|
@@ -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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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": "
|
|
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
|
|
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
|
|
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
|
-
###
|
|
130
|
-
-
|
|
131
|
-
-
|
|
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-
|
|
187
|
+
"nodus-account1": {
|
|
145
188
|
"command": "npx",
|
|
146
189
|
"args": ["-y", "@nodusapi/mcp-server"],
|
|
147
190
|
"env": {
|
|
148
|
-
"NODUS_API_KEY": "
|
|
149
|
-
"NODUS_PROJECT_SLUG": "dev-project"
|
|
191
|
+
"NODUS_API_KEY": "nodus_account1_key"
|
|
150
192
|
}
|
|
151
193
|
},
|
|
152
|
-
"nodus-
|
|
194
|
+
"nodus-account2": {
|
|
153
195
|
"command": "npx",
|
|
154
196
|
"args": ["-y", "@nodusapi/mcp-server"],
|
|
155
197
|
"env": {
|
|
156
|
-
"NODUS_API_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**:
|
|
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,
|
|
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
|
|
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
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
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:**
|
|
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
|
-
- **
|
|
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
|
|
package/TROUBLESHOOTING.md
CHANGED
|
@@ -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
|
}
|
|
@@ -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;
|
|
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', '/
|
|
71
|
+
return this.request('get', this.getProjectUrl('/schemas/tables'));
|
|
62
72
|
}
|
|
63
73
|
async getTable(tableSlug) {
|
|
64
|
-
return this.request('get', `/
|
|
74
|
+
return this.request('get', this.getProjectUrl(`/schemas/tables/${tableSlug}`));
|
|
65
75
|
}
|
|
66
76
|
async createTable(name, slug) {
|
|
67
|
-
return this.request('post', '/
|
|
77
|
+
return this.request('post', this.getProjectUrl('/schemas/tables'), { name, slug });
|
|
68
78
|
}
|
|
69
79
|
async updateTable(tableSlug, name) {
|
|
70
|
-
return this.request('put', `/
|
|
80
|
+
return this.request('put', this.getProjectUrl(`/schemas/tables/${tableSlug}`), { name });
|
|
71
81
|
}
|
|
72
82
|
async addColumn(tableSlug, column) {
|
|
73
|
-
return this.request('post', `/
|
|
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', `/
|
|
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(`/
|
|
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', `/
|
|
113
|
+
return this.request('get', this.getProjectUrl(`/data/${tableSlug}/${id}`));
|
|
104
114
|
}
|
|
105
115
|
async createRow(tableSlug, data) {
|
|
106
|
-
return this.request('post', `/
|
|
116
|
+
return this.request('post', this.getProjectUrl(`/data/${tableSlug}`), data);
|
|
107
117
|
}
|
|
108
118
|
async updateRow(tableSlug, id, data) {
|
|
109
|
-
return this.request('put', `/
|
|
119
|
+
return this.request('put', this.getProjectUrl(`/data/${tableSlug}/${id}`), data);
|
|
110
120
|
}
|
|
111
121
|
async deleteRow(tableSlug, id) {
|
|
112
|
-
return this.request('delete', `/
|
|
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":"AAAA,OAAO,KAAoC,MAAM,OAAO,CAAC;AAazD,MAAM,OAAO,WAAW;IACd,MAAM,CAAgB;IACtB,MAAM,CAAS;
|
|
1
|
+
{"version":3,"file":"nodus-client.js","sourceRoot":"","sources":["../../src/client/nodus-client.ts"],"names":[],"mappings":"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"}
|