mcpField
P
PayPal, guarded

PayPal, guarded

本地服务
fizzl-paypal-demo.onrender.com金融数据0今天更新

关于 PayPal, guarded

PayPal, guarded 是一个为 PayPal Agent Toolkit 加入资金操作检查的 MCP 服务。它设置退款限额、拦截部分不安全退款,并可要求所有者审批;读取操作则直接通过。

主要功能

  1. 01提供名称一致的 PayPal Agent Toolkit 工具
  2. 02按剩余可退款金额执行限额检查
  3. 03拦截存在未结争议或拒付的退款
  4. 04对指定操作要求所有者审批
  5. 05本地记录日志并持久保存每日计数
  6. 06提供试运行检查和防护状态工具

适用场景

  1. 01查看 PayPal 交易而不修改数据
  2. 02限制退款并防止重复或超额退款
  3. 03要求审批争议、价格变更或标记为已付款的发票
  4. 04查看防护决策和待处理审批

MCP 相关

向 MCP 客户端提供 PayPal Agent Toolkit 操作,以及防护状态和试运行工具。防护层在将资金操作转发给 PayPal 前进行检查,并在策略要求时请求所有者审批。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"fizzl13-paypal-guard": {
"command": "npx",
"args": [
"-y",
"fizzl-paypal-guard-mcp"
],
"env": {
"PAYPAL_CLIENT_ID": "<PAYPAL_CLIENT_ID>",
"PAYPAL_CLIENT_SECRET": "<PAYPAL_CLIENT_SECRET>",
"PAYPAL_ENVIRONMENT": "<PAYPAL_ENVIRONMENT>",
"LIMIT_REFUND": "<LIMIT_REFUND>",
"LIMIT_REFUND_PER_DAY": "<LIMIT_REFUND_PER_DAY>",
"LIMIT_REFUNDS_PER_DAY": "<LIMIT_REFUNDS_PER_DAY>",
"LIMIT_CURRENCY": "<LIMIT_CURRENCY>",
"GUARD_POLICY": "<GUARD_POLICY>",
"FIZZL_AGENT_KEY": "<FIZZL_AGENT_KEY>",
"TELEGRAM_BOT_TOKEN": "<TELEGRAM_BOT_TOKEN>",
"TELEGRAM_CHAT_ID": "<TELEGRAM_CHAT_ID>",
"APPROVAL_IN_CHAT": "<APPROVAL_IN_CHAT>",
"APPROVAL_MINUTES": "<APPROVAL_MINUTES>"
}
}
}
}
启动命令npx -y fizzl-paypal-guard-mcp
需要配置的环境变量
PAYPAL_CLIENT_IDClient ID of your PayPal REST app (developer.paypal.com)
PAYPAL_CLIENT_SECRET密钥Secret of your PayPal REST app
PAYPAL_ENVIRONMENTSANDBOX (default) or PRODUCTION
LIMIT_REFUNDMost per refund without asking you (default 25.00)
LIMIT_REFUND_PER_DAYRefunds a day in total (default 100.00)
LIMIT_REFUNDS_PER_DAYNumber of refunds a day (default 10)
LIMIT_CURRENCYCurrency of the limits (default USD)
GUARD_POLICYOther rules as JSON, e.g. {"dispute":"deny","stop":"ask"}
FIZZL_AGENT_KEY密钥Approvals in the Fizzl Agent Wallet (Telegram + dashboard): an agent key awk_… from wallet.fizzl.eu
TELEGRAM_BOT_TOKEN密钥Approvals through your own Telegram bot
TELEGRAM_CHAT_IDYour Telegram chat id (approvals go only there)
APPROVAL_IN_CHAToff to never ask in the chat app (MCP elicitation)
APPROVAL_MINUTESHow long you have to answer (default 10)

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmfizzl-paypal-guard-mcp0.2.1

工具

49

收录的工具列表 · 更新于 1 周前

