{"id":"541c63ca-3a6f-4ebd-9813-9bd92f72c5d8","shortId":"Fyfrzb","kind":"skill","title":"Ruby Mcp Server Generator","tagline":"Awesome Copilot skill by Github","description":"# Ruby MCP Server Generator\n\nGenerate a complete, production-ready MCP server in Ruby using the official Ruby SDK.\n\n## Project Generation\n\nWhen asked to create a Ruby MCP server, generate a complete project with this structure:\n\n```\nmy-mcp-server/\n├── Gemfile\n├── Rakefile\n├── lib/\n│   ├── my_mcp_server.rb\n│   ├── my_mcp_server/\n│   │   ├── server.rb\n│   │   ├── tools/\n│   │   │   ├── greet_tool.rb\n│   │   │   └── calculate_tool.rb\n│   │   ├── prompts/\n│   │   │   └── code_review_prompt.rb\n│   │   └── resources/\n│   │       └── example_resource.rb\n├── bin/\n│   └── mcp-server\n├── test/\n│   ├── test_helper.rb\n│   └── tools/\n│       ├── greet_tool_test.rb\n│       └── calculate_tool_test.rb\n└── README.md\n```\n\n## Gemfile Template\n\n```ruby\nsource 'https://rubygems.org'\n\ngem 'mcp', '~> 0.4.0'\n\ngroup :development, :test do\n  gem 'minitest', '~> 5.0'\n  gem 'rake', '~> 13.0'\n  gem 'rubocop', '~> 1.50'\nend\n```\n\n## Rakefile Template\n\n```ruby\nrequire 'rake/testtask'\nrequire 'rubocop/rake_task'\n\nRake::TestTask.new(:test) do |t|\n  t.libs << 'test'\n  t.libs << 'lib'\n  t.test_files = FileList['test/**/*_test.rb']\nend\n\nRuboCop::RakeTask.new\n\ntask default: %i[test rubocop]\n```\n\n## lib/my_mcp_server.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nrequire 'mcp'\nrequire_relative 'my_mcp_server/server'\nrequire_relative 'my_mcp_server/tools/greet_tool'\nrequire_relative 'my_mcp_server/tools/calculate_tool'\nrequire_relative 'my_mcp_server/prompts/code_review_prompt'\nrequire_relative 'my_mcp_server/resources/example_resource'\n\nmodule MyMcpServer\n  VERSION = '1.0.0'\nend\n```\n\n## lib/my_mcp_server/server.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  class Server\n    attr_reader :mcp_server\n    \n    def initialize(server_context: {})\n      @mcp_server = MCP::Server.new(\n        name: 'my_mcp_server',\n        version: MyMcpServer::VERSION,\n        tools: [\n          Tools::GreetTool,\n          Tools::CalculateTool\n        ],\n        prompts: [\n          Prompts::CodeReviewPrompt\n        ],\n        resources: [\n          Resources::ExampleResource.resource\n        ],\n        server_context: server_context\n      )\n      \n      setup_resource_handler\n    end\n    \n    def handle_json(json_string)\n      mcp_server.handle_json(json_string)\n    end\n    \n    def start_stdio\n      transport = MCP::Server::Transports::StdioTransport.new(mcp_server)\n      transport.open\n    end\n    \n    private\n    \n    def setup_resource_handler\n      mcp_server.resources_read_handler do |params|\n        Resources::ExampleResource.read(params[:uri])\n      end\n    end\n  end\nend\n```\n\n## lib/my_mcp_server/tools/greet_tool.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  module Tools\n    class GreetTool < MCP::Tool\n      tool_name 'greet'\n      description 'Generate a greeting message'\n      \n      input_schema(\n        properties: {\n          name: {\n            type: 'string',\n            description: 'Name to greet'\n          }\n        },\n        required: ['name']\n      )\n      \n      output_schema(\n        properties: {\n          message: { type: 'string' },\n          timestamp: { type: 'string', format: 'date-time' }\n        },\n        required: ['message', 'timestamp']\n      )\n      \n      annotations(\n        read_only_hint: true,\n        idempotent_hint: true\n      )\n      \n      def self.call(name:, server_context:)\n        timestamp = Time.now.iso8601\n        message = \"Hello, #{name}! Welcome to MCP.\"\n        \n        structured_data = {\n          message: message,\n          timestamp: timestamp\n        }\n        \n        MCP::Tool::Response.new(\n          [{ type: 'text', text: message }],\n          structured_content: structured_data\n        )\n      end\n    end\n  end\nend\n```\n\n## lib/my_mcp_server/tools/calculate_tool.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  module Tools\n    class CalculateTool < MCP::Tool\n      tool_name 'calculate'\n      description 'Perform mathematical calculations'\n      \n      input_schema(\n        properties: {\n          operation: {\n            type: 'string',\n            description: 'Operation to perform',\n            enum: ['add', 'subtract', 'multiply', 'divide']\n          },\n          a: {\n            type: 'number',\n            description: 'First operand'\n          },\n          b: {\n            type: 'number',\n            description: 'Second operand'\n          }\n        },\n        required: ['operation', 'a', 'b']\n      )\n      \n      output_schema(\n        properties: {\n          result: { type: 'number' },\n          operation: { type: 'string' }\n        },\n        required: ['result', 'operation']\n      )\n      \n      annotations(\n        read_only_hint: true,\n        idempotent_hint: true\n      )\n      \n      def self.call(operation:, a:, b:, server_context:)\n        result = case operation\n                 when 'add' then a + b\n                 when 'subtract' then a - b\n                 when 'multiply' then a * b\n                 when 'divide'\n                   return error_response('Division by zero') if b.zero?\n                   a / b.to_f\n                 else\n                   return error_response(\"Unknown operation: #{operation}\")\n                 end\n        \n        structured_data = {\n          result: result,\n          operation: operation\n        }\n        \n        MCP::Tool::Response.new(\n          [{ type: 'text', text: \"Result: #{result}\" }],\n          structured_content: structured_data\n        )\n      end\n      \n      def self.error_response(message)\n        MCP::Tool::Response.new(\n          [{ type: 'text', text: message }],\n          is_error: true\n        )\n      end\n    end\n  end\nend\n```\n\n## lib/my_mcp_server/prompts/code_review_prompt.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  module Prompts\n    class CodeReviewPrompt < MCP::Prompt\n      prompt_name 'code_review'\n      description 'Generate a code review prompt'\n      \n      arguments [\n        MCP::Prompt::Argument.new(\n          name: 'language',\n          description: 'Programming language',\n          required: true\n        ),\n        MCP::Prompt::Argument.new(\n          name: 'focus',\n          description: 'Review focus area (e.g., performance, security)',\n          required: false\n        )\n      ]\n      \n      meta(\n        version: '1.0',\n        category: 'development'\n      )\n      \n      def self.template(args, server_context:)\n        language = args['language'] || 'Ruby'\n        focus = args['focus'] || 'general quality'\n        \n        MCP::Prompt::Result.new(\n          description: \"Code review for #{language} with focus on #{focus}\",\n          messages: [\n            MCP::Prompt::Message.new(\n              role: 'user',\n              content: MCP::Content::Text.new(\n                \"Please review this #{language} code with focus on #{focus}.\"\n              )\n            ),\n            MCP::Prompt::Message.new(\n              role: 'assistant',\n              content: MCP::Content::Text.new(\n                \"I'll review the code focusing on #{focus}. Please share the code.\"\n              )\n            ),\n            MCP::Prompt::Message.new(\n              role: 'user',\n              content: MCP::Content::Text.new(\n                '[paste code here]'\n              )\n            )\n          ]\n        )\n      end\n    end\n  end\nend\n```\n\n## lib/my_mcp_server/resources/example_resource.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  module Resources\n    class ExampleResource\n      RESOURCE_URI = 'resource://data/example'\n      \n      def self.resource\n        MCP::Resource.new(\n          uri: RESOURCE_URI,\n          name: 'example-data',\n          description: 'Example resource data',\n          mime_type: 'application/json'\n        )\n      end\n      \n      def self.read(uri)\n        return [] unless uri == RESOURCE_URI\n        \n        data = {\n          message: 'Example resource data',\n          timestamp: Time.now.iso8601,\n          version: MyMcpServer::VERSION\n        }\n        \n        [{\n          uri: uri,\n          mimeType: 'application/json',\n          text: data.to_json\n        }]\n      end\n    end\n  end\nend\n```\n\n## bin/mcp-server Template\n\n```ruby\n#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nrequire_relative '../lib/my_mcp_server'\n\nbegin\n  server = MyMcpServer::Server.new\n  server.start_stdio\nrescue Interrupt\n  warn \"\\nShutting down server...\"\n  exit 0\nrescue StandardError => e\n  warn \"Error: #{e.message}\"\n  warn e.backtrace.join(\"\\n\")\n  exit 1\nend\n```\n\nMake the file executable:\n```bash\nchmod +x bin/mcp-server\n```\n\n## test/test_helper.rb Template\n\n```ruby\n# frozen_string_literal: true\n\n$LOAD_PATH.unshift File.expand_path('../lib', __dir__)\nrequire 'my_mcp_server'\nrequire 'minitest/autorun'\n```\n\n## test/tools/greet_tool_test.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nrequire 'test_helper'\n\nmodule MyMcpServer\n  module Tools\n    class GreetToolTest < Minitest::Test\n      def test_greet_with_name\n        response = GreetTool.call(\n          name: 'Ruby',\n          server_context: {}\n        )\n        \n        refute response.is_error\n        assert_equal 1, response.content.length\n        assert_match(/Ruby/, response.content.first[:text])\n        \n        assert response.structured_content\n        assert_equal 'Hello, Ruby! Welcome to MCP.', response.structured_content[:message]\n      end\n      \n      def test_output_schema_validation\n        response = GreetTool.call(\n          name: 'Test',\n          server_context: {}\n        )\n        \n        assert response.structured_content.key?(:message)\n        assert response.structured_content.key?(:timestamp)\n      end\n    end\n  end\nend\n```\n\n## test/tools/calculate_tool_test.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nrequire 'test_helper'\n\nmodule MyMcpServer\n  module Tools\n    class CalculateToolTest < Minitest::Test\n      def test_addition\n        response = CalculateTool.call(\n          operation: 'add',\n          a: 5,\n          b: 3,\n          server_context: {}\n        )\n        \n        refute response.is_error\n        assert_equal 8, response.structured_content[:result]\n      end\n      \n      def test_subtraction\n        response = CalculateTool.call(\n          operation: 'subtract',\n          a: 10,\n          b: 4,\n          server_context: {}\n        )\n        \n        refute response.is_error\n        assert_equal 6, response.structured_content[:result]\n      end\n      \n      def test_multiplication\n        response = CalculateTool.call(\n          operation: 'multiply',\n          a: 6,\n          b: 7,\n          server_context: {}\n        )\n        \n        refute response.is_error\n        assert_equal 42, response.structured_content[:result]\n      end\n      \n      def test_division\n        response = CalculateTool.call(\n          operation: 'divide',\n          a: 15,\n          b: 3,\n          server_context: {}\n        )\n        \n        refute response.is_error\n        assert_equal 5.0, response.structured_content[:result]\n      end\n      \n      def test_division_by_zero\n        response = CalculateTool.call(\n          operation: 'divide',\n          a: 10,\n          b: 0,\n          server_context: {}\n        )\n        \n        assert response.is_error\n        assert_match(/Division by zero/, response.content.first[:text])\n      end\n      \n      def test_unknown_operation\n        response = CalculateTool.call(\n          operation: 'modulo',\n          a: 10,\n          b: 3,\n          server_context: {}\n        )\n        \n        assert response.is_error\n        assert_match(/Unknown operation/, response.content.first[:text])\n      end\n    end\n  end\nend\n```\n\n## README.md Template\n\n```markdown\n# My MCP Server\n\nA Model Context Protocol server built with Ruby and the official MCP Ruby SDK.\n\n## Features\n\n- ✅ Tools: greet, calculate\n- ✅ Prompts: code_review\n- ✅ Resources: example-data\n- ✅ Input/output schemas\n- ✅ Tool annotations\n- ✅ Structured content\n- ✅ Full test coverage\n\n## Requirements\n\n- Ruby 3.0 or later\n\n## Installation\n\n```bash\nbundle install\n```\n\n## Usage\n\n### Stdio Transport\n\nRun the server:\n\n```bash\nbundle exec bin/mcp-server\n```\n\nThen send JSON-RPC requests:\n\n```bash\n{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"method\":\"ping\"}\n{\"jsonrpc\":\"2.0\",\"id\":\"2\",\"method\":\"tools/list\"}\n{\"jsonrpc\":\"2.0\",\"id\":\"3\",\"method\":\"tools/call\",\"params\":{\"name\":\"greet\",\"arguments\":{\"name\":\"Ruby\"}}}\n```\n\n### Rails Integration\n\nAdd to your Rails controller:\n\n```ruby\nclass McpController < ApplicationController\n  def index\n    server = MyMcpServer::Server.new(\n      server_context: { user_id: current_user.id }\n    )\n    render json: server.handle_json(request.body.read)\n  end\nend\n```\n\n## Testing\n\nRun tests:\n\n```bash\nbundle exec rake test\n```\n\nRun linter:\n\n```bash\nbundle exec rake rubocop\n```\n\nRun all checks:\n\n```bash\nbundle exec rake\n```\n\n## Integration with Claude Desktop\n\nAdd to `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"my-mcp-server\": {\n      \"command\": \"bundle\",\n      \"args\": [\"exec\", \"bin/mcp-server\"],\n      \"cwd\": \"/path/to/my-mcp-server\"\n    }\n  }\n}\n```\n\n## Project Structure\n\n```\nmy-mcp-server/\n├── Gemfile              # Dependencies\n├── Rakefile             # Build tasks\n├── lib/                 # Source code\n│   ├── my_mcp_server.rb # Main entry point\n│   └── my_mcp_server/   # Module namespace\n│       ├── server.rb    # Server setup\n│       ├── tools/       # Tool implementations\n│       ├── prompts/     # Prompt templates\n│       └── resources/   # Resource handlers\n├── bin/                 # Executables\n│   └── mcp-server       # Stdio server\n├── test/                # Test suite\n│   ├── test_helper.rb   # Test configuration\n│   └── tools/           # Tool tests\n└── README.md            # This file\n```\n\n## License\n\nMIT\n```\n\n## Generation Instructions\n\n1. **Ask for project name and description**\n2. **Generate all files** with proper naming and module structure\n3. **Use classes for tools and prompts** for better organization\n4. **Include input/output schemas** for type safety\n5. **Add tool annotations** for behavior hints\n6. **Include structured content** in responses\n7. **Implement comprehensive tests** for all tools\n8. **Follow Ruby conventions** (snake_case, modules, frozen_string_literal)\n9. **Add proper error handling** with is_error flag\n10. **Provide both stdio and HTTP** usage examples","tags":["ruby","mcp","server","generator","awesome","copilot","github"],"capabilities":["skill","source-github","category-awesome-copilot"],"categories":["awesome-copilot"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/github/awesome-copilot/ruby-mcp-server-generator","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under github/awesome-copilot","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T08:40:12.638Z","embedding":null,"createdAt":"2026-04-18T20:26:15.673Z","updatedAt":"2026-04-22T08:40:12.638Z","lastSeenAt":"2026-04-22T08:40:12.638Z","tsv":"'/division':976 '/lib':762 '/lib/my_mcp_server':717 '/path/to/my-mcp-server':1168 '/ruby':808 '/unknown':1001 '/usr/bin/env':709 '0':731,968 '0.4.0':82 '1':742,804,1078,1227 '1.0':556 '1.0.0':163 '1.50':95 '10':895,966,991,1300 '13.0':92 '15':941 '2':1084,1234 '2.0':1076,1082,1088 '3':874,943,993,1090,1244 '3.0':1051 '4':897,1254 '42':928 '5':872,1261 '5.0':89,951 '6':905,918,1268 '7':920,1274 '8':882,1281 '9':1291 'add':381,432,870,1101,1153,1262,1292 'addit':866 'annot':305,413,1043,1264 'application/json':674,698 'applicationcontrol':1109 'area':548 'arg':561,565,569,1164 'argument':529,1096 'argument.new':532,542 'ask':32,1228 'assert':802,806,811,814,836,839,880,903,926,949,971,974,996,999 'assist':608 'attr':176 'awesom':5 'b':391,400,425,435,440,445,873,896,919,942,967,992 'b.to':457 'b.zero':455 'bash':748,1055,1064,1074,1130,1137,1145 'begin':718 'behavior':1266 'better':1252 'bin':65,1204 'bin/mcp-server':706,751,1067,1166 'build':1178 'built':1020 'bundl':1056,1065,1131,1138,1146,1163 'calcul':365,369,1032 'calculate_tool.rb':60 'calculate_tool_test.rb':73 'calculatetool':199,360 'calculatetool.call':868,891,914,937,962,987 'calculatetooltest':861 'case':429,1286 'categori':557 'category-awesome-copilot' 'check':1144 'chmod':749 'class':174,265,359,515,652,784,860,1107,1246 'claud':1151 'claude_desktop_config.json':1155 'code':521,526,577,599,617,624,635,1034,1182 'code_review_prompt.rb':62 'codereviewprompt':202,516 'command':1162 'complet':16,41 'comprehens':1276 'configur':1216 'content':341,482,591,593,609,611,630,632,813,822,884,907,930,953,1045,1271 'context':183,207,209,317,427,563,798,835,876,899,922,945,970,995,1017,1116 'control':1105 'convent':1284 'copilot':6 'coverag':1048 'creat':34 'current_user.id':1119 'cwd':1167 'data':328,343,468,484,667,671,684,688,1039 'data.to':700 'data/example':656 'date':300 'date-tim':299 'def':180,214,224,237,313,421,486,559,657,676,788,825,864,887,910,933,956,982,1110 'default':122 'depend':1176 'descript':272,283,366,376,388,394,523,535,545,576,668,1233 'desktop':1152 'develop':84,558 'dir':763 'divid':384,447,939,964 'divis':451,935,958 'e':734 'e.backtrace.join':739 'e.g':549 'e.message':737 'els':459 'end':96,118,164,213,223,235,250,251,252,253,344,345,346,347,466,485,500,501,502,503,637,638,639,640,675,702,703,704,705,743,824,842,843,844,845,886,909,932,955,981,1005,1006,1007,1008,1125,1126 'entri':1185 'enum':380 'equal':803,815,881,904,927,950 'error':449,461,498,736,801,879,902,925,948,973,998,1294,1298 'exampl':666,669,686,1038,1307 'example-data':665,1037 'example_resource.rb':64 'exampleresourc':653 'exampleresource.read':247 'exampleresource.resource':205 'exec':1066,1132,1139,1147,1165 'execut':747,1205 'exit':730,741 'f':458 'fals':553 'featur':1029 'file':114,746,1222,1237 'file.expand':760 'filelist':115 'first':389 'flag':1299 'focus':544,547,568,570,582,584,601,603,618,620 'follow':1282 'format':298 'frozen':129,168,257,351,507,644,711,755,773,849,1288 'full':1046 'gem':80,87,90,93 'gemfil':50,75,1175 'general':571 'generat':4,13,14,30,39,273,524,1225,1235 'github':9 'greet':271,275,286,790,1031,1095 'greet_tool.rb':59 'greet_tool_test.rb':72 'greettool':197,266 'greettool.call':794,831 'greettooltest':785 'group':83 'handl':215,1295 'handler':212,240,243,1203 'hello':322,816 'helper':779,855 'hint':308,311,416,419,1267 'http':1305 'id':1077,1083,1089,1118 'idempot':310,418 'implement':1197,1275 'includ':1255,1269 'index':1111 'initi':181 'input':277,370 'input/output':1040,1256 'instal':1054,1057 'instruct':1226 'integr':1100,1149 'interrupt':725 'iso8601':320,691 'json':216,217,220,221,701,1071,1121,1123,1156 'json-rpc':1070 'jsonrpc':1075,1081,1087 'languag':534,537,564,566,580,598 'later':1053 'lib':52,112,1180 'lib/my_mcp_server.rb':126 'lib/my_mcp_server/prompts/code_review_prompt.rb':504 'lib/my_mcp_server/resources/example_resource.rb':641 'lib/my_mcp_server/server.rb':165 'lib/my_mcp_server/tools/calculate_tool.rb':348 'lib/my_mcp_server/tools/greet_tool.rb':254 'licens':1223 'linter':1136 'liter':131,170,259,353,509,646,713,757,775,851,1290 'll':614 'load_path.unshift':759 'main':1184 'make':744 'markdown':1011 'match':807,975,1000 'mathemat':368 'mcp':2,11,20,37,48,55,67,81,134,138,143,148,153,158,178,184,186,190,228,232,267,326,333,361,473,490,517,530,540,573,586,592,604,610,625,631,659,766,820,1013,1026,1160,1173,1188,1207 'mcp-server':66,1206 'mcp_server.handle':219 'mcp_server.resources':241 'mcpcontrol':1108 'mcpserver':1157 'messag':276,292,303,321,329,330,339,489,496,585,685,823,838 'message.new':588,606,627 'meta':554 'method':1079,1085,1091 'mime':672 'mimetyp':697 'minitest':88,786,862 'minitest/autorun':769 'mit':1224 'model':1016 'modul':160,172,261,263,355,357,511,513,648,650,780,782,856,858,1190,1242,1287 'modulo':989 'multipl':912 'multipli':383,442,916 'my-mcp-serv':46,1158,1171 'my_mcp_server.rb':53,1183 'mymcpserv':161,173,193,262,356,512,649,693,720,781,857,1113 'n':740 'name':188,270,280,284,288,315,323,364,520,533,543,664,792,795,832,1094,1097,1231,1240 'namespac':1191 'nshut':727 'number':387,393,406 'offici':26,1025 'oper':373,377,398,407,412,423,430,464,465,471,472,869,892,915,938,963,985,988,1002 'operand':390,396 'organ':1253 'output':289,401,827 'param':245,248,1093 'past':634 'path':761 'perform':367,379,550 'ping':1080 'pleas':595,621 'point':1186 'privat':236 'product':18 'production-readi':17 'program':536 'project':29,42,1169,1230 'prompt':61,200,201,514,518,519,528,531,541,574,587,605,626,1033,1198,1199,1250 'proper':1239,1293 'properti':279,291,372,403 'protocol':1018 'provid':1301 'qualiti':572 'rail':1099,1104 'rake':91,104,1133,1140,1148 'rake/testtask':101 'rakefil':51,97,1177 'raketask.new':120 'read':242,306,414 'reader':177 'readi':19 'readme.md':74,1009,1220 'refut':799,877,900,923,946 'relat':136,141,146,151,156,716 'render':1120 'request':1073 'request.body.read':1124 'requir':100,102,133,135,140,145,150,155,287,302,397,410,538,552,715,764,768,777,853,1049 'rescu':724,732 'resourc':63,203,204,211,239,246,651,654,662,670,682,687,1036,1201,1202 'resource.new':660 'respons':450,462,488,793,830,867,890,913,936,961,986,1273 'response.content.first':809,979,1003 'response.content.length':805 'response.is':800,878,901,924,947,972,997 'response.new':335,475,492 'response.structured':812,821,883,906,929,952 'response.structured_content.key':837,840 'result':404,411,428,469,470,479,480,885,908,931,954 'result.new':575 'return':448,460,679 'review':522,527,546,578,596,615,1035 'role':589,607,628 'rpc':1072 'rubi':1,10,23,27,36,77,99,128,167,256,350,506,567,643,708,710,754,772,796,817,848,1022,1027,1050,1098,1106,1283 'rubocop':94,119,125,1141 'rubocop/rake_task':103 'rubygems.org':79 'run':1061,1128,1135,1142 'safeti':1260 'schema':278,290,371,402,828,1041,1257 'sdk':28,1028 'second':395 'secur':551 'self.call':314,422 'self.error':487 'self.read':677 'self.resource':658 'self.template':560 'send':1069 'server':3,12,21,38,49,56,68,175,179,182,185,191,206,208,229,233,316,426,562,719,729,767,797,834,875,898,921,944,969,994,1014,1019,1063,1112,1115,1161,1174,1189,1193,1208,1210 'server.handle':1122 'server.new':187,721,1114 'server.rb':57,1192 'server.start':722 'server/prompts/code_review_prompt':154 'server/resources/example_resource':159 'server/server':139 'server/tools/calculate_tool':149 'server/tools/greet_tool':144 'setup':210,238,1194 'share':622 'skill':7 'snake':1285 'sourc':78,1181 'source-github' 'standarderror':733 'start':225 'stdio':226,723,1059,1209,1303 'stdiotransport.new':231 'string':130,169,218,222,258,282,294,297,352,375,409,508,645,712,756,774,850,1289 'structur':45,327,340,342,467,481,483,1044,1170,1243,1270 'subtract':382,437,889,893 'suit':1213 't.libs':109,111 't.test':113 'task':121,1179 'templat':76,98,127,166,255,349,505,642,707,753,771,847,1010,1200 'test':69,85,106,110,116,124,778,787,789,826,833,854,863,865,888,911,934,957,983,1047,1127,1129,1134,1211,1212,1215,1219,1277 'test.rb':117 'test/test_helper.rb':752 'test/tools/calculate_tool_test.rb':846 'test/tools/greet_tool_test.rb':770 'test_helper.rb':70,1214 'testtask.new':105 'text':337,338,477,478,494,495,699,810,980,1004 'text.new':594,612,633 'time':301 'time.now':319,690 'timestamp':295,304,318,331,332,689,841 'tool':58,71,195,196,198,264,268,269,334,358,362,363,474,491,783,859,1030,1042,1195,1196,1217,1218,1248,1263,1280 'tools/call':1092 'tools/list':1086 'transport':227,230,1060 'transport.open':234 'true':132,171,260,309,312,354,417,420,499,510,539,647,714,758,776,852 'type':281,293,296,336,374,386,392,405,408,476,493,673,1259 'unknown':463,984 'unless':680 'uri':249,655,661,663,678,681,683,695,696 'usag':1058,1306 'use':24,1245 'user':590,629,1117 'valid':829 'version':162,192,194,555,692,694 'warn':726,735,738 'welcom':324,818 'x':750 'zero':453,960,978","prices":[{"id":"3db0f73b-6fa2-4e8f-9ae3-232ae550c1a5","listingId":"541c63ca-3a6f-4ebd-9813-9bd92f72c5d8","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"github","category":"awesome-copilot","install_from":"skills.sh"},"createdAt":"2026-04-18T20:26:15.673Z"}],"sources":[{"listingId":"541c63ca-3a6f-4ebd-9813-9bd92f72c5d8","source":"github","sourceId":"github/awesome-copilot/ruby-mcp-server-generator","sourceUrl":"https://github.com/github/awesome-copilot/tree/main/skills/ruby-mcp-server-generator","isPrimary":false,"firstSeenAt":"2026-04-18T21:51:07.867Z","lastSeenAt":"2026-04-22T06:52:30.977Z"},{"listingId":"541c63ca-3a6f-4ebd-9813-9bd92f72c5d8","source":"skills_sh","sourceId":"github/awesome-copilot/ruby-mcp-server-generator","sourceUrl":"https://skills.sh/github/awesome-copilot/ruby-mcp-server-generator","isPrimary":true,"firstSeenAt":"2026-04-18T20:26:15.673Z","lastSeenAt":"2026-04-22T08:40:12.638Z"}],"details":{"listingId":"541c63ca-3a6f-4ebd-9813-9bd92f72c5d8","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"github","slug":"ruby-mcp-server-generator","source":"skills_sh","category":"awesome-copilot","skills_sh_url":"https://skills.sh/github/awesome-copilot/ruby-mcp-server-generator"},"updatedAt":"2026-04-22T08:40:12.638Z"}}