RubyでローカルMCPサーバーをさっと作る
次の記事のオマージュかつ、最近作っている mcp-rb というgemの宣伝記事です。
ぜひ次の記事をご一読ください。
上の記事を読んで、「Rubyでシュッとやりたいよ」と思われた方に朗報です。
この記事では、RubyでMCPサーバーを立てるためのライブラリを紹介します。
mcp-rb とは
mcp-rb は Ruby で MCP サーバーを実装するためのライブラリです。
SinatraやGraphQL RubyのようなDSLを提供し、少ないコードでMCP サーバーを実装できます。
どのくらい実用段階かというと、これでCosenseとやり取りするMCP Serverを作成し、Claude Desktopを通じてプロジェクトの壁打ちができるくらいには動いています。
簡単な MCP サーバーを実装する
まずは、mizchi さんの記事と同様に getStringLength
という文字列の長さを返すだけの簡単なサーバーを実装してみましょう。mcp-rb を使うと、以下のように書くことができます。
require 'mcp'
name "string-utils"
tool "getStringLength" do
description "Get the length of a string"
argument :input, String, required: true, description: "The input string"
call { |args| args[:input].length.to_s }
end
TypeScriptに比べて非常に短いことがわかります。
このコードでは次のようなことをしています。
-
name
で MCP サーバーの名前を設定 -
tool
ブロックでツールを定義-
description
でツールの説明を設定 -
argument
で引数の型や必須かどうかを指定 -
call
ブロックで実際の処理を記述
-
名前がややこしいのですが、rubygems には mcp-rb
で登録しているので次のコマンドでインストールしてください。
bundle add mcp-rb
# または
gem install mcp-rb
Roo Code に登録する
Roo Code で使用するには、mizchi さんの記事と同様に RooCode の MCP の設定ファイルを編集します。
私はrbenvを利用しているので次のようになります:
{
"mcpServers": {
"local": {
"command": "/Users/funwarioisii/.rbenv/shims/ruby",
"args": ["/path/to/string_utils.rb"],
"env": {},
"disabled": false,
"alwaysAllow": []
}
}
}
おわりに
せっかくなのでもう少し今回紹介したmcp-rb
について書いておきます。
Railsとも一応連携して動くが…どうするかは手探りというのがこちらです。
browser-use
みたいなものもPlaywrightを組み合わせて作っていて、期待値には達しないがぼちぼち動くみたいな感じです。
実は公式のPython SDKも面白く、type hintsを読み取って、必要なパラメータを組み立てていたりします。なのでmcp-rbよりも短く書けたりしそうです。すごい。
rbs inlineをうまく使って似たような機能作れないかなぁとか考えています。
以上余談でした。
TypeScriptやPythonではAI/LLM関連のツールがよく出てきますが、Rubyは比較的少ない印象なので、なにかの参考になれば幸いです。
せっかくなのでもう一回リンク貼っておきます。
Issue, Pull Request, Starお待ちしています。
Discussion