参数类型必填说明
notestring否给发票接收方的备注。也会显示在发票通知邮件中。
itemsarray是发票中的明细项。
allow_tipboolean否付款人是否可以在付款时添加小费。在香港、台湾、印度或日本不可用。
referencestring否参考值,例如采购订单号。
theme_colorstring否用于呈现发票的主色,采用十六进制颜色代码(例如 #000000)。如果省略,则使用默认主题。
invoice_datestring否采用 yyyy-MM-DD 格式的发票日期。
currency_codestring是发票使用的三字符 ISO-4217 货币代码(例如 USD)。适用于发票中的所有金额。
invoicer_citystring否开票方地址所在的城市、城镇或村庄。
shipping_coststring否发票的运费,使用发票的 currency_code。
invoice_numberstring否发票编号。如果省略,PayPal 会从上次使用的发票编号开始自动递增。
invoicer_statestring否开票方地址所在的州或省。
invoicer_tax_idstring否开票方的税号。
invoicer_surnamestring否开票方的姓氏。
enable_pay_by_bankboolean否是否为此发票启用 PAY_BY_BANK 作为付款方式,让付款人直接从其银行账户付款。仅适用于美国商家以及币种为 USD 的发票。
primary_recipientsarray是将为此发票开具账单的收件人。
invoicer_given_namestring否开票方的名字。
invoicer_postal_codestring否开票方地址的邮政编码。
allow_partial_paymentboolean否发票是否允许部分付款。若为 false,则必须全额付款;若为 true,则允许部分付款。印度、巴西或以色列的用户无法使用。
invoicer_country_codestring否开票方地址所在国家/地区的两位字符 ISO 3166-1 国家/地区代码(例如 US 或 GB)。
invoicer_business_namestring否开票方的企业名称。
invoicer_email_addressstring否开票方的电子邮件地址。
invoicer_address_line_1string否开票方地址的第一行,例如门牌号和街道名称。
invoicer_address_line_2string否开票方地址的第二行,例如套房号或公寓号。
minimum_partial_payment_amountstring否部分付款允许的最低金额,使用发票的 currency_code。仅当 allow_partial_payment 为 true 时有效。
pay_by_bank_exclusive_above_thresholdboolean否为 true 时,一旦发票总额超过 PayPal 系统定义的阈值($1000),PAY_BY_BANK 将成为唯一可用的付款方式,并禁用超过该阈值时的所有其他付款方式。

详细介绍

fizzl-paypal-guard-mcp

PayPal 的 Agent Toolkit 作为 MCP 服务,适用于 Claude Desktop、Claude Code、Cursor 和其他 MCP 客户端,并在模型与 PayPal 之间加入 fizzl-paypal-guard。

它包含与 PayPal 自己的 MCP 服务(@paypal/mcp)相同的 47 个工具,名称也完全相同。区别在于:每次涉及转移或承诺资金的调用,都会先经过检查。

  • 读取操作直接通过。 订单、发票、交易、争议和退款:尽管查看。
  • 退款金额绝不会超过剩余金额。 未指定金额的退款会退还一笔付款的全部剩余金额。守卫会先从 PayPal 读取该笔付款。已全额退款的付款会被阻止再次退款,退款金额超过剩余金额也会被阻止。
  • 银行已付款时不退款。 如果一笔付款存在尚未解决的拒付或争议,该笔付款的退款就会被阻止:否则买家会拿到两次钱,而 PayPal 会放行这笔退款。
  • 由你设定限额。 默认情况下,每笔退款最高 25 美元,每天最多退款 100 美元、共 10 笔;每笔付款每天最多退款一次;同一客户在 30 天内的第三笔退款需要你确认。取消和账单也有每日次数限制。
  • 其余情况由你决定。 超过限额,以及每一笔已受理的争议、价格变更或标记为已付款的发票,都会提供“批准”和“拒绝”选项:你可以在手机上(通过 Telegram 或 Fizzl Agent Wallet)或直接在聊天应用中处理。没有答复就视为拒绝。
  • 日志不由 Agent 写入。 每项非读取操作都会记录在你的设备上,包含处理决定、原因和批准人。当天的计数也会保存在本地,因此重启应用不会让 Agent 获得全新的每日限额。

被拦截的调用会返回 { "blocked": true, "reasons": […], "message": "Not done (…)" },消息会告知模型不要尝试其他方式。模型无法通过说辞绕过守卫:检查依据的是 PayPal 的实际信息和你设定的限额,而不是对话内容。

守卫的在线演示(PayPal 沙盒中的客服 Agent):https://fizzl-paypal-demo.onrender.com

设置

  1. 创建一个 REST 应用:前往 developer.paypal.com → Apps & Credentials。从 Sandbox 开始:这里只使用测试资金。复制应用的客户端 ID 和密钥。
  2. 将服务添加到 MCP 客户端。 对于 Claude Desktop,在 claude_desktop_config.json 中:
{
  "mcpServers": {
    "paypal": {
      "command": "npx",
      "args": ["-y", "fizzl-paypal-guard-mcp", "--tools=all"],
      "env": {
        "PAYPAL_CLIENT_ID": "your sandbox client id",
        "PAYPAL_CLIENT_SECRET": "your sandbox secret",
        "PAYPAL_ENVIRONMENT": "SANDBOX"
      }
    }
  }
}

对于 Claude Code:

claude mcp add paypal -e PAYPAL_CLIENT_ID=… -e PAYPAL_CLIENT_SECRET=… -e PAYPAL_ENVIRONMENT=SANDBOX -- npx -y fizzl-paypal-guard-mcp --tools=all

Claude Desktop,双击即可安装: 下载 fizzl-paypal-guard-mcp.mcpb,然后用 Claude Desktop 打开。它会提示你输入客户端 ID 和密钥、设置限额,以及(如有需要)提供 Fizzl 钱包密钥或 Telegram 机器人;无需在配置文件中输入任何内容。

  1. 重启应用,然后试着提问,例如:“列出我过去一周的 PayPal 交易”,再试试 “全额退还 capture 2GG…”。询问 paypal_guard_status,了解守卫允许哪些操作,以及它今天执行了哪些操作。

从 @paypal/mcp 切换过来?使用相同的 --tools 列表。与 PAYPAL_ACCESS_TOKEN 不同,此服务使用应用的客户端 ID 和密钥:访问令牌大约九小时后就会失效,而且守卫需要自行读取付款信息。

审批

当某项操作需要你确认时,服务会向以下已设置的第一个渠道发起请求:

渠道方式设置
Fizzl Agent Wallet在 Telegram(@FizzlWalletBot)或钱包仪表板中,像查看 Agent 的其他付款一样,选择批准或拒绝。处理结果(PayPal 的退款 ID)会显示在相应的收据上。FIZZL_AGENT_KEY:来自 wallet.fizzl.eu → Agents 的 Agent 密钥(awk_…)
你自己的 Telegram 机器人机器人会发送一条包含批准和拒绝选项的消息。通过 @BotFather 创建机器人并向其发送 /start;从 @userinfobot 获取你的聊天 ID。机器人不得设置 webhook。TELEGRAM_BOT_TOKEN、TELEGRAM_CHAT_ID
聊天应用中应用本身会显示一个表单(MCP elicitation),供你选择批准或拒绝。只有你可以回答,模型不能回答。适用于支持 elicitation 的 MCP 客户端,例如 Claude Code;其他客户端请使用手机。不要设置会自动回答这些表单的钩子(Claude Code 的 Elicitation 钩子可以做到这一点)。无;设置 APPROVAL_IN_CHAT=off 可关闭

如果以上渠道都未设置,任何超过限额的操作都不会执行。

更推荐使用手机:请求会发送到与你运行 Agent 的设备不同的设备上。而且它的等待时间可以超过 MCP 客户端等待工具调用的时间。如果在 APPROVAL_WAIT_SECONDS(45)秒后你仍未回复,调用会返回 "waiting": true 和一个审批 ID。审批流程会继续:在 APPROVAL_MINUTES(10)分钟内批准,操作就会执行;否则不会发生任何操作。模型会收到不要重试的提示,而 paypal_guard_status 搭配审批 ID 可以显示处理结果。

设置

变量
PAYPAL_CLIENT_ID、PAYPAL_CLIENT_SECRET你的 REST 应用凭据。未设置时,服务会列出其工具,并在每次调用时说明如何设置。
PAYPAL_ENVIRONMENTSANDBOX(默认)或 PRODUCTION
--tools= 或 PAYPAL_TOOLSall(默认),或使用 PayPal MCP 服务中的工具名称:payments.createRefund,payments.getRefunds,orders.get,transactions.list,invoices.list,…
LIMIT_REFUND无需询问即可执行的单笔退款最高金额(默认 25.00)
LIMIT_REFUND_PER_DAY每日退款总额(默认 100.00)
LIMIT_REFUNDS_PER_DAY每日退款笔数(默认 10)
LIMIT_CURRENCY限额使用的币种(默认 USD)。退款使用其他币种时会向你确认。
GUARD_POLICY其他策略,以 JSON 格式设置,基于默认值进行配置:例如 {"dispute":"deny","stop":"ask","bill":{"countPerDay":5}};或设置为 {"returnDays":30},以便在退款支付时间距今超过你的退货期限时向你确认。每种情况可设置为 "allow"、"ask"、"deny" 或限额。
FIZZL_AGENT_KEY、FIZZL_WALLET_URL通过 Fizzl Agent Wallet 审批(URL 默认值为 https://wallet.fizzl.eu)
TELEGRAM_BOT_TOKEN、TELEGRAM_CHAT_ID通过你自己的 Telegram 机器人审批
APPROVAL_IN_CHAT设置为 off,以始终不在聊天应用中询问
APPROVAL_MINUTES你可以回复的时限(默认 10)
APPROVAL_WAIT_SECONDS工具调用等待你回复的时长,超时后返回 "waiting"(默认 45)
AGENT_NAME手机上显示的名称(默认:MCP 客户端的名称)
GUARD_STATE_DIR保存每日计数和日志的位置(默认 ~/.fizzl-paypal-guard;沙盒环境和正式环境分开存储)

工具

PayPal Agent Toolkit 1.11 的所有工具,按它们对资金的操作分类:

类型工具默认规则
读取get_order、list_transactions、get_refund、list_invoices、get_invoice、list_disputes、get_dispute、…放行
退款create_refund不超过剩余可退款金额;有未结信用卡拒付或争议的付款不能退款;每笔 $25,每天 $100 且最多 10 笔;之后由你决定
争议accept_dispute_claim(向买家付款)每笔由你决定
账簿record_payment_for_invoice、record_refund_for_invoice(标记为已转账,但实际上没有资金流动)由你决定
停止cancel_subscription、cancel_sent_invoice、delete_invoice、…每天 3 笔;之后由你决定
价格update_product、update_plan、update_subscription、create_subscription_plan、…由你决定
收款create_invoice、send_invoice、create_subscription、…每天 20 笔;之后由你决定
其他create_order、pay_order、create_shipment_tracking、send_invoice_reminder、…放行

如果防护程序尚不认识某个工具(例如较新版本工具包中的工具),总会先询问你。完整列表见 actions.js。

此外,它还有两个自带工具:

工具
paypal_guard_status查看你的限额、今天已用额度、等待你审批的请求,以及日志中的最新决策。提供 approval_id 时,可查看相应审批的处理结果。
paypal_guard_check试运行:查看防护程序会如何处理某次调用及原因,但不会实际执行。

面向服务客户的应用

在你与 Claude 的私人对话中,发出指令的人是你。客服机器人则不同:它代表客户行事,而客户可能会声称任何事情(“我替我丈夫联系,这是他的付款编号”)。因此,防护程序还会检查退款、取消或账单是否属于应用正在服务的客户。

由应用而非模型告知服务端客户身份:该信息位于工具调用的 _meta 中,模型无法修改。

await mcpClient.callTool({
  name: "create_refund",
  arguments: { capture_id: "2GG…" },
  _meta: { "fizzl.eu/customer": "[email protected]", "fizzl.eu/request": "My mug arrived broken" },
});

对于 PayPal 结账付款,PayPal 知道付款人的电子邮件地址。银行卡付款没有电子邮件地址;对于这类付款,请在自己的代码中使用 fizzl-paypal-guard 的 customerOf 钩子,就像演示商店那样。

须知

  • 先在沙盒中测试。 使用 PRODUCTION 时,退款是真实的。
  • 每天的计数按机器计算。两台电脑使用同一个 PayPal 应用时,各自有独立的每日限额。
  • 防护程序通过同一个 REST 应用读取 PayPal 中的付款信息。它本身绝不会转移资金。
  • PayPal 数据中的文本(账单备注、争议信息、商品描述)由他人撰写。服务端会告知模型将其视为信息,而非指令。防护程序不会依赖模型是否听从。

开发

npm ci
npm test                          # the MCP server with a pretend PayPal
PAYPAL_SANDBOX_CLIENT_ID=… PAYPAL_SANDBOX_SECRET=… node test/sandbox.mjs   # against the PayPal sandbox

GitHub Actions 会在每次变更时运行沙盒检查(paypal-sandbox.yml):两位客户使用银行卡付款,然后通过 MCP 执行一笔 $12 退款;一笔 $300 退款会等待所有者审批,并在点击 Approve 后执行;对于已全额退款的付款再次发起退款,则会被拦截。

MIT · Fizzl

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。