关于 LemonSqueezy MCP Server
LemonSqueezy MCP Server 将 LemonSqueezy 商店操作提供给兼容 MCP 的 AI 助手。工具覆盖电商数据与操作,并可选配置商店访问、退款和破坏性调用的限制。
主要功能
- 01管理产品、客户和订单
- 02处理订阅与折扣
- 03管理许可证密钥和结账
- 04创建退款、发票和 Webhook
- 05可选防护规则与审计日志资源
适用场景
- 01查看商店订单和订阅数据
- 02按配置限额执行退款
- 03管理许可证密钥和折扣码
- 04通过可选接收器核对 Webhook 事件
MCP 相关
将 LemonSqueezy API 操作作为 MCP 工具提供,并提供审计日志 MCP 资源。管理工具需要 LemonSqueezy API 密钥;防护规则和 Webhook 接收器工具为可选项。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
64收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
@yawlabs/lemonsqueezy-mcp
只需单击一次,即可将其添加到本地 Yaw MCP 配置中,以便在每个 Yaw Terminal 会话中使用。也可以在下方手动安装。
用于 LemonSqueezy API 的 MCP 服务。通过任何兼容 MCP 的 AI 助手管理商店、产品、客户、订阅、折扣、许可证密钥等。
快速开始
npx -y @yawlabs/lemonsqueezy-mcp@latest
需要 Node.js 22 或更高版本(engines.node 为 >=22)。
也可以通过 Smithery 一键安装:
npx -y @smithery/cli install @yawlabs/lemonsqueezy-mcp --client claude
Smithery 会提示你填写环境变量(API 密钥和可选的防护措施),并为你将配置写入客户端。
效果展示
配置完成后,你可以用通俗的英语向 AI 助手询问商店管理相关问题,助手会通过 MCP 工具处理这些请求:
You: How much did we make from the "Pro Annual" plan last month?
Claude: [calls ls_list_subscriptions, ls_get_variant, ls_list_subscription_invoices]
Pro Annual brought in $14,280 across 84 active subscriptions in April.
Three of those were upgrades from monthly; none churned.
You: Refund order #LS-1234 in full.
Claude: [calls ls_get_order to fetch the total, then ls_refund_order with amount = total]
Refunded $99.00 against order LS-1234. The customer's card will see the
credit in 5-10 business days.
You: Disable license key abc-123 for the customer who reported abuse.
Claude: [calls ls_list_license_keys to find the ID, then ls_update_license_key with disabled: true]
License key disabled. Their existing activations will fail validation
on the next check.
防护措施(退款上限、速率限制、商店允许列表)会在明显的错误请求发送到 LemonSqueezy 之前将其拦截。请参阅配置,了解用于启用这些措施的环境变量。
设置
将 LemonSqueezy API 密钥设为环境变量:
export LEMONSQUEEZY_API_KEY="your-api-key"
从你的 LemonSqueezy 控制面板获取 API 密钥。
Docker
仓库根目录中包含一个多阶段 Dockerfile。运行时映像是在 node:22-alpine 上运行的单个打包文件,由非 root 用户 node 运行,且不暴露端口(stdio 传输)。
docker build -t yawlabs/lemonsqueezy-mcp .
docker run --rm -i -e LEMONSQUEEZY_API_KEY="your-api-key" yawlabs/lemonsqueezy-mcp
此外还为 Podman 用户提供了相应的 Containerfile。它通过 npm run gen:containerfile 从 Dockerfile 生成。release.sh 会在步骤 1 中运行 npm run check:containerfile,因此如果两个文件存在差异,发布就会失败。此仓库没有 CI,因此不会检查拉取请求中的文件差异:编辑 Dockerfile 后,请自行运行该命令。
Claude Code
添加到 MCP 配置中:
{
"mcpServers": {
"lemonsqueezy": {
"command": "npx",
"args": ["-y", "@yawlabs/lemonsqueezy-mcp@latest"],
"env": {
"LEMONSQUEEZY_API_KEY": "your-api-key"
}
}
}
}
Claude Desktop
添加到 claude_desktop_config.json:
{
"mcpServers": {
"lemonsqueezy": {
"command": "npx",
"args": ["-y", "@yawlabs/lemonsqueezy-mcp@latest"],
"env": {
"LEMONSQUEEZY_API_KEY": "your-api-key"
}
}
}
}
Yaw MCP
页面顶部的 添加到 Yaw MCP 按钮可以在不提供密钥的情况下添加此服务。请将密钥存储在 Yaw MCP 的加密保管库中,而不要将其作为明文环境变量:
yaw-mcp set lemonsqueezy env.LEMONSQUEEZY_API_KEY --secret
它会提示你输入值,但不会回显(也可以从管道标准输入读取),并且只会将 ${secret:...} 引用写入 ~/.yaw-mcp/bundles.json。LEMONSQUEEZY_TEST_API_KEY 和 LEMONSQUEEZY_SINK_ADMIN_TOKEN 也可以采用相同方式处理。
Yaw MCP 也会将 LEMONSQUEEZY_API_KEY_COMMAND 视为凭据,因为它的名称中包含 KEY:yaw-mcp doctor 会将字面值标记为 plaintext:,并在捕获的 stderr 中对该值进行屏蔽。这是预期行为。该变量存储的是命令行,而非密钥,因此这个标记不会造成影响;你也可以用相同方式将命令存储为密钥,以消除该提示。
工具(64 个)
用户
ls_get_user— 获取已认证用户
商店
ls_get_store— 根据 ID 获取商店ls_list_stores— 列出所有商店(不受LEMONSQUEEZY_ALLOWED_STORE_IDS限制:会返回 API 密钥可查看的所有商店)
客户
ls_get_customer— 根据 ID 获取客户ls_list_customers— 列出客户(可按商店、电子邮件筛选)ls_create_customer— 创建客户ls_update_customer— 更新客户ls_archive_customer— 归档客户
产品
ls_get_product— 根据 ID 获取产品ls_list_products— 列出产品(可按商店筛选)
变体
ls_get_variant— 根据 ID 获取变体ls_list_variants— 列出变体(可按产品筛选)
价格
ls_get_price— 按 ID 获取价格ls_list_prices— 列出价格(按变体筛选)
这两个工具都会为每条价格记录添加 effective_unit_price(实际按单位收取的美分金额)和 effective_unit_price_note(说明该数值的来源);适用时还会添加 unit_price_is_not_charged 或 unit_price_is_per_package。请读取 effective_unit_price,而不是 unit_price:后者在阶梯式(volume / graduated)定价中已不再使用;也不要读取变体的 price。订阅项目读取也会对通过 include=price 嵌入的价格应用相同的注释。
文件
ls_get_file— 按 ID 获取文件ls_list_files— 列出文件(按变体筛选)
订单
ls_get_order— 按 ID 获取订单ls_list_orders— 列出订单(按商店、电子邮件筛选)ls_generate_order_invoice— 生成 PDF 发票ls_refund_order— 发起退款
订单项目
ls_get_order_item— 按 ID 获取订单项目ls_list_order_items— 列出订单项目(按订单、产品、变体筛选)
订阅
ls_get_subscription— 按 ID 获取订阅ls_list_subscriptions— 列出订阅(按商店、状态、产品等筛选)ls_update_subscription— 更新(切换方案、暂停、计费锚点、试用)ls_cancel_subscription— 取消订阅
订阅发票
ls_get_subscription_invoice— 按 ID 获取订阅发票ls_list_subscription_invoices— 列出订阅发票(按商店、订阅、状态筛选)ls_generate_subscription_invoice— 生成 PDF 发票ls_refund_subscription_invoice— 发起退款
订阅项目
ls_get_subscription_item— 按 ID 获取订阅项目ls_list_subscription_items— 列出订阅项目(按订阅、价格筛选)ls_update_subscription_item— 更新数量ls_get_subscription_item_usage— 获取当前计费周期的用量
用量记录
ls_get_usage_record— 按 ID 获取用量记录ls_list_usage_records— 列出用量记录(按订阅项目筛选)ls_create_usage_record— 上报计量用量(递增或设置)
折扣
ls_get_discount— 按 ID 获取折扣ls_list_discounts— 列出折扣(按商店筛选)ls_create_discount— 创建折扣码ls_delete_discount— 删除折扣
折扣兑换记录
ls_get_discount_redemption— 按 ID 获取折扣兑换记录ls_list_discount_redemptions— 列出兑换记录(按折扣、订单筛选)
许可证密钥
ls_get_license_key— 按 ID 获取许可证密钥ls_list_license_keys— 列出许可证密钥(按商店、订单、产品筛选)ls_update_license_key— 更新激活次数限制、到期时间或禁用状态
许可证密钥实例
ls_get_license_key_instance— 按 ID 获取许可证密钥激活记录ls_list_license_key_instances— 列出激活记录(按许可证密钥筛选)
结账
ls_get_checkout— 按 ID 获取结账记录ls_list_checkouts— 列出结账记录(按商店、变体筛选)ls_create_checkout— 创建结账 URL(自定义定价、预填信息、折扣)
Webhook
ls_get_webhook— 按 ID 获取 Webhookls_list_webhooks— 列出 Webhook(按商店筛选)ls_create_webhook— 创建 Webhookls_update_webhook— 更新 Webhookls_delete_webhook— 删除 Webhook
许可证 API
ls_activate_license— 激活许可证密钥(无需 API 密钥)ls_validate_license— 验证许可证密钥(无需 API 密钥)ls_deactivate_license— 停用许可证密钥实例(无需 API 密钥)。每次调用都会产生不可逆影响:请求受速率限制并会记录审计日志,且审计条目中的许可证密钥会被掩码处理
联盟营销人员
ls_get_affiliate— 按 ID 获取联盟营销人员(佣金率、状态、收入)ls_list_affiliates— 列出联盟营销人员(按用户电子邮件筛选)。不受LEMONSQUEEZY_ALLOWED_STORE_IDS限制:会返回 API 密钥可访问的所有商店中的联盟营销人员
Webhook 接收器(可选)
连接到独立的 @yawlabs/lemonsqueezy-webhook-sink 进程,让 Agent 能够根据实际触发的 webhook 进行核对。工具始终会注册;如果未设置 LEMONSQUEEZY_SINK_URL / LEMONSQUEEZY_SINK_ADMIN_TOKEN,调用会返回明确的“未配置”错误。
ls_sink_events_list— 列出接收器收到的 webhook 事件(可按since/type/limit筛选)ls_sink_event_mark_processed— 将接收器事件标记为已由使用方处理(幂等)ls_sink_stats— 获取事件总数、未处理数量和最后接收时间戳
功能
- API 覆盖范围 — 涵盖 20 个 LemonSqueezy API 资源的 58 个工具、3 个 License API 工具,以及 3 个用于连接可选 @yawlabs/lemonsqueezy-webhook-sink 的桥接工具,以便进行 webhook 核对(总计 64 个)
- JSON:API 支持 — 每个
ls_list_*工具都支持分页;除ls_list_stores外的每个工具都支持筛选;除ls_get_user和ls_get_subscription_item_usage外的每个ls_get_*/ls_list_*工具都支持关系包含(include) - 零运行时依赖 — 单个打包文件,使用
npx即可即时启动 - License API — 无需 API 密钥即可激活、验证和停用许可证密钥
- MCP 注释 — 每个工具都声明只读、破坏性和幂等提示
- 带退避的重试 — 适用于 LemonSqueezy API 调用(
ls_sink_*工具只尝试一次):每种方法遇到 429 都会重试,包括退款和 License API 调用等 POST 请求;重试前会等待服务器提供的Retry-After(缺失或无法解析时为 1s)。这依赖于 429 表示请求在 LemonSqueezy 执行操作前已被拒绝。如果Retry-After超过 30s,或等待会超过总截止时间,则直接返回 429。5xx 响应、超时和网络错误仅对幂等方法(GET、DELETE)进行重试,并采用指数退避和随机抖动;遇到这类错误的 POST 或 PATCH 不会重试。最多尝试 4 次,每次最多 30s,90s 后不会开始新的尝试或等待 - 防护措施 — 可选的商店允许列表、退款上限、破坏性调用速率限制、按权限类别禁用(
LEMONSQUEEZY_DISABLE_CLASSES),以及按权限类别设置速率限制(LEMONSQUEEZY_RATE_LIMIT_PER_CLASS) - 审计日志 MCP 资源 —
lemonsqueezy://audit-log以application/x-ndjson格式公开最近 1000 条破坏性调用记录,供无法访问 stderr 的客户端使用 - 结构化日志 — 可选的 JSON 日志输出到 stderr,支持选择级别(
error、audit、all)
配置
所有配置均通过环境变量进行。管理 API 工具需要以下变量之一:LEMONSQUEEZY_API_KEY_COMMAND、LEMONSQUEEZY_TEST_API_KEY 或 LEMONSQUEEZY_API_KEY(按此顺序检查);三个 License API 工具和 ls_sink_* 工具均不需要这些变量。其他所有配置均为可选。
| 变量 | 用途 |
|---|---|
LEMONSQUEEZY_API_KEY | LemonSqueezy API 令牌。 |
LEMONSQUEEZY_API_KEY_COMMAND | 其标准输出(会去除首尾空白,且必须非空)作为 API 密钥的命令。优先级高于 LEMONSQUEEZY_TEST_API_KEY 和 LEMONSQUEEZY_API_KEY。使用此项可从密钥库获取短期凭据(op read、gcloud secrets versions access 等),而无需将其写入环境变量。该命令会直接运行,不会通过 shell 运行:字符串会按空格和制表符拆分,单引号或双引号会将内容括为一个参数(引号内不支持转义),反斜杠是普通字符。相邻的带引号和不带引号的文本会合并为一个参数,空的 '' 会被丢弃。不会进行 $VAR / ~ 展开、通配符匹配、命令替换、管道或重定向。如需使用其中任何功能,请将其写入脚本,并通过解释器调用脚本,例如 sh /path/get-key.sh、node get-key.js,或在 Windows 上使用 powershell -NoProfile -File C:\path\get-key.ps1。在 Windows 上,不能直接通过裸名称或完整路径启动 .cmd / .bat 文件,而许多密钥库 CLI 会安装为 .cmd 垫片(例如 gcloud):请用 cmd /c gcloud secrets versions access ... 包装调用,或调用 .exe 文件,例如 op。在 LEMONSQUEEZY_MCP_SANDBOX=1 且 oam 版本为 0.18.0 或更高版本时,Node 密钥命令必须通过包装器清除 NODE_OPTIONS:oam 会通过 NODE_OPTIONS 将服务的 --permission / --allow-* 标志传给子进程,而 Node 不接受其中的 --allow-net,并会以状态码 9 退出。请使用 sh -c 'unset NODE_OPTIONS; exec node get-key.js',或在 Windows 上使用 cmd /c "set NODE_OPTIONS=&& node get-key.js";在沙盒模式下检测到裸 node 命令时,启动器会向 stderr 输出警告。请参阅沙盒。命令的运行时限为 10 秒,标准输出和标准错误各限制为 64 KB。输出会缓存 1 小时。缓存以命令字符串为键,因此在进程运行期间更改命令后,下次请求时会刷新缓存;如果 API 返回 401/403,也会自动使缓存失效,因此上游密钥轮换后,无需等待 TTL,下次调用即可生效。 |
LEMONSQUEEZY_TEST_API_KEY | 可选的测试模式密钥。设置为非空值时,其优先级高于 LEMONSQUEEZY_API_KEY(但低于 LEMONSQUEEZY_API_KEY_COMMAND)。每个进程首次启用时,服务会向 stderr 输出一行 JSON test_mode 通知,供你确认测试模式已启用。使用此项可将服务指向沙盒/测试商店,而无需取消设置生产密钥。 |
LEMONSQUEEZY_ALLOWED_STORE_IDS | 以逗号分隔的商店 ID 允许列表。设置后:(1) 输入中包含 storeId 的任何工具都会拒绝对不在允许列表中的商店发起调用;(2) 接受 storeId 筛选条件的工具(例如 ls_list_orders、ls_list_subscriptions)必须提供该条件——不带此条件的调用会被阻止,以免因缺少筛选条件而返回 API 密钥可访问的所有商店的数据。完全没有 storeId 字段的工具不受此允许列表限制,分为以下三种情况:(a) 通过资源 ID 定位的工具(例如 ls_get_order、ls_refund_order、ls_cancel_subscription、ls_update_subscription_item、ls_create_usage_record、ls_archive_customer、ls_delete_webhook、ls_delete_discount、ls_update_license_key)会按该 ID 路由,因此调用方必须事先知道该 ID;(b) ls_list_stores 和 ls_list_affiliates 完全不接受范围限定 ID,且会返回 API 密钥可访问的所有商店中的记录——ls_list_stores 会列出允许列表之外的商店。两者各自的工具说明中都注明了这一点。(c) License API 工具(ls_activate_license、ls_validate_license、ls_deactivate_license)使用调用方传入的许可证密钥进行身份验证,而非 API 密钥,因此此允许列表和账户隔离都无法限制这些工具;请参阅权限类别了解适用的控制措施。其他按父级列出的工具(ls_list_prices、ls_list_files、ls_list_variants、ls_list_order_items、ls_list_discount_redemptions、ls_list_license_key_instances、ls_list_subscription_items、ls_list_usage_records)在设置允许列表时需要父级 ID 筛选条件——这只能提供部分缓解,因为该父级本身可能属于不在允许列表中的商店。LemonSqueezy API 密钥在账户级别颁发,并授权访问该账户中的所有商店,因此,对于使用 API 密钥的工具,此允许列表是服务在进程内唯一能强制执行的商店边界。请将其与 LEMONSQUEEZY_MAX_REFUND_AMOUNT_CENTS / LEMONSQUEEZY_DESTRUCTIVE_RATE_LIMIT / LEMONSQUEEZY_RATE_LIMIT_PER_CLASS 配合使用,以实现纵深防御;如果你的账户托管了多个不希望暴露给同一 Agent 的商店,请将这些商店放在单独的 LemonSqueezy 账户中,并确保此服务无法访问其 API 密钥。 |
LEMONSQUEEZY_MAX_REFUND_AMOUNT_CENTS | 非负数。拒绝超过此金额的 ls_refund_order 和 ls_refund_subscription_invoice 调用(退款金额以整分为单位,因此 99.5 这样的分数上限最多允许退款 99 分)。未设置或为空表示不设上限;0 是有效值,会阻止所有退款(架构要求 amount >= 1),因此可将其用作紧急开关。负数或非数值会导致服务在启动时停止。检查在速率限制器之前运行,因此被拒绝的超额退款不会占用破坏性操作或 money 类别的额度。 |
LEMONSQUEEZY_DESTRUCTIVE_RATE_LIMIT | 非负数。每 60 秒滚动窗口内允许的破坏性工具调用次数上限(小数会按下一个整数处理:2.5 允许调用 3 次)。未设置或为空表示不设限制;**0 会阻止所有破坏性调用。**负数或非数值会导致服务在启动时停止。此限制仅在进程内生效——按 MCP 服务实例计算,而非全局计算;每次 npx 冷启动都会重置窗口。每次调用均视为破坏性操作(无论输入为何):ls_refund_order、ls_refund_subscription_invoice、ls_cancel_subscription、ls_update_subscription_item、ls_create_usage_record、ls_archive_customer、ls_delete_discount、ls_delete_webhook 和 ls_deactivate_license。取决于输入的破坏性操作:ls_update_license_key 设置 disabled: true,或传入任何 activationLimit 或 expiresAt(包括 null)时;ls_update_subscription 暂停订阅(pause: "void" 或 "free")、切换方案(variantId)、传入 billingAnchor、传入 trialEndsAt(日期或 null),或设置 invoiceImmediately: true 时;ls_update_customer 设置 status: "archived" 时;以及 ls_update_webhook 传入 secret 时。其他工具调用均不属于破坏性操作。若某个破坏性调用先被 LEMONSQUEEZY_DISABLE_CLASSES、退款上限或 LEMONSQUEEZY_RATE_LIMIT_PER_CLASS 拒绝,则不会进入此计数器,因此不会被计数。所有破坏性调用(包括被阻止的调用)都会在日志中标记为 audit: true,并记录在 lemonsqueezy://audit-log 中。MCP 客户端会在这 13 个工具上都看到 destructiveHint: true,包括其中 4 个取决于输入的工具,因为注解是静态的;服务端对这 4 个工具按调用次数计数。 |
LEMONSQUEEZY_DISABLE_CLASSES | 以逗号分隔的权限类别列表,列出要直接拒绝的类别。任何所属类别列于其中的工具都会在尝试调用 API 之前返回 guardrail_block。示例:LEMONSQUEEZY_DISABLE_CLASSES=money,recurring,pii 会阻止退款、订阅变更、用量报告和专用客户工具,同时保留 read、mutate、key 和 webhook 类别。禁用 pii 并不能阻止 Agent 获取客户数据:读取类工具仍会返回客户姓名和电子邮件(请参阅权限类别下方的说明)。未知类别名称会导致服务在启动时停止。 |
LEMONSQUEEZY_RATE_LIMIT_PER_CLASS | 以逗号分隔的各类别滚动速率限制。每个条目格式为 class:N、class:N/m 或 class:N/h(仅写数字时默认为每分钟)。示例:money:2/h,recurring:5/h,key:10/m。recurring 额度会将用量报告(ls_create_usage_record)与订阅变更一并计入,因此如果用于计量的 Agent,请据此设置额度。此项与 LEMONSQUEEZY_DESTRUCTIVE_RATE_LIMIT 组合生效——两项都必须通过。限制值为 0 时会阻止该类别的所有调用;未列出的类别不受限制。格式错误的条目会导致服务在启动时抛出错误。限制按服务实例在进程内计算。 |
LEMONSQUEEZY_LOG | 输出到 stderr 的结构化日志详细程度。设置为 all(或旧值 json)时记录所有工具和 HTTP 调用;设置为 audit 时仅记录破坏性调用的审计条目和错误(生产环境推荐);设置为 error 时仅记录失败。不设置(或设置为其他任何值):不记录日志。破坏性调用会标记为 audit: true,并包含其输入;输入会按照资源中所述进行脱敏(stderr 日志和审计日志资源采用相同的脱敏规则)。失败条目包含用于标识原因的 status。对于 tool_call 行:guardrail_block(操作员策略拒绝了调用)、validation_error(客户端发送了格式错误的请求,例如更新时没有要更改的字段)、exception(发生异常),或 error(工具返回了错误结果,例如 LemonSqueezy 返回 HTTP 错误或请求超时)。对于 http_call 行:timeout、network_error 或 HTTP 状态码。 |
LEMONSQUEEZY_SINK_URL | 可选的 @yawlabs/lemonsqueezy-webhook-sink 实例的基础 URL(例如 https://webhooks.example.com)。末尾的斜杠会被移除。启用下方的 ls_sink_* 对账工具。未设置:工具仍会注册,但调用时会返回“未配置”错误。 |
LEMONSQUEEZY_SINK_ADMIN_TOKEN | 用于 sink 管理端点的 Bearer 令牌。必须与 sink 的 WEBHOOK_SINK_ADMIN_TOKEN 一致。设置 LEMONSQUEEZY_SINK_URL 时必填;如果 sink 启动时未设置管理令牌,其管理端点会返回 404,且 ls_sink_* 调用会提供相应诊断信息。 |
日志格式
每行:{ts, event, tool?, method?, path?, status, latency_ms, request_id?, error?, audit?, inputs?}。标准输出专用于 MCP 协议,切勿在其中记录日志。
错误附加信息
HTTP 错误会在存在上游 X-Request-Id 时包含该字段,以便提交给 LemonSqueezy 的支持工单能够引用确切的调用。如果错误正文是 JSON,且服务器无法识别其中的 message,就会在错误文本和日志行中完整显示该正文,并按照审计输入的相同方式进行脱敏(参见资源)。非 JSON 错误正文会原样传递。
权限类别
LemonSqueezy 自身提供的最强访问控制是 API 密钥边界。 LemonSqueezy API 密钥授予对整个账户的访问权限——包括每个商店,以及除三个 License API 工具(见下文)和三个不使用该密钥的 ls_sink_* 桥接工具之外的所有工具。通过 LemonSqueezy 拒绝某类权限的唯一方式,就是一开始不向 Agent 提供 API 密钥。LemonSqueezy 的团队成员管理界面可以限定哪些用户能在控制面板中执行哪些操作,但公开 API 密钥会继承其所属账户的全部权限;没有“此密钥可以读取但不能退款”之类的开关。因此,就上游 API 而言,权威边界取决于 Agent 持有哪个 API 密钥。
这意味着,对于 LemonSqueezy 无法自行限制的权限,以下环境变量是进程内的主要控制面——每类速率上限(RATE_LIMIT_PER_CLASS)、部署时禁用类别(DISABLE_CLASSES)、退款限额(MAX_REFUND_AMOUNT_CENTS)以及审计日志。从防护的角度看,它们是双重保险,因为能够更改服务器环境变量的操作员可以移除这些限制;但它们也至关重要,因为 LemonSqueezy 没有等效机制。如果你需要一个确实无法访问某个商店或某类操作的 Agent,可靠的做法是创建一个独立的 LemonSqueezy 账户,且绝不向该 Agent 提供其密钥。但这种做法不适用于 License API 工具(见下文)。
每个工具都标有一个权限类别,用于说明调用者需要哪类业务权限才能调用该工具。此类别与破坏性/只读的二元标注相互独立:读取客户记录和列出产品都是读取操作,但只有前者会返回个人身份信息(PII);创建结账和退款都是写入操作,但只有后者会转移资金。
| 类别 | 涵盖内容 | 工具 |
|---|---|---|
read | 安全读取(列表/获取),主要负载不包含客户 PII。 | 除 ls_get_customer 和 ls_list_customers 之外的所有 ls_get_* 和 ls_list_* 工具,以及 ls_validate_license、ls_sink_events_list 和 ls_sink_stats |
pii | 专用的客户记录工具。此类别不会限制对客户数据的访问;请参阅下方说明。 | ls_get_customer、ls_list_customers、ls_create_customer、ls_update_customer、ls_archive_customer |
mutate | 非资金变更:结账、折扣、生成发票、将接收器事件标记为已处理。 | ls_create_checkout、ls_create_discount、ls_delete_discount、ls_generate_order_invoice、ls_generate_subscription_invoice、ls_sink_event_mark_processed |
money | 资金转移。在支付层面不可逆。 | ls_refund_order、ls_refund_subscription_invoice |
recurring | 订阅状态和按用量计费:会影响经常性收入的变更。 | ls_update_subscription、ls_cancel_subscription、ls_update_subscription_item、ls_create_usage_record |
key | 许可证密钥管理(激活、停用、禁用、更改激活次数上限或到期时间)。 | ls_update_license_key、ls_activate_license、ls_deactivate_license |
webhook | Webhook 配置——会影响其他系统所依赖的信任范围。 | ls_create_webhook、ls_update_webhook、ls_delete_webhook |
这就是每个工具所属的类别。src/tools/tools.test.ts 固定了相同的映射,而将工具移到另一个类别属于 SEMVER.md 定义的重大变更(MAJOR)。 |
注意:pii 仅控制上述五个客户工具。它不会阻止 Agent 访问客户数据:读取类别的工具仍会附带返回客户姓名和邮箱(订单、订阅和许可证密钥中包含这些信息);ls_list_orders 和 ls_list_subscriptions 接受 userEmail 筛选条件;订单、订阅和许可证密钥的获取/列表工具接受 include=customer,可同时加载客户记录。该类别仅用于主要用途是处理客户记录的工具,因此 LEMONSQUEEZY_DISABLE_CLASSES=pii 会阻止这些工具,但不会阻止访问客户数据。若要避免 Agent 接触客户数据,请从另一个不托管你所关注客户记录的 LemonSqueezy 账户签发 API 密钥。
License API 工具不受 API 密钥边界限制。 ls_activate_license、ls_validate_license 和 ls_deactivate_license 使用调用方传入的许可证密钥进行身份验证,而非使用 API 密钥,因此无论服务器持有哪个 API 密钥,它们都能操作任何 LemonSqueezy 账户的许可证密钥。使用单独的 LemonSqueezy 账户无法隔离这些工具,LEMONSQUEEZY_ALLOWED_STORE_IDS 也不会限制它们。以下控制措施会作用于这些工具:
ls_deactivate_license(类别key):LEMONSQUEEZY_DISABLE_CLASSES=key、LEMONSQUEEZY_RATE_LIMIT_PER_CLASS=key:N,以及会将每次调用都视为破坏性操作的LEMONSQUEEZY_DESTRUCTIVE_RATE_LIMIT。每次调用也会记录审计日志,并对许可证密钥进行遮蔽(参见 资源)。ls_activate_license(类别key):同样受上述两项类别控制措施限制。激活是附加操作,因此不属于破坏性操作,破坏性操作速率限制和审计日志都不会记录它。ls_validate_license(类别read):仅受LEMONSQUEEZY_DISABLE_CLASSES=read或LEMONSQUEEZY_RATE_LIMIT_PER_CLASS=read:N限制,而这两者也会影响其他所有读取操作。下文的只读锁定配置仍允许使用它。
这两项 key 类别控制措施也适用于同类别中的管理 API 工具 ls_update_license_key。
以下两个可选环境变量会使用此分类体系:
LEMONSQUEEZY_RATE_LIMIT_PER_CLASS— 限制每个类别的调用速率。LemonSqueezy 权限无法表达“每小时最多退款 2 次”;此策略只能在这里设置。这是防止失控 Agent 的关键控制措施。LEMONSQUEEZY_DISABLE_CLASSES— 彻底禁用某个类别。适用于需要快速切换部署时;将DISABLE_CLASSES=pii,mutate,money,recurring,key,webhook切换为纯读取模式,只需更改一行配置(所有read工具仍可使用,包括ls_validate_license)。能够更改服务器环境变量的操作员也能移除这项限制,因此若要实施权威性的拒绝策略,请使用单独的 LemonSqueezy 账户,并确保 Agent 无法访问其 API 密钥;不过,这并不能限制 License API 工具。
这两个变量均为可选项;若都未设置,则允许使用所有类别,且不限制调用次数。
资源
服务器会向倾向于结构化检索而非解析 stderr 的客户端公开一个 MCP 资源:
| URI | MIME 类型 | 内容 |
|---|---|---|
lemonsqueezy://audit-log | application/x-ndjson | 最近的破坏性工具调用及其结果(速率限制拦截、退款上限拦截、异常、成功)。容量有限的环形缓冲区,最多保留最近的 1000 条记录,按时间从近到远排列,服务器重启后重置。输入在写入缓冲区前会经过脱敏,stderr 日志也会记录同一份脱敏副本。(1) 对于整个名称匹配凭据/个人身份信息模式的任何对象键(secret、password、token、api_key、bearer、authorization、signing_secret、private_key、pin、ssn、social_security_number、credit_card、card_number、cvv、cvc,不区分大小写;复合名称中的 _ 也可以是 - 或省略),其值会替换为 [REDACTED]。(2) 名为 licenseKey、license_key 或 license-key(任意大小写)的键存储的是 License API 凭据,因此其值会被遮蔽:长度为 16 个或更多字符的字符串会变为 [REDACTED:last4=XXXX],保留末尾四个字符,以便将记录与密钥关联,同时不暴露密钥;其他任何值都会变为 [REDACTED]。(3) 任何符合 JWT 承载令牌格式(以 eyJ… 开头,包含三个 base64url 段)的字符串值,无论出现在什么键下,都会变为 [REDACTED]。规则 (1) 和 (2) 根据键名生效,因此,存储在其他键名下的许可证密钥不会被遮蔽。任何其他键名下的值都会保留,包括 ID licenseKeyId、license_key_id、licenseKeyInstanceId、instanceId、storeId、orderId 和 webhookId,以及 UUID 格式的值。 |
无人值守运行服务器
对于针对线上商店的无人值守/Agent 式使用,我们建议:
- 在 LemonSqueezy 账户下创建 API 密钥,该账户仅托管 Agent 获准操作的商店——LemonSqueezy 不提供按商店限定 API 密钥范围的功能,因此账户隔离是持久的商店边界。将
LEMONSQUEEZY_ALLOWED_STORE_IDS设置为相同的商店集合,作为针对接受storeId的工具的双重进程内限制。账户隔离无法限制三个 License API 工具,因为这些工具使用许可证密钥而非 API 密钥进行身份验证(参见权限类别)。 - 将
LEMONSQUEEZY_MAX_REFUND_AMOUNT_CENTS设置为远低于任何单笔退款预期金额的单次调用上限。 - 将
LEMONSQUEEZY_DESTRUCTIVE_RATE_LIMIT设置为较小的值(例如 5/min),作为失控 Agent 的断路器。如需更精细的控制,可添加LEMONSQUEEZY_RATE_LIMIT_PER_CLASS=money:2/h,recurring:5/h,key:10/m,为每个权限类别设置各自的上限。如果 Agent 还会报告计量用量,也要相应调整recurring数值:用量报告也会计入其中。 - 如果某个类别不应被访问(例如只需要
read的分析 Agent),请将要拒绝的类别设置到LEMONSQUEEZY_DISABLE_CLASSES中。服务器会在构建 API 调用前拒绝这些类别。如需不可撤销的拒绝,也请从单独的 LemonSqueezy 账户为 Agent 创建 API 密钥(License API 工具除外)。 - 将
LEMONSQUEEZY_LOG=audit,并将 stderr 发送到日志聚合器。audit级别会保留每条破坏性调用记录和错误,但会丢弃成功读取的记录,使运行数周期间的日志量保持可控。针对status: "guardrail_block"或各工具错误率升高设置告警。调试时使用LEMONSQUEEZY_LOG=all。 - 通过由密钥库管理的秘密运行
LEMONSQUEEZY_API_KEY_COMMAND,这样无需重启服务器进程即可轮换凭据。API 客户端会在收到 401/403 时自动清除进程内的密钥缓存,因此轮换后的上游密钥会在下次请求时生效,而不必等待 1h TTL。
服务器不会处理的事项,必须由调用方负责:
- 幂等性/去重存储 — MCP 服务是无状态子进程;跨调用去重应由你的 Agent 或编排器负责。
- Webhook 对账 — 在单独的长运行进程中订阅 LemonSqueezy Webhook,以便在 API 写入成功但响应丢失时对账状态。可使用现成的接收器 @yawlabs/lemonsqueezy-webhook-sink。
- 指标/仪表板 — 服务器会输出结构化日志;请在日志管道中生成指标。
版本策略见 SEMVER.md。
开发
npm install
npm run lint
npm test # full unit + handler suite (builds first)
npm run test:integration # live suite; exits 1 unless LEMONSQUEEZY_TEST_API_KEY + LEMONSQUEEZY_TEST_STORE_ID are set
此仓库没有 CI:Pull Request 不会自动重新运行 lint、类型检查或测试,因此请在本地运行。npm run test:integration 会向真实商店写入临时的 ci-test- 资源。
Containerfile 由 Dockerfile 生成。编辑 Dockerfile 后:
npm run gen:containerfile # regenerate Containerfile
npm run check:containerfile # release.sh step 1 runs this too; non-zero exit means the two have drifted
在 oam.js 上运行(可选)
oam.js 可原样运行此服务。已在 oam 0.9.0 上验证:完整的 MCP 握手、全部 64 个工具、lemonsqueezy://audit-log 资源、可用的 fetch,以及错误文本与 Node 完全一致的防护规则拒绝。在发布的 oam 0.18.0 上,也已通过启动器重新验证 MCP 握手、全部 64 个工具(与 Node 上的 64 个相同)、一次工具调用和 audit-log 资源,且涵盖启用和未启用下方沙箱的情况。
最低版本为 oam 0.18.0。 启动器会选择它能找到的、版本不低于此版本的最新 oam,不会在旧版本上运行服务;如果找不到,则回退到 Node(LEMONSQUEEZY_MCP_RUNTIME=oam 会将此情况变为硬性错误)。此处设置最低版本很重要:0.9.0 之前的版本会将 child_process.execFile 的参数交给 shell 处理;只要配置了 LEMONSQUEEZY_API_KEY_COMMAND,就可能受到影响——该功能会使用 execFile 运行密钥命令,并有意不使用 shell,而这些旧版本仍会再次拆分其参数。
发布的 lemonsqueezy-mcp 命令(bin/lemonsqueezy-mcp.mjs,也是 npx 运行的命令)会根据以下变量选择运行时:
| 变量 | 默认值 | 用途 |
|---|---|---|
LEMONSQUEEZY_MCP_RUNTIME | auto | auto:如果启动器当前运行在 oam 上,且该版本为 0.18.0 或更新版本,则在该 oam 上运行服务(除非 LEMONSQUEEZY_MCP_SANDBOX=1);否则,在它能找到的最新 oam 二进制文件上运行,版本需为 0.18.0 或更新版本(参见 OAM_BIN);若找不到,则使用 Node。低于 0.18.0 的 oam 宿主绝不会直接运行服务——它会转交给最新的可用 oam,或转交给 PATH 上的 Node;如果两者都没有,则退出并报错。被跳过的 OAM_BIN 始终会在 stderr 中列出。只有在找不到可用 oam 时,才会列出其他被跳过的 oam 二进制文件以及任何 oam.cmd / oam.bat 垫片;因找到更新版本而跳过的旧版本不会列出。所选 oam 启动失败,以及从低于 0.18.0 的 oam 宿主转交给 Node,始终会有提示;如果此类宿主改为转交给更新版本的 oam,则不会输出任何内容。oam:行为相同,但不会回退,而是报错退出;错误中给出的解决办法取决于实际情况(对于低于 0.18.0 的 oam,建议运行 oam self-update;对于无法运行的二进制文件,建议检查该文件;只有在完全找不到 oam 时,才建议从 oamjs.org 安装——但 Linux 非 x64 平台除外,因为 oam 未发布该平台的构建版本)。node:始终使用 Node——在 npx 下进程内运行;如果客户端通过 oam run 启动命令,则转交给 PATH 上的 Node。大小写不敏感;任何其他值的行为都与 auto 相同。 |
OAM_BIN | 未设置 | 优先于自动发现使用的 oam 二进制文件路径,版本需为 0.18.0 或更新版本。如果该文件不存在、版本较旧或无法运行,启动器会在 stderr 中说明情况,然后继续自动发现。自动发现会先查找已设置的 OAM_INSTALL_DIR(oam 安装程序的目标目录),然后查找已安装的位置(Windows 上依次为 %LOCALAPPDATA%\oam\bin 和 ~/.oam/bin;其他系统上为 ~/.oam/bin),最后查找 PATH;它会询问找到的每个 oam 的版本,并使用最新版本;版本相同时优先使用已安装的副本。在 Windows 上,只有 oam.exe 有效:绝不会运行 oam.cmd / oam.bat 垫片,且只有在找不到可用 oam 时才会在 stderr 中列出它们。在 LEMONSQUEEZY_MCP_RUNTIME=node 下,以及未启用沙箱且已在 oam 0.18.0 或更新版本上运行时,此变量会被忽略。 |
LEMONSQUEEZY_MCP_SANDBOX | 未设置 | 设为 1 时,会在 --permission 下运行服务;见下文。 |
沙箱化(可选启用)
设置 LEMONSQUEEZY_MCP_SANDBOX=1,即可在 oam 的 --permission 模型下运行:网络仅允许访问 api.lemonsqueezy.com:443(以及设置了 LEMONSQUEEZY_SINK_URL 时,该 URL 中指定的主机和端口;如果 URL 使用 http: / https:,则端口为 80 / 443),文件系统完全禁止访问,除非配置了 LEMONSQUEEZY_API_KEY_COMMAND,否则也禁止启动子进程。授权范围限定到端口,因为从 oam 0.18.0 开始,host:port 条目允许 fetch 访问该端口(在 0.17.1 及更早版本中,它不允许任何 HTTP 请求,因此以前的授权会只写主机名)。
配置 LEMONSQUEEZY_API_KEY_COMMAND 后,还会有两项变化,均从 oam 0.18.0 开始:
- 密钥命令的环境。 未显式指定环境的子进程只能获取
--allow-env授权的变量;在 Windows 上,即使是子进程通常会继承的变量(SYSTEMROOT、TEMP、USERPROFILE等),也会受到相同的过滤。因此,授权列表还包含APPDATA、HOME、HOMEDRIVE、HOMEPATH、LANG、LOCALAPPDATA、SYSTEMDRIVE、SYSTEMROOT、TEMP、TMP、TMPDIR、USERPROFILE和WINDIR,这些变量是保险库 CLI 和 PowerShell 所需的。在 oam 0.18.0 上实测:没有这些变量时,powershell -NoProfile -Command ...会报错“Internal Windows PowerShell error”;添加这些变量后,它以及cmd /c ...和sh -c ...密钥命令都能返回密钥,API 也能通过 443 端口正常响应。 - Node 密钥命令需要包装器。 oam 会像 Node 处理其子进程那样,将服务端的
--permission/--allow-*标志追加到子进程的NODE_OPTIONS中,而 Node 22 不允许在此处使用--allow-net(node: --allow-net= is not allowed in NODE_OPTIONS,退出码为 9)。请先清除它:sh -c 'unset NODE_OPTIONS; exec node get-key.js',或在 Windows 上使用cmd /c "set NODE_OPTIONS=&& node get-key.js"(两种方式都已实测可用)。如果密钥命令是裸node,启动器会在 stderr 上打印此建议。自行设置NODE_OPTIONS=--permission并无帮助:子进程会在 Node 的权限模型下运行,但没有读取自身脚本的授权。
当运行于 oam 的启动器将服务交给 Node(LEMONSQUEEZY_MCP_RUNTIME=node,或使用低于最低要求版本的 oam)时,会先从继承的 NODE_OPTIONS 中移除 --permission 和 --allow-*,并在 stderr 上说明移除了哪些内容:Node 无法应用 oam 的网络和环境变量授权;如果保留这些标志,Node 会在开始提供服务前以退出码 9 退出。
--permission 是进程级标志,因此启动器始终会为它启动一个全新的 oam,即使客户端已在 oam 0.18.0 或更高版本下启动该命令也是如此。这只是一种偏好,并非保证:如果无法启动可用的 oam,LEMONSQUEEZY_MCP_RUNTIME=auto 仍会在不使用 --permission 的情况下提供服务,而 LEMONSQUEEZY_MCP_RUNTIME=oam 则会报错退出。
此功能默认不启用,而是选择加入,因为授权配置错误不会明确报错。oam 会将未获授权的环境变量从 process.env 中移除,而不是抛出异常,因此授权不足时,读取 LEMONSQUEEZY_API_KEY 会得到“未认证”,而不是“已拒绝”。启动器中的环境变量允许列表根据已发布的程序包实际读取的内容生成;如果新增了 process.env 查找,请将相应变量添加到该列表中。
{
"mcpServers": {
"lemonsqueezy": {
"command": "oam",
"args": ["run", "/path/to/lemonsqueezy-mcp/dist/index.js"],
"env": { "LEMONSQUEEZY_API_KEY": "..." }
}
}
}
请注意:如果要向服务端而不是 oam 传递参数,需要使用 -- 分隔符:oam run dist/index.js -- version。
已发布的命令会优先使用 oam,但并不要求安装 oam。 oam 不会发布到 npm,因此 npx @yawlabs/lemonsqueezy-mcp 必须能在没有 oam 的情况下正常运行,而且确实可以:发现过程只检查文件是否存在,不会启动子进程;回退方案则会在 npm 已经启动的 Node 进程中运行服务。不过,如果安装了 oam,该命令会先启动 Node,对找到的每个 oam 二进制文件运行 --version,选出最新版本,然后才启动 oam,因此它始终比直接使用上面的配置让客户端连接 oam 慢。LEMONSQUEEZY_MCP_RUNTIME=node 会完全跳过 oam。MCP 客户端每个会话只会冷启动此服务一次,因此真正产生的开销是启动耗时——而目前还没有在较新版本的 oam 上测量过此仓库的启动耗时。请先在自己的硬件上测量,再下结论。
在此仓库中,oam 确实有两处优势,二者都需选择启用,也都不会触及 npm 包:
npm run check:oam——通过oam check(tsgo,即 TypeScript 7 原生实现)进行类型检查。实测耗时为 2878ms,而tsc --noEmit为 4406ms;两者的检查结果都没有问题。npx tsc --noEmit仍是可移植的默认方案,也是提交前检查清单指定使用的命令。npm run build:binary:oam——通过oam compile(scripts/build-binary-oam.mjs)构建独立二进制文件。实测大小为 57.14 MB。文件会写入bin/<platform>-<arch>/,之后由scripts/stage-release-asset.mjs将其暂存为发布资源。如果要重新分发该二进制文件,其中包含 oam 的运行时,因此请随附 oam 的LICENSE、NOTICE和THIRD_PARTY_LICENSES.md。
源代码有意保持运行时无关:其中没有任何 oam: 导入,测试也继续使用 node:test。这样才能确保 Node 回退方案是真正可用,而非徒有其名——一旦加入 oam:test 或带 oam: 前缀的导入,“回退到 Node”这句话就不再属实。任何 oam 调用都会在工作目录下的 oam/ 中写入字节码缓存;该路径已加入 gitignore。
发布
发布在本地执行,使用 release.sh,并要求从干净的 main 检出版本开始。此仓库没有 GitHub Actions 工作流(.github/ 中只有 CODEOWNERS),因此仅推送标签不会发布任何内容。release.sh 保留了 CI 模式,可供由标签触发的发布工作流使用;这是预期的最终状态,但目前没有任何东西会调用它。
发布前,请手动在 CHANGELOG.md 中编写 ## [Unreleased] 条目;如果更改了 src/api.ts 或工具处理程序,请针对测试模式的商店运行 npm run test:integration(此命令需要 LEMONSQUEEZY_TEST_API_KEY 和 LEMONSQUEEZY_TEST_STORE_ID,缺少时会以代码 1 退出)。单元测试会模拟 fetch,因此无法发现上游 API 的变化。然后:
./release.sh X.Y.Z
执行第 1 步前,release.sh 会检查是否已安装并通过身份验证 gh,并确认当前位于 main;如果工作树不干净,也会拒绝运行,除非这是在续跑一个版本号变更已提交的发布流程。除非 X.Y.Z 已发布到 npm,否则脚本还会运行 npm whoami,若失败则停止,因此失效或缺失的 npm 令牌会让流程在第 4 步推送标签前中止。npm whoami 能证明令牌有效,但不能证明它是自动化令牌:网页登录会话可以通过此检查,却会在第 5 步因 EOTP 失败。
随后,它会在工作站上执行八个步骤:
npm run lint、npm run check:containerfile(如果Containerfile与Dockerfile不一致则失败),以及scripts/check-oam-floor.mjs。如果启动器、README 或启动器测试中的 oam 下限(OAM_MIN)存在不同的引号写法,或者低于最新的 oam 版本,则此脚本会失败(LEMONSQUEEZY_MCP_ALLOW_STALE_OAM=1会故意在旧下限上发布;如果 GitHub API 无法访问,会报告这一情况,但不会导致失败)npm test(会先构建),然后运行npm run check:compliance:@yawlabs/mcp-compliance 固定使用 Yaw MCP 评分所用的版本,通过 Node 上的启动器对构建后的服务进行评分。必需检查失败,或评分低于LEMONSQUEEZY_MCP_MIN_COMPLIANCE(默认为A),都会导致发布失败;跳过的检查和测试套件的警告会以WARNING行输出。如果测试套件完全无法运行,会说明这一情况,发布仍会继续,除非设置了LEMONSQUEEZY_MCP_COMPLIANCE_STRICT=1- 更新
package.json和package-lock.json中的版本,并将server.json同步为该版本 - 将
CHANGELOG.md中的## [Unreleased]改为## [X.Y.Z](如果[Unreleased]为空,则改为根据上一个标签之后的提交标题编写该节,并发出警告),然后提交、更改注释标签为vX.Y.Z,并推送main和该标签 npm publish --access public- 创建 GitHub release,说明内容取自
CHANGELOG.md中的## [X.Y.Z]部分 - 等待 npm 提供新版本(最多 10 分钟,之后发出警告并继续),运行
npx -y @yawlabs/[email protected] --version进行冒烟测试(最多尝试 60 次,每次间隔 10 秒),然后使用mcp-publisher将server.json发布到 Official MCP Registry - 验证 npm 版本、
package.json和标签
部分步骤失败后可以安全地重新运行。./release.sh X.Y.Z 会检测已完成的版本更新、提交、标签、npm 发布和 GitHub release,并跳过这些操作;lint、测试、推送和 npx 冒烟测试会重新运行。第 7 步的 MCP Registry 发布不会跳过,因此发布成功后重新运行会因版本重复而在该步骤失败。
在工作站上发布不会附带 npm provenance 证明:release.sh 仅在 CI 模式下传递 --provenance。
每台机器的一次性设置:
-
用于发布
@yawlabs/lemonsqueezy-mcp的 npm 自动化令牌,存放在~/.npmrc中(npmjs.com -> Access Tokens -> Generate -> Automation):@yawlabs:registry=https://registry.npmjs.org/ //registry.npmjs.org/:_authToken=npm_YOURTOKEN切勿运行
npm login --auth-type=web。 这会用绑定 2FA 的 Web 会话覆盖自动化令牌,导致下一次发布因EOTP失败。 -
gh auth login。 发布前检查要求完成此登录,第 6 步也会使用它创建 release。第 7 步会使用令牌(gh auth token)登录mcp-publisher,除非设置了MCP_REGISTRY_TOKEN;无论采用哪种方式,Registry 只允许 YawLabs 组织 Owner 使用令牌读取组织角色(read:org可以;repo、user、write:org和admin:org也可以)来发布io.github.YawLabs/*命名空间。登录时会读取角色,但只有发布时才会拒绝,因此无法读取角色的令牌仍能登录,而发布会收到 403。首次使用时会将mcp-publisher下载到~/.local/bin;如需使用其他副本,请设置MCP_PUBLISHER。 -
PATH中的jq、curl和tar。 第 3 步使用jq编辑server.json。第 7 步首次使用时会通过curl和tar下载mcp-publisher,除非MCP_PUBLISHER指向现有副本。该步骤还会使用curl轮询 npm;如果缺少curl,则会发出警告并跳过等待。 -
推送到
main和创建v*标签的权限。 仓库规则集要求通过拉取请求更新main,并限制创建v*标签;只有组织管理员可以绕过这些限制,而第 4 步会直接推送两者。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。