Acknowledgment: This implementation was inspired by the article Building a Model Context Protocol Server with TypeScript by Azuki Azusa.
This project is a Ruby implementation of a Model Context Protocol (MCP) server skeleton. It provides an interface that allows Large Language Models (LLMs) like Claude to call tools. The current implementation provides a tool that generates random numbers.
get-random-number
: Generates a random integer between 1 and a specified maximum value (defaults to 100)This server consists of the following components:
MCP::Server
: Main server implementation that handles MCP protocol messages
MCP::Transport::Stdio
: Standard I/O transport layer for communication
MCP::Tool
: Tool definition and execution handler
RandomNumberServer
: Server implementation that registers and manages tools
The server follows the MCP initialization protocol:
initialize
request with protocol versioninitialized
notificationThe server implements the following MCP APIs:
initialize
: Server initialization and protocol version negotiationtools/list
: Lists available tools and their schemastools/call
: Executes a tool with provided argumentsClone the repository:
git clone <repository-url>
cd mcp-ruby-skeleton
Make sure the server script is executable:
chmod +x bin/run_server.rb
Run the server directly:
./bin/run_server.rb
Add the following to your Claude Desktop configuration at:
~/Library/Application Support/Claude/claude_desktop_config.json
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"random-number": {
"command": "ruby",
"args": [
"/Users/bash/src/mcp-ruby-skeleton/bin/run_server.rb"
]
}
}
}
Replace the path with the absolute path to your run_server.rb
file on your system.
After configuring, restart Claude Desktop and try a prompt like "Generate a random number between 1 and 50."
Claude app logs related to MCP servers are available at:
~/Library/Logs/Claude/mcp*.log
%APPDATA%\Claude\logs\mcp*.log
To view the logs in real-time:
# On macOS
tail -f ~/Library/Logs/Claude/mcp*.log
# On Windows
type "%APPDATA%\Claude\logs\mcp*.log"
The server itself logs to standard error output (STDERR), and the log level is set during the initialization of the RandomNumberServer
class (currently at DEBUG level).
Server disconnection
If you see a message like "MCP server disconnected", check:
Tool not showing up
If the random number tool doesn't appear in Claude:
You can add more tools to the server by modifying the RandomNumberServer
class:
def setup_tools
# Existing random number tool
random_number_tool = MCP::Tool.new(
"get-random-number",
"Generate a random number between 1 and the specified maximum value",
{
type: "object",
properties: {
max: {
type: "integer",
description: "Maximum value for the random number (defaults to 100 if not specified)"
}
}
}
) do |args|
max = (args["max"] || 100).to_i
max = 100 if max <= 0
rand(1..max)
end
@server.register_tool(random_number_tool)
# Add your new tool here
new_tool = MCP::Tool.new(
"tool-name",
"Tool description",
{
type: "object",
properties: {
# Tool parameters
}
}
) do |args|
# Tool implementation
end
@server.register_tool(new_tool)
end
When implementing new tools or server features, it's recommended to add tests. Testing should combine unit tests, integration tests, and end-to-end tests.
Tests should verify:
To improve the robustness of the MCP server, it's important to implement proper error handling and exception handling:
{
"mcpServers": {
"random-number": {
"env": {},
"args": [
"/Users/bash/src/mcp-ruby-skeleton/bin/run_server.rb"
],
"command": "ruby"
}
}
}
Seamless access to top MCP servers powering the future of AI integration.