Let Your AI Assistant Explore the Event Store with res-mcp
… and check why 5600+ Rails engineers read also this
Let Your AI Assistant Explore the Event Store with res-mcp
When you’re debugging with an AI assistant, half the work is giving it enough context. You copy event payloads into the chat, paste stream contents, look up IDs, then repeat the process every time you need another piece of information.
ruby_event_store-mcp removes that step. It’s the companion to the res CLI. Instead of you querying the event store from the terminal, your AI assistant does it for you through MCP tools. You ask questions in plain English, it reads the events itself.
The difference from copying the events into the chat yourself is that the assistant can ask follow-up questions on its own. If it needs to inspect another stream, load an aggregate’s history, or trace a correlation, it simply calls another tool. You stay in the conversation instead of switching between your AI client and a terminal.
Setup
Add the gem and install:
gem "ruby_event_store-mcp"
bundle install
That installs the res-mcp binary — but it doesn’t register anything with your AI client yet. The binary speaks MCP over stdio, launched from your app’s root, where — exactly like the res CLI — it loads config/environment.rb and reads your app’s Rails.configuration.event_store. There’s no HTTP endpoint to mount and nothing to deploy. Telling your client about it is a separate, one-time step — and every MCP client takes the same server definition, only the file it goes in changes.
Claude Code — drop a .mcp.json in your project root:
{
"mcpServers": {
"res": {
"command": "bundle",
"args": ["exec", "res-mcp"]
}
}
}
(or run claude mcp add res -- bundle exec res-mcp). Launched from the project directory, Claude Code runs the server there, so no cwd is needed. On the next launch it asks you to trust the project’s MCP server — approve it, then run /mcp to see res connected with its nine tools.
Claude Desktop — the same block, but with an explicit cwd pointing at your app’s root, in claude_desktop_config.json:
{
"mcpServers": {
"res": {
"command": "bundle",
"args": ["exec", "res-mcp"],
"cwd": "/path/to/your/rails/app"
}
}
}
(macOS: ~/Library/Application Support/Claude/claude_desktop_config.json; Windows: %APPDATA%\Claude\claude_desktop_config.json.)
Other MCP clients — Cursor, Windsurf, Cline and the rest take the same mcpServers block in their own config file; VS Code’s built-in MCP uses a servers key with "type": "stdio" instead. The bundle exec res-mcp command is the portable part.
That’s the whole setup. No routes, no mounts, no credentials.
Ask questions, not commands
Once it’s connected you just talk to the assistant — no slash command, no skill. You ask in plain English and it decides which tools to call (the first call asks your permission; allowlist the res server to stop being asked).
The server gives the assistant nine read-only tools over your event store. You never call them by name — you ask a question, and the assistant picks the tools it needs. They cover three kinds of questions:
Browse streams and events
stream_show— a stream’s event count, version, and first/last eventstream_events— the events in a stream, filterable by type, time, or positionevent_show— one event in full, data and metadataevent_streams— every stream a given event belongs to
Search and summarize
recent— the most recent events across the whole store (“what just happened?”)search— events anywhere, filtered by type, time range, or streamstats— total counts and the unique event types present
Follow a process
aggregate_history— the full event history of one aggregate instance (e.g. a singleFulfillment::Order)trace— the causation tree of everything sharing a correlation ID, so you can see where a multi-step flow stopped
Examples
For example, instead of browsing the streams yourself, you can simply ask:
“What just happened? Show the 20 most recent events.”
“Walk me through the history of Fulfillment::Order f47ac10b-58cc-4372-a567-0e02b2c3d479.”
“Are there any OrderPlaced events from the last hour without a matching OrderConfirmed?”
“Trace correlation 452fd6f0-e3a2-4716-bc8a-43bbcf2cae61 — where did the process stop?”
The assistant calls recent, aggregate_history, search, or trace behind the scenes, reads the results, and reasons over them — no copy-pasting event payloads into the chat, no switching to a Rails console mid-thought.
Why it’s safe to point at any app
Every tool uses the public event_store.* API — the same one your application uses through Rails.configuration.event_store. There’s no direct SQL access, no ActiveRecord internals, and no adapter-specific code.
The server is also intentionally read-only. Your AI assistant can inspect events, streams, and correlations, but it cannot append, link, or delete events. The worst it can do is answer your questions.