构建用于费用跟踪的远程 MCP 服务器:一位开发者的真实实践经验

构建用于费用跟踪的远程 MCP 服务器:一位开发者的真实实践经验

如何在不放弃数据控制权的前提下将你自己的工具连接到 Claude Desktop

构建用于费用跟踪的远程 MCP 服务器:一位开发者的真实实践经验

每次需要记录费用时,你都要在应用、电子表格和浏览器标签页之间来回切换。这既繁琐,又把原本几秒钟就能搞定的事情拖成了几分钟。如果你能像与同事交谈一样,自然地告诉 AI 助手记录下来,并且能将数据真正存储在你所掌控的地方,会怎样呢?

2026 年 7 月 16 日,开发者 Ali Raza 分享了他如何通过构建一个远程 MCP 服务器并将其连接到 Claude Desktop 来解决这一难题。他的经历不仅展示了这一解决方案有多么优雅,也揭示了真正的痛点所在。

为什么这在当下至关重要

在 2026 年,AI 助手正在成为你使用各种工具的主要界面。但大多数指南都假设你构建的是在本地运行或仅与公共 API 交互的玩具示例。一旦你想在不将控制权移交给第三方的情况下,将你自己的数据和自己的服务引入对话,就会遇到完全不同的一系列难题。这就是端到端解决这些难题的故事。

什么是 MCP,为什么它很重要?

MCP 代表模型上下文协议(Model Context Protocol)。不妨把它想象成 Claude 与你的代码之间的一场对话。当你在 Claude Desktop 中输入内容时,它可以调用位于你自建服务器上的函数。MCP 定义了这场对话的运作方式——请求采用什么格式、响应是什么样子、如何处理错误。它是一种协议,而非魔法,但它打开了一扇大门。

如果没有 MCP,将 Claude 连接到你的个人费用跟踪器意味着先构建一个 API,再构建一个 Claude 插件,然后寄希望于插件生态系统能如你预期般运作。有了 MCP,你只需暴露一些函数(如“添加一笔费用”、“显示我上个月花了多少钱”),Claude 就知道如何调用它们。你的数据依然属于你,你的服务器也始终由你掌控。

方案搭建:Raza 构建的内容

该解决方案包含三个主要部分:工具定义层、数据库以及与 Claude Desktop 的连接。

使用 FastMCP 进行工具定义

FastMCP 是一个 Python 库,可以轻松定义 Claude 可以调用的函数。Raza 使用它暴露了四个核心工具:

  • add_expense — 记录新交易
  • get_summary — 获取费用统计数据或趋势
  • list_transactions — 显示最近或筛选后的费用
  • 类别管理 — 按类型整理费用

当你让 Claude “记录 15 美元买咖啡” 时,FastMCP 会将其转换为函数调用并发送给服务器。

使用 aiosqlite 进行数据库访问

一种天真的方法是使用标准 SQLite,在数据库回答查询时它会发生阻塞。但在异步服务器中(一种无需等待即可同时处理许多请求的服务器),阻塞是致命的——它会让一切停滞不前。Raza 转向使用 aiosqlite,它允许数据库请求在不冻结其他工作的情况下运行。

数据库本身存放在由 Python 的 tempfile 模块管理的临时目录中。这听起来可能有些脆弱,但实际上具有自适应性:Raza 的部署环境(Horizon)无法保证固定的可写路径,因此动态存储避免了部署磨擦。

连接到 Claude Desktop

服务器运行后,你在 Claude Desktop 的配置中将其注册为自定义连接器。从那时起,当你打开 Claude Desktop 并要求它处理费用时,它就会连接到你的远程服务器。

部署服务器

Raza 将完整的 MCP 服务器部署到了云平台 Horizon。服务器在远程运行,而不是在你的笔记本电脑上。在本地运行的 Claude Desktop 通过互联网调用它。这种架构很干净:你的笔记本电脑无需保持开机状态,并且可以从运行 Claude Desktop 的任何设备访问你的服务器。

教程没教的两大经验

端到端构建这一系统暴露了快速入门指南一笔带过的问题。

经验 1:Windows MSIX 沙盒机制

Windows 上的 Claude Desktop 是以 MSIX 包(微软的现代应用格式)形式发布的。操作系统虚拟化了文件系统。当你以为 Claude Desktop 正在写入常规的 Windows 配置文件夹时,它实际上写入的是一个被操作系统呈现得如同正常目录一样的沙盒位置。

Raza 付出了血淋淋的代价才发现这一点:配置文件并不存在于标准文档所说的位置。解决这一问题需要理解 MSIX 虚拟化的工作原理,而不仅仅是按部就班地照着教程做。

经验 2:超越基础的 OAuth

仅本地运行的 MCP 服务器永远不需要与外部服务进行身份验证。但只要你的服务器与真正的 API 对话——比如从银行获取数据,或将费用记录到某个服务——你就需要 OAuth。而 OAuth 远不止“点击登录按钮”那么简单。

你需要:

  1. 发起 OAuth 重定向流程(将用户引导至授权服务器)
  2. 在用户授予权限时接收授权码
  3. 用该授权码兑换访问令牌
  4. 安全地存储令牌
  5. 在令牌过期时进行刷新

大多数初学者教程都跳过了所有这些步骤。Raza 不得不直接阅读 OAuth 规范才把它做好。

最终效果:轻松记录费用

解决这些问题后,Raza 最终拥有了一个运行良好的系统。在 Claude Desktop 中使用自然语言指令——“记录 15 美元买咖啡,类别为餐饮”——就会通过 MCP 路由到远程服务器并存储在数据库中,不需要独立的应用或网页表单。

