A Rust port of calc (Landon Curt Noll's arbitrary-precision calculator) について
toRustCalcMCPは、calcをRustに移植したもので、コマンドライン、ブラウザーのREPL、MCPで任意精度計算を行うユーザー向けです。共通エンジンでは厳密な有理数演算を使います。
主な機能
- 01厳密な有理数演算
- 02calc互換のコマンドライン計算機
- 03ブラウザーベースのWeb REPL
- 04MCP計算ツール
- 05関数、変数、制御フロー
- 06複素数とリスト
活用シーン
- 01高精度な式の評価
- 02MCPクライアントからの計算機利用
- 03ブラウザーでの対話的な計算
MCP 対応
stdio上のJSON-RPC 2.0を使うMCPサーバーを提供します。クライアントは式の評価、セッションの精度や表示設定、組み込み関数の一覧取得を行えます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/carlomagnoglobal/torustcalcmcp:latestローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/carlomagnoglobal/torustcalcmcp:lateststdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
toRustCalcMCP
calc(Landon Curt Noll による任意精度計算機)を Rust に移植したもので、以下の用途で動作します。
rcalc— calc 互換のコマンドライン計算機- Web REPL — ブラウザー上で動作する対話型計算機
- MCP サーバー — LLM/エージェントとの連携向けの stdio 経由 JSON-RPC 2.0
3 つのインターフェイスで、1 つのエンジンを使用します。 数値コアでは 正確な有理数演算
(num-bigint 上の num-rational)を採用しています。これは calc が本来採用しているものと同じモデルです。
そのため、1/3 * 3 は厳密に 1 となり、2^256 は最後の桁まで計算されます。
👉 2 分で始める — rcalc を初めて使う方は、こちらからどうぞ。 👉 Claude Desktop MCP としてインストール — Claude Desktop と連携できます。
ビルド
cargo build --release
# binaries:
# target/release/toRustCalcMCP (auto-detects MCP vs CLI)
# target/release/rcalc (always the CLI)
任意でシンボリックリンクを作成できます:ln -s toRustCalcMCP rcalc — argv[0] が rcalc の場合、
toRustCalcMCP は計算機として動作します。
CLI の使い方(rcalc)
rcalc '2^100' # 1267650600228229401496703205376
rcalc '1/3 + 1/6' # 0.5
rcalc -m frac '1/3 + 1/6' # 1/2
rcalc 'gcd(462,1071)' # 21
rcalc 'fact(30)' # 265252859812191058636308480000000
rcalc 'sqrt(2)' # 1.4142135623730950488
rcalc 'isprime(1000003)' 'nextprime(1000003)' # 1 \n 1000033
echo '3*4' | rcalc -p # pipe mode
rcalc # interactive REPL (Ctrl-D to exit)
フラグ:-p はパイプモード、-q は静音モード、-m real|frac|int はモード、-v はバージョン、-h はヘルプです。
calc の従来のフラグ(-c -C -d -e -i -O -s -u)も受け付けますが、無視されます。
Web REPL の使い方
cargo build --release
./target/release/rcalc-web
# Open browser: http://localhost:8888
最新のブラウザーベースの REPL で、以下の機能を備えています。
- 式の対話的な評価
- コマンド履歴(↑/↓矢印キー)
- 構文がハイライト表示された出力
- calc のすべての機能(組み込み名 483 個)
- モバイル/デスクトップ向けのレスポンシブデザイン
http://localhost:8888 を開き、2^256 または sin(pi()/6) を入力してみてください。
MCP の使い方
toRustCalcMCP --mcp # speak JSON-RPC 2.0 over stdio
ハンドシェイク → initialize、次に tools/list、続いて tools/call の順に実行します。
サーバーが出力する正式なスキーマについては
docs/MCP_TOOL_SCHEMA.json を、クライアント登録用のスニペットについては
examples/mcp-config.json を参照してください。
ツール
| tool | 目的 | 主な引数 |
|---|---|---|
calc_eval | 式を評価する | expression(必須)、mode、digits、epsilon |
calc_config | セッションの精度と表示設定を取得/設定する | action(get/set)、mode、digits、epsilon |
calc_functions | 組み込み関数を一覧表示する | filter(部分文字列、省略可) |
calc_eval の mode/digits/epsilon は呼び出しごとの上書き設定です。calc_config set
を使うと、セッション全体の設定が変更されます。
対応言語機能
- 演算子:
+ - * /(厳密)、//(整数除算)、%(剰余)、^/**(べき乗)、比較演算子== != < <= > >=(結果は1/0)、単項演算子-/+。 - 変数と代入:
x = 7; x^2。 - ユーザー定義関数:
define f(x) = x^2; f(5)→25。 - 制御フロー:
if/else、while、forループ、{}を使ったブロック。 ;で区切った文。各文の値が出力されます(calc の動作)。- 数値リテラル:整数、
a/b形式の有理数、小数、1.2e-3、0x/0b。 - リスト:
list(1,2,3); append(x,4); slice(x,1,3)。 - 複素数:
sqrt(-1)→i。+、-、*、/による演算に対応します。 - 文字列リテラル:
"hello"; strlen(s); index(haystack, needle)。 - 組み込み名 483 個(calc の 350 個と完全に同等の機能から、ドキュメント化されたインタープリター内部機能 15 個を除き、拡張機能を追加)— 以下の実装状況を参照してください。
精度モデル
数値は正確な有理数です。無理数の結果は、calc と同様に、セッションの epsilon(デフォルトは厳密な 1/10^20)以内の近似値になります。超越関数(exp、
ln、sin、cos、tan)は、テイラー級数とニュートン法を使って任意精度で計算されます。sqrt、sin、cos などは、項が epsilon 未満になるまで収束計算を続けます。
pi/e は 60 桁の定数です。real モードの出力に先頭の ~ が付いている場合は、calc と同様に、不正確な(丸められた/循環する)表現であることを示します。
実装状況 — upstream と完全に同等です ✅
calc upstream(lcn2/calc の func.c)では、350 個の組み込み関数が定義されています。この移植版では、483 個の組み込み関数名を登録し、upstream の組み込み関数 350 個のうち 335 個に対応しています(長らく未対応だった残りの 148 個は、以下の upstream との同等性を高める段階で追加されました)。さらに、upstream にない拡張機能やエイリアスも数十個あります(統計、ハッシュ、ビット演算、システム情報など)。
意図的に未実装(インタープリター内部の 15 個)
以下の upstream 名は calc の C インタープリターの内部実装に由来し、この移植版のアーキテクチャには意味のある対応付けがありません。実体のないスタブを提供するのではなく、未実装のままにしています。
access、calc_tty、calclevel、calcpath、custom、dp、estr、
inputlevel、memsize、name、param、prompt、protect、saveval、
stoponerror
upstream との既知の差異
- 出力引数を取る組み込み関数は、代わりに値を返します。
d2dm/d2dms(および g/h 系)は[deg, min]/[deg, min, sec]のリストを返し、quomodは[q, r]を返し、search/rsearchはインデックスまたは null を返します。 - インプレース/左辺値を扱う組み込み関数は、新しい値を返します。
modify、copy、swapが該当します(組み込み関数が受け取るのは値であり、参照ではありません)。 base2()は 0 を読み取ります(2 つ目の基数はありません)。設定するとエラーになります。レンダラーが対応する出力基数は 1 つだけです。free*()は何もしません。キャッシュは使用せず、値は必要に応じて計算されます。
言語機能の全容
- ✅ ユーザー定義関数(
define name(params) = expr)、高階組み込み関数(select/forall/modifyが関数値を呼び出します) - ✅ 制御フロー(
if/else、while、forループ) - ✅ 変数とスコープ
- ✅ リストとインデックス指定(0 始まり、負のインデックスにも対応)
- ✅ 完全な算術演算に対応した複素数
- ✅ 文字列リテラルと、文字列関数一式
- ✅ 基数変換(2~36、入力と出力)
- ✅ 任意精度演算(正確な有理数、正確な 1/10^20 のイプシロン)
- ✅ ファイルの読み込み(
-f filename)、ファイル I/O 組み込み関数、REPL、パイプモード
対象範囲 — アーキテクチャと設計
calc upstream は約 92,000 行の C で構成され、約 350 個の組み込み関数と、チューリング完全なスクリプト言語を備えています。この移植版は、段階的に拡張できるよう構成された、忠実なコアです。
- ✅ 正確な有理数を扱う数値エンジン — calc のネイティブなモデルに一致します
- ✅ 完全な字句解析器/パーサー — 式の構文全体を処理します
- ✅ ツリーウォーク評価器 — ユーザー定義関数、制御フロー、スコープに対応します
- ✅ 組み込み関数レジストリ — 自動カタログ化に対応した拡張可能な関数マップ
- ✅ CLI と MCP サーバー — 2 つのフロントエンドで 1 つのエンジンを使用します
- 🔄 段階的な組み込み関数の追加 — 各カテゴリーを既存部分の作り直しなしに追加できます
アーキテクチャは安定しており、関数の追加は簡単です。
ライセンス
calc upstream と同じ LGPL-2.1 です。
テスト CI ワークフロー
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。