@chinchillaenterprises/mcp-dev-logger 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.
- package/README.md +250 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +555 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
package/README.md
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# MCP Dev Logger
|
|
2
|
+
|
|
3
|
+
A Model Context Protocol (MCP) server for capturing and streaming development server output. Perfect for monitoring `npm run dev`, `yarn dev`, `pnpm dev`, or any other development server commands across all frameworks (Next.js, Vite, Create React App, etc.).
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Universal Dev Server Logging**: Works with any development server command
|
|
8
|
+
- **Real-time Log Streaming**: Capture build errors, TypeScript errors, hot reload events
|
|
9
|
+
- **Persistent Logs**: All output saved to file for historical debugging
|
|
10
|
+
- **Process Management**: Start, stop, and restart dev servers
|
|
11
|
+
- **Log Filtering**: Search through logs with grep patterns
|
|
12
|
+
- **Framework Agnostic**: One tool for all development servers
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
### From NPM (Recommended)
|
|
17
|
+
```bash
|
|
18
|
+
claude mcp add dev-logger -s user -- npx @chinchillaenterprises/mcp-dev-logger
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### For Development/Testing
|
|
22
|
+
```bash
|
|
23
|
+
# Clone and build locally
|
|
24
|
+
git clone <repository-url>
|
|
25
|
+
cd mcp-dev-logger
|
|
26
|
+
npm install
|
|
27
|
+
npm run build
|
|
28
|
+
|
|
29
|
+
# Add to Claude Code (local development)
|
|
30
|
+
claude mcp add dev-logger-local -s user -- node $(pwd)/dist/index.js
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Tools Provided
|
|
34
|
+
|
|
35
|
+
### 1. dev_start_log_streaming
|
|
36
|
+
Start a development server and stream its output to a log file.
|
|
37
|
+
|
|
38
|
+
**Parameters:**
|
|
39
|
+
- `command` (optional): Dev command to run (default: "npm run dev")
|
|
40
|
+
- `outputFile` (optional): File to write logs to (default: "dev-server-logs.txt")
|
|
41
|
+
- `cwd` (optional): Working directory
|
|
42
|
+
- `env` (optional): Environment variables to pass
|
|
43
|
+
|
|
44
|
+
**Example:**
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"command": "npm run dev",
|
|
48
|
+
"outputFile": "frontend-logs.txt",
|
|
49
|
+
"cwd": "/path/to/project",
|
|
50
|
+
"env": {
|
|
51
|
+
"PORT": "3001",
|
|
52
|
+
"NODE_ENV": "development"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 2. dev_stop_log_streaming
|
|
58
|
+
Stop the running development server and logging.
|
|
59
|
+
|
|
60
|
+
**No parameters required.**
|
|
61
|
+
|
|
62
|
+
### 3. dev_restart_log_streaming
|
|
63
|
+
Restart the development server (useful when it crashes or hangs).
|
|
64
|
+
|
|
65
|
+
**Parameters:**
|
|
66
|
+
- `clearLogs` (optional): Whether to clear the log file on restart (default: false)
|
|
67
|
+
|
|
68
|
+
### 4. dev_get_status
|
|
69
|
+
Check if the development server is running and get its status.
|
|
70
|
+
|
|
71
|
+
**Returns:**
|
|
72
|
+
- Running status
|
|
73
|
+
- Process ID (PID)
|
|
74
|
+
- Uptime
|
|
75
|
+
- Current command
|
|
76
|
+
- Log file location
|
|
77
|
+
|
|
78
|
+
### 5. dev_tail_logs
|
|
79
|
+
Get the last N lines from the log file.
|
|
80
|
+
|
|
81
|
+
**Parameters:**
|
|
82
|
+
- `lines` (optional): Number of lines to return (default: 50)
|
|
83
|
+
- `filter` (optional): Grep pattern to filter logs
|
|
84
|
+
|
|
85
|
+
**Example:**
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"lines": 100,
|
|
89
|
+
"filter": "ERROR"
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 6. dev_clear_logs
|
|
94
|
+
Clear the log file.
|
|
95
|
+
|
|
96
|
+
**Parameters:**
|
|
97
|
+
- `backup` (optional): Whether to backup logs before clearing (default: false)
|
|
98
|
+
|
|
99
|
+
## Usage Examples
|
|
100
|
+
|
|
101
|
+
### Start Next.js Development Server
|
|
102
|
+
```typescript
|
|
103
|
+
// Start Next.js dev server
|
|
104
|
+
{
|
|
105
|
+
"command": "npm run dev",
|
|
106
|
+
"outputFile": "nextjs-dev.log"
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Monitor Vite Dev Server
|
|
111
|
+
```typescript
|
|
112
|
+
// Start Vite with custom port
|
|
113
|
+
{
|
|
114
|
+
"command": "vite --port 3001",
|
|
115
|
+
"outputFile": "vite-dev.log",
|
|
116
|
+
"env": {
|
|
117
|
+
"NODE_ENV": "development"
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Check for TypeScript Errors
|
|
123
|
+
```typescript
|
|
124
|
+
// Tail logs filtering for TypeScript errors
|
|
125
|
+
{
|
|
126
|
+
"lines": 200,
|
|
127
|
+
"filter": "TS\\d+"
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Debug Build Errors
|
|
132
|
+
```typescript
|
|
133
|
+
// Get recent errors from build process
|
|
134
|
+
{
|
|
135
|
+
"lines": 100,
|
|
136
|
+
"filter": "ERROR|FAILED|error"
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Log Format
|
|
141
|
+
|
|
142
|
+
Logs are written with timestamps and error markers:
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
[2024-01-15T10:30:45.123Z] Starting: npm run dev
|
|
146
|
+
[2024-01-15T10:30:46.456Z] > my-app@1.0.0 dev
|
|
147
|
+
[2024-01-15T10:30:46.457Z] > next dev
|
|
148
|
+
[2024-01-15T10:30:47.123Z] ▲ Next.js 14.0.0
|
|
149
|
+
[2024-01-15T10:30:47.124Z] - Local: http://localhost:3000
|
|
150
|
+
[2024-01-15T10:30:48.789Z] [ERROR] Error: Cannot find module './components/Header'
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Common Use Cases
|
|
154
|
+
|
|
155
|
+
### 1. Debugging Build Failures
|
|
156
|
+
```bash
|
|
157
|
+
# Start dev server
|
|
158
|
+
dev_start_log_streaming
|
|
159
|
+
|
|
160
|
+
# When build fails, check recent errors
|
|
161
|
+
dev_tail_logs { "filter": "ERROR", "lines": 100 }
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 2. Monitoring TypeScript Compilation
|
|
165
|
+
```bash
|
|
166
|
+
# Start with TypeScript focus
|
|
167
|
+
dev_start_log_streaming { "command": "npm run dev", "outputFile": "ts-errors.log" }
|
|
168
|
+
|
|
169
|
+
# Check for TS errors
|
|
170
|
+
dev_tail_logs { "filter": "TS\\d+|typescript", "lines": 50 }
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### 3. Port Conflicts
|
|
174
|
+
```bash
|
|
175
|
+
# Start on different port
|
|
176
|
+
dev_start_log_streaming {
|
|
177
|
+
"command": "npm run dev",
|
|
178
|
+
"env": { "PORT": "3001" }
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 4. Clean Restart After Crash
|
|
183
|
+
```bash
|
|
184
|
+
# Restart and clear old logs
|
|
185
|
+
dev_restart_log_streaming { "clearLogs": true }
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Troubleshooting
|
|
189
|
+
|
|
190
|
+
### Dev Server Not Starting
|
|
191
|
+
1. Check the log file for error messages
|
|
192
|
+
2. Verify the command works when run directly in terminal
|
|
193
|
+
3. Check working directory is correct
|
|
194
|
+
4. Ensure all dependencies are installed
|
|
195
|
+
|
|
196
|
+
### Logs Not Appearing
|
|
197
|
+
1. Check the output file path is writable
|
|
198
|
+
2. Some frameworks buffer output - logs may appear in chunks
|
|
199
|
+
3. Use `dev_get_status` to verify server is running
|
|
200
|
+
|
|
201
|
+
### Process Won't Stop
|
|
202
|
+
1. Use `dev_stop_log_streaming` first
|
|
203
|
+
2. If that fails, the process may have crashed - check system process manager
|
|
204
|
+
3. Restart Claude Code to clean up orphaned processes
|
|
205
|
+
|
|
206
|
+
## Limitations
|
|
207
|
+
|
|
208
|
+
- Only one dev server can be managed at a time (default instance)
|
|
209
|
+
- Process management is best-effort - some processes may not respond to signals
|
|
210
|
+
- Very large log files may impact performance of `dev_tail_logs`
|
|
211
|
+
|
|
212
|
+
## Development
|
|
213
|
+
|
|
214
|
+
### Building
|
|
215
|
+
```bash
|
|
216
|
+
npm run build
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Watch Mode
|
|
220
|
+
```bash
|
|
221
|
+
npm run dev
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Testing
|
|
225
|
+
```bash
|
|
226
|
+
# Test with local installation
|
|
227
|
+
claude mcp add dev-logger-test -s user -- node $(pwd)/dist/index.js
|
|
228
|
+
|
|
229
|
+
# Start Claude and test tools
|
|
230
|
+
claude
|
|
231
|
+
> /mcp # Check if server is connected
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Contributing
|
|
235
|
+
|
|
236
|
+
1. Fork the repository
|
|
237
|
+
2. Create feature branch
|
|
238
|
+
3. Make changes and test thoroughly
|
|
239
|
+
4. Submit pull request with clear description
|
|
240
|
+
|
|
241
|
+
## License
|
|
242
|
+
|
|
243
|
+
MIT License - see LICENSE file for details.
|
|
244
|
+
|
|
245
|
+
## Support
|
|
246
|
+
|
|
247
|
+
For issues and questions:
|
|
248
|
+
- Open an issue in the repository
|
|
249
|
+
- Check existing issues for similar problems
|
|
250
|
+
- Include log samples when reporting bugs
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { ListToolsRequestSchema, CallToolRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { spawn } from "child_process";
|
|
7
|
+
import { writeFileSync, readFileSync, existsSync, appendFileSync, copyFileSync } from "fs";
|
|
8
|
+
import { join, resolve } from "path";
|
|
9
|
+
import { tmpdir } from "os";
|
|
10
|
+
// Schema definitions
|
|
11
|
+
const StartLogStreamingArgsSchema = z.object({
|
|
12
|
+
command: z.string().optional().describe("Dev command to run (default: npm run dev)"),
|
|
13
|
+
outputFile: z.string().optional().describe("File to write logs to (default: dev-server-logs.txt)"),
|
|
14
|
+
cwd: z.string().optional().describe("Working directory"),
|
|
15
|
+
env: z.record(z.string()).optional().describe("Environment variables")
|
|
16
|
+
});
|
|
17
|
+
const RestartLogStreamingArgsSchema = z.object({
|
|
18
|
+
clearLogs: z.boolean().optional().describe("Clear logs on restart (default: false)")
|
|
19
|
+
});
|
|
20
|
+
const TailLogsArgsSchema = z.object({
|
|
21
|
+
lines: z.number().optional().describe("Number of lines to return (default: 50)"),
|
|
22
|
+
filter: z.string().optional().describe("Grep pattern to filter logs")
|
|
23
|
+
});
|
|
24
|
+
const ClearLogsArgsSchema = z.object({
|
|
25
|
+
backup: z.boolean().optional().describe("Backup logs before clearing (default: false)")
|
|
26
|
+
});
|
|
27
|
+
class DevLoggerServer {
|
|
28
|
+
server;
|
|
29
|
+
activeServers;
|
|
30
|
+
pidFile;
|
|
31
|
+
constructor() {
|
|
32
|
+
this.server = new Server({
|
|
33
|
+
name: "mcp-dev-logger",
|
|
34
|
+
version: "1.0.0",
|
|
35
|
+
}, {
|
|
36
|
+
capabilities: {
|
|
37
|
+
tools: {},
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
this.activeServers = new Map();
|
|
41
|
+
this.pidFile = join(tmpdir(), "mcp-dev-logger.json");
|
|
42
|
+
// Load any saved state
|
|
43
|
+
this.loadState();
|
|
44
|
+
this.setupHandlers();
|
|
45
|
+
}
|
|
46
|
+
loadState() {
|
|
47
|
+
try {
|
|
48
|
+
if (existsSync(this.pidFile)) {
|
|
49
|
+
const data = JSON.parse(readFileSync(this.pidFile, 'utf8'));
|
|
50
|
+
// Note: We can't restore the actual process objects, but we can track that they existed
|
|
51
|
+
console.error("Previous dev server sessions detected. Use dev_get_status to check.");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
// Ignore errors loading state
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
saveState() {
|
|
59
|
+
try {
|
|
60
|
+
const state = {};
|
|
61
|
+
for (const [id, info] of this.activeServers) {
|
|
62
|
+
state[id] = {
|
|
63
|
+
command: info.command,
|
|
64
|
+
cwd: info.cwd,
|
|
65
|
+
outputFile: info.outputFile,
|
|
66
|
+
startTime: info.startTime,
|
|
67
|
+
pid: info.pid
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
writeFileSync(this.pidFile, JSON.stringify(state, null, 2));
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
// Ignore errors saving state
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
killAllProcesses() {
|
|
77
|
+
for (const [id, info] of this.activeServers) {
|
|
78
|
+
try {
|
|
79
|
+
if (info.process && info.pid) {
|
|
80
|
+
process.kill(info.pid, 'SIGTERM');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
// Process might already be dead
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
this.activeServers.clear();
|
|
88
|
+
}
|
|
89
|
+
setupHandlers() {
|
|
90
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
91
|
+
const tools = [
|
|
92
|
+
{
|
|
93
|
+
name: "dev_start_log_streaming",
|
|
94
|
+
description: "Start development server and stream logs to file",
|
|
95
|
+
inputSchema: {
|
|
96
|
+
type: "object",
|
|
97
|
+
properties: {
|
|
98
|
+
command: {
|
|
99
|
+
type: "string",
|
|
100
|
+
description: "Dev command to run (default: npm run dev)"
|
|
101
|
+
},
|
|
102
|
+
outputFile: {
|
|
103
|
+
type: "string",
|
|
104
|
+
description: "File to write logs to (default: dev-server-logs.txt)"
|
|
105
|
+
},
|
|
106
|
+
cwd: {
|
|
107
|
+
type: "string",
|
|
108
|
+
description: "Working directory"
|
|
109
|
+
},
|
|
110
|
+
env: {
|
|
111
|
+
type: "object",
|
|
112
|
+
description: "Environment variables",
|
|
113
|
+
additionalProperties: {
|
|
114
|
+
type: "string"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: "dev_stop_log_streaming",
|
|
122
|
+
description: "Stop development server and logging",
|
|
123
|
+
inputSchema: {
|
|
124
|
+
type: "object",
|
|
125
|
+
properties: {}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: "dev_restart_log_streaming",
|
|
130
|
+
description: "Restart the development server",
|
|
131
|
+
inputSchema: {
|
|
132
|
+
type: "object",
|
|
133
|
+
properties: {
|
|
134
|
+
clearLogs: {
|
|
135
|
+
type: "boolean",
|
|
136
|
+
description: "Clear logs on restart (default: false)"
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: "dev_get_status",
|
|
143
|
+
description: "Get status of development server",
|
|
144
|
+
inputSchema: {
|
|
145
|
+
type: "object",
|
|
146
|
+
properties: {}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: "dev_tail_logs",
|
|
151
|
+
description: "Get last N lines from log file",
|
|
152
|
+
inputSchema: {
|
|
153
|
+
type: "object",
|
|
154
|
+
properties: {
|
|
155
|
+
lines: {
|
|
156
|
+
type: "number",
|
|
157
|
+
description: "Number of lines to return (default: 50)"
|
|
158
|
+
},
|
|
159
|
+
filter: {
|
|
160
|
+
type: "string",
|
|
161
|
+
description: "Grep pattern to filter logs"
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
name: "dev_clear_logs",
|
|
168
|
+
description: "Clear the log file",
|
|
169
|
+
inputSchema: {
|
|
170
|
+
type: "object",
|
|
171
|
+
properties: {
|
|
172
|
+
backup: {
|
|
173
|
+
type: "boolean",
|
|
174
|
+
description: "Backup logs before clearing (default: false)"
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
];
|
|
180
|
+
return { tools };
|
|
181
|
+
});
|
|
182
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
183
|
+
try {
|
|
184
|
+
const { name, arguments: args } = request.params;
|
|
185
|
+
switch (name) {
|
|
186
|
+
case "dev_start_log_streaming": {
|
|
187
|
+
const validatedArgs = StartLogStreamingArgsSchema.parse(args);
|
|
188
|
+
// Kill any existing process first
|
|
189
|
+
this.killAllProcesses();
|
|
190
|
+
const command = validatedArgs.command || "npm run dev";
|
|
191
|
+
const outputFile = resolve(validatedArgs.outputFile || "dev-server-logs.txt");
|
|
192
|
+
const cwd = resolve(validatedArgs.cwd || process.cwd());
|
|
193
|
+
// Parse command into program and args
|
|
194
|
+
const [program, ...cmdArgs] = command.split(' ');
|
|
195
|
+
// Create or clear the output file
|
|
196
|
+
writeFileSync(outputFile, `[${new Date().toISOString()}] Starting: ${command}\n`);
|
|
197
|
+
try {
|
|
198
|
+
// Spawn the process
|
|
199
|
+
const devProcess = spawn(program, cmdArgs, {
|
|
200
|
+
cwd: cwd,
|
|
201
|
+
env: { ...process.env, ...validatedArgs.env },
|
|
202
|
+
shell: true,
|
|
203
|
+
detached: false
|
|
204
|
+
});
|
|
205
|
+
const serverId = "default";
|
|
206
|
+
const serverInfo = {
|
|
207
|
+
process: devProcess,
|
|
208
|
+
command: command,
|
|
209
|
+
cwd: cwd,
|
|
210
|
+
outputFile: outputFile,
|
|
211
|
+
startTime: new Date(),
|
|
212
|
+
pid: devProcess.pid
|
|
213
|
+
};
|
|
214
|
+
this.activeServers.set(serverId, serverInfo);
|
|
215
|
+
// Stream stdout to file
|
|
216
|
+
devProcess.stdout?.on('data', (data) => {
|
|
217
|
+
const timestamp = new Date().toISOString();
|
|
218
|
+
const logEntry = `[${timestamp}] ${data}`;
|
|
219
|
+
appendFileSync(outputFile, logEntry);
|
|
220
|
+
});
|
|
221
|
+
// Stream stderr to file
|
|
222
|
+
devProcess.stderr?.on('data', (data) => {
|
|
223
|
+
const timestamp = new Date().toISOString();
|
|
224
|
+
const logEntry = `[${timestamp}] [ERROR] ${data}`;
|
|
225
|
+
appendFileSync(outputFile, logEntry);
|
|
226
|
+
});
|
|
227
|
+
// Handle process exit
|
|
228
|
+
devProcess.on('exit', (code, signal) => {
|
|
229
|
+
const timestamp = new Date().toISOString();
|
|
230
|
+
const exitMessage = `[${timestamp}] Process exited with code ${code} and signal ${signal}\n`;
|
|
231
|
+
appendFileSync(outputFile, exitMessage);
|
|
232
|
+
this.activeServers.delete(serverId);
|
|
233
|
+
});
|
|
234
|
+
// Handle process errors
|
|
235
|
+
devProcess.on('error', (error) => {
|
|
236
|
+
const timestamp = new Date().toISOString();
|
|
237
|
+
const errorMessage = `[${timestamp}] Process error: ${error.message}\n`;
|
|
238
|
+
appendFileSync(outputFile, errorMessage);
|
|
239
|
+
});
|
|
240
|
+
this.saveState();
|
|
241
|
+
return {
|
|
242
|
+
content: [
|
|
243
|
+
{
|
|
244
|
+
type: "text",
|
|
245
|
+
text: JSON.stringify({
|
|
246
|
+
status: "started",
|
|
247
|
+
pid: devProcess.pid,
|
|
248
|
+
command: command,
|
|
249
|
+
cwd: cwd,
|
|
250
|
+
outputFile: outputFile,
|
|
251
|
+
message: `Dev server started. Logs streaming to ${outputFile}`
|
|
252
|
+
}, null, 2)
|
|
253
|
+
}
|
|
254
|
+
]
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
throw new Error(`Failed to start dev server: ${error instanceof Error ? error.message : String(error)}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
case "dev_stop_log_streaming": {
|
|
262
|
+
const serverId = "default";
|
|
263
|
+
const serverInfo = this.activeServers.get(serverId);
|
|
264
|
+
if (!serverInfo) {
|
|
265
|
+
return {
|
|
266
|
+
content: [
|
|
267
|
+
{
|
|
268
|
+
type: "text",
|
|
269
|
+
text: JSON.stringify({
|
|
270
|
+
status: "not_running",
|
|
271
|
+
message: "No dev server is currently running"
|
|
272
|
+
}, null, 2)
|
|
273
|
+
}
|
|
274
|
+
]
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
try {
|
|
278
|
+
if (serverInfo.pid) {
|
|
279
|
+
process.kill(serverInfo.pid, 'SIGTERM');
|
|
280
|
+
}
|
|
281
|
+
this.activeServers.delete(serverId);
|
|
282
|
+
this.saveState();
|
|
283
|
+
return {
|
|
284
|
+
content: [
|
|
285
|
+
{
|
|
286
|
+
type: "text",
|
|
287
|
+
text: JSON.stringify({
|
|
288
|
+
status: "stopped",
|
|
289
|
+
message: "Dev server stopped successfully"
|
|
290
|
+
}, null, 2)
|
|
291
|
+
}
|
|
292
|
+
]
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
throw new Error(`Failed to stop dev server: ${error instanceof Error ? error.message : String(error)}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
case "dev_restart_log_streaming": {
|
|
300
|
+
const validatedArgs = RestartLogStreamingArgsSchema.parse(args);
|
|
301
|
+
const serverId = "default";
|
|
302
|
+
const serverInfo = this.activeServers.get(serverId);
|
|
303
|
+
if (!serverInfo) {
|
|
304
|
+
return {
|
|
305
|
+
content: [
|
|
306
|
+
{
|
|
307
|
+
type: "text",
|
|
308
|
+
text: JSON.stringify({
|
|
309
|
+
status: "error",
|
|
310
|
+
message: "No dev server to restart. Use dev_start_log_streaming first."
|
|
311
|
+
}, null, 2)
|
|
312
|
+
}
|
|
313
|
+
]
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
// Save current configuration
|
|
317
|
+
const { command, cwd, outputFile } = serverInfo;
|
|
318
|
+
// Stop current process
|
|
319
|
+
try {
|
|
320
|
+
if (serverInfo.pid) {
|
|
321
|
+
process.kill(serverInfo.pid, 'SIGTERM');
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
// Process might already be dead
|
|
326
|
+
}
|
|
327
|
+
// Clear logs if requested
|
|
328
|
+
if (validatedArgs.clearLogs && existsSync(outputFile)) {
|
|
329
|
+
writeFileSync(outputFile, '');
|
|
330
|
+
}
|
|
331
|
+
// Wait a moment for process to die
|
|
332
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
333
|
+
// Restart with same configuration
|
|
334
|
+
const startArgs = {
|
|
335
|
+
command,
|
|
336
|
+
outputFile,
|
|
337
|
+
cwd
|
|
338
|
+
};
|
|
339
|
+
// Start new process
|
|
340
|
+
const [program, ...cmdArgs] = command.split(' ');
|
|
341
|
+
writeFileSync(outputFile, `[${new Date().toISOString()}] Restarting: ${command}\n`, { flag: 'a' });
|
|
342
|
+
const devProcess = spawn(program, cmdArgs, {
|
|
343
|
+
cwd: cwd,
|
|
344
|
+
env: process.env,
|
|
345
|
+
shell: true,
|
|
346
|
+
detached: false
|
|
347
|
+
});
|
|
348
|
+
const newServerInfo = {
|
|
349
|
+
process: devProcess,
|
|
350
|
+
command: command,
|
|
351
|
+
cwd: cwd,
|
|
352
|
+
outputFile: outputFile,
|
|
353
|
+
startTime: new Date(),
|
|
354
|
+
pid: devProcess.pid
|
|
355
|
+
};
|
|
356
|
+
this.activeServers.set("default", newServerInfo);
|
|
357
|
+
// Stream stdout to file
|
|
358
|
+
devProcess.stdout?.on('data', (data) => {
|
|
359
|
+
const timestamp = new Date().toISOString();
|
|
360
|
+
const logEntry = `[${timestamp}] ${data}`;
|
|
361
|
+
appendFileSync(outputFile, logEntry);
|
|
362
|
+
});
|
|
363
|
+
// Stream stderr to file
|
|
364
|
+
devProcess.stderr?.on('data', (data) => {
|
|
365
|
+
const timestamp = new Date().toISOString();
|
|
366
|
+
const logEntry = `[${timestamp}] [ERROR] ${data}`;
|
|
367
|
+
appendFileSync(outputFile, logEntry);
|
|
368
|
+
});
|
|
369
|
+
// Handle process exit
|
|
370
|
+
devProcess.on('exit', (code, signal) => {
|
|
371
|
+
const timestamp = new Date().toISOString();
|
|
372
|
+
const exitMessage = `[${timestamp}] Process exited with code ${code} and signal ${signal}\n`;
|
|
373
|
+
appendFileSync(outputFile, exitMessage);
|
|
374
|
+
this.activeServers.delete("default");
|
|
375
|
+
});
|
|
376
|
+
this.saveState();
|
|
377
|
+
return {
|
|
378
|
+
content: [
|
|
379
|
+
{
|
|
380
|
+
type: "text",
|
|
381
|
+
text: JSON.stringify({
|
|
382
|
+
status: "restarted",
|
|
383
|
+
pid: devProcess.pid,
|
|
384
|
+
command: command,
|
|
385
|
+
outputFile: outputFile,
|
|
386
|
+
message: "Dev server restarted successfully"
|
|
387
|
+
}, null, 2)
|
|
388
|
+
}
|
|
389
|
+
]
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
case "dev_get_status": {
|
|
393
|
+
const serverId = "default";
|
|
394
|
+
const serverInfo = this.activeServers.get(serverId);
|
|
395
|
+
if (!serverInfo) {
|
|
396
|
+
return {
|
|
397
|
+
content: [
|
|
398
|
+
{
|
|
399
|
+
type: "text",
|
|
400
|
+
text: JSON.stringify({
|
|
401
|
+
status: "not_running",
|
|
402
|
+
message: "No dev server is currently running"
|
|
403
|
+
}, null, 2)
|
|
404
|
+
}
|
|
405
|
+
]
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
const uptime = new Date().getTime() - serverInfo.startTime.getTime();
|
|
409
|
+
const uptimeSeconds = Math.floor(uptime / 1000);
|
|
410
|
+
const uptimeMinutes = Math.floor(uptimeSeconds / 60);
|
|
411
|
+
const uptimeHours = Math.floor(uptimeMinutes / 60);
|
|
412
|
+
return {
|
|
413
|
+
content: [
|
|
414
|
+
{
|
|
415
|
+
type: "text",
|
|
416
|
+
text: JSON.stringify({
|
|
417
|
+
status: "running",
|
|
418
|
+
pid: serverInfo.pid,
|
|
419
|
+
command: serverInfo.command,
|
|
420
|
+
cwd: serverInfo.cwd,
|
|
421
|
+
outputFile: serverInfo.outputFile,
|
|
422
|
+
startTime: serverInfo.startTime,
|
|
423
|
+
uptime: {
|
|
424
|
+
hours: uptimeHours,
|
|
425
|
+
minutes: uptimeMinutes % 60,
|
|
426
|
+
seconds: uptimeSeconds % 60
|
|
427
|
+
}
|
|
428
|
+
}, null, 2)
|
|
429
|
+
}
|
|
430
|
+
]
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
case "dev_tail_logs": {
|
|
434
|
+
const validatedArgs = TailLogsArgsSchema.parse(args);
|
|
435
|
+
const serverId = "default";
|
|
436
|
+
const serverInfo = this.activeServers.get(serverId);
|
|
437
|
+
// Use the active server's log file if available, otherwise default
|
|
438
|
+
const outputFile = serverInfo?.outputFile || "dev-server-logs.txt";
|
|
439
|
+
if (!existsSync(outputFile)) {
|
|
440
|
+
return {
|
|
441
|
+
content: [
|
|
442
|
+
{
|
|
443
|
+
type: "text",
|
|
444
|
+
text: JSON.stringify({
|
|
445
|
+
status: "error",
|
|
446
|
+
message: `Log file not found: ${outputFile}`
|
|
447
|
+
}, null, 2)
|
|
448
|
+
}
|
|
449
|
+
]
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
try {
|
|
453
|
+
// Read the file
|
|
454
|
+
const content = readFileSync(outputFile, 'utf8');
|
|
455
|
+
const lines = content.split('\n').filter(line => line.trim());
|
|
456
|
+
// Filter if pattern provided
|
|
457
|
+
let filteredLines = lines;
|
|
458
|
+
if (validatedArgs.filter) {
|
|
459
|
+
const pattern = new RegExp(validatedArgs.filter, 'i');
|
|
460
|
+
filteredLines = lines.filter(line => pattern.test(line));
|
|
461
|
+
}
|
|
462
|
+
// Get last N lines
|
|
463
|
+
const numLines = validatedArgs.lines || 50;
|
|
464
|
+
const lastLines = filteredLines.slice(-numLines);
|
|
465
|
+
return {
|
|
466
|
+
content: [
|
|
467
|
+
{
|
|
468
|
+
type: "text",
|
|
469
|
+
text: JSON.stringify({
|
|
470
|
+
status: "success",
|
|
471
|
+
file: outputFile,
|
|
472
|
+
totalLines: lines.length,
|
|
473
|
+
filteredLines: filteredLines.length,
|
|
474
|
+
returnedLines: lastLines.length,
|
|
475
|
+
logs: lastLines
|
|
476
|
+
}, null, 2)
|
|
477
|
+
}
|
|
478
|
+
]
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
catch (error) {
|
|
482
|
+
throw new Error(`Failed to read logs: ${error instanceof Error ? error.message : String(error)}`);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
case "dev_clear_logs": {
|
|
486
|
+
const validatedArgs = ClearLogsArgsSchema.parse(args);
|
|
487
|
+
const serverId = "default";
|
|
488
|
+
const serverInfo = this.activeServers.get(serverId);
|
|
489
|
+
// Use the active server's log file if available, otherwise default
|
|
490
|
+
const outputFile = serverInfo?.outputFile || "dev-server-logs.txt";
|
|
491
|
+
if (!existsSync(outputFile)) {
|
|
492
|
+
return {
|
|
493
|
+
content: [
|
|
494
|
+
{
|
|
495
|
+
type: "text",
|
|
496
|
+
text: JSON.stringify({
|
|
497
|
+
status: "error",
|
|
498
|
+
message: `Log file not found: ${outputFile}`
|
|
499
|
+
}, null, 2)
|
|
500
|
+
}
|
|
501
|
+
]
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
try {
|
|
505
|
+
// Backup if requested
|
|
506
|
+
if (validatedArgs.backup) {
|
|
507
|
+
const backupFile = `${outputFile}.${new Date().getTime()}.backup`;
|
|
508
|
+
copyFileSync(outputFile, backupFile);
|
|
509
|
+
}
|
|
510
|
+
// Clear the file
|
|
511
|
+
writeFileSync(outputFile, '');
|
|
512
|
+
return {
|
|
513
|
+
content: [
|
|
514
|
+
{
|
|
515
|
+
type: "text",
|
|
516
|
+
text: JSON.stringify({
|
|
517
|
+
status: "success",
|
|
518
|
+
message: `Log file cleared: ${outputFile}`,
|
|
519
|
+
backup: validatedArgs.backup ? "Created backup" : "No backup created"
|
|
520
|
+
}, null, 2)
|
|
521
|
+
}
|
|
522
|
+
]
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
catch (error) {
|
|
526
|
+
throw new Error(`Failed to clear logs: ${error instanceof Error ? error.message : String(error)}`);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
default:
|
|
530
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
535
|
+
return {
|
|
536
|
+
content: [
|
|
537
|
+
{
|
|
538
|
+
type: "text",
|
|
539
|
+
text: `Error: ${errorMessage}`
|
|
540
|
+
}
|
|
541
|
+
],
|
|
542
|
+
isError: true
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
async run() {
|
|
548
|
+
const transport = new StdioServerTransport();
|
|
549
|
+
await this.server.connect(transport);
|
|
550
|
+
console.error("Dev Logger MCP server running on stdio");
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
const server = new DevLoggerServer();
|
|
554
|
+
server.run().catch(console.error);
|
|
555
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@chinchillaenterprises/mcp-dev-logger",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for capturing and streaming development server output (npm run dev, etc.)",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"mcp-dev-logger": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"start": "node dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"mcp",
|
|
17
|
+
"dev-server",
|
|
18
|
+
"logging",
|
|
19
|
+
"npm",
|
|
20
|
+
"vite",
|
|
21
|
+
"nextjs",
|
|
22
|
+
"development"
|
|
23
|
+
],
|
|
24
|
+
"author": "Chinchilla Enterprises",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
28
|
+
"zod": "^3.22.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^20.0.0",
|
|
32
|
+
"typescript": "^5.0.0"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist/**/*",
|
|
36
|
+
"README.md"
|
|
37
|
+
],
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=18.0.0"
|
|
40
|
+
},
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://github.com/ChinchillaEnterprises/ChillMCP.git",
|
|
44
|
+
"directory": "mcp-dev-logger"
|
|
45
|
+
}
|
|
46
|
+
}
|