订阅管理服务

一个基于PayMCP和Stripe的订阅管理服务,用于保护MCP工具并提供付费访问控制。

  • by PayMCP
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 PayMCP/paymcp-subscription-demo-py

使用说明

PayMCP订阅演示(Python)

示例MCP服务器,使用PayMCP为活动订阅提供工具,Stripe作为计费提供商,OAuth/OIDC进行身份验证。

  • 使用承载令牌保护MCP工具免受Auth0、通用OIDC或Keycloak的攻击
  • 强制使用付费工具(演示 add 工具)通过Stripe订阅
  • 在MCP客户端的根目录中公开OAuth发现元数据

快速启动

  1. 复制 .env.example 到 .env 并填写您的auth+Tripe值。
  2. 安装deps: pdm install -d.
  3. 运行服务器: pdm run server.py (默认值:http://localhost:8000).
  4. 连接MCP客户端,进行身份验证,然后调用 add 工具-访问需要活动的Stripe订阅匹配 STRIPE_SUBSCRIPTION_ID.

环境

  • HOST / PORT:MCP服务器主机/端口(默认值: localhost:8000).
  • OIDC_ISSUER:Auth0/通用OIDC的颁发者URL(如果使用Keycloak样式配置,请留空)。
  • AUTH_HOST, AUTH_PORT, AUTH_REALM:钥匙斗篷位置(如果不使用) OIDC_ISSUER.
  • OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET:OAuth客户端凭据。
  • STRIPE_SECRET_KEY:PayMCP的条纹密钥。
  • STRIPE_SUBSCRIPTION_ID:代表所需计划的条纹价格ID。

身份验证提供程序设置

Auth0
  1. 在Auth0仪表板中:应用程序->API-> 创建API.Set Identifier 到您的MCP服务器主机名(例如。, http://localhost:8000/mcp).
  2. 创建客户端应用程序并复制 domain, client ID, client secret 进入 .env (OIDC_ISSUER, OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET).
  3. 身份验证->数据库:创建 用户名密码验证 连接。
  4. 用户名密码验证 connection->将该连接提升到域级别。
  5. 设置->高级设置:启用 动态客户端注册(DCR) 和 资源参数兼容性配置文件.
Keycloak

使用官方MCP授权演练:https://modelcontextprotocol.io/docs/tutorials/security/authorization.然后设置 AUTH_HOST, AUTH_PORT, AUTH_REALM, OAUTH_CLIENT_ID,以及 OAUTH_CLIENT_SECRET 在 .env (离开 OIDC_ISSUER 空)。

条纹设置

  1. 在Stripe仪表板中创建产品和经常性价格。
  2. 集 STRIPE_SUBSCRIPTION_ID 该价格ID。
  3. 集 STRIPE_SECRET_KEY 您的Stripe密钥。
    PayMCP将使用这些来检查订阅状态,并生成向MCP客户端公开的结账/管理链接。

跑步

  • 开发服务器: pdm run server.py

MCP服务器通过HTTP运行,具有OAuth保护的端点(/ 用于会话请求)。OAuth元数据通过以下方式自动为客户端发布 mcpAuthMetadataRouter.

访问控制是如何工作的

  • OAuth承载令牌会根据您的提供商进行验证,并且必须针对MCP资源(HOST:PORT).
  • 演示 add 工具通过以下方式声明订阅要求 _meta.subscription.plan = STRIPE_SUBSCRIPTION_ID;PayMCP强制执行。
  • PayMCP增加了三种帮助方法,让用户获得结账链接,并在聊天中直接管理他们的订阅。

故障排除

  • 401或受众错误:确保API Identifier (Auth0)或资源指示符匹配 http://HOST:PORT/mcp.
  • JWT形状无效:请确认您的提供商发布了JWT访问令牌(不是不透明令牌)。
  • 条纹错误:仔细检查 STRIPE_SECRET_KEY 而那个 STRIPE_SUBSCRIPTION_ID 存在并处于活动状态。