[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6AE5ZXNVRVT2BA1J0WJJSKB":3,"skill-same:01M6AE5ZXNVRVT2BA1J0WJJSKB":86},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":53,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M6AE5ZXNVRVT2BA1J0WJJSKB","ruby-mcp-server-generator",null,"Generate a complete Model Context Protocol server project in Ruby using the official MCP Ruby SDK gem.","github\u002Fawesome-copilot","github","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F9919?v=4","01M6AC83DS133TPXFSP1DHNCC6","GitHub","01M6AD3PBDYPK7NVFJNJ66Y8RS",41046,"MIT","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fruby-mcp-server-generator\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"MCP","mcp server","server","ruby mcp server generator","ruby","generator","sdk","model context protocol","official","generate","protocol","model","context","project","gem","complete","2026-11-10 10:12:30",false,"---\nname: ruby-mcp-server-generator\ndescription: 'Generate a complete Model Context Protocol server project in Ruby using the official MCP Ruby SDK gem.'\n---\n\n# 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\u002F\n├── Gemfile\n├── Rakefile\n├── lib\u002F\n│   ├── my_mcp_server.rb\n│   ├── my_mcp_server\u002F\n│   │   ├── server.rb\n│   │   ├── tools\u002F\n│   │   │   ├── greet_tool.rb\n│   │   │   └── calculate_tool.rb\n│   │   ├── prompts\u002F\n│   │   │   └── code_review_prompt.rb\n│   │   └── resources\u002F\n│   │       └── example_resource.rb\n├── bin\u002F\n│   └── mcp-server\n├── test\u002F\n│   ├── test_helper.rb\n│   └── tools\u002F\n│       ├── greet_tool_test.rb\n│       └── calculate_tool_test.rb\n└── README.md\n```\n\n## Gemfile Template\n\n```ruby\nsource 'https:\u002F\u002Frubygems.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\u002Ftesttask'\nrequire 'rubocop\u002Frake_task'\n\nRake::TestTask.new(:test) do |t|\n  t.libs \u003C\u003C 'test'\n  t.libs \u003C\u003C 'lib'\n  t.test_files = FileList['test\u002F**\u002F*_test.rb']\nend\n\nRuboCop::RakeTask.new\n\ntask default: %i[test rubocop]\n```\n\n## lib\u002Fmy_mcp_server.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nrequire 'mcp'\nrequire_relative 'my_mcp_server\u002Fserver'\nrequire_relative 'my_mcp_server\u002Ftools\u002Fgreet_tool'\nrequire_relative 'my_mcp_server\u002Ftools\u002Fcalculate_tool'\nrequire_relative 'my_mcp_server\u002Fprompts\u002Fcode_review_prompt'\nrequire_relative 'my_mcp_server\u002Fresources\u002Fexample_resource'\n\nmodule MyMcpServer\n  VERSION = '1.0.0'\nend\n```\n\n## lib\u002Fmy_mcp_server\u002Fserver.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\u002Fmy_mcp_server\u002Ftools\u002Fgreet_tool.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  module Tools\n    class GreetTool \u003C 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\u002Fmy_mcp_server\u002Ftools\u002Fcalculate_tool.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  module Tools\n    class CalculateTool \u003C 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 \u002F 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\u002Fmy_mcp_server\u002Fprompts\u002Fcode_review_prompt.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  module Prompts\n    class CodeReviewPrompt \u003C 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\u002Fmy_mcp_server\u002Fresources\u002Fexample_resource.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  module Resources\n    class ExampleResource\n      RESOURCE_URI = 'resource:\u002F\u002Fdata\u002Fexample'\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\u002Fjson'\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\u002Fjson',\n          text: data.to_json\n        }]\n      end\n    end\n  end\nend\n```\n\n## bin\u002Fmcp-server Template\n\n```ruby\n#!\u002Fusr\u002Fbin\u002Fenv ruby\n# frozen_string_literal: true\n\nrequire_relative '..\u002Flib\u002Fmy_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\u002Fmcp-server\n```\n\n## test\u002Ftest_helper.rb Template\n\n```ruby\n# frozen_string_literal: true\n\n$LOAD_PATH.unshift File.expand_path('..\u002Flib', __dir__)\nrequire 'my_mcp_server'\nrequire 'minitest\u002Fautorun'\n```\n\n## test\u002Ftools\u002Fgreet_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 \u003C 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(\u002FRuby\u002F, 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\u002Ftools\u002Fcalculate_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 \u003C 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(\u002FDivision by zero\u002F, 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(\u002FUnknown operation\u002F, 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\u002Foutput 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\u002Fmcp-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\u002Flist\"}\n{\"jsonrpc\":\"2.0\",\"id\":\"3\",\"method\":\"tools\u002Fcall\",\"params\":{\"name\":\"greet\",\"arguments\":{\"name\":\"Ruby\"}}}\n```\n\n### Rails Integration\n\nAdd to your Rails controller:\n\n```ruby\nclass McpController \u003C 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\u002Fmcp-server\"],\n      \"cwd\": \"\u002Fpath\u002Fto\u002Fmy-mcp-server\"\n    }\n  }\n}\n```\n\n## Project Structure\n\n```\nmy-mcp-server\u002F\n├── Gemfile              # Dependencies\n├── Rakefile             # Build tasks\n├── lib\u002F                 # Source code\n│   ├── my_mcp_server.rb # Main entry point\n│   └── my_mcp_server\u002F   # Module namespace\n│       ├── server.rb    # Server setup\n│       ├── tools\u002F       # Tool implementations\n│       ├── prompts\u002F     # Prompt templates\n│       └── resources\u002F   # Resource handlers\n├── bin\u002F                 # Executables\n│   └── mcp-server       # Stdio server\n├── test\u002F                # Test suite\n│   ├── test_helper.rb   # Test configuration\n│   └── tools\u002F           # 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\u002Foutput 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\n","# 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\u002F\n├── Gemfile\n├── Rakefile\n├── lib\u002F\n│   ├── my_mcp_server.rb\n│   ├── my_mcp_server\u002F\n│   │   ├── server.rb\n│   │   ├── tools\u002F\n│   │   │   ├── greet_tool.rb\n│   │   │   └── calculate_tool.rb\n│   │   ├── prompts\u002F\n│   │   │   └── code_review_prompt.rb\n│   │   └── resources\u002F\n│   │       └── example_resource.rb\n├── bin\u002F\n│   └── mcp-server\n├── test\u002F\n│   ├── test_helper.rb\n│   └── tools\u002F\n│       ├── greet_tool_test.rb\n│       └── calculate_tool_test.rb\n└── README.md\n```\n\n## Gemfile Template\n\n```ruby\nsource 'https:\u002F\u002Frubygems.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\u002Ftesttask'\nrequire 'rubocop\u002Frake_task'\n\nRake::TestTask.new(:test) do |t|\n  t.libs \u003C\u003C 'test'\n  t.libs \u003C\u003C 'lib'\n  t.test_files = FileList['test\u002F**\u002F*_test.rb']\nend\n\nRuboCop::RakeTask.new\n\ntask default: %i[test rubocop]\n```\n\n## lib\u002Fmy_mcp_server.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nrequire 'mcp'\nrequire_relative 'my_mcp_server\u002Fserver'\nrequire_relative 'my_mcp_server\u002Ftools\u002Fgreet_tool'\nrequire_relative 'my_mcp_server\u002Ftools\u002Fcalculate_tool'\nrequire_relative 'my_mcp_server\u002Fprompts\u002Fcode_review_prompt'\nrequire_relative 'my_mcp_server\u002Fresources\u002Fexample_resource'\n\nmodule MyMcpServer\n  VERSION = '1.0.0'\nend\n```\n\n## lib\u002Fmy_mcp_server\u002Fserver.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\u002Fmy_mcp_server\u002Ftools\u002Fgreet_tool.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  module Tools\n    class GreetTool \u003C 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\u002Fmy_mcp_server\u002Ftools\u002Fcalculate_tool.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  module Tools\n    class CalculateTool \u003C 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 \u002F 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\u002Fmy_mcp_server\u002Fprompts\u002Fcode_review_prompt.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  module Prompts\n    class CodeReviewPrompt \u003C 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\u002Fmy_mcp_server\u002Fresources\u002Fexample_resource.rb Template\n\n```ruby\n# frozen_string_literal: true\n\nmodule MyMcpServer\n  module Resources\n    class ExampleResource\n      RESOURCE_URI = 'resource:\u002F\u002Fdata\u002Fexample'\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\u002Fjson'\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\u002Fjson',\n          text: data.to_json\n        }]\n      end\n    end\n  end\nend\n```\n\n## bin\u002Fmcp-server Template\n\n```ruby\n#!\u002Fusr\u002Fbin\u002Fenv ruby\n# frozen_string_literal: true\n\nrequire_relative '..\u002Flib\u002Fmy_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\u002Fmcp-server\n```\n\n## test\u002Ftest_helper.rb Template\n\n```ruby\n# frozen_string_literal: true\n\n$LOAD_PATH.unshift File.expand_path('..\u002Flib', __dir__)\nrequire 'my_mcp_server'\nrequire 'minitest\u002Fautorun'\n```\n\n## test\u002Ftools\u002Fgreet_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 \u003C 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(\u002FRuby\u002F, 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\u002Ftools\u002Fcalculate_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 \u003C 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(\u002FDivision by zero\u002F, 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(\u002FUnknown operation\u002F, 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\u002Foutput 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\u002Fmcp-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\u002Flist\"}\n{\"jsonrpc\":\"2.0\",\"id\":\"3\",\"method\":\"tools\u002Fcall\",\"params\":{\"name\":\"greet\",\"arguments\":{\"name\":\"Ruby\"}}}\n```\n\n### Rails Integration\n\nAdd to your Rails controller:\n\n```ruby\nclass McpController \u003C 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\u002Fmcp-server\"],\n      \"cwd\": \"\u002Fpath\u002Fto\u002Fmy-mcp-server\"\n    }\n  }\n}\n```\n\n## Project Structure\n\n```\nmy-mcp-server\u002F\n├── Gemfile              # Dependencies\n├── Rakefile             # Build tasks\n├── lib\u002F                 # Source code\n│   ├── my_mcp_server.rb # Main entry point\n│   └── my_mcp_server\u002F   # Module namespace\n│       ├── server.rb    # Server setup\n│       ├── tools\u002F       # Tool implementations\n│       ├── prompts\u002F     # Prompt templates\n│       └── resources\u002F   # Resource handlers\n├── bin\u002F                 # Executables\n│   └── mcp-server       # Stdio server\n├── test\u002F                # Test suite\n│   ├── test_helper.rb   # Test configuration\n│   └── tools\u002F           # 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\u002Foutput 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\n",{"name":5,"description":7},"main","5269f7ea2d6c3a9bfda5ed878b6726cf509121fd","skills\u002Fruby-mcp-server-generator",5340,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot","https:\u002F\u002Fawesome-copilot.github.com\u002F","https:\u002F\u002Fgithub.com\u002Fgithub","https:\u002F\u002Fgithub.com\u002Fabout","How people build software.","2026-11-11 13:41:32",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add github\u002Fawesome-copilot --skill ruby-mcp-server-generator",{"tool":64,"command":65},"bunx","bunx skills add github\u002Fawesome-copilot --skill ruby-mcp-server-generator",{"tool":67,"command":68},"pnpm","pnpm dlx skills add github\u002Fawesome-copilot --skill ruby-mcp-server-generator","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fruby-mcp-server-generator\u002FSKILL.md",true,[72,78,82],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"references\u002Fdocs-context.md","REFERENCE","参考文档",1256,"https:\u002F\u002Fgithub.com\u002Fmakura-games\u002Fsunrise-station\u002Fblob\u002Fmaster\u002F.agents\u002Fskills\u002Fss14-audio-system-core\u002Freferences\u002Fdocs-context.md",{"path":79,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":80,"sourceHtmlUrl":81},"references\u002Ffresh-pattern-catalog.md",4174,"https:\u002F\u002Fgithub.com\u002Fmakura-games\u002Fsunrise-station\u002Fblob\u002Fmaster\u002F.agents\u002Fskills\u002Fss14-audio-system-core\u002Freferences\u002Ffresh-pattern-catalog.md",{"path":83,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":84,"sourceHtmlUrl":85},"references\u002Frejected-snippets.md",2866,"https:\u002F\u002Fgithub.com\u002Fmakura-games\u002Fsunrise-station\u002Fblob\u002Fmaster\u002F.agents\u002Fskills\u002Fss14-audio-system-core\u002Freferences\u002Frejected-snippets.md",[87,117,145,175,207,224],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":97,"publishedAt":43},"01M70KXZNX9ES38N2A8M58ZZMZ","supabase-rls-policies","Write, review, and test Supabase Row Level Security (RLS) policies so that one user cannot read or change another user's rows. Use when creating or changing tables, policies, views, or security definer functions in a Supabase project, when reviewing a migration that touches RLS, or when asked to prove user isolation with pgTAP tests that sign in as two users.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fsupabase-rls-policies\u002FSKILL.md",[93,96],{"categoryNo":94,"categoryName":95,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[98,99,100,101,40,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],"supabase","rls","supabase rls","supabase rls policies","when","review","change","read","write","security","isolation","tables","as","tests","prove","use","users","functions","with",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":124,"publishedAt":43},"01M70KWA5YWXDV6V8DZ19E3T2Y","skill-distribution-audit","Audit a skill collection before release or investigate installer omissions, archived\u002Ftemplate leakage, duplicate identities, and manifest drift. Reconcile the intended public source set, distribution manifest, and actual discovery output for a specified consumer version. Includes a deterministic set-comparison helper.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fskill-distribution-audit\u002FSKILL.md",[123],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144],"distribution","skill distribution audit","audit","SET","deterministic","installer","for","discovery","comparison","helper","manifest","version","collection","drift","output","investigate","duplicate","template","release","reconcile",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":149,"sourceHtmlUrl":150,"categories":151,"keywords":157,"publishedAt":43},"01M70KCJPFVW7PPQ49CC5R8JGK","logicapps-custom-code-net10-migration","Migrate Azure Logic Apps Standard local-function custom-code projects from .NET 8 to .NET 10. Use for legacy Logic Apps custom-code workspace upgrades, project\u002Fpackage configuration, custom-worker settings, publication, and integrated VS Code debugging. Not for ordinary .NET applications, standalone Azure Functions, Consumption workflows, or cloud deployment.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Flogicapps-custom-code-net10-migration\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Flogicapps-custom-code-net10-migration\u002FSKILL.md",[152],{"categoryNo":153,"categoryName":154,"taxonomyType":155,"taxonomyTypeDesc":156},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[158,159,160,161,162,163,131,40,164,165,166,167,168,169,170,113,171,172,173,174],"custom","code","logicapps custom code net10 migration","migration","projects","standalone","deployment","applications","local","azure","worker","upgrades","package","apps","Legacy","debugging","workflows",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":179,"sourceHtmlUrl":180,"categories":181,"keywords":184,"publishedAt":43},"01M6AEBN37RQMXJ3298PEY7PG1","winmd-api-search","Find and explore Windows desktop APIs. Use when building features that need platform capabilities — camera, file access, notifications, UI controls, AI\u002FML, sensors, networking, etc. Discovers the right API for a task and retrieves full type details (methods, properties, events, enumeration values).","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fwinmd-api-search\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fwinmd-api-search\u002FSKILL.md",[182,183],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":153,"categoryName":154,"taxonomyType":155,"taxonomyTypeDesc":156},[185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,102,200,201,202,203,204,131,205,206],"winmd api search","search","api","windows","desktop","file access","enumeration","ui","ml","file","networking","capabilities","notifications","explore","access","features","full","camera","events","platform","methods","controls",{"skillNo":208,"name":209,"nameZh":6,"description":210,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":211,"licenseFileUrl":212,"sourceHtmlUrl":213,"categories":214,"keywords":220,"publishedAt":43},"01M6AE571R3SC1ZGE202B3NB5S","resemble-detect","Deepfake detection and media safety — detect AI-generated audio, images, video, and text, trace synthesis sources, apply watermarks, verify speaker identity, and analyze media intelligence using Resemble AI","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fresemble-detect\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fresemble-detect\u002FSKILL.md",[215,216,219],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":217,"categoryName":218,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[221,128,194,222,223],"resemble detect","https","identity",{"skillNo":225,"name":226,"nameZh":6,"description":227,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":211,"licenseFileUrl":228,"sourceHtmlUrl":229,"categories":230,"keywords":235,"publishedAt":43},"01M6AE30BSK2HCY4TQQ22Z8JRD","quality-playbook","Run a complete quality engineering audit on any codebase. Derives behavioral requirements from the code, generates spec-traced functional tests, runs a three-pass code review with regression tests, executes a multi-model spec audit (Council of Three), and produces a consolidated bug report with TDD-verified patches. Finds the 35% of real defects that structural code review alone cannot catch. Works with any language. Trigger on 'quality playbook', 'spec audit', 'Council of Three', 'fitness-to-purpose', or 'coverage theater'.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fquality-playbook\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fquality-playbook\u002FSKILL.md",[231,234],{"categoryNo":232,"categoryName":233,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[236,237,238,239,159,103,9,127,240,241,222,242,243,244,245,246,247,248,249,250,251,252,111,253,38,254,255],"playbook","quality playbook","quality","code review","tdd","run","report","spec","bug report","council","engineering","functional","spec audit","bug","verified","multi-model","three","coverage","regression","structural"]