xdebug-mcp 1.0.2 → 1.1.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 CHANGED
@@ -145,6 +145,71 @@ services:
145
145
  - XDEBUG_CONFIG=client_host=host.docker.internal client_port=9003
146
146
  ```
147
147
 
148
+ ### Using Unix Domain Sockets
149
+
150
+ For improved performance and simplified setup on local systems, you can use Unix domain sockets instead of TCP. Unix sockets eliminate network stack overhead and are ideal for debugging on the same machine.
151
+
152
+ **Benefits:**
153
+ - ⚡ Lower latency (no TCP/IP stack overhead)
154
+ - 🔒 Better security (file permissions instead of port binding)
155
+ - 📦 Simpler setup (no port management)
156
+ - 🚀 Faster communication for local debugging
157
+
158
+ **MCP Configuration (Unix Socket):**
159
+
160
+ ```json
161
+ {
162
+ "mcpServers": {
163
+ "xdebug": {
164
+ "command": "xdebug-mcp",
165
+ "env": {
166
+ "XDEBUG_SOCKET_PATH": "/tmp/xdebug.sock",
167
+ "LOG_LEVEL": "info"
168
+ }
169
+ }
170
+ }
171
+ }
172
+ ```
173
+
174
+ **PHP/Xdebug Configuration:**
175
+
176
+ ```ini
177
+ [xdebug]
178
+ zend_extension=xdebug
179
+ xdebug.mode=debug
180
+ xdebug.start_with_request=yes
181
+ xdebug.client_host=unix:///tmp/xdebug.sock
182
+ ```
183
+
184
+ **Socket File Permissions:**
185
+
186
+ The socket file is created with default permissions. To restrict access, you can:
187
+
188
+ ```bash
189
+ # After MCP server starts
190
+ chmod 600 /tmp/xdebug.sock
191
+
192
+ # Or use a secure directory
193
+ mkdir -p ~/.xdebug && chmod 700 ~/.xdebug
194
+ # Then set XDEBUG_SOCKET_PATH=$HOME/.xdebug/xdebug.sock
195
+ ```
196
+
197
+ **Automatic Cleanup:**
198
+
199
+ When `XDEBUG_SOCKET_PATH` is set, the server will:
200
+ - Listen on the specified Unix socket instead of TCP port
201
+ - Automatically clean up stale socket files on startup (prevents "address in use" errors)
202
+ - Automatically clean up socket files on shutdown
203
+ - Use the same debugging tools and features as TCP mode
204
+
205
+ **When to Use Unix Sockets:**
206
+ - ✅ Local PHP development (best performance)
207
+ - ✅ Same-machine debugging
208
+ - ✅ High-frequency breakpoint hits
209
+ - ❌ Remote debugging (use TCP instead)
210
+
211
+ *Unix socket support requested in [Issue #1](https://github.com/kpanuragh/xdebug-mcp/issues/1) by [@dkd-kaehm](https://github.com/dkd-kaehm)*
212
+
148
213
  ## Available MCP Tools (41 Total)
149
214
 
150
215
  ### Session Management
@@ -290,8 +355,9 @@ Use capture_request_context to see $_GET, $_POST, $_SESSION, cookies, and header
290
355
 
291
356
  | Variable | Default | Description |
292
357
  |----------|---------|-------------|
293
- | `XDEBUG_PORT` | `9003` | Port to listen for Xdebug connections |
294
- | `XDEBUG_HOST` | `0.0.0.0` | Host to bind |
358
+ | `XDEBUG_PORT` | `9003` | Port to listen for Xdebug connections (TCP mode) |
359
+ | `XDEBUG_HOST` | `0.0.0.0` | Host to bind (TCP mode) |
360
+ | `XDEBUG_SOCKET_PATH` | - | Unix domain socket path (e.g., `/tmp/xdebug.sock`). When set, uses Unix socket instead of TCP |
295
361
  | `COMMAND_TIMEOUT` | `30000` | Command timeout in milliseconds |
296
362
  | `PATH_MAPPINGS` | - | JSON object mapping container to host paths |
297
363
  | `MAX_DEPTH` | `3` | Max depth for variable inspection |
@@ -299,21 +365,44 @@ Use capture_request_context to see $_GET, $_POST, $_SESSION, cookies, and header
299
365
  | `MAX_DATA` | `2048` | Max data size per variable |
300
366
  | `LOG_LEVEL` | `info` | Log level: debug, info, warn, error |
301
367
 
368
+ ## Connection Modes: TCP vs Unix Socket
369
+
370
+ | Feature | TCP | Unix Socket |
371
+ |---------|-----|-------------|
372
+ | **Setup** | Easy (default) | Simple (one env var) |
373
+ | **Performance** | Good | Excellent (lower latency) |
374
+ | **Security** | Port accessible to network | File-based permissions |
375
+ | **Remote Debugging** | ✅ Supported | ❌ Local only |
376
+ | **Docker** | ✅ Works with host.docker.internal | ❌ Requires volume mount |
377
+ | **Stale Socket** | Manual port cleanup | Auto-cleanup |
378
+ | **Default** | `XDEBUG_PORT=9003` | Disabled (use TCP) |
379
+
380
+ **Quick Decision Guide:**
381
+ - 🏠 **Local development?** → Use Unix socket for best performance
382
+ - 🐳 **Docker on same machine?** → Use Unix socket with volume mount
383
+ - 🌐 **Remote server?** → Use TCP
384
+ - 🚀 **Maximum speed?** → Use Unix socket
385
+ - 📝 **Don't know?** → Start with TCP (default), switch to Unix socket if needed
386
+
302
387
  ## How It Works
303
388
 
304
- 1. **MCP Server starts** and listens for Xdebug connections on port 9003
389
+ 1. **MCP Server starts** and listens for Xdebug connections (TCP port 9003 or Unix socket)
305
390
  2. **PHP script runs** with Xdebug enabled
306
391
  3. **Xdebug connects** to the MCP server via DBGp protocol
307
392
  4. **AI uses MCP tools** to control debugging (set breakpoints, step, inspect)
308
393
  5. **DBGp commands** are sent to Xdebug, responses parsed and returned
309
394
 
310
395
  ```
