Curated library of 39 AI agent skills for Ruby on Rails development. Organized by category: planning, testing, code-quality, ddd, engines, infrastructure, api, patterns, context, orchestration, and workflows. Includes 5 callable workflow skills (rails-tdd-loop, rails-review-flow, rails-setup-flow, rails-quality-flow, rails-engines-flow) for complete development cycles. Covers code review, architecture, security, testing (RSpec), engines, service objects, DDD patterns, and TDD automation.
95
98%
Does it follow best practices?
Impact
95%
1.20xAverage score across 35 eval scenarios
Passed
No known issues
A Ruby MCP server that exposes the rails-agent-skills skill library to AI tools (Windsurf, Cursor, Claude Code, RubyMine, etc.) via the Model Context Protocol official spec (JSON-RPC 2.0, stdio transport).
Built on the official Ruby MCP SDK (gem 'mcp').
| Requirement | Version |
|---|---|
| Ruby | 3.1+ |
mcp gem | 0.13+ |
| Bundler | 2.x |
| Type | Prefix | Source |
|---|---|---|
| Resources | skill/<name> | Every SKILL.md + support files (EXAMPLES.md, TESTING.md, PATTERNS.md, HEURISTICS.md, TASK_TEMPLATES.md) in each skill directory |
| Resources | doc/<name> | All *.md files under docs/ |
| Resources | workflow/<name> | All *.md files under .windsurf/workflows/ |
| Tool | use_skill | Invocable tool: given a skill_name, returns the full SKILL.md content |
Adding a new skill directory to the repo automatically makes it available — no server changes needed.
mcp_server/
├── server.rb # Entry point: MCP::Server + StdioTransport
├── Gemfile # gem 'mcp' (official SDK), minitest, rake
├── Rakefile # bundle exec rake test
├── Dockerfile # Container image for Docker-based deployment
├── registry.json # Metadata for MCP registries (smithery.ai, glama.ai)
├── lib/
│ └── mcp_skills/
│ ├── resource_registry.rb # Service: discovers all resources (skills + docs + workflows)
│ ├── skill_resource_builder.rb # Service: builds MCP::Resource objects for skills
│ ├── doc_resource_builder.rb # Service: builds MCP::Resource objects for docs/workflows
│ └── skill_tool.rb # MCP::Tool: 'use_skill' invocable by the agent
└── test/
├── test_helper.rb
├── resource_registry_test.rb
├── skill_resource_builder_test.rb
├── doc_resource_builder_test.rb
└── skill_tool_test.rbService objects:
McpSkills::ResourceRegistry — scans the repo for all exposable files. Single source of truth. Zero hardcoded skill names.McpSkills::SkillResourceBuilder — maps a skill directory path to an MCP::Resource with file:// URI and skill/ name prefix.McpSkills::DocResourceBuilder — same for docs/ and .windsurf/workflows/ with doc/ and workflow/ prefixes.McpSkills::SkillTool — MCP::Tool subclass. call(skill_name:) reads and returns the SKILL.md content.git clone https://github.com/igmarin/rails-agent-skills.git ~/rails-agent-skills
cd ~/rails-agent-skills/mcp_server
bundle installRun the server manually (stdio — for debugging):
bundle exec ruby server.rbInspect with the MCP inspector:
npx @modelcontextprotocol/inspector bundle exec ruby server.rbThe repo includes a pre-populated .mcp.json at the root. When you open the cloned repo as a project in Claude Code, the server is registered automatically — no manual config needed.
For global setup (available in every project), add to ~/.claude/mcp.json:
{
"mcpServers": {
"rails-agent-skills": {
"type": "stdio",
"command": "bundle",
"args": ["exec", "ruby", "mcp_server/server.rb"],
"cwd": "/YOUR/PATH/TO/rails-agent-skills",
"env": {
"BUNDLE_GEMFILE": "/YOUR/PATH/TO/rails-agent-skills/mcp_server/Gemfile"
}
}
}
}Replace the path with your actual clone location, then start a new Claude Code session.
The config goes in your global Windsurf MCP file (~/.codeium/windsurf/mcp_config.json):
{
"mcpServers": {
"rails-agent-skills": {
"type": "stdio",
"command": "bundle",
"args": ["exec", "ruby", "mcp_server/server.rb"],
"cwd": "/YOUR/PATH/TO/rails-agent-skills",
"env": {
"BUNDLE_GEMFILE": "/YOUR/PATH/TO/rails-agent-skills/mcp_server/Gemfile"
}
}
}
}Reload Windsurf (Cmd+Shift+P → "Reload Window"). The server will appear in the MCP panel.
Why
BUNDLE_GEMFILE? The server'sGemfilelives insidemcp_server/, not at the repo root. Setting this env var tells Bundler exactly which Gemfile to use regardless of working directory.
Open Settings → MCP (or edit ~/.cursor/mcp.json) and add:
{
"mcpServers": {
"rails-agent-skills": {
"type": "stdio",
"command": "bundle",
"args": ["exec", "ruby", "mcp_server/server.rb"],
"cwd": "/YOUR/PATH/TO/rails-agent-skills",
"env": {
"BUNDLE_GEMFILE": "/YOUR/PATH/TO/rails-agent-skills/mcp_server/Gemfile"
}
}
}
}Restart Cursor.
Open Settings → Tools → AI Assistant → Model Context Protocol and add a new server:
bundle exec ruby mcp_server/server.rb/YOUR/PATH/TO/rails-agent-skillsBUNDLE_GEMFILE=/YOUR/PATH/TO/rails-agent-skills/mcp_server/GemfileRestart RubyMine.
For environments without Ruby, or for containerized deployment:
cd mcp_server
docker build -t rails-agent-skills-mcp .
docker run --rm -i rails-agent-skills-mcpThe container uses stdio transport — wire it up the same way as the Ruby command, replacing bundle exec ruby server.rb with docker run --rm -i rails-agent-skills-mcp.
Docker Hub (published image):
{
"mcpServers": {
"rails-agent-skills": {
"type": "stdio",
"command": "docker",
"args": ["run", "--rm", "-i", "igmarin/rails-agent-skills-mcp"]
}
}
}tools/call use_skill with skill_name: "rails-graphql-best-practices".rails-graphql-best-practices/SKILL.md and returns the full instructions.bundle exec rake testTests are written with Minitest: each file validates real behavior of a service object, not just structure.
ResourceRegistry uses glob patterns (**/SKILL.md, docs/**/*.md, .windsurf/workflows/*.md). When you add a new skill directory with a SKILL.md, it appears in resources/list on the next server start — no code changes required.
This server is listed on:
lib/mcp_skills/ and must be independently testable (no MCP::Server dependency in unit tests).mcp gem — do not reimplement wire format in service objects.docs
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10
scenario-11
scenario-12
scenario-13
scenario-14
scenario-15
scenario-16
scenario-17
scenario-18
scenario-19
scenario-20
scenario-21
scenario-22
scenario-23
scenario-24
scenario-25
scenario-26
scenario-27
scenario-28
scenario-29
scenario-30
scenario-31
scenario-32
scenario-33
scenario-34
scenario-35
mcp_server
skills
api
api-rest-collection
rails-graphql-best-practices
code-quality
rails-architecture-review
rails-code-conventions
rails-code-review
rails-review-response
rails-security-review
rails-stack-conventions
assets
snippets
refactor-safely
context
rails-context-engineering
rails-project-onboarding
ddd
ddd-boundaries-review
ddd-rails-modeling
ddd-ubiquitous-language
engines
rails-engine-compatibility
rails-engine-docs
rails-engine-extraction
rails-engine-installers
rails-engine-release
rails-engine-reviewer
rails-engine-testing
infrastructure
rails-api-versioning
rails-background-jobs
rails-database-seeding
rails-frontend-hotwire
rails-migration-safety
rails-performance-optimization
orchestration
rails-skills-orchestrator
patterns
ruby-service-objects
strategy-factory-null-calculator
yard-documentation
planning
create-prd
generate-tasks
ticket-planning
testing
rails-bug-triage
rails-tdd-slices
rspec-best-practices
rspec-service-testing