MCP on Rails (avec OAuth optionnel)
Un modèle d’application Rails qui intègre le Model Context Protocol (MCP) avec Ruby on Rails. Lors de la configuration, le modèle demande s’il faut ajouter une protection OAuth 2.1 avec Devise et Doorkeeper — ainsi un seul modèle supporte à la fois MCP simple et les configurations entièrement authentifiées.
Démarrage rapide
git clone https://github.com/pstrzalk/mcp-on-rails.git
rails new myapp -m mcp-on-rails/mcp
cd myapp
rails db:migrate
rails server
Le modèle invitera :Add Devise + Doorkeeper OAuth 2.1 authentication? (y/n)
Répondez n pour un serveur MCP simple ou y pour une protection OAuth complète.Ajout du modèle MCP à une application Rails existante
Vous pouvez tout aussi facilement appliquer ce modèle à une application Rails existante.
git clone https://github.com/pstrzalk/mcp-on-rails.git
cd your-project/
rails app:template LOCATION=../mcp-on-rails/mcpMCP simple (répondre "n")
Crée une application Rails avec un serveur MCP ouvert — aucune authentification requise.
Ce que vous obtenez
- gem
mcpajoutée au Gemfile McpControllerà/mcp— hérite deActionController::API, gère le protocole MCP- Routes MCP —
POST /mcp,GET /mcp - Hook scaffold —
rails generate scaffoldcrée automatiquement des outils MCP - Générateur d’outil personnalisé —
rails generate mcp_tool NomOutil champ:type - Générateur de prompt personnalisé —
rails generate mcp_prompt NomPrompt arg arg:required to_mcp_responsesur ApplicationRecord pour un formatage texte cohérentrake mcp:toolsetrake mcp:promptspour lister tous les outils et prompts enregistrés (utilisezmcp:tools:verbose/mcp:prompts:verbosepour les détails complets)
Utilisation
rails new myapp -m mcp-on-rails/mcp # answer n
cd myapp && rails db:migraterails generate scaffold Post title:string body:text
rails db:migrate
rails server
Testez-le :# MCP initialize
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'List tools
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'Structure du projet (mode simple)
app/
├── controllers/
│ └── mcp_controller.rb # Open MCP endpoint (no auth)
├── models/
│ └── application_record.rb # Extended with to_mcp_response
├── prompts/ # MCP prompts (created via generator)
└── tools/ # MCP tools (auto-generated per scaffold)config/
├── initializers/
│ └── mcp.rb # MCP tool and prompt autoloading
└── routes.rb # MCP routes
lib/
├── generators/ # MCP tool and prompt generators
└── tasks/
└── mcp.rake # rake mcp:tools, rake mcp:prompts (and verbose variants)
Connexion des assistants IA (mode simple)
{
"name": "my-rails-app",
"type": "StreamableHttp",
"url": "http://localhost:3000/mcp"
}Aucune authentification requise — le point de terminaison /mcp est ouvert.
OAuth MCP (répondez "y")
Crée une application Rails avec un serveur MCP protégé par OAuth 2.1, incluant PKCE, l'enregistrement dynamique des clients, et le support des indicateurs de ressources — tout ce qui est nécessaire pour le flux d'autorisation OAuth de MCP.
Ce que vous obtenez
Tout ce qui est inclus en mode simple, plus :
- gems
devise+doorkeeperajoutés au Gemfile - Devise pour l'authentification des utilisateurs (inscription, connexion, réinitialisation du mot de passe)
- Doorkeeper fournisseur OAuth 2.1 avec application obligatoire de PKCE (S256)
McpControllerprotégé pardoorkeeper_authorize!avec validation de l'audience du token (RFC 8707)- Enregistrement dynamique des clients via
POST /oauth/register(RFC 7591) - Métadonnées des ressources protégées via
GET /.well-known/oauth-protected-resource(RFC 9728) - Métadonnées du serveur d'autorisation via
GET /.well-known/oauth-authorization-server(RFC 8414) - Indicateurs de ressources — les tokens sont limités à la ressource
/mcp(RFC 8707)
Utilisation
rails new myapp -m mcp-on-rails/mcp # answer y
cd myapp && rails db:migraterails generate scaffold Post title:string body:text
rails db:migrate
rails server
Le point de terminaison /mcp nécessite désormais un jeton Bearer — les requêtes non authentifiées retournent 401.
Flux OAuth
Le flux complet d’autorisation suit la spécification OAuth de MCP :
- Découverte — Le client récupère
GET /.well-known/oauth-protected-resourcepour trouver le serveur d’autorisation - Métadonnées du serveur — Le client récupère
GET /.well-known/oauth-authorization-serverpour les points de terminaison et capacités - Enregistrement du client —
POST /oauth/registeravec les métadonnées du client (RFC 7591) - Autorisation —
GET /oauth/authorizeaveccode_challengePKCE (S256) et paramètreresource - Authentification utilisateur — Devise gère la connexion/l’inscription
- Échange de jeton —
POST /oauth/tokenaveccode_verifieret paramètreresource - Requêtes MCP —
POST /mcpavecAuthorization: Bearer
RFC supportés
| RFC | Description | Point de terminaison |
|-----|-------------|---------------------|
| OAuth 2.1 + PKCE | Autorisation avec Proof Key for Code Exchange (S256) | /oauth/authorize, /oauth/token |
| RFC 7591 | Enregistrement dynamique du client | POST /oauth/register |
| RFC 8414 | Métadonnées du serveur d’autorisation | GET /.well-known/oauth-authorization-server |
| RFC 8707 | Indicateurs de ressources | paramètre resource dans les requêtes d’auth et de jeton |
| RFC 9728 | Métadonnées de ressource protégée | GET /.well-known/oauth-protected-resource |
Structure du projet (mode OAuth)
app/
├── controllers/
│ ├── mcp_controller.rb # OAuth-protected MCP endpoint
│ ├── oauth_client_registration_controller.rb # RFC 7591
│ └── oauth_authorization_server_metadata_controller.rb # RFC 8414 + 9728
├── models/
│ ├── user.rb # Devise user with OAuth associations
│ ├── oauth_application.rb
│ ├── oauth_access_token.rb
│ └── oauth_access_grant.rb
├── prompts/ # MCP prompts (created via generator)
├── tools/ # MCP tools (auto-generated per scaffold)
└── views/
└── devise/ # Customizable auth viewsconfig/
├── initializers/
│ ├── doorkeeper.rb # OAuth + PKCE config
│ ├── devise.rb # User auth config
│ └── mcp.rb # MCP tool autoloading
└── routes.rb # All OAuth + MCP routes
db/migrate/
├── *_devise_create_users.rb
├── *_create_doorkeeper_tables.rb
├── *_enable_pkce.rb
└── *_add_resource_to_oauth_tables.rb
Connexion des assistants IA (mode OAuth)
{
"name": "my-rails-app",
"type": "StreamableHttp",
"url": "http://localhost:3000/mcp"
}Le client doit compléter le flux OAuth PKCE avant d'effectuer des requêtes MCP — le point de terminaison /mcp renvoie 401 sans un jeton Bearer valide.
Fonctionnalités communes (les deux modes)
Génération de modèles avec les outils MCP
rails generate scaffold Post title:string content:text
rails db:migrateCela crée des fichiers Rails standard plus 5 outils MCP dans app/tools/posts/ :
show_tool.rb— Récupérer un seul post par IDindex_tool.rb— Lister les posts avec paginationcreate_tool.rb— Créer de nouveaux postsupdate_tool.rb— Mettre à jour les posts existantsdelete_tool.rb— Supprimer des posts
Création d’outils MCP personnalisés
rails generate mcp_tool WeatherCheck location:stringCréation de invites MCP personnalisées
rails generate mcp_prompt hotel_finder location:required check_in_date:required adults price_maxCela crée app/prompts/hotel_finder.rb avec une classe de prompt héritant de MCP::Prompt. Les arguments sont facultatifs par défaut — ajoutez :required pour les rendre obligatoires.
Les prompts sont automatiquement chargés depuis app/prompts/ et enregistrés auprès du serveur MCP. Contrairement aux outils, les prompts ne sont pas générés automatiquement lors du scaffolding — ils sont créés explicitement via le générateur.
Liste des outils et prompts disponibles
rake mcp:tools # compact one-line-per-tool summary
rake mcp:tools:verbose # full details with schema
rake mcp:prompts # compact one-line-per-prompt summary
rake mcp:prompts:verbose # full details with argumentsLicence
Licence MIT
--- Tranlated By Open Ai Tx | Last indexed: 2026-06-17 ---