SpacetimeDB 的 Claude Code 插件:从 marketplace 安装到 MCP 数据库操作实战 📅 发布时间:2026/9/11 23:02:13 👁 浏览次数: SpacetimeDB 的 Claude Code 插件从 marketplace 安装到 MCP 数据库操作实战【免费下载链接】SpacetimeDBDevelopment at the speed of light项目地址: https://gitcode.com/GitHub_Trending/sp/SpacetimeDB本文围绕 .claude-plugin/README.md 展开讲解如何通过.claude-plugin/marketplace.json将 SpacetimeDB 的skills/技能库与 MCP 服务器接入 Claude Code并从源码层面剖析spacetime mcp的实现原理。读完你既能完成插件安装、验证与维护也能掌握用 MCP 工具直接操作线上数据库列表、读 schema、跑 SQL、调 reducer的完整姿势。1. 背景为什么 SpacetimeDB 需要一个 Claude Code 插件SpacetimeDB 是一个“以光速开发”的实时数据库仓库根目录的 README.md 以此为口号其工作流涉及大量命令spacetime init/build/publish、spacetime sql/call/subscribe以及登录、服务器管理、客户端绑定生成等。当这些操作发生在 AI Agent如 Claude Code内部时与其让 Agent 手工拼 shell 命令不如把数据库能力直接“暴露”成结构化的工具tools与技能skills。.claude-plugin/marketplace.json 正是这座桥梁它把仓库的两个资产装进 Claude Code——skills/目录11 个面向任务的技能文档覆盖 CLI、核心概念、Rust/C#/TypeScript/C 服务端、TypeScript/C# 客户端、Unity、Unreal 等场景MCP 服务器以spacetime mcp启动通过 stdio 桥接到 CLI 所配置的 HTTP 服务器让 Agent 可以直接“看库、查库、改库”。从源码看MCP 能力是 CLI 的一等公民crates/cli/src/subcommands/mcp.rs定义了完整的mcp子命令并被注册进 crates/cli/src/lib.rs 的get_subcommands()列表。下面先讲安装再深入实现。2. 安装插件到 Claude Code2.1 从 marketplace 安装.claude-plugin/README.md 给出了两条命令完成“添加 marketplace 安装插件”claude plugin marketplace add clockworklabs/SpacetimeDB claude plugin install spacetimedbspacetimedb-plugins第一条命令将插件市场marketplace注册进 Claude Code市场名对应marketplace.json中的name: spacetimedb-plugins第二条命令安装名为spacetimedb的插件对应plugins[0].namespacetimedbspacetimedb-plugins表示“从spacetimedb-plugins市场安装spacetimedb插件”。2.2 从本地检出安装如果你是本地开发/调试直接用当前目录作为市场源即可claude plugin marketplace add ./ # 指向仓库根目录含 .claude-plugin/marketplace.json claude plugin install spacetimedbspacetimedb-pluginsREADME 强调本地安装后应执行验证claude plugin details spacetimedb该命令会列出插件携带的 skills 列表与 MCP 服务器配置用于确认安装结果正确。MCP 服务器实际运行spacetime mcp它通过 stdio 桥接到“你 CLI 所配置的那个服务器”的 HTTP 端点详见第 5 节。3. 插件清单剖析marketplace.json 都配置了什么.claude-plugin/marketplace.json 是插件安装的“配方”关键字段如下字段值说明$schemaAnthropic Claude Code marketplace schema声明清单格式namespacetimedb-plugins市场名安装命令中的后缀plugins[0].namespacetimedb插件名plugins[0].source./skills技能来源目录相对marketplace.jsonplugins[0].strictfalse非严格模式直接读取skills/目录plugins[0].skills11 个路径见下显式列出每个技能plugins[0].mcpServers.spacetimedbcommand: spacetime,args: [mcp]MCP 服务器启动方式3.1 skills 清单11 个技能插件显式声明了./skills下的 11 个技能逐一对应仓库 skills/ 目录中的SKILL.md清单中的路径对应技能文件覆盖内容./cliskills/cli/SKILL.mdCLI 全命令速查init/build/dev/publish/sql/call/login…./conceptsskills/concepts/SKILL.md核心概念reducer、事务、权限等./cpp-serverskills/cpp-server/SKILL.mdC 服务端模块开发./csharp-clientskills/csharp-client/SKILL.mdC# 客户端 SDK./csharp-serverskills/csharp-server/SKILL.mdC# 服务端模块开发./mcpskills/mcp/SKILL.md通过 MCP 工具操作数据库./rust-serverskills/rust-server/SKILL.mdRust 服务端模块开发./typescript-clientskills/typescript-client/SKILL.mdTypeScript 客户端 SDK./typescript-serverskills/typescript-server/SKILL.mdTypeScript 服务端模块开发./unityskills/unity/SKILL.mdUnity 客户端集成./unrealskills/unreal/SKILL.mdUnreal Engine 客户端集成每个SKILL.md都带 YAML frontmattername、description、triggers等。例如 skills/mcp/SKILL.md 的 description 写明了适用时机“当客户端暴露了 spacetimedb MCP 工具且任务是检查或修改线上数据库数据时使用”triggers则给出 “list my databases / read the schema / call a reducer” 等提示词帮助 Agent 自动命中技能。3.2 strict: false 的维护语义README 的 “Maintaining” 一节特别解释了strict: false的作用“The entry usesstrict: false, so it readsskills/directly and needs no manifest inside a plugin payload. It lists each skill explicitly, so adding one underskills/means adding it here too.cargo ci lintfails when the list and the directory disagree.”翻译成工程要点strict: false意味着 Claude Code 直接读取source: ./skills目录下的技能无需在每个技能子目录中额外放置 manifest因为清单是显式罗列在skills/下新增技能时必须同步把新路径加进marketplace.json的skills数组仓库的 CI 任务cargo ci lint会校验“清单列表”与“目录实际内容”是否一致不一致即失败——这是一道自动化的同步护栏修改清单后可用claude plugin validate .校验 catalog 合法性。3.3 MCP 服务器声明mcpServers: { spacetimedb: { command: spacetime, args: [mcp] } }插件安装后Claude Code 会在需要时以spacetime mcp启动 MCP 服务器。这意味着前提是环境中已有spacetimeCLI 可执行文件安装方式见第 5.3 节。4. 安装后的日常使用MCP 工具操作数据库安装并连接 MCP 后Agent 端会暴露一组spacetimedb.*工具。需要强调的是这些工具是被动的——它们不会主动广播自己的存在因此应先通过tools/list或客户端工具列表确认后再使用不要想当然地认为它们缺失。4.1 工具一览以 skills/mcp/SKILL.md 的表格为准工具参数返回list_databases无你拥有的数据库identity 与名称get_schemadatabase表与 reducer 的 JSON schemasqldatabase、sql、可选confirmed查询结果 JSON 行calldatabase、reducer、可选argsJSON 数组reducer 执行结果ping可选message健康检查注意list_databases只列出你本人拥有的数据库匿名身份下通常为空列表所以当你不知道库名时应先从这里开始。4.2 工具调用示例list_databases {} get_schema { database: mydb } sql { database: mydb, sql: SELECT * FROM message } call { database: mydb, reducer: send_message, args: [hello] }给sql传confirmed: true可等待一次“持久化确认读”durably confirmed read适合对一致性有要求的场景。4.3 两种服务形态host-wide 与 scopedMCP 服务器存在两种形态使用前务必先看tools/list不要做假设host-wide主机级spacetime mcp不带数据库参数启动对应 HTTPPOST /v1/mcp。每个数据工具都必须带database参数库名或 identity并提供list_databases{ name: sql, arguments: { database: mydb, sql: SELECT * FROM message } }scoped单库级spacetime mcp database启动对应 HTTPPOST /v1/database/db/mcp。连接已锁定数据库因此没有database参数、也没有list_databases{ name: sql, arguments: { sql: SELECT * FROM message } }两种形态的选择体现在源码里mcp.rs中当提供了database时连接走conn.db_uri(mcp)否则走conn.host_uri(mcp)见 crates/cli/src/subcommands/mcp.rs与上文两条 HTTP 路径一一对应。4.4 不变的规则权限模型与错误语义无论哪种形态工具都以你的身份运行与 HTTP API 完全一致受 skills/concepts/SKILL.md 中描述的权限模型约束reducer 是唯一的写路径改数据必须用call它在事务中运行要么整体提交、要么整体回滚通过 SQL 写数据需要库所有权sql可以读公开表要用它写数据你必须拥有该数据库。技能建议优先用call私有表对客户端不可读get_schema仍会展示私有表的声明因此sql报no such table往往意味着该表是私有的而不是不存在。可读性取决于你的身份不要假设私有表可读工具错误在带内返回reducer 失败或查询错误时返回的是isError: true的结果与文本消息而不是传输层失败。重试前先读消息文本。4.5 常见问题速查现象含义database argument must be a string服务器是 host-wide你漏传了databaseunknown tool: list_databases服务器已 scoped 到单个数据库x not found该服务器上无此库或应当用 identity 却传了名字no such table: x表是私有的或查错了库完全没有spacetimedb.*工具未连接 MCP 服务器改用 CLI见 skills/cli/SKILL.mdspacetime mcp被标记为UNSTABLE未稳定可能尚未包含在已发布的 CLI 版本中若客户端无法启动它就回退到 CLI 命令。4.6 MCP 与 CLI 的分工技能文档明确给出了“用哪个”的决策表任务用哪个列库、读 schema、跑 SQL、调 reducerMCP 工具init / build / publish / generate / start / logsspacetimeCLIMCP 工具只能操作已存在的数据库无法脚手架项目、编译模块、发布或生成绑定因此两者是互补关系而非替代关系。工具在场时优先用工具——它们有类型、返回 JSON、客户端还能对破坏性操作做闸门控制没有 MCP 客户端时等价的 CLI 命令同样正确。5. 源码深潜spacetime mcp 是如何工作的5.1 子命令定义mcp子命令在 crates/cli/src/subcommands/mcp.rs 中定义clap::Command::new(mcp) .about(format!( Serve SpacetimeDB to MCP-aware agents and editors over stdio. {UNSTABLE_WARNING} )) .arg(Arg::new(database).required(false).env(SPACETIMEDB_DB_NAME).help( The name or identity of a single database to serve. Falls back to the SPACETIMEDB_DB_NAME \ environment variable. Omit it to serve the whole server, where each tool takes a database \ argument instead, )) .arg(common_args::server().help(The nickname, host name or URL of the server hosting the database)) .arg(common_args::anonymous())database参数可省略也可通过环境变量SPACETIMEDB_DB_NAME提供提供则进入 scoped 形态省略则进入 host-wide 形态——与 4.3 节两种形态完全对应支持--server服务器昵称/主机名/URL与--anonymous匿名身份。5.2 执行流程exec函数mcp.rs的核心逻辑构造连接用config.get_host_url(server)解析目标主机用auth_header_from_saved_token从已保存的 token 构造认证头--anonymous时使用匿名身份若指定了数据库用database_identity解析其 identity否则用Identity::ZERO表示 host-wide选择桥接端点有数据库 →conn.db_uri(mcp)/v1/database/db/mcp无数据库 →conn.host_uri(mcp)/v1/mcp。启动时会向 stderr 打印桥接目标stdio 循环转发逐行读取 stdin 的 JSON-RPC 消息跳过空行以POSTContent-Type: application/json转发到 HTTP 端点若响应为202 Accepted则视为通知无响应体直接跳过否则把 JSON 响应体写回 stdout 并换行刷新——这就是“桥接 stdio 到 HTTP”的完整实现。代码里还有一处细节值得注意client.ensure_content_type(application/json)用于校验响应的内容类型保证协议一致性。5.3 环境前提与本地服务器spacetime mcp需要spacetimeCLI。本地开发时先启动本地服务器spacetime start # 启动本地实例默认 http://127.0.0.1:3000 spacetime server add local --url http://localhost:3000 --default之后运行spacetime mcp或带库名spacetime mcp mydb即可。身份相关命令skills/cli/SKILL.mdspacetime login # 打开浏览器登录 spacetime login --token token # 用 token 登录 spacetime login show # 查看登录状态 spacetime logout # 登出6. 扩展与维护新增技能在skills/下新增目录与SKILL.md后必须在 .claude-plugin/marketplace.json 的skills数组中同步登记CI 的cargo ci lint会检查二者是否一致校验清单claude plugin validate .可校验 catalog 是否合法版本稳定性spacetime mcp标注为 UNSTABLE升级 CLI 时留意该子命令的可用性发布环境以仓库当前代码crates/cli/src/subcommands/mcp.rs为准配套资产仓库还提供了 Codex 插件变体codex-plugin/与技能同步脚本docs/scripts/sync-agent-skills.mjs多 Agent 平台的技能体系保持一致。7. 总结安装插件只需两步claude plugin marketplace add clockworklabs/SpacetimeDBclaude plugin install spacetimedbspacetimedb-plugins本地检出用./作源并用claude plugin details spacetimedb验证插件 skills/11 个技能strict: false直接读取、显式登记 MCP 服务器spacetime mcpstdio 桥接 HTTP日常查改数据优先使用spacetimedb.list_databases / get_schema / sql / call / ping先看tools/list判断 host-wide 还是 scoped 形态写路径永远是 reducercallSQL 写需要所有权私有表对客户端不可读工具错误在带内返回底层由 crates/cli/src/subcommands/mcp.rs 实现stdin 逐行 JSON-RPC → HTTP 转发 → stdout 回写database参数/SPACETIMEDB_DB_NAME决定单库还是全库形态。【免费下载链接】SpacetimeDBDevelopment at the speed of light项目地址: https://gitcode.com/GitHub_Trending/sp/SpacetimeDB创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考