AI Agents

Your agent can read your production logs, and Lumber still can't. lumber mcp serves your logs to AI agents over the Model Context Protocol (MCP), the standard way agents such as Claude Code and Claude Desktop use tools. The logs are decrypted on your Mac by the lumber command, with your own account key, and Lumber's servers still hold only ciphertext.

The tools only read: nothing an agent does through them changes anything in Lumber.

Setup

  1. Install lumber, then sign in and link your Mac (see Command Line).
  2. Add it to your agent.

Claude Code:

claude mcp add lumber -- lumber mcp

Claude Desktop: add it to claude_desktop_config.json, with the full path that which lumber prints, since the app doesn't read your shell's PATH:

{
  "mcpServers": {
    "lumber": { "command": "/opt/homebrew/bin/lumber", "args": ["mcp"] }
  }
}

Other MCP clients: run lumber mcp as a stdio server.

The server uses the session lumber login saved, reading it from the Keychain on each call, so signing in again doesn't need a restart.

Tools

ToolWhat it does
list_appsYour apps, whether your Mac can read each one, how many days of logs its plan keeps, and whether it has reached its monthly log limit
search_logsThe newest logs matching apps, a level, a time range and text, up to 500 at a time
wait_for_logsWaits for new logs (errors and fatals, unless told otherwise) and returns them grouped by message, each group with its count and its latest log in full
list_notesThe notes people wrote about an app's logs, with who wrote them

Levels and times work as on the command line: warn means warn and above, and a time is an age like 2h, a day like 2026-10-29, or an ISO time.

Things to ask:

  • "What errors did Billing log in the last hour?"
  • "Find the logs for request req-42 and tell me what happened."
  • "Has anyone left a note about this error?"

Watching for errors

Nothing watches unless you ask it to. wait_for_logs returns as soon as new logs arrive, or empty after a timeout, with a next_after value; passing it back on the next call carries on exactly where the last one stopped, so an agent can watch in a loop without missing or repeating a log. A burst of the same error comes back as one group with a count, so one bug reads as one problem rather than a hundred.

In Claude Code, for example:

Watch Billing for errors with wait_for_logs. When one comes in, find the cause in this repo and fix it, leaving the change for me to review.

An agent can follow the command line instead: lumber tail Billing -l error --json -q prints one line per error.

Keep in mind

  • Logs are untrusted input. A log's message, context and metadata are written by your app, and through it by the people using it: a form field, a URL or a crafted request can end up in a log. Every tool tells the agent to treat log text as data, never as instructions, but an agent that can change your code is still reading text anyone could have written. Review its changes rather than letting it deploy them.
  • Your agent's model sees what it reads. The logs are decrypted on your Mac and handed to your agent, so the service that runs its model receives the logs the agent reads, under that service's own terms. Lumber's servers still never see them.
  • Like the command line, it runs on macOS for now.