nitrostack 1.0.18 → 1.0.20
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/ARCHITECTURE.md +302 -0
- package/dist/cli/commands/build.js +1 -1
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/start.js +3 -3
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/mcp-dev-wrapper.js +60 -12
- package/dist/cli/mcp-dev-wrapper.js.map +1 -1
- package/dist/core/events/log-emitter.d.ts +8 -0
- package/dist/core/events/log-emitter.d.ts.map +1 -0
- package/dist/core/events/log-emitter.js +20 -0
- package/dist/core/events/log-emitter.js.map +1 -0
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +3 -1
- package/dist/core/logger.js.map +1 -1
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +58 -14
- package/dist/core/server.js.map +1 -1
- package/dist/core/transports/streamable-http.d.ts +145 -0
- package/dist/core/transports/streamable-http.d.ts.map +1 -0
- package/dist/core/transports/streamable-http.js +691 -0
- package/dist/core/transports/streamable-http.js.map +1 -0
- package/package.json +2 -2
- package/src/studio/app/settings/page.tsx +8 -79
- package/src/studio/components/Sidebar.tsx +1 -1
- package/templates/typescript-auth/src/index.ts +27 -13
- package/templates/typescript-auth-api-key/src/index.ts +29 -14
- package/templates/typescript-auth-api-key/src/widgets/next.config.js +9 -1
- package/templates/typescript-oauth/src/index.ts +30 -9
- package/templates/typescript-oauth/src/widgets/next.config.js +9 -1
- package/templates/typescript-starter/src/index.ts +28 -4
- package/templates/typescript-starter/src/widgets/next.config.js +9 -1
- package/src/studio/package-lock.json +0 -3129
package/ARCHITECTURE.md
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
# NitroStack Architecture
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
NitroStack is a **framework** built on top of the official MCP SDK that provides a structured, decorator-based approach for building production-ready MCP servers with enterprise features.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
9
|
+
│ NitroStack Framework │
|
|
10
|
+
├─────────────────────────────────────────────────────────────┤
|
|
11
|
+
│ CLI Tools │ Templates │ Studio UI │ Decorators │
|
|
12
|
+
├─────────────────────────────────────────────────────────────┤
|
|
13
|
+
│ Core Server Layer (Module System) │
|
|
14
|
+
├─────────────────────────────────────────────────────────────┤
|
|
15
|
+
│ Auth │ Guards │ Interceptors │ Pipes │ Events │
|
|
16
|
+
├─────────────────────────────────────────────────────────────┤
|
|
17
|
+
│ Transport Layer (HTTP/STDIO) │
|
|
18
|
+
├─────────────────────────────────────────────────────────────┤
|
|
19
|
+
│ Official MCP SDK (@modelcontextprotocol) │
|
|
20
|
+
└─────────────────────────────────────────────────────────────┘
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Core Architecture
|
|
24
|
+
|
|
25
|
+
### 1. Module System (Inspired by NestJS)
|
|
26
|
+
|
|
27
|
+
**Module** → Groups related components
|
|
28
|
+
```typescript
|
|
29
|
+
@Module({
|
|
30
|
+
components: [CalculatorComponent],
|
|
31
|
+
imports: [ConfigModule]
|
|
32
|
+
})
|
|
33
|
+
export class AppModule {}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Component** → Contains tools, resources, prompts
|
|
37
|
+
```typescript
|
|
38
|
+
@Component()
|
|
39
|
+
export class CalculatorComponent {
|
|
40
|
+
@Tool({ description: "Add numbers" })
|
|
41
|
+
add(@Param('a') a: number, @Param('b') b: number) {
|
|
42
|
+
return a + b;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 2. Decorator System
|
|
48
|
+
|
|
49
|
+
**Purpose**: Declarative API for defining MCP primitives
|
|
50
|
+
|
|
51
|
+
| Decorator | Purpose |
|
|
52
|
+
|-----------|---------|
|
|
53
|
+
| `@Tool()` | Define callable tools |
|
|
54
|
+
| `@Resource()` | Expose data resources |
|
|
55
|
+
| `@Prompt()` | Create prompt templates |
|
|
56
|
+
| `@UseGuards()` | Apply authentication |
|
|
57
|
+
| `@UseInterceptors()` | Add middleware logic |
|
|
58
|
+
| `@UsePipes()` | Validate/transform input |
|
|
59
|
+
| `@Subscribe()` | Handle events |
|
|
60
|
+
|
|
61
|
+
### 3. Dependency Injection
|
|
62
|
+
|
|
63
|
+
**Injectable Services** → Shared across components
|
|
64
|
+
```typescript
|
|
65
|
+
@Injectable()
|
|
66
|
+
export class DatabaseService {
|
|
67
|
+
query(sql: string) { ... }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@Component()
|
|
71
|
+
export class UserComponent {
|
|
72
|
+
constructor(private db: DatabaseService) {}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Component Flow
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
Request → Transport → Server → Guards → Pipes → Component Method → Interceptors → Response
|
|
80
|
+
↓ ↓
|
|
81
|
+
Auth Check Logging/Transform
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
1. **Transport** receives request (HTTP/STDIO)
|
|
85
|
+
2. **Guards** check authentication/authorization
|
|
86
|
+
3. **Pipes** validate and transform input
|
|
87
|
+
4. **Component** executes business logic
|
|
88
|
+
5. **Interceptors** transform response/add logging
|
|
89
|
+
6. **Transport** sends response back
|
|
90
|
+
|
|
91
|
+
## Key Features
|
|
92
|
+
|
|
93
|
+
### 🔒 Built-in Authentication
|
|
94
|
+
- **JWT**: Token-based auth
|
|
95
|
+
- **API Key**: Simple key-based auth
|
|
96
|
+
- **OAuth**: Full OAuth2/PKCE flow
|
|
97
|
+
- **Guards**: Declarative protection
|
|
98
|
+
|
|
99
|
+
### 🚀 Dual Transport
|
|
100
|
+
- **STDIO**: For dev (MCP Inspector, Claude Desktop)
|
|
101
|
+
- **HTTP SSE**: For production web clients
|
|
102
|
+
- **Auto-switching**: Based on NODE_ENV
|
|
103
|
+
|
|
104
|
+
### 🎨 NitroStudio (Admin UI)
|
|
105
|
+
- Visual tool testing
|
|
106
|
+
- Resource browsing
|
|
107
|
+
- Prompt management
|
|
108
|
+
- Real-time logs
|
|
109
|
+
- Built with Next.js
|
|
110
|
+
|
|
111
|
+
### 🧩 Widget System
|
|
112
|
+
- React components for tool UIs
|
|
113
|
+
- Auto-exported as static HTML
|
|
114
|
+
- Embedded in tool responses
|
|
115
|
+
- Custom rendering in clients
|
|
116
|
+
|
|
117
|
+
### 📦 CLI Tooling
|
|
118
|
+
```bash
|
|
119
|
+
nitro init # Scaffold new project
|
|
120
|
+
nitro dev # Run with hot-reload
|
|
121
|
+
nitro build # Production build
|
|
122
|
+
nitro generate-types # Generate TypeScript types
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 🏗️ Templates
|
|
126
|
+
- `typescript-starter` - Basic MCP server
|
|
127
|
+
- `typescript-auth` - With JWT auth
|
|
128
|
+
- `typescript-auth-api-key` - With API key auth
|
|
129
|
+
- `typescript-oauth` - With OAuth flow
|
|
130
|
+
|
|
131
|
+
## Architecture Comparison
|
|
132
|
+
|
|
133
|
+
### Official MCP SDK
|
|
134
|
+
```typescript
|
|
135
|
+
// Manual setup, imperative
|
|
136
|
+
const server = new Server({ name: "my-server" });
|
|
137
|
+
|
|
138
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
139
|
+
tools: [{ name: "add", description: "...", inputSchema: {...} }]
|
|
140
|
+
}));
|
|
141
|
+
|
|
142
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
143
|
+
if (request.params.name === "add") {
|
|
144
|
+
return { content: [{ type: "text", text: result }] };
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const transport = new StdioServerTransport();
|
|
149
|
+
await server.connect(transport);
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### NitroStack
|
|
153
|
+
```typescript
|
|
154
|
+
// Declarative, structured
|
|
155
|
+
@Component()
|
|
156
|
+
export class CalculatorComponent {
|
|
157
|
+
@Tool({ description: "Add numbers" })
|
|
158
|
+
@UseGuards(JwtGuard)
|
|
159
|
+
@HealthCheck('add-operation')
|
|
160
|
+
async add(
|
|
161
|
+
@Param('a') a: number,
|
|
162
|
+
@Param('b') b: number
|
|
163
|
+
): Promise<number> {
|
|
164
|
+
return a + b;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Bootstrap
|
|
169
|
+
await McpApplicationFactory.create(AppModule).start('dual');
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Advantages Over Raw SDK
|
|
173
|
+
|
|
174
|
+
| Feature | MCP SDK | NitroStack |
|
|
175
|
+
|---------|---------|------------|
|
|
176
|
+
| **Structure** | Manual | Module-based |
|
|
177
|
+
| **Tools** | Imperative handlers | Decorators |
|
|
178
|
+
| **Auth** | DIY | Built-in (JWT/OAuth/API Key) |
|
|
179
|
+
| **Validation** | Manual | Pipes with Zod |
|
|
180
|
+
| **Transport** | Single | Dual (HTTP+STDIO) |
|
|
181
|
+
| **UI** | None | NitroStudio |
|
|
182
|
+
| **DI** | None | Full container |
|
|
183
|
+
| **Guards** | DIY | Declarative |
|
|
184
|
+
| **Events** | None | EventEmitter |
|
|
185
|
+
| **Widgets** | None | React components |
|
|
186
|
+
| **CLI** | None | Full toolchain |
|
|
187
|
+
| **Templates** | None | 4+ ready templates |
|
|
188
|
+
|
|
189
|
+
## Component Relationships
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
AppModule
|
|
193
|
+
├── ConfigModule (Injectable)
|
|
194
|
+
├── AuthModule (JWT/OAuth/API Key)
|
|
195
|
+
└── Feature Modules
|
|
196
|
+
├── CalculatorComponent
|
|
197
|
+
│ ├── Tools (@Tool decorator)
|
|
198
|
+
│ ├── Resources (@Resource decorator)
|
|
199
|
+
│ ├── Prompts (@Prompt decorator)
|
|
200
|
+
│ └── Dependencies (via DI)
|
|
201
|
+
└── DatabaseComponent
|
|
202
|
+
└── Shared via @Injectable
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Production Architecture
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
┌──────────────────────────────────────────┐
|
|
209
|
+
│ Load Balancer (nginx) │
|
|
210
|
+
└─────────────┬────────────────────────────┘
|
|
211
|
+
│
|
|
212
|
+
┌─────────┴─────────┐
|
|
213
|
+
│ │
|
|
214
|
+
┌───▼────┐ ┌───▼────┐
|
|
215
|
+
│ Node 1 │ │ Node 2 │ (Multiple instances)
|
|
216
|
+
│ :3000 │ │ :3001 │
|
|
217
|
+
└───┬────┘ └───┬────┘
|
|
218
|
+
│ │
|
|
219
|
+
│ HTTP SSE + STDIO │
|
|
220
|
+
│ │
|
|
221
|
+
┌───▼───────────────────▼────┐
|
|
222
|
+
│ Shared Services │
|
|
223
|
+
│ (DB, Cache, Message Q) │
|
|
224
|
+
└─────────────────────────────┘
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Development Workflow
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
# 1. Scaffold
|
|
231
|
+
nitro init my-server --template typescript-auth
|
|
232
|
+
|
|
233
|
+
# 2. Develop
|
|
234
|
+
cd my-server
|
|
235
|
+
npm install
|
|
236
|
+
npm run dev # STDIO transport for Inspector
|
|
237
|
+
|
|
238
|
+
# 3. Build
|
|
239
|
+
npm run build # Compiles TS + exports widgets
|
|
240
|
+
|
|
241
|
+
# 4. Production
|
|
242
|
+
NODE_ENV=production npm start # Dual transport
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## File Structure
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
my-server/
|
|
249
|
+
├── src/
|
|
250
|
+
│ ├── index.ts # Bootstrap
|
|
251
|
+
│ ├── app.module.ts # Root module
|
|
252
|
+
│ ├── modules/ # Feature modules
|
|
253
|
+
│ │ └── calculator/
|
|
254
|
+
│ │ ├── calculator.component.ts
|
|
255
|
+
│ │ └── calculator.service.ts
|
|
256
|
+
│ ├── guards/ # Auth guards
|
|
257
|
+
│ ├── interceptors/ # Logging, transform
|
|
258
|
+
│ ├── pipes/ # Validation
|
|
259
|
+
│ └── widgets/ # React UIs
|
|
260
|
+
│ ├── package.json
|
|
261
|
+
│ └── components/
|
|
262
|
+
└── dist/ # Compiled output
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Key Design Principles
|
|
266
|
+
|
|
267
|
+
1. **Convention over Configuration** - Sensible defaults, minimal boilerplate
|
|
268
|
+
2. **Decorator-First** - Declarative, self-documenting code
|
|
269
|
+
3. **Production-Ready** - Auth, validation, logging, health checks
|
|
270
|
+
4. **Framework Agnostic** - Can integrate with Express, Fastify, etc.
|
|
271
|
+
5. **Type-Safe** - Full TypeScript support with inference
|
|
272
|
+
6. **Modular** - Each feature is a module, easy to add/remove
|
|
273
|
+
|
|
274
|
+
## When to Use NitroStack vs Raw SDK
|
|
275
|
+
|
|
276
|
+
### Use NitroStack When:
|
|
277
|
+
- Building production servers
|
|
278
|
+
- Need authentication
|
|
279
|
+
- Want structured codebase
|
|
280
|
+
- Multiple developers
|
|
281
|
+
- Need admin UI
|
|
282
|
+
- Building complex servers with many tools
|
|
283
|
+
|
|
284
|
+
### Use Raw SDK When:
|
|
285
|
+
- Simple, single-purpose servers
|
|
286
|
+
- Prototyping/experimenting
|
|
287
|
+
- Minimal dependencies preferred
|
|
288
|
+
- Learning MCP basics
|
|
289
|
+
- Custom architecture needed
|
|
290
|
+
|
|
291
|
+
## Summary
|
|
292
|
+
|
|
293
|
+
NitroStack = **MCP SDK** + **Structure** + **Enterprise Features** + **Developer Experience**
|
|
294
|
+
|
|
295
|
+
It's not replacing the MCP SDK, it's enhancing it with:
|
|
296
|
+
- 🏗️ **Architecture**: Modules, components, DI
|
|
297
|
+
- 🔐 **Security**: Built-in auth strategies
|
|
298
|
+
- 🎨 **UI**: Admin dashboard & widget system
|
|
299
|
+
- 🛠️ **Tooling**: CLI, templates, hot-reload
|
|
300
|
+
- 📦 **Deployment**: Dual transport, production-ready
|
|
301
|
+
|
|
302
|
+
Think of it as **NestJS for MCP** - bringing enterprise patterns and developer ergonomics to MCP server development.
|
|
@@ -88,7 +88,7 @@ export async function buildCommand(options) {
|
|
|
88
88
|
console.log(chalk.green.bold('\n✨ Build completed successfully!\n'));
|
|
89
89
|
console.log(chalk.white('Output directory:'), chalk.cyan(options.output));
|
|
90
90
|
if (hasWidgets) {
|
|
91
|
-
console.log(chalk.white('Widgets output:'), chalk.cyan('src/widgets
|
|
91
|
+
console.log(chalk.white('Widgets output:'), chalk.cyan('src/widgets/out'));
|
|
92
92
|
}
|
|
93
93
|
console.log(chalk.white('\nTo start the server:\n'));
|
|
94
94
|
console.log(chalk.cyan(' npm start'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,9 +12,9 @@ export async function startCommand(options) {
|
|
|
12
12
|
console.log(chalk.cyan(' npm run build'));
|
|
13
13
|
process.exit(1);
|
|
14
14
|
}
|
|
15
|
-
// Auto-detect widgets
|
|
16
|
-
const
|
|
17
|
-
const hasBuiltWidgets = fs.existsSync(
|
|
15
|
+
// Auto-detect widgets (check for 'out' directory in production builds)
|
|
16
|
+
const widgetsOutPath = path.join(process.cwd(), 'src', 'widgets', 'out');
|
|
17
|
+
const hasBuiltWidgets = fs.existsSync(widgetsOutPath);
|
|
18
18
|
if (!hasBuiltWidgets) {
|
|
19
19
|
const widgetsPackageJsonPath = path.join(process.cwd(), 'src', 'widgets', 'package.json');
|
|
20
20
|
if (fs.existsSync(widgetsPackageJsonPath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAMpB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqB;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,CAAC;IAExF,gCAAgC;IAChC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { spawn } from 'child_process';
|
|
|
3
3
|
import chokidar from 'chokidar';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
import { fileURLToPath } from 'url';
|
|
6
|
+
import http from 'http';
|
|
6
7
|
const __filename = fileURLToPath(import.meta.url);
|
|
7
8
|
const __dirname = path.dirname(__filename);
|
|
8
9
|
/**
|
|
@@ -13,6 +14,7 @@ const __dirname = path.dirname(__filename);
|
|
|
13
14
|
* 2. Watches for changes in the dist/ directory
|
|
14
15
|
* 3. Restarts the server when changes are detected
|
|
15
16
|
* 4. Maintains stdio connection for Studio
|
|
17
|
+
* 5. Captures stderr from the MCP server and streams it over an SSE endpoint
|
|
16
18
|
*
|
|
17
19
|
* IMPORTANT: All logs go to stderr to avoid corrupting MCP JSON-RPC on stdout
|
|
18
20
|
*/
|
|
@@ -28,19 +30,68 @@ let isRestarting = false;
|
|
|
28
30
|
let consecutiveFailures = 0;
|
|
29
31
|
const maxConsecutiveFailures = 3;
|
|
30
32
|
let restartTimeout = null;
|
|
33
|
+
let sseClient = null;
|
|
34
|
+
const logCache = [];
|
|
35
|
+
// Create an HTTP server for SSE log streaming
|
|
36
|
+
const logServer = http.createServer((req, res) => {
|
|
37
|
+
if (req.url === '/mcp-logs') {
|
|
38
|
+
res.writeHead(200, {
|
|
39
|
+
'Content-Type': 'text/event-stream',
|
|
40
|
+
'Cache-Control': 'no-cache',
|
|
41
|
+
'Connection': 'keep-alive',
|
|
42
|
+
'Access-Control-Allow-Origin': '*', // Allow all origins
|
|
43
|
+
});
|
|
44
|
+
sseClient = res;
|
|
45
|
+
// Send cached logs
|
|
46
|
+
logCache.forEach(log => {
|
|
47
|
+
sseClient?.write(`data: ${log}\n\n`);
|
|
48
|
+
});
|
|
49
|
+
req.on('close', () => {
|
|
50
|
+
sseClient = null;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
res.writeHead(404);
|
|
55
|
+
res.end();
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
const logServerPort = parseInt(process.env.MCP_LOG_PORT || '3004');
|
|
59
|
+
logServer.listen(logServerPort, () => {
|
|
60
|
+
console.error(`[NitroStack Hot Reload] Log streaming server running at http://localhost:${logServerPort}/mcp-logs`);
|
|
61
|
+
});
|
|
31
62
|
function startMCPServer() {
|
|
32
63
|
if (isRestarting)
|
|
33
64
|
return;
|
|
34
|
-
// Start the MCP server - inherit stdin/stdout for MCP protocol
|
|
35
|
-
// Set PORT from MCP_SERVER_PORT to avoid conflicts with Studio (port 3000)
|
|
36
65
|
const mcpEnv = {
|
|
37
66
|
...process.env,
|
|
38
|
-
|
|
67
|
+
NODE_ENV: 'development',
|
|
68
|
+
PORT: process.env.MCP_SERVER_PORT || '3002',
|
|
39
69
|
};
|
|
40
70
|
mcpProcess = spawn('node', [distPath], {
|
|
41
|
-
stdio: ['inherit', 'inherit', '
|
|
71
|
+
stdio: ['inherit', 'inherit', 'pipe'], // Pipe stderr to capture logs
|
|
42
72
|
env: mcpEnv,
|
|
43
73
|
});
|
|
74
|
+
let buffer = '';
|
|
75
|
+
if (mcpProcess.stderr) {
|
|
76
|
+
mcpProcess.stderr.on('data', (data) => {
|
|
77
|
+
buffer += data.toString();
|
|
78
|
+
let boundary = buffer.indexOf('\n');
|
|
79
|
+
while (boundary !== -1) {
|
|
80
|
+
const line = buffer.substring(0, boundary);
|
|
81
|
+
buffer = buffer.substring(boundary + 1);
|
|
82
|
+
// Forward to the console for local debugging
|
|
83
|
+
process.stderr.write(line + '\n');
|
|
84
|
+
if (line.startsWith('NITRO_LOG::')) {
|
|
85
|
+
const logJson = line.substring('NITRO_LOG::'.length);
|
|
86
|
+
logCache.push(logJson);
|
|
87
|
+
if (sseClient) {
|
|
88
|
+
sseClient.write(`data: ${logJson}\n\n`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
boundary = buffer.indexOf('\n');
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
44
95
|
mcpProcess.on('exit', (code) => {
|
|
45
96
|
if (!isRestarting) {
|
|
46
97
|
if (code !== 0) {
|
|
@@ -53,7 +104,7 @@ function startMCPServer() {
|
|
|
53
104
|
console.error(`[NitroStack Hot Reload] Server exited with code ${code} (attempt ${consecutiveFailures}/${maxConsecutiveFailures}), restarting...`);
|
|
54
105
|
}
|
|
55
106
|
else {
|
|
56
|
-
consecutiveFailures = 0;
|
|
107
|
+
consecutiveFailures = 0;
|
|
57
108
|
console.error(`[NitroStack Hot Reload] Server exited with code ${code}, restarting...`);
|
|
58
109
|
}
|
|
59
110
|
mcpProcess = null;
|
|
@@ -65,11 +116,9 @@ function startMCPServer() {
|
|
|
65
116
|
});
|
|
66
117
|
}
|
|
67
118
|
function restartMCPServer() {
|
|
68
|
-
// Clear any pending restart
|
|
69
119
|
if (restartTimeout) {
|
|
70
120
|
clearTimeout(restartTimeout);
|
|
71
121
|
}
|
|
72
|
-
// Debounce restarts - wait for all file changes to settle
|
|
73
122
|
restartTimeout = setTimeout(() => {
|
|
74
123
|
if (isRestarting)
|
|
75
124
|
return;
|
|
@@ -77,23 +126,21 @@ function restartMCPServer() {
|
|
|
77
126
|
if (mcpProcess) {
|
|
78
127
|
console.error('[NitroStack Hot Reload] Changes detected, restarting server...');
|
|
79
128
|
mcpProcess.kill('SIGTERM');
|
|
80
|
-
// Wait for the process to exit and ports to be released (especially for HTTP transport)
|
|
81
129
|
setTimeout(() => {
|
|
82
130
|
mcpProcess = null;
|
|
83
131
|
isRestarting = false;
|
|
84
132
|
startMCPServer();
|
|
85
133
|
console.error('[NitroStack Hot Reload] Server restarted successfully');
|
|
86
|
-
}, 1500);
|
|
134
|
+
}, 1500);
|
|
87
135
|
}
|
|
88
136
|
else {
|
|
89
137
|
isRestarting = false;
|
|
90
138
|
startMCPServer();
|
|
91
139
|
}
|
|
92
|
-
}, 1000);
|
|
140
|
+
}, 1000);
|
|
93
141
|
}
|
|
94
142
|
// Start the server initially
|
|
95
143
|
startMCPServer();
|
|
96
|
-
// Watch for changes in dist directory
|
|
97
144
|
const watcher = chokidar.watch(watchPath, {
|
|
98
145
|
ignoreInitial: true,
|
|
99
146
|
persistent: true,
|
|
@@ -110,13 +157,13 @@ watcher.on('add', (filepath) => {
|
|
|
110
157
|
console.error(`[NitroStack Hot Reload] File added: ${path.relative(projectRoot, filepath)}`);
|
|
111
158
|
restartMCPServer();
|
|
112
159
|
});
|
|
113
|
-
// Handle graceful shutdown
|
|
114
160
|
process.on('SIGINT', () => {
|
|
115
161
|
console.error('[NitroStack Hot Reload] Shutting down...');
|
|
116
162
|
watcher.close();
|
|
117
163
|
if (mcpProcess) {
|
|
118
164
|
mcpProcess.kill('SIGTERM');
|
|
119
165
|
}
|
|
166
|
+
logServer.close();
|
|
120
167
|
process.exit(0);
|
|
121
168
|
});
|
|
122
169
|
process.on('SIGTERM', () => {
|
|
@@ -124,6 +171,7 @@ process.on('SIGTERM', () => {
|
|
|
124
171
|
if (mcpProcess) {
|
|
125
172
|
mcpProcess.kill('SIGTERM');
|
|
126
173
|
}
|
|
174
|
+
logServer.close();
|
|
127
175
|
process.exit(0);
|
|
128
176
|
});
|
|
129
177
|
//# sourceMappingURL=mcp-dev-wrapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-dev-wrapper.js","sourceRoot":"","sources":["../../src/cli/mcp-dev-wrapper.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAgB,MAAM,eAAe,CAAC;AACpD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-dev-wrapper.js","sourceRoot":"","sources":["../../src/cli/mcp-dev-wrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import Transport from 'winston-transport';
|
|
3
|
+
export declare const logEmitter: EventEmitter<[never]>;
|
|
4
|
+
export declare class EventEmitterTransport extends Transport {
|
|
5
|
+
constructor(opts?: Transport.TransportStreamOptions);
|
|
6
|
+
log(info: any, callback: () => void): void;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=log-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-emitter.d.ts","sourceRoot":"","sources":["../../../src/core/events/log-emitter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,eAAO,MAAM,UAAU,uBAAqB,CAAC;AAG7C,qBAAa,qBAAsB,SAAQ,SAAS;gBACtC,IAAI,CAAC,EAAE,SAAS,CAAC,sBAAsB;IAInD,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,IAAI;CAUpC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import Transport from 'winston-transport';
|
|
3
|
+
// Create a new event emitter
|
|
4
|
+
export const logEmitter = new EventEmitter();
|
|
5
|
+
// Define a custom winston transport
|
|
6
|
+
export class EventEmitterTransport extends Transport {
|
|
7
|
+
constructor(opts) {
|
|
8
|
+
super(opts);
|
|
9
|
+
}
|
|
10
|
+
log(info, callback) {
|
|
11
|
+
setImmediate(() => {
|
|
12
|
+
logEmitter.emit('log', info);
|
|
13
|
+
// Also write to stderr for the dev wrapper to capture
|
|
14
|
+
process.stderr.write(`NITRO_LOG::${JSON.stringify(info)}\n`);
|
|
15
|
+
});
|
|
16
|
+
// Perform the callback
|
|
17
|
+
callback();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=log-emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-emitter.js","sourceRoot":"","sources":["../../../src/core/events/log-emitter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,6BAA6B;AAC7B,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,YAAY,EAAE,CAAC;AAE7C,oCAAoC;AACpC,MAAM,OAAO,qBAAsB,SAAQ,SAAS;IAClD,YAAY,IAAuC;QACjD,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IAED,GAAG,CAAC,IAAS,EAAE,QAAoB;QACjC,YAAY,CAAC,GAAG,EAAE;YAChB,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7B,sDAAsD;YACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,uBAAuB;QACvB,QAAQ,EAAE,CAAC;IACb,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGpC;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,MAAM,CA6DT;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,QAAkC,CAAC"}
|
package/dist/core/logger.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import winston from 'winston';
|
|
2
|
+
import { EventEmitterTransport } from './events/log-emitter.js';
|
|
2
3
|
/**
|
|
3
4
|
* Create a logger instance with custom configuration
|
|
4
5
|
*
|
|
@@ -7,7 +8,7 @@ import winston from 'winston';
|
|
|
7
8
|
*/
|
|
8
9
|
export function createLogger(options) {
|
|
9
10
|
const { level = 'info', file, serviceName = 'nitrostack', enableConsole = false } = options;
|
|
10
|
-
const transports = [];
|
|
11
|
+
const transports = [new EventEmitterTransport()];
|
|
11
12
|
// CRITICAL: Console logging disabled by default for MCP compatibility
|
|
12
13
|
// MCP uses stdio for JSON-RPC communication, console output breaks it
|
|
13
14
|
if (enableConsole) {
|
|
@@ -35,6 +36,7 @@ export function createLogger(options) {
|
|
|
35
36
|
}
|
|
36
37
|
const winstonLogger = winston.createLogger({
|
|
37
38
|
level,
|
|
39
|
+
format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
|
|
38
40
|
transports,
|
|
39
41
|
});
|
|
40
42
|
return {
|
package/dist/core/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAkB,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EACL,eAAe,EAGf,WAAW,EACZ,MAAM,YAAY,CAAC;AAOpB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAKX;IACF,OAAO,CAAC,6BAA6B,CAAuB;gBAEhD,MAAM,EAAE,eAAe;IA0BnC;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAkBtB;;OAEG;YACW,yBAAyB;IA6BvC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAMlC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM5B;;;;;;;;;OASG;IACH,MAAM,CAAC,WAAW,EAAE,GAAG,GAAG,IAAI;IA+C9B;;OAEG;IACH,QAAQ,IAAI,WAAW;IAIvB;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAyLrB;;;;OAIG;IACG,KAAK,CAAC,aAAa,GAAE,OAAO,GAAG,MAAM,GAAG,MAAgB,EAAE,gBAAgB,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAkB,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EACL,eAAe,EAGf,WAAW,EACZ,MAAM,YAAY,CAAC;AAOpB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAKX;IACF,OAAO,CAAC,6BAA6B,CAAuB;gBAEhD,MAAM,EAAE,eAAe;IA0BnC;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAkBtB;;OAEG;YACW,yBAAyB;IA6BvC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAMlC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM5B;;;;;;;;;OASG;IACH,MAAM,CAAC,WAAW,EAAE,GAAG,GAAG,IAAI;IA+C9B;;OAEG;IACH,QAAQ,IAAI,WAAW;IAIvB;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAyLrB;;;;OAIG;IACG,KAAK,CAAC,aAAa,GAAE,OAAO,GAAG,MAAM,GAAG,MAAgB,EAAE,gBAAgB,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAmGtG;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB5B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,CAEtE"}
|