v0.5.1 — MCP Server[fix]
✨ New: MCP Server (ralqlator-mcp)
ralqlator 现在自带一个 Model Context Protocol (MCP) 服务器,将其所有的计算能力以工具的形式开放给 AI 助手。
# 启动 MCP 服务器(stdio 传输)
ralqlator-mcp服务器通过标准输入/输出读写 JSON-RPC 2.0 格式的请求和响应,每行一条。
可用工具
| 工具 | 描述 |
|---|---|
calculate |
数学表达式求值,支持精确有理数运算和所有内置函数。可选 format 参数(decimal / hex / oct / bin) |
calculate_bitwise |
位运算表达式求值(仅整数)。可选 format 参数 |
list_functions |
列出所有 50+ 个内置数学函数及其说明 |
list_constants |
列出内置常量(C_PI, C_E)和用户自定义常量 |
list_user_definitions |
列出所有用户自定义函数、序列和常量 |
create_user_definition |
创建用户自定义函数、序列或常量 |
delete_user_definition |
按名称删除用户自定义定义 |
list_operators |
列出所有支持的运算符及其描述和优先级 |
调用示例
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"calculate","arguments":{"expression":"sin(C_PI/2)"}}}{"jsonrpc":"2.0","id":1,"result":{"content":[{"type":"text","text":"1"}]}}{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"calculate","arguments":{"expression":"255","format":"hex"}}}{"jsonrpc":"2.0","id":2,"result":{"content":[{"type":"text","text":"0xFF"}]}}用户定义管理:
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"create_user_definition","arguments":{"name":"double","type":"function","expression_or_value":"x*2","params":["x"]}}}
{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"calculate","arguments":{"expression":"double(21)"}}}
{"jsonrpc":"2.0","id":5,"method":"tools/call","params":{"name":"delete_user_definition","arguments":{"name":"double"}}}🔧 技术细节
- 纯 JSON-RPC 2.0 实现:无 MCP SDK 依赖,仅使用已有的
serde+ 新增serde_json - 复用现有 API:MCP 服务器直接调用
calculator::calculate_with_functions()和calculator::calculate_bitwise(),与 CLI 使用同一套计算引擎 - 用户自定义数据:自动从
~/.ralqlator加载用户自定义函数和常量 - 标准错误码:JSON-RPC 约定的错误码(parse error -32700、invalid params -32602、method not found -32601 等)
📦 新增文件
| 文件 | 说明 |
|---|---|
src/mcp.rs |
MCP 协议层——类型定义、5个工具处理器(~600行) |
src/bin/ralqlator_mcp.rs |
二进制入口——stdio JSON 读取/写入循环 |
docs/mcp-architecture.md |
架构设计文档 |
⚙️ 构建
cargo build --release --bin ralqlator-mcp二进制文件在 target/release/ralqlator_mcp(注意文件名中为下划线)。
🧪 测试
- 5 个库单元测试全部通过
- MCP 功能测试 12/12 全部通过(覆盖计算、位运算、格式输出、用户定义 CRUD、运算符列表、错误处理等场景)
💬 其他改动
=运算符的返回值从yes/no改为true/false(与==保持一致)