更重要的是,实际运行中的 Bug 都被修复了。当 Raza 部署到 Horizon 并打开 Windows 上的 Claude Desktop 时,一切正常运行。没有路径方面的意外,也没有因令牌过期而中断流程的问题。

下一步计划

Raza 正在使用 LangGraph(一个用于构建多步骤 AI 智能体的框架)将其扩展为 Agent 工作流。目标是添加有状态逻辑:AI 不仅仅一次执行一个工具调用,而是制定计划、分多个步骤执行、保存进度检查点,并在采取关键操作前暂停以寻求人工批准。

代码仓库已在 GitHub 上公开: github.com/AliRaza3485/test-remote-mcp-server,因此如果你正在使用 MCP 或 LangGraph 进行开发,可以亲自参考这些模式。

结论

构建远程 MCP 服务器在大体轮廓上很简单——定义你的工具,将它们连接到数据库,在 Claude Desktop 中注册服务器——但细节至关重要。Windows 打包、异步数据库访问和 OAuth 生命周期管理并不是罕见的边缘情况;它们是任何真实部署的一部分。Raza 的经历表明,玩具示例与实际运行系统之间的差距比想象中要小,但你确实需要保持清醒的头脑去跨越它。

优点

  • 数据所有权:你的费用数据保存在你自己的数据库中,而不是在厂商的云端。
  • 自然的交互方式:无需独立的 UI 或应用;直接用自然语言与 Claude Desktop 对话。
  • 可扩展性:基础架构就位后,添加新工具(预算提醒、定期费用等)非常简单直接。
  • 学习资源:公开的代码仓库展示了针对 OAuth、异步数据库和部署特性的实战模式。
  • 集成能力:在 Windows、Mac 以及其他能运行 Claude Desktop 的平台上都能无缝工作。

缺点

  • 运维责任:服务器属于你。服务中断、安全补丁和数据库备份都是你的责任。
  • 部署复杂性:Horizon 或其他平台增加了一层复杂性;如果你更倾于纯本地部署,则需要采用不同的方法。
  • OAuth 学习曲线:如果你的服务器需要外部身份验证,你需要理解完整的 OAuth 流程,而不仅仅是复制教程代码片段。
  • 仅限于 Claude:MCP 服务器与 Claude Desktop 进行通信。如果你想在其他 AI 客户端中使用相同的工具,则需要单独集成。
  • 临时文件脆弱性:使用 Python 的 tempfile 进行数据库存储目前可行,但如果以后更换托管环境,则需要仔细考虑。

注意事项

本文仅供教育目的,总结了 Ali Raza 于 2026 年 7 月 16 日在 DEV Community 上报道的真实进展。你尝试的任何实现都应从阅读 Raza 的公开仓库和官方 MCP 文档开始。在将本文用于生产工作之前,请对照原始出处核实所有主张。此处描述的 OAuth 模式和部署细节特定于 Raza 的实现;你的环境可能需要不同的选择。在移至生产环境之前,务必在非生产环境中测试配置路径、令牌刷新逻辑和数据库访问模式。按照妥善的安全规范对待访问令牌和任何密钥——切勿将它们提交至版本控制或以明文形式记录日志。

常见问题解答

什么是模型上下文协议(MCP)? — MCP 是一种标准协议,可让像 Claude 这样的 AI 助手调用由你控制的服务器暴露的函数,从而无需构建单独的插件即可实现你自己的工具和数据的无缝集成。

我可以在本地运行 MCP 服务器而不是在 Horizon 上运行吗? — 可以,你可以在本地或任何具有互联网访问权限的平台上托管服务器。Raza 选择了 Horizon,但只要能运行 Python,FastMCP 和 aiosqlite 在任何地方都能运行。

构建 MCP 服务器需要了解 Python 吗? — 该示例使用了 Python 和 FastMCP,但 MCP 与语言无关。你可以用 Node.js、Go、Rust 或任何其他语言构建 MCP 服务器;只需使用不同的库即可。

如果费用数据放在远程服务器上,我该如何保证其安全? — 使用 HTTPS 加密传输中的数据,在私有网络中或在身份验证保障下运行服务器,并确保服务器本身保持最新。考虑将敏感凭据(如 OAuth 令牌)保存在安全金库中,而不是保存在明文文件中。

如果远程服务器宕机了怎么办?Claude Desktop 会停止工作吗? — 是的,Claude Desktop 将无法调用托管在不可用服务器上的工具。这就是为什么生产环境的 MCP 服务器通常具备监控、备份以及快速恢复计划的原因。

我可以使用 MCP 服务器将多个 AI 助手连接到相同的工具吗? — MCP 是基于协议的,因此理论上是可以的。不过,Claude Desktop 目前是具备完整 MCP 支持的主要客户端。与其他 AI 平台集成需要这些平台也支持 MCP。

我需要多久刷新一次 OAuth 令牌? — 这取决于具体的服务。大多数服务颁发的令牌有效期从一小时到几天不等。Raza 的实现会自动处理此问题;服务器会存储令牌并在其过期前进行刷新。

aiosqlite 比普通的 SQLite 更快吗? — 在纯粹的速度上不一定更快,但在异步上下文中更安全。它可以防止整个服务器在数据库回答查询时发生停滞,这在你同时处理多个请求时至关重要。

标签

#mcp #aiassistant #expensetracking #clouddeployment #pythondev #fastapi #oauth2 #remoteserver

Free field guide

Docker Security Checklist

Lock down your containers from build to runtime — 29 practical controls covering images, runtime flags, secrets, and the daemon. Enter your email — you'll get the PDF instantly, plus new posts on Docker, Linux & security.