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
| 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[] = [];