311
- ┌─────────────┐ MCP/stdio ┌─────────────┐ DBGp/TCP ┌─────────────┐
312
- │ Claude │ ◄────────────────► │ xdebug-mcp │ ◄───────────────► │ Xdebug │
396
+ ┌─────────────┐ MCP/stdio ┌─────────────┐ DBGp/TCP or ┌─────────────┐
397
+ │ Claude │ ◄────────────────► │ xdebug-mcp │ ◄─ Unix Socket ──► │ Xdebug │
313
398
  │ (AI Agent) │ │ Server │ │ (in PHP) │
314
399
  └─────────────┘ └─────────────┘ └─────────────┘
315
400
  ```
316
401
 
402
+ **Connection Options:**
403
+ - **TCP (Default):** `xdebug.client_host=127.0.0.1` + `XDEBUG_PORT=9003`
404
+ - **Unix Socket:** `xdebug.client_host=unix:///tmp/xdebug.sock` + `XDEBUG_SOCKET_PATH=/tmp/xdebug.sock`
405
+
317
406
  ## Troubleshooting
318
407
 
319
408
  ### No debug sessions appearing
@@ -321,18 +410,55 @@ Use capture_request_context to see $_GET, $_POST, $_SESSION, cookies, and header
321
410
  1. Check that Xdebug is installed: `php -v` should show Xdebug
322
411
  2. Verify Xdebug config: `php -i | grep xdebug`
323
412
  3. Ensure `xdebug.client_host` points to the MCP server
324
- 4. Check firewall allows connections on port 9003
413
+ 4. **For TCP:** Check firewall allows connections on port 9003
414
+ 5. **For Unix socket:** Verify socket path exists and has correct permissions: `ls -la /tmp/xdebug.sock`
415
+ 6. Check MCP server logs: `LOG_LEVEL=debug` for verbose output
325
416
 
326
417
  ### Connection issues with Docker
327
418
 
