关于 Money Lover
moneylover-mcp 是一个非官方 stdio 服务,让 AI Agent 和聊天机器人访问 Money Lover 账户数据。它可读取钱包、分类和交易;修改交易需主动开启,并受服务端限制保护。
主要功能
- 01列出钱包、分类和交易
- 02按分类汇总支出
- 03添加、更新或删除交易
- 04要求明确启用写入模式
- 05按钱包、金额和频率限制写入
适用场景
- 01让 Agent 查看余额和交易
- 02汇总指定日期范围的支出
- 03启用写入后更正或删除交易
MCP 相关
该服务通过 stdio 与 MCP 客户端通信,并提供读取和交易写入工具。只有设置 MONEYLOVER_ALLOW_WRITE=true 后,写入工具才会执行。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
moneylover-mcp
一个 MCP 服务,可让 AI Agent 或聊天机器人读取你的 Money Lover 数据;如果你允许,还能添加、更正和删除交易。它通过 stdio 与客户端通信。
免责声明——请阅读。 本项目为非官方项目,与 Money Lover 及其所有者没有关联,也未获得其认可或支持。 “Money Lover”是其所有者的商标,此处仅用于说明本软件连接的服务。 Money Lover 没有公开 API。本工具使用与 Money Lover 网页应用相同的未公开 Web 端点,这些端点是根据公开的开源项目逆向分析得出的。它们可能随时更改或失效,使用这些端点也可能违反 Money Lover 的服务条款(我们无法核实相关条款)。 使用本软件的所有风险均由你自行承担,包括账户受限、数据丢失或错误,以及交易错误的风险。本软件依据 MIT 许可证按“原样”提供,不提供任何形式的担保。请备份数据,并先在临时钱包中试用。
信任模型
在授予此服务访问财务账户的权限前,审阅者应了解以下事项。每项声明均由代码落实,并在 CI 中检查,而非仅停留在文字说明。
| 声明 | 落实方式 |
|---|---|
| 令牌拥有完整访问权限;只读限制由服务强制执行。 Money Lover 不提供受限或只读令牌。 | 写入工具始终会列出,但只有在 MONEYLOVER_ALLOW_WRITE=true 时才会执行操作;启用后,服务端保护机制会限制其行为(安全性)。 |
网络出口仅连接到 Money Lover:web.moneylover.me 和 oauth.moneylover.me,且仅使用 HTTPS。不进行遥测、不检查更新,也不连接其他主机。 | 端点为编译时常量,无法通过环境变量更改;永远不会跟随重定向。如果源代码中出现其他 URL,tests/egress.rs 会导致检查失败。 |
凭据保留在本地。 密码仅用于登录,不会存储;令牌保存在权限为 0600 的文件中;不会记录任何机密信息,也不会将其返回给 AI。 | src/token_store.rs、会隐藏敏感信息的 Debug 实现以及相关测试。 |
| 依赖项已锁定并经过审查。 | 全程使用 Cargo.lock 和 --locked;cargo-deny 仅允许 crates.io 来源和宽松许可证,并会在 RustSec 安全公告或已撤回的 crate 出现时失败(每周及变更时检查);GitHub Actions 均固定到提交 SHA;使用 Dependabot。 |
| 发布的二进制文件均由此代码库构建。 | 每个发布压缩包都有签名的 SLSA 构建来源证明(gh attestation verify)和一条 SHA256SUMS 记录。 |
| 已发布的捆绑包与此代码库及此域名绑定。 | 官方 MCP Registry 中的条目使用经 DNS 验证的命名空间 com.iyongbudiarso/moneylover-mcp;每个 .mcpb 的哈希都记录在该版本的 server.json 中,且每个捆绑包都附带与压缩包相同的构建来源证明。 |
工具
| 工具 | 功能 | 是否需要写入模式 |
|---|---|---|
list_wallets | 列出钱包及其币种和余额(refresh: true 可获取实时余额) | 否 |
list_categories | 列出收入/支出类别,可查询整个账户或单个钱包 | 否 |
list_transactions | 列出指定日期范围内的交易,按时间从新到旧排列(limit 默认为 50,最大为 200) | 否 |
summarize_spending | 按币种分组,汇总指定日期范围内各类别的金额 | 否 |
add_transaction | 创建交易;支持 dry_run | 是 |
update_transaction | 修改交易的类别、金额、备注或日期;支持 dry_run | 是 |
delete_transaction | 删除交易;支持 dry_run | 是 |
对大模型使用有重要影响的设计选择:
- 钱包和类别均通过名称指定,而非 ID。匹配区分大小写;如果名称未知或有歧义,会返回列出候选项的错误,而不会猜测。
- 金额始终为正数。收入或支出由类别决定。如果某个类别名称同时适用于收入和支出(例如“Other”),请传入
type。 - 金额以十进制字符串返回,不会使用浮点数。
- 日期格式为
YYYY-MM-DD,采用你配置的时区。每次调用的日期范围最多为 366 天;写入工具接受从一年前到一个月后的日期。 update_transaction和delete_transaction需要传入list_transactions返回的id、wallet和date(Money Lover 无法仅凭 ID 查找交易)。更新只会修改你传入的字段,其余内容均保持不变,包括照片、位置、事件、人员和“从报告中排除”标记。不支持将交易移至其他钱包:请先删除,再重新添加。转账、债务和贷款与其他交易关联,因此会被拒绝;请在应用中修改。summarize_spending会跳过标记为“从报告中排除”的交易;list_transactions仍会列出这些交易,因此两者不会出现不易察觉的结果差异。- 如果未指定
wallet,list_transactions和summarize_spending会涵盖所有钱包,包括已归档的钱包和从 Money Lover 总额中排除的钱包。Money Lover 自带的“所有钱包”查询会排除这些钱包,且最多返回 9,999 条记录,因此服务会分别查询这些钱包(达到 9,999 条记录上限时,会逐个查询每个钱包)。这类钱包较多的账户需要更长时间;如果只需要查询一个钱包,请传入wallet。如果指定范围内单个钱包的交易数量达到或超过 9,999 条,会报错并提示缩短日期范围,而不会静默地返回不完整列表或总额。 - 写入工具始终会列出,因此客户端及其安全扫描器可以看到所有可用功能;但如果未设置
MONEYLOVER_ALLOW_WRITE=true,所有调用都会在访问网络前被拒绝。有关写入操作的限制,请参阅安全。 - 钱包和类别会缓存在内存中(默认 5 分钟),因为大型账户的钱包列表可能需要 30 秒以上才能加载。写入交易会清除缓存的余额;如果名称不在缓存中,则会触发一次重新获取(因此可以找到刚创建的钱包);
list_wallets会报告from_cache,让 Agent 知道余额可能已过时。在 Money Lover 应用中所做的更改,会在缓存过期后显示,或通过refresh: true立即获取。
安装
预构建二进制文件(无需 Rust)
从最新发布版本下载适用于你平台的压缩包:
| 平台 | 压缩包 |
|---|---|
| macOS,Apple Silicon | moneylover-mcp-<version>-aarch64-apple-darwin.tar.gz |
| macOS,Intel | moneylover-mcp-<version>-x86_64-apple-darwin.tar.gz |
| Linux x86_64(glibc 2.35+) | moneylover-mcp-<version>-x86_64-unknown-linux-gnu.tar.gz |
| Linux ARM64(glibc 2.35+) | moneylover-mcp-<version>-aarch64-unknown-linux-gnu.tar.gz |
| Windows x86_64 | moneylover-mcp-<version>-x86_64-pc-windows-msvc.zip |
运行前请先验证。每个发布版本都附有 SHA256SUMS,且每个压缩包都带有已签名的构建来源证明,证明它是由此仓库的发布工作流构建的:
shasum -a 256 -c SHA256SUMS --ignore-missing # Linux: sha256sum --check --ignore-missing SHA256SUMS
gh attestation verify moneylover-mcp-*.tar.gz --repo Iyongbudiarso/moneylover-mcp
解压后,将 moneylover-mcp 放到 PATH 中的某个位置。这些二进制文件未经 Apple 或 Microsoft 证书签名。在 macOS 上,通过浏览器下载的文件会被 Gatekeeper 拦截;验证后,可使用 xattr -d com.apple.quarantine moneylover-mcp 放行。在 Windows 上,SmartScreen 可能会要求确认。
MCPB 捆绑包(适用于 Claude Desktop 和其他 MCPB 客户端)
支持 MCP Bundles 的客户端可以改为将服务作为扩展安装。从最新发布版本下载适用于你平台的 .mcpb 文件并打开,或将该文件提供给客户端:
| 平台 | 捆绑包 |
|---|---|
| macOS(Apple Silicon 和 Intel) | moneylover-mcp-darwin.mcpb |
| Linux x86_64 | moneylover-mcp-linux-x86_64.mcpb |
| Linux ARM64 | moneylover-mcp-linux-aarch64.mcpb |
| Windows x86_64 | moneylover-mcp-windows-x86_64.mcpb |
每个平台都有一个单独的捆绑包,因为捆绑包只包含一个可执行文件,而 MCPB 无法根据 CPU 架构选择可执行文件;macOS 捆绑包包含一个通用二进制文件。
客户端要求配置时,你可以输入 Money Lover 邮箱和密码(客户端会将密码保存在操作系统钥匙串中,服务会将其换成令牌,与 login 的处理方式完全相同),也可以将两项留空,然后使用预构建二进制文件运行一次 moneylover-mcp login——扩展会重复使用已保存的令牌。除非在扩展设置中启用,否则添加交易功能会保持关闭。
同一批捆绑包也列在官方 MCP Registry 中,名称为 com.iyongbudiarso/moneylover-mcp,并通过 iyongbudiarso.com 上的 v=MCPv1; … TXT 记录完成验证。支持 Registry 的客户端会检查每次下载的文件是否与其中记录的 SHA-256 值一致。这能证明条目的发布者身份,但不代表代码安全。请查看信任模型和源代码。
从源代码构建
你需要安装 Rust 工具链(1.89 或更高版本)。
cargo install --locked --git https://github.com/Iyongbudiarso/moneylover-mcp
# or, from a checkout:
cargo build --locked --release # binary: target/release/moneylover-mcp
--locked 会使用 Cargo.lock 中的确切依赖版本进行构建;CI 会使用 cargo deny 审核这些依赖,而不是使用 crates.io 上最新的版本。
登录
请只在终端中登录一次。密码会在隐藏提示下输入,且绝不会保存;只会保存由此生成的令牌:
moneylover-mcp login
配置
所有配置均通过环境变量进行。
| 变量 | 默认值 | 含义 |
|---|---|---|
MONEYLOVER_TIMEZONE | Asia/Jakarta | 日期使用的 IANA 时区 |
MONEYLOVER_ALLOW_WRITE | false | 设置为 true,以启用 add_transaction、update_transaction 和 delete_transaction |
MONEYLOVER_WRITE_WALLETS | – | 以逗号分隔的钱包名称;设置后,写入操作仅针对这些钱包 |
MONEYLOVER_MAX_AMOUNT | – | 设置后,超过此金额的操作将被拒绝 |
MONEYLOVER_MAX_WRITES_PER_HOUR | 20 | 每滚动小时内新增、更新和删除操作的合计次数(1-1000) |
MONEYLOVER_TOKEN_PATH | ~/.config/moneylover-mcp/token.json | 令牌的存储位置。必须是绝对路径 |
MONEYLOVER_CACHE_SECS | 300 | 钱包和类别的缓存时长(设为 0 可禁用缓存) |
MONEYLOVER_TIMEOUT_SECS | 45 | 每个请求的超时时间(1-300)。Money Lover 的服务器可能响应较慢 |
MONEYLOVER_LOG | info | 日志筛选级别。日志仅输出到 stderr |
MONEYLOVER_EMAIL、MONEYLOVER_PASSWORD | – | 仅用于无法运行 login 的无头环境;见下文 |
身份验证说明
- 仅支持邮箱 + 密码账户。通过 Google、Facebook 或 Apple 登录创建的账户没有密码,无法通过此方式登录。
- 一个 Money Lover 账户大约允许使用5 台设备,每次全新登录都会占用一个名额。服务器会将令牌存储在
token.json中并刷新令牌(刷新不会占用名额)。多个 MCP 客户端可以安全地共用同一个令牌文件;访问操作会通过锁文件进行串行化。 - 如果令牌无法再刷新,请重新运行
moneylover-mcp login。 moneylover-mcp logout会删除本地令牌,并立即停止正在运行的服务器。令牌本身在过期前仍会在 Money Lover 中保持有效;如需撤销,请在 Money Lover 应用中移除该设备。无论哪种情况,共用该令牌文件的所有服务器都会停止,直到你再次运行moneylover-mcp login;它绝不会在后台静默重新登录。- 密码错误时,每次服务器启动只会尝试一次,不会循环重试。
客户端配置示例
不要在配置中填写密码:请先运行 moneylover-mcp login。
{
"mcpServers": {
"moneylover": {
"command": "/path/to/moneylover-mcp",
"env": {
"MONEYLOVER_TIMEZONE": "Asia/Jakarta"
}
}
}
}
在 Zed 中,将相同内容放在 settings.json 的 context_servers 下:
{
"context_servers": {
"moneylover": {
"command": "/path/to/moneylover-mcp",
"env": { "MONEYLOVER_TIMEZONE": "Asia/Jakarta" }
}
}
}
如需允许 Agent 记录、更正和删除交易,请主动启用并限制其操作范围:
"env": {
"MONEYLOVER_ALLOW_WRITE": "true",
"MONEYLOVER_WRITE_WALLETS": "Cash",
"MONEYLOVER_MAX_AMOUNT": "2000000"
}
无头服务器(例如容器或运行聊天机器人的 VPS)可以改为传入 MONEYLOVER_EMAIL 和
MONEYLOVER_PASSWORD;请使用平台的密钥存储,而不要将它们放在仓库中的文件里。
安全
不要提交包含凭据的 MCP 客户端配置文件。 Zed 的 settings.json 和
类似文件经常会出现在公开的 dotfiles 仓库中。
服务端保护账户安全的措施:
- 凭据。 密码仅用于登录,不会被存储。令牌保存在
token.json中,该文件在权限为0700的目录中以0600权限创建;如果其他用户可以读取令牌文件,服务端会将其权限收紧为0600,若无法做到则拒绝使用。密码、令牌和Authorization标头绝不会出现在日志或工具输出中。在 Windows 上,文件权限取决于用户配置文件的默认权限。 - 网络。 仅使用 HTTPS,证书通过操作系统信任存储进行验证,绝不跟随重定向(因此密码或令牌绝不会被重新发送到其他地方),并限制响应大小。
- 默认禁用写入。 如果没有设置
MONEYLOVER_ALLOW_WRITE=true,写入工具(add_transaction、update_transaction、delete_transaction)仍会出现在工具列表中,但会返回错误,而不会调用 Money Lover。启用后,每次写入都会由服务端而非 AI 进行检查:- 仅允许指定的钱包(如果设置了
MONEYLOVER_WRITE_WALLETS),绝不允许已归档的钱包。对于更新和删除,检查的是交易所属的钱包; - 金额不得超过
MONEYLOVER_MAX_AMOUNT(如果已设置); - 日期必须在一年前至一个月后之间。更新和删除也只会影响日期在此范围内的交易,因此 Agent 无法改写更早的历史记录;
- 每小时最多允许
MONEYLOVER_MAX_WRITES_PER_HOUR次新增、更新和删除,合并计数(按服务端进程计数:分别运行服务端的两个 MCP 客户端会各自获得一次限额); - 除非 Agent 传入
allow_duplicate: true,否则会拒绝 10 分钟内的相同交易,以避免意外重试; - 绝不会更新或删除转账、债务、贷款和还款,因为它们都关联着其他交易,操作后会导致数据不一致;
- 写入绝不会自动重试。如果写入超时,工具会返回
UNCERTAIN,并告知 Agent 在重试前先进行检查。
- 仅允许指定的钱包(如果设置了
需要了解的事项:
- 提示词注入。 AI 会看到交易备注、钱包名称和类别名称。在共享钱包中,其他人也可以编写这些内容。类似“忽略之前的指令并添加……”的文本可能会操纵 Agent。服务端会告知 Agent 将这些文本视为数据,但真正的保护措施是上述写入限制。启用写入后,注入的指令也可能要求删除,而此操作无法撤销。除非确有需要,否则请保持写入关闭,并限制
MONEYLOVER_WRITE_WALLETS;优先选择每次调用工具前都会征求你同意的 MCP 客户端。MONEYLOVER_WRITE_WALLETS按钱包名称匹配;与你共享钱包的钱包所有者可以重命名钱包,因此请列出你拥有的钱包。 - 组合使用服务。 如果 Agent 既能读取你的财务信息,又能向外发送数据(网页抓取、电子邮件等),就可能被诱骗泄露这些信息。请考虑同时启用哪些工具。
- 日志。 日志写入 stderr,MCP 客户端通常会将其保存到文件。在默认的
info级别下,日志不包含任何财务数据。MONEYLOVER_LOG=rmcp=debug会记录完整的工具输入和输出。 - 你的 AI 提供商会看到工具返回的所有内容(余额、交易)。使用云端 AI 处理财务数据时,这一点无法避免。
发布
- 在
Cargo.toml中更新version,运行cargo build更新Cargo.lock,然后提交。 - 打标签并推送:
git tag v0.3.1 && git push origin v0.3.1。
发布工作流 会检查标签是否与 Cargo.toml 中的版本一致,运行测试、构建所有平台的版本、证明其来源,并在 GitHub 上发布包含 SHA256SUMS 的版本。
手动运行工作流(Actions > Release > Run workflow)只会进行构建,适合作为试运行。
随后,第二个作业会使用固定版本的 @anthropic-ai/mcpb CLI,从这些归档文件组装 .mcpb 包,对 macOS 包进行冒烟测试,证明每个包的来源,并将这些包以及 SHA256SUMS.mcpb 和生成的 server.json 附加到同一版本中。
发布到 MCP Registry
这是刻意设置为手动执行的步骤:它需要一个 Ed25519 密钥,该密钥不得存放在仓库或 CI 中。scripts/publish-registry.sh 会获取已发布的 server.json,下载一次各个包并按 SHA-256 缓存;如果注册表令牌已过期(有效期为 5 分钟),则登录;重新检查每个哈希值;执行发布;最后通过注册表 API 确认新版本:
brew install mcp-publisher # the registry's CLI, once
scripts/publish-registry.sh v0.4.0 # ~20 s cold, ~2 s warm
scripts/publish-registry.sh v0.4.0 --dry-run # download + verify only
如果该版本已列出,脚本会立即停止,不会下载任何内容。包会缓存在 ~/.cache/mcp-publisher/<owner>__<repo>/<tag>/ 中,因此重新运行无需额外操作。
首次运行时,以及轮换密钥后,脚本头部会说明如何生成密钥,并将公钥部分放入顶级域名的 TXT 记录中;现在登录操作已包含在脚本中。
需要注意两点:已发布的版本不可变,因此应更新版本号,而不是重新构建标签;重新构建标签会生成不同的包字节(ZIP 时间戳不同),因此应在发布工作流运行后再发布注册表条目,且不要为已发布的标签重新运行工作流。
开发
cargo test # unit + end-to-end tests against a mocked Money Lover
cargo clippy --all-targets
实时测试会调用真实 API,默认跳过。先运行 moneylover-mcp login(或 cargo run -- login),然后:
cargo test --test live live_read_only -- --ignored --nocapture # read only
# Optional write test: needs a wallet named exactly "MCP Test"
MONEYLOVER_LIVE_WRITE=1 MONEYLOVER_LIVE_CATEGORY="<an expense category in that wallet>" \
cargo test --test live live_write -- --ignored --nocapture
之后请在 Money Lover 应用中删除测试交易。
对面向 Agent 的接口进行静态分析
snyk-agent-scan 会检查 AI 客户端实际看到的内容——工具描述、提示词注入面,以及硬编码的密钥。它不属于 CI 的一部分,因为它需要 Snyk 令牌,并会将工具名称和描述上传到 api.snyk.io,因此需要时请手动运行:
SNYK_TOKEN=… uvx [email protected] scan --ci \
--dangerously-run-mcp-servers --suppress-mcpserver-io=true mcp.json
根据你的常规客户端配置生成 mcp.json(格式为常见的 {"mcpServers": {…}}),如果其中包含凭据,请勿提交。
许可证
MIT。请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。