# I built a local index of my own work, then plugged it into Claude Code

> Source: <https://dev.to/pavel_piliak_6bf36833ab7f/i-built-a-local-index-of-my-own-work-then-plugged-it-into-claude-code-4moc>
> Published: 2026-06-06 20:34:11+00:00

I switch between projects a lot, and the most expensive part of starting a session is trying to remember what I was doing. Did I already try X two weeks ago? When did we decide on the Postgres migration approach? Who was on the last Slack thread about that auth bug? My laptop already had the answers, they were just scattered across Git history, the GitHub web UI, Jira, a Slack search box, and one Confluence doc I couldn't find without three guesses.

I had been keeping a side project that consolidated all of that into one local SQLite file. It's a small Go binary called [DevRecall](https://github.com/pavelpilyak/devrecall) that pulls activity from Git, GitHub, Jira, Linear, Confluence, Slack and Google Calendar, runs it through FTS5 and on-device embeddings, and gives me a CLI I can ask "when did I touch the JWT refresh code?" without opening five tabs.

It worked. The CLI and the desktop app got used regularly, the standup and recall queries pulled real signal. Then I added an MCP server, and the tool stopped being something I invoke and started being something Claude Code invokes for me.

MCP is JSON-RPC over stdio. A coding agent (Claude Code, Cursor, Codex CLI, Continue, Zed) launches your server as a subprocess, sends `initialize`

, then `tools/list`

, then calls your tools as the user works. Stderr is yours, stdout is the protocol. That's basically the whole story for stdio servers.

The reason this changed things for me: the moment I stopped thinking of "the agent" as something I drove with `devrecall chat`

in a terminal, and started thinking of it as Claude Code, the existing tool catalogue I had already written for my own chat REPL suddenly belonged in Claude Code too. Same `search_activities`

, `list_activities`

, `get_activity`

, `get_related_activities`

functions. They did not need to change. They needed a thin adapter that spoke MCP instead of my own chat loop.

I added a `devrecall mcp`

subcommand. About 300 lines of Go for the protocol layer, plus a config block in the Claude Code plugin:

```
{
  "mcpServers": {
    "devrecall": {
      "command": "devrecall",
      "args": ["mcp"]
    }
  }
}
```

After restarting Claude Code, the agent could call any of fifteen tools against my local index. The first useful query I tried was something like "what was that auth bug I fixed in February?". It called `current_time`

to anchor "February" against today, then `semantic_search_activities`

with the query, then `get_activity`

on the top hit, then `get_related_activities`

to pull in the linked Jira ticket and PR. The output was a paragraph with three citations, all real, none invented.

After that I more or less stopped opening the desktop app for searches. The same data, the same tool catalogue, but invoked from inside the editor as a side effect of whatever I am working on.

The plugin ships four slash commands:

`/devrecall:recall <query>`

searches the index with citations.`/devrecall:context [days]`

injects a brief of recent activity at the start of a session.`/devrecall:log <text>`

captures a note (a decision, an observation) back into the index, which I use a lot for things I would otherwise forget by next sprint.`/devrecall:prep <date>`

builds a meeting brief: event details plus what each attendee has been working on.Day one the index is empty. You connect sources (`devrecall auth jira`

, `devrecall auth github`

, etc.) and the daemon backfills 7 days. The local DB then grows from each sync, so the recall tools get more useful the longer you have it running. On a fresh install your first few queries will return mostly recent stuff. After a few weeks of normal use it starts handing back the kind of context you would otherwise have spent twenty minutes digging up by hand.

If you want history older than a week on a fresh machine, there's `devrecall backfill --since 90d`

(or `--since 1y`

). It hits the same APIs your daily sync uses, just with a wider window.

macOS:

```
brew install --cask pavelpilyak/devrecall/devrecall
```

That installs the GUI and the CLI. Then in Claude Code:

```
/plugin marketplace add pavelpilyak/devrecall-claude-plugin
/plugin install devrecall@devrecall
```

If you don't use Claude Code, the MCP server is just `devrecall mcp`

and you point any other MCP-compatible client at it (`.cursor/mcp.json`

, Continue config, Zed settings, etc.). I have hands-on tested Claude Code. The other clients should work because MCP is MCP, but I have not verified each one, so if it breaks somewhere I would like to know. macOS first. The CLI compiles on Linux. The Tauri desktop app has not been packaged for Linux yet, help welcome there.

Source: [github.com/pavelpilyak/devrecall](https://github.com/pavelpilyak/devrecall). Docs: [devrecall.dev](https://devrecall.dev). MIT. Local-first by design, no SaaS plane, no telemetry.
