get-logs
Retrieve and filter application logs from named pipes to monitor output and debug issues in development environments.
Instructions
Retrieve logs from the named pipe with optional filtering
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Number of log lines to return | |
| filter | No | Text to filter logs by | |
| since | No | Timestamp to get logs after |
Implementation Reference
- src/index.ts:178-210 (handler)Executes the get-logs tool: copies logStore, applies optional filter and since filters, slices last N lines, reverses to chronological order, returns as JSON-formatted text content block.async ({ lines, filter, since }) => { try { let logs = [...logStore]; if (filter) { logs = logs.filter((entry) => entry.message.toLowerCase().includes(filter.toLowerCase()), ); } if (since) { logs = logs.filter((entry) => { const timestamp = new Date(entry.timestamp).getTime(); return timestamp > since; }); } // Take the last N lines and reverse them so oldest is first logs = logs.slice(-lines).reverse(); return { content: [ { type: "text", text: JSON.stringify(logs, null, 2), }, ], }; } catch (error) { logJson(`Error retrieving logs: ${error}`); throw new Error("Failed to retrieve logs"); } },
- src/index.ts:169-177 (schema)Zod schema defining input parameters for the get-logs tool: lines (optional, default 50), filter (optional string), since (optional timestamp number).{ lines: z .number() .optional() .default(50) .describe("Number of log lines to return"), filter: z.string().optional().describe("Text to filter logs by"), since: z.number().optional().describe("Timestamp to get logs after"), },
- src/index.ts:166-211 (registration)Registers the get-logs tool on the MCP server with name, description, input schema, and inline handler function.server.tool( "get-logs", "Retrieve logs from the named pipe with optional filtering", { lines: z .number() .optional() .default(50) .describe("Number of log lines to return"), filter: z.string().optional().describe("Text to filter logs by"), since: z.number().optional().describe("Timestamp to get logs after"), }, async ({ lines, filter, since }) => { try { let logs = [...logStore]; if (filter) { logs = logs.filter((entry) => entry.message.toLowerCase().includes(filter.toLowerCase()), ); } if (since) { logs = logs.filter((entry) => { const timestamp = new Date(entry.timestamp).getTime(); return timestamp > since; }); } // Take the last N lines and reverse them so oldest is first logs = logs.slice(-lines).reverse(); return { content: [ { type: "text", text: JSON.stringify(logs, null, 2), }, ], }; } catch (error) { logJson(`Error retrieving logs: ${error}`); throw new Error("Failed to retrieve logs"); } }, );
- src/index.ts:16-19 (schema)TypeScript interface defining the structure of log entries stored in logStore, used by the handler.interface LogEntry { timestamp: string; message: string; }
- src/index.ts:28-29 (helper)In-memory array storing the recent log entries (up to MAX_STORED_LOGS=100), populated by the file watcher, directly used by the get-logs handler.const logStore: LogEntry[] = [];