LogRider 1.0.0
MCP server
Point an AI assistant at a log far larger than its context window.
logrider-mcp ships inside LogRider.app and exposes the same memory-mapped engine the app uses as seven read-only tools. The point isn’t that an assistant can read your logs — it’s that it can read them without loading them. Every response is bounded, and any response that got cut off says so along with the true total.
Setup
Three steps
1. The binary is inside the bundle. Nothing installs into /usr/local/bin — riding inside the app means it upgrades with the app and is covered by the same signature and notarization.
/Applications/LogRider.app/Contents/MacOS/logrider-mcp
2. Configure your client. For Claude Desktop, in ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"logrider": {
"command": "/Applications/LogRider.app/Contents/MacOS/logrider-mcp",
"args": ["--allow", "/var/log"]
}
}
}For Claude Code, from the project you want it in:
claude mcp add logrider -- \
/Applications/LogRider.app/Contents/MacOS/logrider-mcp --allow /var/logThe -- is not optional. Without it claude reads --allow as one of its own options and fails with unknown option '--allow'. Everything after -- goes to the server instead.
3. Check it works. You should get a JSON frame containing serverInfo.
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18"}}' \
| /Applications/LogRider.app/Contents/MacOS/logrider-mcpScoping
What --allow does
With no --allow, any file you can read is fair game. The server runs as you, with your permissions. It does not prompt.
That’s reasonable when you’re driving. It’s the wrong default for an autonomous client, which will follow a path it found in a stack trace or a config file — and nothing in the protocol distinguishes the log you meant from ~/.ssh/config or a .env full of production credentials. The model doesn’t have to be malicious; it only has to be helpful about the wrong file.
"args": ["--allow", "/var/log", "--allow", "/Users/me/work/acme/logs"]
Paths outside those roots are refused with an explanation the model can act on, rather than a silent empty result. Symlinks are resolved before the check, so a link inside an allowed directory can’t reach outside it. It restricts the server to the directories you name — it is not a sandbox, and it costs one line of config. The server never writes. Every tool is read-only.
Bundled skill
The instructions, not just the tools
Seven tools are no use to an assistant that reaches for the wrong one. LogRider ships a Claude skill alongside the server — how to approach a log too big to read, starting with the mistake the server exists to prevent: never pull a multi-gigabyte file into the context window. Summarise first, then narrow.
cp -R "/Applications/LogRider.app/Contents/Resources/skills/logrider" \ ~/.claude/skills/
It rides inside the bundle, so it updates with the app. A test asserts it only names tools the server actually has, so it cannot teach a call that fails.
Reference
The seven tools
| Tool | What it does |
|---|---|
summarize_log | Start here. Total lines, size, count per level, first and last line, and the most frequent errors grouped by shape. Costs a few hundred tokens regardless of file size. |
search_log | Literal text, or an RE2 regex with regex=true. Returns up to max_results hits with line numbers and always reports the true total. Optional context_lines. |
filter_log | Only the lines at given severity levels, optionally also matching a regex. How you get every error without scanning. |
read_lines | A specific window by line number — the follow-up when search_log gives you a location and you want what surrounds it. |
tail_log | The last N lines. What it said just before it died. |
list_logs | Log files in a directory, newest first, with sizes and times. For working out which rotated log covers the incident. |
compare_logs | Diff two logs: lines added, removed, modified, and the first differences. The one tool with a size limit — comparing holds about ten times the two files' combined size in memory, and refuses any pair that would exceed a quarter of system RAM. It is for rotated logs of a few hundred MB, not for the multi-gigabyte files the other tools handle. |
Every tool bounds its output, and every bound that bites is reported with the true total — showing 100 of 20,384 matches, not a list that stops. RE2 means linear-time matching and no catastrophic backtracking; it also means no backreferences and no lookaround, which are rejected with an explanation rather than silently matching nothing.
In practice
“Checkout fell over around 02:00. What happened?”
summarize_log— 41M lines, 6.2 GB, 3,104 errors, spanning 00:00–06:00.filter_logwithlevels=["error","fatal"]— they cluster onOOMKilled by cgroup limit.search_logforOOMKilledwith context — first at line 18,442,109, 02:04:17.read_linesaround it — the requests immediately before.
Four calls, a few thousand tokens, against 6.2 GB. None of the file entered the context window.
If it doesn’t work
Troubleshooting
| Symptom | Cause |
|---|---|
| “server disconnected” on startup | Wrong command path. Check the file exists. |
| Tools don’t appear | Client not restarted, or a JSON syntax error in the config. |
| “outside the directories this server is allowed to read” | Working as intended. Add an --allow root, or point at a file inside one. |
| “invalid pattern” | RE2 rejected it — usually a backreference (\1) or lookaround ((?=), which RE2 doesn’t support. |
To see what the server is doing, run it by hand — it logs to stderr and speaks protocol on stdout.