Action MCP Example ð
ããŒã«ã«Action MCP Example ð ã«ã€ããŠ
Action MCP Example ã¯ãActionMCP gem ã䜿ã£ãŠ MCP ãµãŒããŒãæ§ç¯ããæ¹æ³ã瀺ã Ruby on Rails ã®ãã³ãã¬ãŒãã§ãããµã³ãã«ã®ããŒã«ãããã³ããããªãœãŒã¹ãã³ãã¬ãŒããå«ã¿ãŸããRails ãããžã§ã¯ãã« MCP ãå°å ¥ããéçºè ãæ³å®ããŠããŸãã
äž»ãªæ©èœ
- 01ActionMCP gem ãå©çšãã Rails ãã³ãã¬ãŒã
- 02ã²ãŒããŠã§ã€ã¯ã©ã¹ã«ãã JWT èªèšŒ
- 03倩æ°ååŸãäŸåé¢ä¿æ å ±ã®ãµã³ãã«ããŒã«
- 04ãµã³ãã«ã®ããã³ãããš Gemfile ãªãœãŒã¹ãã³ãã¬ãŒã
掻çšã·ãŒã³
- 01Rails ãããžã§ã¯ãã§ MCP ã³ã³ããŒãã³ããå®çŸ©ããæ¹æ³ã®åŠç¿
- 02JWT èªèšŒä»ã MCP ãµãŒããŒã®åææ§ç¯
- 03MCP Inspector ã«ããããŒã«ã«ãšã³ããã€ã³ãã®åäœç¢ºèª
MCP 察å¿
æ¬ãããžã§ã¯ã㯠MCP ãµãŒããŒãšããŠã/mcp ãšã³ããã€ã³ãçµç±ã§ããŒã«ãããã³ããããªãœãŒã¹ãã³ãã¬ãŒãã MCP ã¯ã©ã€ã¢ã³ãã«å ¬éããŸãã
èšå®
ããŒã«ã«ãµãŒããŒã®èšå®ã¯ã©ã®ã¯ã©ã€ã¢ã³ãã§ãå ±éã§ããã³ããŒããŠã¯ã©ã€ã¢ã³ãã® MCP èšå®ãã¡ã€ã«ã«è²Œãä»ããŠãã ããã
npx -y @modelcontextprotocol/inspectorããŒã«ã«ãµãŒããŒã«ã¯ãã·ã³äžã®å®è¡ç°å¢ïŒNode.js 18 以äžãªã©ïŒãå¿ èŠã§ããèšå®ãã¡ã€ã«ã®å Žæã¯ã¯ã©ã€ã¢ã³ãããšã«ç°ãªããŸãã
ããŒã«
ããŒã«ã«ãµãŒããŒã®ããŒã«ã¯ãã·ã³äžã§èµ·åããŠåããŠååŸã§ããŸããã¡ã³ãããŒã¯ãŸã ããŒã«äžèЧãæäŸããŠããŸããã
詳现
Action MCP ã®ãµã³ãã« ð
ActionMCP gem ã®çµ±åæ¹æ³ãšäœ¿ç𿹿³ã玹ä»ããã·ã³ãã«ãª Ruby on Rails ã¢ããªã±ãŒã·ã§ã³ã§ããgem ã®ãœãŒã¹ã³ãŒã㯠GitHub ã® https://github.com/seuros/mcp ã§ç¢ºèªã§ããŸãã
ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãRails ãããžã§ã¯ãå ã§ MCP ã³ã³ããŒãã³ããå®çŸ©ããŠäœ¿çšããæ¹æ³ã玹ä»ããŸãã
èŠä»¶
- RubyïŒæšå¥šããŒãžã§ã³ã¯
.ruby-versionãåç §ïŒ - PostgreSQLïŒãŸã㯠DockerïŒ
ã¯ããã«
1. ã¯ããŒã³ãšã»ããã¢ãã
git clone https://github.com/seuros/mcp_rails_template.git
cd mcp_rails_template
bin/setup
2. ç°å¢èšå®
çšæãããŠãã .env.example ãã¡ã€ã«ãã³ããŒããŸãã
cp .env.example .env
.env ãç·šéããç°å¢ã«å¿ããŠå¿
èŠãªå€ãå
¥åããŸãïŒç¹ã«ãfetch_weather_by_location_tool ãªã©ã®ããŒã«ã«å¿
èŠãª API ããŒãå
¥åããŠãã ããïŒã
3. ããŒã¿ããŒã¹ã®ã»ããã¢ãã
Docker ã䜿çšããŠãäžæç㪠PostgreSQL ã€ã³ã¹ã¿ã³ã¹ãããã«èµ·åã§ããŸãã
make up
ããã«ãããPostgreSQL ãããŒã 5466 ã§èµ·åããŸãã
ãŸãã¯ãconfig/database.yml ãç·šéããŠç¬èªã® PostgreSQL ããŒã¿ããŒã¹ãèšå®ããŠãã ããã
4. ã¢ããªã±ãŒã·ã§ã³ã®å®è¡
Rails ãµãŒããŒãèµ·åããŸãã
bin/rails s
ã¢ããªã¯ http://localhost:3002 ã§å©çšã§ããŸãã
ActionMCP ãµãŒããŒ
ActionMCP ã¯ãmcp.ru ãä»ããŠããŒã 62770 ã§ã¹ã¿ã³ãã¢ãã³ãµãŒããŒãšããŠå®è¡ãããŸããNginx 㯠/mcp ãªã¯ãšã¹ãããã®ãµãŒããŒã«ãããã·ããŸãã
Client â nginx:8080/mcp â ActionMCP:62770
èªèšŒ
ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãApplicationGateway ã¯ã©ã¹ãä»ãã JWT ããŒã¹ã®èªèšŒã䜿çšããŸãã
ãã¹ããŠãŒã¶ãŒïŒãã£ã¯ã¹ãã£ããïŒ
| ã¡ãŒã«ã¢ãã¬ã¹ | ãã¹ã¯ãŒã | ããŒã« |
|---|---|---|
| [email protected] | password123 | ãã¹ããŠãŒã¶ãŒ |
| [email protected] | password123 | 管çè ãŠãŒã¶ãŒ |
ãã£ã¯ã¹ãã£ã®èªã¿èŸŒã¿
bin/rails db:fixtures:load FIXTURES=users
JWT ããŒã¯ã³ã®çæ
# In Rails console
user = User.find_by(email: '[email protected]')
token = user.generate_jwt(expires_in: 10.years) # Long-lived for demo
MCP ã¯ã©ã€ã¢ã³ãã®èšå®
äºåã«èšå®ãããé·æéæå¹ãªããŒã¯ã³ãå«ã .mcp.json ãã¡ã€ã«ãçšæãããŠããŸãã
{
"mcpServers": {
"mcp_rails_template": {
"url": "http://localhost:8080/mcp",
"headers": {
"Authorization": "Bearer <token>"
}
}
}
}
ãŸãã¯ãcurl ã§æåã§ãã¹ãããŸãã
curl -H "Authorization: Bearer <token>" http://localhost:8080/mcp
ã²ãŒããŠã§ã€ã®èšå®
ã²ãŒããŠã§ã€ã¯ config/mcp.yml ã§èšå®ãããŠããŸãã
development:
authentication: ["jwt"]
gateway_class: "ApplicationGateway"
ããŒã«å ã§ã®ãŠãŒã¶ãŒãžã®ã¢ã¯ã»ã¹
class MyTool < ApplicationMCPTool
def perform
render text: "Hello #{current_user.name}!"
end
end
MCP ã³ã³ããŒãã³ãïŒapp/mcp/ïŒ
ãã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãActionMCP ã³ã³ããŒãã³ãã®äŸãããã€ãå«ãŸããŠããŸãã
ããã³ããïŒapp/mcp/prompts/ïŒ
epic_adventure_prompt.rbïŒæå®ãããããŒããŒåãšåéºã®çš®é¡ïŒãã¡ã³ã¿ãžãŒãSFããã¹ããªãŒïŒã«åºã¥ããŠãçãç©èªé¢šã®åéºã¹ããŒãªãŒãçæããŸãããã¬ãŒã¹ãã«ããŒã®ç»åããŒã¿æååãä»»æã§å«ããããšãã§ããŸãã
ãªãœãŒã¹ãã³ãã¬ãŒãïŒapp/mcp/resource_templates/ïŒ
gemfile_template.rbïŒãããžã§ã¯ãã® Gemfile ã®äŸåé¢ä¿ã JSON ãªãœãŒã¹ãšããŠæäŸããŸããBundler ã䜿çšããæå®ãããç°å¢ïŒproductionãtestãdevelopmentããŸãã¯defaultïŒã«åºã¥ã㊠gem ãååŸããŸãããªãœãŒã¹ URI ã¯gemfile://{environment}ã®åœ¢åŒã§ãã
ããŒã«ïŒapp/mcp/tools/ïŒ
ããŒã«ã¯ãèšèªã¢ãã«ãå®è¡ãèŠæ±ã§ããå ·äœçãªã¢ã¯ã·ã§ã³ãå®çŸ©ããŸãã
dependency_info_tool.rbïŒGemfileãšGemfile.lockãã Bundler ã䜿çšããŠäŸåé¢ä¿ã®æ å ±ãååŸããŸãããŸããå®è¡æã®äŸåé¢ä¿ã«ã€ããŠã¯.gemspecãã¡ã€ã«ã確èªããŸããproductionãtestãruntimeã®äŸåé¢ä¿ãããããå¥ã® JSON ãªãœãŒã¹ãšããŠåºåããŸããfetch_weather_by_location_tool.rbïŒæå®ããã緯床ãšçµåºŠã®åº§æšã«åºã¥ããŠãOpen-Meteo APIïŒhttps://api.open-meteo.comïŒãã倩æ°äºå ±ããŒã¿ãååŸããŸããAPI ããã®æªå 工㮠JSON ã¬ã¹ãã³ã¹ãè¿ããŸããrubocop_tool.rbïŒRuboCop gem ã® API ã䜿çšããŠãæå®ããã Ruby ã³ãŒãã¹ãããããåæããŸããæ€åºãããã¹ã¿ã€ã«ãŸãã¯ã³ãŒãå質ã«é¢ããéåã«ã€ããŠãã«ãŒã«åãã¡ãã»ãŒãžãè¡çªå·ãåçªå·ãå«ããŠå ±åããŸããruby_code_analyzer_tool.rbïŒãããžã§ã¯ããã£ã¬ã¯ããªå ã® Ruby ã³ãŒãã«å¯ŸããŠãåºæ¬çãªéçè§£æãå®è¡ããŸãã.rbãã¡ã€ã«ãè§£æããŠãã¯ã©ã¹ãã¢ãžã¥ãŒã«ãã¡ãœãããã€ã³ããã¯ã¹åããŸããæ€åºããããã¹ãŠã®ã¯ã©ã¹ãã¢ãžã¥ãŒã«ãã¡ãœããã®äžèŠ§è¡šç€ºããç¹å®ã®ã¯ã©ã¹ïŒã¢ãžã¥ãŒã«ïŒconstantïŒãŸãã¯ã¡ãœããïŒmethod_detailsïŒã®è©³çްïŒãœãŒã¹ã³ãŒãã®ã¹ãããããå«ãïŒã®ååŸããªã¯ãšã¹ãã§ããŸãã
äœ¿ãæ¹
MCP ã®æ©èœã察話圢åŒã§ãã¹ãããã³ç¢ºèªããã«ã¯ãMCP Inspector ã䜿çšã§ããŸãã
npx @modelcontextprotocol/inspector --url http://localhost:8080/mcp
Inspector ã³ãã³ããå®è¡ããåã«ãDocker ãå®è¡äžã§ããããšã確èªããŠãã ããïŒdocker compose upïŒã
ã³ã³ããªãã¥ãŒã·ã§ã³
ãæ°è»œã«ãååãã ããïŒãã®ãµã³ãã«ã®æ¹åã«åœ¹ç«ã€ã€ã·ã¥ãŒã®äœæããã«ãªã¯ãšã¹ãã®éä¿¡ããåŸ ã¡ããŠããŸãã
楜ããã³ãŒãã£ã³ã°ãïŒâšð
ã³ã¡ã³ã
MCP ã¯åããŠã§ããïŒ
ãããã³ã«ã®æŠèŠããæåã®ãµãŒããŒã®å°å ¥ãŸã§ãããããçåã«ãŸãšããŠçããŸãã
AI ã¢ããªã±ãŒã·ã§ã³ãå€éšã®ããŒã«ãããŒã¿ãœãŒã¹ã«çµ±äžçãªæ¹æ³ã§æ¥ç¶ããããã®ãªãŒãã³ãªãããã³ã«ã§ããã¯ã©ã€ã¢ã³ãã¯ã¢ãã«ãšã®å¯Ÿè©±ãæ ããMCP ãµãŒããŒã¯ããŒã«ã»ãªãœãŒã¹ã»ããã³ãããã³ãã¬ãŒããæäŸããŸããæšæºã¡ãã»ãŒãžã§ããåãããããã1 ã€ã®ãµãŒããŒãè€æ°ã®ã¯ã©ã€ã¢ã³ãã§åå©çšã§ããŸãã