Rust 与 Tauri 构建的素材管理器 AssetHoard 在 0.2.3 版加入内置 MCP 服务,让助手查询并修改本地素材库。服务随应用运行,通过内部库接口访问数据,使修改及时反映到界面;摘录中对 SQLite 多进程写入的腐败风险表述过于绝对。
你的 AI assistant 能在八秒内写出一个状态机,却完全不知道你手里有哪些资产。
AssetHoard 是一款面向独立游戏开发者、采用 local-first 理念的桌面资产管理工具,用 Rust 和 Tauri 构建。它已经掌握了你资产库里的每个模型、纹理、精灵图和音效,知道它们属于哪个 bundle、有哪些标签,以及依赖哪些资源。0.2.3 版本新增了内置 MCP server,让你的 assistant 可以直接查询这些信息。
这篇文章聊的是工程实现:server 放在哪里,为什么使用 HTTP,以及如何让一个能够修改资产库的本地 server 安全地持续运行。
最容易想到的捷径,是做一个独立的 MCP 可执行程序,打开应用的 SQLite 文件,直接读取。我们排除了这个方案,原因有两个:
因此,server 在 AssetHoard 内部运行,只有应用打开时才响应请求。后来发现,这反而成了一个优点:assistant 做出的每项修改,都会立即显示在 UI 中。
MCP 模块不允许调用应用命令,也不允许执行 SQL。所有操作都要经过一个小型内部资产库 API,这层 API 位于 UI 和 MCP server 的下方,供两者共同使用。
当 assistant 把一项资产移入某个 bundle 时,调用的函数与拖放操作完全相同。使用相同的校验、相同的审计日志,也生成相同的撤销记录。不存在另一条逐渐与实际实现脱节的代码路径。
这也降低了新增工具的成本。一个工具只需要一个带类型的参数 struct,以及一个调用资产库 API 的简单方法;struct 的文档注释会成为模型读取的描述。真正的逻辑集中在一处,只需测试一次。
我们选择 HTTP 而不是 stdio,是因为 server 位于一个已经运行的应用内部。Claude Code、Cursor、VS Code 和 Windsurf 只需带上一个 header,就能连接本地 endpoint,配置一行就够了。Claude Desktop 只会启动 stdio server,所以目前需要通过 mcp-remote 桥接。
默认端口固定为 47823。端口可以配置,但如果被占用,应用不会自行改用其他端口。自动切换听起来很贴心,直到你写好的所有客户端配置悄悄失效。我们选择在端口被占用时,返回一条清晰易懂的错误信息。
一个能读取你的文件、修改你的资产库的本地 server,值得多做一些防范。
文本结果与缩略图分开返回。 搜索只返回 id、名称、类型、路径和标签。如果模型想查看图片,就调用 get_thumbnail,获取一张最大 256px 的图像。这样,它既能确认那块“长满苔藓的岩石”确实有苔藓,也不会让每条搜索结果的图片塞满 context。
导出时带上依赖。 模型会带上自己的纹理,Godot .tres 会带上它引用的资源,Unreal 资产也会带上各自的依赖。位于 zip 或 .unitypackage 文件中的资产,会先被提取出来。
Deep links。 返回的每项资产、每个 bundle 和每个项目,都包含一个 assethoard:// 链接。这样,assistant 就能交给你一个可点击的链接,直接跳到应用中的对应条目。
模型能读懂的错误。 对于未知 id、写入工具未启用等情况,返回的是普通错误信息,而不是协议错误。这样,assistant 就能解释问题,或者尝试其他方法。
“找三个不同的木桶模型,再找一张与它们搭配的木材纹理,把它们复制到 Assets/Props。”
assistant 会搜索资产、查看缩略图、选出一组,然后连同纹理一起导出。你可以继续搭建关卡。
“在 ‘Environment’ 下创建一个名为 ‘Rocks’ 的 bundle,把所有岩石模型移进去,并给它们打上 ‘nature’ 标签。”
每一步都会实时显示在应用中,并各自生成一条撤销记录。如果它把一颗其实是土豆的东西当成巨石移了进去,按 Ctrl+Z 就行。
目前主要的缺口是 Claude Desktop 仍然需要 mcp-remote。一个小型原生 shim 已经列入计划。
完整文章发布在 AssetHoard 博客上,里面还有更多工作流。各客户端的配置方法见 MCP 文档,每个工具的说明见工具参考。AssetHoard 在公开 beta 期间可以免费下载。
如果你也在桌面应用中内置过本地 MCP server,我很想听听你是如何处理身份验证和写入权限的。
如需采取进一步行动,你可以考虑屏蔽此人,以及/或者举报滥用行为。