328
419
  1. For Linux, add `extra_hosts: ["host.docker.internal:host-gateway"]`
329
420
  2. Verify container can reach host: `curl host.docker.internal:9003`
421
+ 3. Check xdebug logs in container: `docker logs <container-id> | grep xdebug`
422
+
423
+ ### Unix socket issues
424
+
425
+ 1. **"Address already in use"**: Socket file wasn't cleaned up
426
+ - Remove manually: `rm -f /tmp/xdebug.sock`
427
+ - MCP server will clean up automatically on next start
428
+ 2. **"Permission denied"**: Check socket file permissions
429
+ - List socket: `ls -la /tmp/xdebug.sock`
430
+ - Run as same user as PHP: `ps aux | grep php`
431
+ 3. **Socket path in php.ini:**
432
+ - Correct: `xdebug.client_host=unix:///tmp/xdebug.sock`
433
+ - Wrong: `xdebug.client_host=unix:/tmp/xdebug.sock` (missing one `/`)
330
434
 
331
435
  ### Breakpoints not hitting
332
436
 
333
437
  1. Ensure file paths match exactly (use container paths for Docker)
334
438
  2. Check breakpoint is resolved: `list_breakpoints`
335
439
  3. Verify script execution reaches that line
440
+ 4. Check that `xdebug.start_with_request=yes` is set
441
+ 5. Try a simple file to verify basic setup works
442
+
443
+ ### Performance issues
444
+
445
+ 1. If experiencing slow stepping, increase `COMMAND_TIMEOUT`:
446
+ - Default: 30000ms (30 seconds)
447
+ - Try: `COMMAND_TIMEOUT=60000` for slower systems
448
+ 2. For Unix sockets, verify socket is on fast filesystem (not network mount)
449
+ 3. Check system load: `top` - excessive context switching slows debugging
450
+
451
+ ### Server won't start
452
+
453
+ 1. **Port in use (TCP):**
454
+ - Find process: `lsof -i :9003`
455
+ - Kill it: `kill -9 <pid>`
456
+ 2. **Bad config:**
457
+ - Validate environment variables: `echo $XDEBUG_SOCKET_PATH`
458
+ - Check for typos in path names
459
+ 3. **Permission denied:**
460
+ - For Unix socket, ensure write permission to parent directory
461
+ - Example: `mkdir -p ~/.xdebug && chmod 700 ~/.xdebug`
336
462
 
337
463
  ## Contributing
338
464
 
