rubyhash-mcp
# rubyhash-mcp
MCP server for [RubyHash](https://rubyhash.dev). Gives any MCP-capable agent (Claude Code, Claude Desktop, Cursor, and others) two deterministic Ruby tools:
- **ruby_hash_diff**: compare two Ruby hash literals, or paste raw failing Minitest/RSpec output, and get a structured report of exactly what changed: changed values with before and after, added and removed keys, and explicit type changes (nil to String, Integer to Float, symbol keys vs string keys).
- **ruby_to_json**: convert a Ruby hash or array literal (hashrockets, symbol keys, shorthand syntax, nesting, nil/true/false) to clean JSON with sorted keys.
Everything runs locally in the server process. Nothing is uploaded, logged, or stored, the same privacy promise as [rubyhash.dev](https://rubyhash.dev).
## Tools
- `ruby_hash_diff`: Compare two Ruby hash literals, or paste raw failing Minitest/RSpec output, and get a structured report: changed values with before and after, added and removed keys, and explicit type changes (nil to String, Integer to Float, symbol keys vs string keys).
- `ruby_to_json`: Convert a Ruby hash or array literal (hashrockets, symbol keys, shorthand syntax, nesting, nil/true/false) to clean JSON with alphabetically sorted keys.
## Why an agent would want this
When a Ruby test fails on two large nearly identical hashes, comparing them by reading is slow and error prone, for humans and for language models. A 40-key nested hash diff burns context and invites mistakes. This server does the comparison with a real recursive descent parser and hands back only the differences, deterministically.
## Install
```json
{
"mcpServers": {
"rubyhash": {
"command": "npx",
"args": ["-y", "rubyhash-mcp"]
}
}
}
```
Or for Claude Code:
```bash
claude mcp add rubyhash -- npx -y rubyhash-mcp
```
## Example
Input (raw test output):
```
-{"uid"=>"u@example.test", "role"=>"admin", "seats"=>3}
+{"uid"=>"u@example.test", "role"=>"editor", "seats"=>3.0}
```
Output:
```json
{
"equal": false,
"summary": "2 changed, 0 added, 0 removed, 1 type change",
"changed": [
{ "path": "role", "before": "admin", "after": "editor", "typeChanged": false },
{ "path": "seats", "before": 3, "after": 3, "beforeType": "Integer", "afterType": "Float", "typeChanged": true }
]
}
```
## Also available as an HTTP API
If you cannot run a local MCP server, the same tools are exposed at the [RubyHash Agent API](https://rubyhash.dev/agents), with an OpenAPI description and an x402 machine-payable catalog.
## Development
```bash
npm install
npm test # 36 unit tests
```
## License
MIT for this package. The rubyhash.dev site and its browser tool are separate, private, and all rights reserved.
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: one compares two Ruby hashes and returns a diff, the other converts a Ruby hash/array literal to JSON. There is no overlap or ambiguity.
Both tool names follow a consistent verb_noun snake_case pattern: ruby_hash_diff and ruby_to_json. The prefix 'ruby_' is shared, and the second part describes the action ('hash_diff' vs 'to_json').
With only 2 tools, the server is minimal but still focused. It feels slightly thin for a general utility server, but for a niche Ruby hash utility it is acceptable and not excessive.
The tools cover diffing and conversion, which are useful but there are obvious gaps such as merging, validation, or formatting. The surface is not severely incomplete but lacks typical CRUD lifecycle coverage.