MCP server
The docs, in your agent. Nothing to install.
A hosted, read-only Model Context Protocol server. Point Claude Code, Claude, Cursor, ChatGPT or Codex at one URL and your agent can search the docs of the exact framework version your app uses, read any guide, map Rails and Phoenix concepts, start an app, and upgrade one. No account, no key.
https://rustoffrails.org/mcpConnect your agent
The transport is Streamable HTTP. There is no sign-in: choose "no authentication" wherever a client asks.
Claude Code
In a terminal (add --scope user to have it in every project):
claude mcp add --transport http rustoffrails https://rustoffrails.org/mcpBuilding an app with the framework? The plugin gives you the skills and guardrails too; the MCP server is for reading and asking.
Claude (Desktop and claude.ai)
Remote servers are added as a custom connector, not in the Desktop config file: Customize → Connectors → Add → Add custom connector. Name it Rust off Rails, paste the URL, choose no sign-in, then turn it on from the + menu in a chat. On Team and Enterprise plans an owner adds it. Anthropic's guide.
Cursor
In ~/.cursor/mcp.json (every project) or .cursor/mcp.json (one project):
{
"mcpServers": {
"rustoffrails": {
"url": "https://rustoffrails.org/mcp"
}
}
}Codex
In a terminal:
codex mcp add rustoffrails --url https://rustoffrails.org/mcpOr in ~/.codex/config.toml:
[mcp_servers.rustoffrails]
url = "https://rustoffrails.org/mcp"ChatGPT
Turn on developer mode, then create an app (formerly "connector") with the URL above and No authentication, and enable it from the + menu in a chat. OpenAI moves these menus and changes which plans have them, so see your client's docs for the current path.
Anything else
Any client that speaks Streamable HTTP works with the URL alone. Browser-based clients work too: the endpoint sends CORS headers.
Tools and resources
All tools are read-only. By default they answer from the same docs as /docs and llms.txt, framework v0.7.3; the docs tools take a version for any other release.
-
search_docsSearch the Rust off Rails framework docs (guides, generators, AGENTS.md, stack, workflow…). Returns ranked sections with the doc path, title, a snippet and the URL. Then read a whole doc with read_doc.
-
read_docRead one framework doc as Markdown, by its docs path (e.g. "guides/models.md", "AGENTS.md", "generators/new.md") or slug ("guides/models"). Only docs in the index exist.
-
rails_mapLook up how a Ruby on Rails or Elixir/Phoenix concept maps to Rust off Rails (RAILS_MAP.md): returns the matching rows with the guide to read.
-
list_skillsList the Claude Code plugin's skills (/offrails:new, :feature, :scaffold…) with when to use each and an example.
-
starter_promptA ready-to-paste prompt that starts a new Rust off Rails app, for Claude Code (/offrails:new) and for any AGENTS.md agent. Pick a gallery kind, or "custom" with your own name and pitch.
-
stack_versionsThe crate versions the framework was last verified against (stack.md, "Verified against"). Orientation, not a pin: agents still cargo add.
-
framework_infoThe latest framework version and every version whose docs this server has, the install one-liner, the Claude Code plugin commands, the repository and the site's links.
-
upgrade_pathHow to upgrade an app from one framework version to another: the CHANGELOG sections in between, oldest first, with every App migration note, plus which docs were added, removed or changed.
-
diff_docA unified diff of one framework doc between two versions (e.g. guides/models.md from 0.4.0 to 0.6.0).
-
get_releaseA release's tarball URL, its SHA-256 (from the release's checksums.txt) and the exact commands to verify it and vendor it into .offrails/.
-
list_partsList the framework's parts (template/parts: mailer, jobs, sign-in, realtime, dev tools…): each one's summary, what it gives you, the parts it requires and the `cargo offrails add <part>` command. Read one with read_part.
-
read_partRead one part: its README (what it does, install, adapting it, what not to change), the files it adds and the shared files it wires into.
-
list_snippetsList the framework's snippets (template/snippets: small tested code to copy, such as an Atom feed, slugs, Markdown, pagination): each one's purpose, what it needs, its files and the `cargo offrails snippet show|add|remove <name>` commands. Read one with read_snippet.
-
read_snippetRead one snippet: its README (when to use it, files, wiring, after adding, adapting it, removing it) plus its file list and wires.
Resources: every doc is also a resource, offrails://docs/<path> (for example offrails://docs/guides/models.md), as Markdown.
Prompts
The plugin's skills, as MCP prompts: most clients list them as slash commands (in Claude Code, /mcp__rustoffrails__upgrade and so on). Every argument is optional. Each prompt tells your agent to read the docs of the version your app vendors (the first line of .offrails/VERSION), from .offrails/ or through the tools with version, never a newer one by accident.
-
new· New appCreate a new Rust off Rails app (rails new): interview, plan, generate.
-
scaffold· Scaffold a resourceGenerate a full CRUD resource (rails g scaffold), e.g. Book title:string rating:integer.
-
generate· Run a generatorRun a generator other than scaffold: model, migration, job, mailer, channel, authentication, task.
-
feature· Build a featureBuild or change a feature from a plain request or from what changed in product/: spec, code, green.
-
check· Definition of DoneRun the Definition of Done (offrails-check, fmt, clippy, tests on SQLite and Postgres, gates) and fix what fails.
-
doctor· Convention auditAudit the app against the framework's conventions and report (or fix) violations.
-
deploy· DeployMake the app deployable and ship it (Docker, Fly.io, Kamal, Railway, Render).
-
upgrade· Upgrade the frameworkUpgrade the app's vendored framework (.offrails/) and migrate it to the new conventions (rails app:update).
-
security· Security reviewDeep security review: threat model, the security checklist, scanners, header checks.
Versions and upgrades
The server bundles the docs of every release: 0.7.3 (latest), 0.7.2, 0.7.1, 0.7.0, 0.6.2, 0.6.1, 0.6.0, 0.5.0, 0.4.0, 0.3.0. Each one is the release's published tarball, checked against its checksums.txt when the site is built.
upgrade_path(from, to): the release notes in between, oldest first, with every App migration note, and which docs were added, removed or changed.diff_doc(path, from, to): what changed in one guide.get_release(version): the tarball, its SHA-256 and the exact commands to verify it and vendor it into.offrails/.
So upgrading an app is one sentence:
Upgrade me from 0.4.0 to 0.6.0.Your agent calls upgrade_path("0.4.0", "0.6.0"), then get_release("0.6.0"), verifies and unpacks the tarball, runs offrails upgrade --check --fw "$FW", and follows that release's generators/upgrade.md step by step. The upgrade prompt does the same with from and to as arguments.
Try it
Once connected, ask in plain words:
How does Rust off Rails do background jobs? Search its docs.
What's the Rust off Rails equivalent of has_many?
Give me a starter prompt for the uptime monitor.
What changed in the models guide between 0.4.0 and 0.6.0?Or with no client at all:
curl -s https://rustoffrails.org/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_docs","arguments":{"query":"background jobs"}}}'Limits and security
- Read-only and public. No tool writes anything. There are no accounts, tokens or cookies: requests carry nothing worth stealing, and responses are
no-store. - Docs only. Paths and versions resolve against the bundled docs index, never the filesystem, so nothing outside the framework's Markdown can be read.
- Verified releases. Every bundled version is its release tarball, pinned by SHA-256 and checked against the release's
checksums.txtat build time;get_releasehands out that same pin. - Limits. 120 requests a minute per IP, 64 KiB request bodies, bounded arguments and 128 KiB results, diffs and prompts.
- Browsers. CORS allows any origin on
/mcponly, never with credentials. Per the MCP spec's DNS-rebinding guidance, theHostmust be rustoffrails.org and theOrigina real web origin. - Stateless. No sessions and no server push: every request stands alone.
Found a problem? See the security policy. This page as Markdown: /mcp.md.