package/dist/config.d.ts CHANGED
@@ -5,6 +5,7 @@ import { z } from 'zod';
5
5
  declare const ConfigSchema: z.ZodObject<{
6
6
  dbgpPort: z.ZodDefault<z.ZodNumber>;
7
7
  dbgpHost: z.ZodDefault<z.ZodString>;
8
+ dbgpSocketPath: z.ZodOptional<z.ZodString>;
8
9
  commandTimeout: z.ZodDefault<z.ZodNumber>;
9
10
  pathMappings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
10
11
  maxDepth: z.ZodDefault<z.ZodNumber>;
@@ -19,10 +20,12 @@ declare const ConfigSchema: z.ZodObject<{
19
20
  maxChildren: number;
20
21
  maxData: number;
21
22
  logLevel: "debug" | "info" | "warn" | "error";
23
+ dbgpSocketPath?: string | undefined;
22
24
  pathMappings?: Record<string, string> | undefined;
23
25
  }, {
24
26
  dbgpPort?: number | undefined;
25
27
  dbgpHost?: string | undefined;
28
+ dbgpSocketPath?: string | undefined;
26
29
  commandTimeout?: number | undefined;
27
30
  pathMappings?: Record<string, string> | undefined;
28
31
  maxDepth?: number | undefined;
package/dist/config.js CHANGED
@@ -7,6 +7,7 @@ const ConfigSchema = z.object({
7
7
  // DBGp server settings
8
8
  dbgpPort: z.number().int().positive().default(9003),
9
9
  dbgpHost: z.string().default('0.0.0.0'),
10
+ dbgpSocketPath: z.string().optional(),
10
11
  commandTimeout: z.number().int().positive().default(30000),
11
12
  // Path mappings for Docker
12
13
  pathMappings: z.record(z.string(), z.string()).optional(),
@@ -27,6 +28,10 @@ export function loadConfig() {
27
28
  maxData: parseInt(process.env.MAX_DATA || '2048', 10),
28
29
  logLevel: process.env.LOG_LEVEL || 'info',
29
30
  };
31
+ // Add socket path if provided
32
+ if (process.env.XDEBUG_SOCKET_PATH) {
33
+ rawConfig.dbgpSocketPath = process.env.XDEBUG_SOCKET_PATH;
34
+ }
30
35
  // Parse path mappings from JSON if provided
31
36
  if (process.env.PATH_MAPPINGS) {
32
37
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAY,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,uBAAuB;IACvB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACvC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAE1D,2BAA2B;IAC3B,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAEzD,6BAA6B;IAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACrD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAElD,UAAU;IACV,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CACrE,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU;IACxB,MAAM,SAAS,GAA4B;QACzC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,EAAE,EAAE,CAAC;QACzD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,SAAS;QAC9C,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,EAAE,EAAE,CAAC;QACpE,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,EAAE,EAAE,CAAC;QACpD,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,KAAK,EAAE,EAAE,CAAC;QAC5D,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,MAAM,EAAE,EAAE,CAAC;QACrD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;KAC1C,CAAC;IAEF,4CAA4C;IAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE7C,kBAAkB;IAClB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAoB,CAAC,CAAC;IAE7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -5,20 +5,22 @@
5
5
  import { EventEmitter } from 'events';
6
6
  import { DbgpConnection } from './connection.js';
7
7
  export interface DbgpServerConfig {
8
- host: string;
9
- port: number;
8
+ host?: string;
9
+ port?: number;
10
+ socketPath?: string;
10
11
  commandTimeout?: number;
11
12
  }
12
13
  export interface DbgpServerEvents {
13
14
  connection: (connection: DbgpConnection) => void;
14
15
  error: (error: Error) => void;
15
- listening: (port: number, host: string) => void;
16
+ listening: (address: string) => void;
16
17
  close: () => void;
17
18
  }
18
19
  export declare class DbgpServer extends EventEmitter {
19
20
  private server;
20
21
  private connections;
21
22
  private config;
23
+ private isUnixSocket;
22
24
  constructor(config: DbgpServerConfig);
23
25
  start(): Promise<void>;
24
26
  private handleConnection;
@@ -30,5 +32,7 @@ export declare class DbgpServer extends EventEmitter {
30
32
  get address(): {
31
33
  host: string;
32
34
  port: number;
35
+ } | {
36
+ path: string;
33
37
  } | null;
34
38
  }
@@ -3,6 +3,7 @@
3
3
  * TCP server that listens for incoming Xdebug connections.
4
4
  */
5
5
  import * as net from 'net';
6
+ import * as fs from 'fs';
6
7
  import { EventEmitter } from 'events';
7
8
  import { DbgpConnection } from './connection.js';
8
9
  import { logger } from '../utils/logger.js';
@@ -10,16 +11,31 @@ export class DbgpServer extends EventEmitter {
10
11
  server = null;
11
12
  connections = new Map();
12
13
  config;
14
+ isUnixSocket;
13
15
  constructor(config) {
14
16
  super();
17
+ this.isUnixSocket = !!config.socketPath;
15
18
  this.config = {
16
19
  host: config.host,
17
20
  port: config.port,
21
+ socketPath: config.socketPath,
18
22
  commandTimeout: config.commandTimeout ?? 30000,
19
23
  };
20
24
  }
21
25
  async start() {
22
26
  return new Promise((resolve, reject) => {
27
+ // Clean up stale socket file if using Unix socket
28
+ if (this.isUnixSocket && this.config.socketPath) {
29
+ try {
30
+ if (fs.existsSync(this.config.socketPath)) {
31
+ fs.unlinkSync(this.config.socketPath);
32
+ logger.debug(`Cleaned up stale socket file: ${this.config.socketPath}`);
33
+ }
34
+ }
35
+ catch (err) {
36
+ logger.warn(`Failed to clean up socket file: ${err}`);
37
+ }
38
+ }
23
39
  this.server = net.createServer((socket) => {
24
40
  this.handleConnection(socket);
25
41
  });
@@ -31,11 +47,22 @@ export class DbgpServer extends EventEmitter {
31
47
  this.server.on('close', () => {
32
48
  this.emit('close');
33
49
  });
34
- this.server.listen(this.config.port, this.config.host, () => {
35
- logger.info(`DBGp server listening on ${this.config.host}:${this.config.port}`);
36
- this.emit('listening', this.config.port, this.config.host);
37
- resolve();
38
- });
50
+ if (this.isUnixSocket) {
51
+ this.server.listen(this.config.socketPath, () => {
52
+ logger.info(`DBGp server listening on Unix socket: ${this.config.socketPath}`);
53
+ this.emit('listening', `unix://${this.config.socketPath}`);
54
+ resolve();
55
+ });
56
+ }
57
+ else {
58
+ const host = this.config.host || '0.0.0.0';
59
+ const port = this.config.port || 9003;
60
+ this.server.listen(port, host, () => {
61
+ logger.info(`DBGp server listening on ${host}:${port}`);
62
+ this.emit('listening', `${host}:${port}`);
63
+ resolve();
64
+ });
65
+ }
39
66
  });
40
67
  }
41
68
  handleConnection(socket) {
@@ -71,6 +98,18 @@ export class DbgpServer extends EventEmitter {
71
98
  return new Promise((resolve) => {
72
99
  if (this.server) {
73
100
  this.server.close(() => {
101
+ // Clean up socket file if using Unix socket
102
+ if (this.isUnixSocket && this.config.socketPath) {
103
+ try {
104
+ if (fs.existsSync(this.config.socketPath)) {
105
+ fs.unlinkSync(this.config.socketPath);
106
+ logger.debug(`Cleaned up socket file: ${this.config.socketPath}`);
107
+ }
108
+ }
109
+ catch (err) {
110
+ logger.warn(`Failed to clean up socket file: ${err}`);
111
+ }
112
+ }
74
113
  logger.info('DBGp server stopped');
75
114
  resolve();
76
115
  });
@@ -86,6 +125,9 @@ export class DbgpServer extends EventEmitter {
86
125
  get address() {
87
126
  const addr = this.server?.address();
88
127
  if (addr && typeof addr === 'object') {
128
+ if ('path' in addr) {
129
+ return { path: addr.path };
130
+ }
89
131
  return { host: addr.address, port: addr.port };
90
132
  }
91
133
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dbgp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dbgp/server.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -20,6 +20,7 @@ async function main() {
20
20
  const dbgpServer = new DbgpServer({
21
21
  host: config.dbgpHost,
22
22
  port: config.dbgpPort,
23
+ socketPath: config.dbgpSocketPath,
23
24
  commandTimeout: config.commandTimeout,
24
25
  });
25
26
  // Create tools context early so we can access pendingBreakpoints
@@ -55,9 +56,16 @@ async function main() {
55
56
  toolsContext.pendingBreakpoints.clearSessionBreakpoints(sessionId);
56
57
  });
57
58
  // Start DBGp server
59
+ let listeningAddress;
60
+ dbgpServer.once('listening', (address) => {
61
+ listeningAddress = address;
62
+ });
58
63
  try {
59
64
  await dbgpServer.start();
60
- logger.info(`DBGp server listening on ${config.dbgpHost}:${config.dbgpPort}`);
65
+ const address = config.dbgpSocketPath
66
+ ? `Unix socket: ${config.dbgpSocketPath}`
67
+ : `${config.dbgpHost}:${config.dbgpPort}`;
68
+ logger.info(`DBGp server listening on ${address}`);
61
69
  }
62
70
  catch (error) {
63
71
  logger.error('Failed to start DBGp server:', error);
@@ -83,17 +91,44 @@ async function main() {
83
91
  await mcpServer.connect(transport);
84
92
  logger.info('MCP server connected via stdio');
85
93
  // Graceful shutdown
94
+ let isShuttingDown = false;
86
95
  const shutdown = async () => {
96
+ if (isShuttingDown)
97
+ return;
98
+ isShuttingDown = true;
87
99
  logger.info('Shutting down...');
88
100
  sessionManager.closeAllSessions();
89
101
  await dbgpServer.stop();
90
102
  process.exit(0);
91
103
  };
104
+ // Handle various shutdown signals
92
105
  process.on('SIGINT', shutdown);
93
106
  process.on('SIGTERM', shutdown);
107
+ process.on('SIGHUP', shutdown);
108
+ // Handle stdin close (when parent process like Claude Code exits)
109
+ process.stdin.on('close', () => {
110
+ logger.info('stdin closed, shutting down...');
111
+ shutdown();
112
+ });
113
+ process.stdin.on('end', () => {
114
+ logger.info('stdin ended, shutting down...');
115
+ shutdown();
116
+ });
117
+ // Handle uncaught errors gracefully
118
+ process.on('uncaughtException', async (error) => {
119
+ logger.error('Uncaught exception:', error);
120
+ await shutdown();
121
+ });
122
+ process.on('unhandledRejection', async (reason) => {
123
+ logger.error('Unhandled rejection:', reason);
124
+ await shutdown();
125
+ });
94
126
  // Keep the process alive
95
127
  logger.info('Xdebug MCP Server is ready');
96
- logger.info(`Waiting for Xdebug connections on port ${config.dbgpPort}...`);
128
+ const waitMsg = config.dbgpSocketPath
129
+ ? `Waiting for Xdebug connections on ${config.dbgpSocketPath}...`
130
+ : `Waiting for Xdebug connections on port ${config.dbgpPort}...`;
131
+ logger.info(waitMsg);
97
132
  }
98
133
  main().catch((error) => {
99
134
  console.error('Fatal error:', error);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAgB,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAEvC,wBAAwB;IACxB,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC,QAAQ;QACrB,IAAI,EAAE,MAAM,CAAC,QAAQ;QACrB,UAAU,EAAE,MAAM,CAAC,cAAc;QACjC,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC,CAAC;IAEH,iEAAiE;IACjE,MAAM,YAAY,GAAiB,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAEtE,gCAAgC;IAChC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;QAC/C,MAAM,CAAC,IAAI,CAAC,0BAA0B,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,cAAc,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YAEpD,+CAA+C;YAC/C,MAAM,YAAY,GAAG,YAAY,CAAC,kBAAkB,CAAC,KAAK,CAAC;YAC3D,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,YAAY,YAAY,mCAAmC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;gBACxF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBAC9E,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,2BAA2B,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YACjD,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QAC7B,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,cAAc,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,EAAE;QAC9C,MAAM,CAAC,IAAI,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;QAC3C,qDAAqD;QACrD,YAAY,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,IAAI,gBAAwB,CAAC;IAC7B,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE;QACvC,gBAAgB,GAAG,OAAO,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc;YACnC,CAAC,CAAC,gBAAgB,MAAM,CAAC,cAAc,EAAE;YACzC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;QAC9B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAChD,CAAC;IAED,+BAA+B;IAC/B,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAE1C,gCAAgC;IAChC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAE9C,oBAAoB;IACpB,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,cAAc;YAAE,OAAO;QAC3B,cAAc,GAAG,IAAI,CAAC;QAEtB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChC,cAAc,CAAC,gBAAgB,EAAE,CAAC;QAClC,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE/B,kEAAkE;IAClE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC9C,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC7C,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,oCAAoC;IACpC,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9C,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAChD,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc;QACnC,CAAC,CAAC,qCAAqC,MAAM,CAAC,cAAc,KAAK;QACjE,CAAC,CAAC,0CAA0C,MAAM,CAAC,QAAQ,KAAK,CAAC;IACnE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xdebug-mcp",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "mcpName": "io.github.kpanuragh/xdebug",
5
5
  "description": "MCP server for PHP Xdebug debugging - enables AI-assisted PHP debugging through the Model Context Protocol",
6
6
  "type": "module",