本项目帮助你在 Cloudflare 上创建自己的远程 MCP 服务器,并支持用户登录和支付选项。你不需要是技术专家就能运行它。
[!NOTE] 该项目现在免费使用且开源。如果你想支持我,请在 X 上关注我 @iannuttall,并订阅我的时事通讯。
开始之前,请确保你有:
git clone https://github.com/iannuttall/mcp-boilerplate.git
cd mcp-boilerplate
npm install
npm install -g wrangler
npx wrangler kv namespace create "OAUTH_KV"
注意:你不能为此数据库使用不同的名称。必须是 "OAUTH_KV"。
执行此命令后,你会看到包含 id 和 preview_id 值的文本
打开项目文件夹中的 wrangler.jsonc 文件
查找 "kv_namespaces": [ 部分
在那里添加你的数据库信息:
"kv_namespaces": [
{
"binding": "OAUTH_KV",
"id": "paste-your-id-here",
"preview_id": "paste-your-preview-id-here"
}
]
cp .dev.vars.example .dev.vars
在代码编辑器中打开 .dev.vars 文件
你需要在这里添加几个值(我们将在接下来的步骤中获取它们)
http://localhost:8787/callback/google
.dev.vars 文件中:GOOGLE_CLIENT_ID="paste-your-client-id-here"
GOOGLE_CLIENT_SECRET="paste-your-client-secret-here"
完成这一步后,如果你不需要 GitHub 登录,可以直接进入第五步。
如果你更喜欢使用 GitHub 登录而不是 Google:
http://localhost:8787http://localhost:8787/callback/github.dev.vars 文件中:GITHUB_CLIENT_ID="paste-your-client-id-here"
GITHUB_CLIENT_SECRET="paste-your-client-secret-here"
src/index.tsimport { GoogleHandler } from "./auth/google-handler";import { GitHubHandler } from "./auth/github-handler";defaultHandler: GoogleHandler as any, 行defaultHandler: GitHubHandler as any,完成第四步A或第四步B后,继续第五步。
sk_test_ 开头)price_ 开头).dev.vars 文件中:STRIPE_SECRET_KEY="sk_test_your-key-here"
STRIPE_SUBSCRIPTION_PRICE_ID="price_your-price-id-here"
STRIPE_METERED_PRICE_ID="your-stripe-metered-price-id"
此模板包括一个工具 (check_user_subscription_status),可以为最终用户提供一个链接到他们的 Stripe 客户账单门户。该门户允许他们管理他们的订阅,例如取消订阅或(如果配置的话)在不同计划之间切换。
初始设置(重要):
默认情况下,Stripe 客户账单门户可能没有完全配置在你的 Stripe 账户中,特别是在测试环境中。
check_user_subscription_status 工具(例如通过 MCP Inspector,或通过 AI 助手触发它)。billingPortal.message 包含类似错误:"无法生成客户账单门户的链接:未提供配置且您的测试模式默认配置尚未创建。提供配置或通过在测试模式下保存客户门户设置来创建默认配置,网址为 https://dashboard.stripe.com/test/settings/billing/portal。"https://dashboard.stripe.com/test/settings/billing/portal),并在 Stripe 中保存你的门户设置。这将激活你的测试环境中的门户。你还需要对生产环境进行类似的检查和配置。一旦激活,check_user_subscription_status 工具将在其 JSON 响应的 billingPortal.url 字段中提供一个直接链接,用户可以使用它。
允许用户切换计划(可选):
默认情况下,账单门户允许用户取消现有订阅。如果你为你的 MCP 服务器提供了多个订阅产品,并希望允许用户在它们之间切换:
https://dashboard.stripe.com/settings/billing/portal 用于生产模式,或 https://dashboard.stripe.com/test/settings/billing/portal 用于测试模式)。这种配置使用户能够通过 Stripe 托管的门户更灵活地管理他们的订阅。
确保你的 .dev.vars 文件包含所有这些值:
BASE_URL="http://localhost:8787"
COOKIE_ENCRYPTION_KEY="生成至少32个字符的随机字符串"
GOOGLE_CLIENT_ID="你的Google客户端ID"
GOOGLE_CLIENT_SECRET="你的Google客户端密钥"
STRIPE_SECRET_KEY="你的Stripe密钥"
STRIPE_SUBSCRIPTION_PRICE_ID="你的Stripe价格ID"
STRIPE_METERED_PRICE_ID="你的Stripe计量价格ID"
对于 COOKIE_ENCRYPTION_KEY,你可以使用以下命令生成一个随机字符串:
openssl rand -hex 32
npx wrangler dev
你的服务器将在 http://localhost:8787 启动
AI 工具的主要端点位于 http://localhost:8787/sse
你可以通过连接到 AI 助手来测试你的服务器:
http://localhost:8787/sse或者使用 Claude Desktop:
{
"mcpServers": {
"my_server": {
"command": "npx",
"args": [
"mcp-remote",
"http://localhost:8787/sse"
]
}
}
}
或者使用 MCP Inspector:
npx @modelcontextprotocol/inspector@0.11.0
[!WARNING] 最新版本的 MCP Inspector 是 0.12.0,但目前使用
npx @modelcontextprotocol/inspector@latest不起作用。正在解决这个问题。
http://localhost:8787/sse当你准备好让你的服务器在线可用时:
npx wrangler deploy
https://your-worker-name.your-account.workers.dev3a. 更新你的 Google OAuth 设置:
https://your-worker-name.your-account.workers.dev/callback/google。3b. 更新你的 GitHub OAuth 应用设置:(可选)
https://your-worker-name.your-account.workers.dev/callback/githubnpx wrangler secret put BASE_URL
npx wrangler secret put COOKIE_ENCRYPTION_KEY
npx wrangler secret put GOOGLE_CLIENT_ID
npx wrangler secret put GOOGLE_CLIENT_SECRET
npx wrangler secret put STRIPE_SECRET_KEY
npx wrangler secret put STRIPE_SUBSCRIPTION_PRICE_ID
npx wrangler secret put STRIPE_METERED_PRICE_ID
对于 BASE_URL,使用你的 Cloudflare URL:https://your-worker-name.your-account.workers.dev
你可以轻松地通过向 src/tools 文件夹添加新文件来创建自己的 AI 工具。该项目附带了免费和付费工具的例子。
要创建一个免费工具(用户无需支付即可访问):
src/tools 文件夹中创建一个新文件(例如:myTool.ts)add.ts 示例中复制此模板:import { z } from "zod";
import { experimental_PaidMcpAgent as PaidMcpAgent } from "@stripe/agent-toolkit/cloudflare";
export function myTool(agent: PaidMcpAgent<Env, any, any>) {
const server = agent.server;
// @ts-ignore
server.tool(
"my_tool_name", // 工具名称
"此工具执行一些很酷的操作。", // 描述你的工具做什么
{ // 输入参数
input1: z.string(), // 使用 Zod 定义参数
input2: z.number() // 例如,字符串、数字、布尔值
},
async ({ input1, input2 }: { input1: string; input2: number }) => ({
// 当调用工具时运行的函数
content: [{ type: "text", text: `您提供了:${input1} 和 ${input2}` }],
})
);
}
修改代码以创建你自己的工具:
myTool)my_tool_name)在 src/tools/index.ts 中添加你的工具:
// 添加这一行与其他导出一起
export * from './myTool';
src/index.ts 中注册你的工具:// 在 init() 方法内部添加:
tools.myTool(this);
你可以通过三种方式创建需要支付的工具:定期订阅、计量使用或一次性付款。
如果你想要按月等周期性费用收取用户访问工具或一组工具的费用,此选项适合你。
Stripe 订阅计费设置:
price_xxxxxxxxxxxxxx)。这就是你在 .dev.vars 文件和注册工具时使用的 STRIPE_SUBSCRIPTION_PRICE_ID。工具实现:
src/tools 文件夹中创建一个新文件(例如:mySubscriptionTool.ts)subscriptionAdd.ts 示例中复制此模板:import { z } from "zod";
import { experimental_PaidMcpAgent as PaidMcpAgent } from "@stripe/agent-toolkit/cloudflare";
import { REUSABLE_PAYMENT_REASON } from "../helpers/constants";
export function mySubscriptionTool(
agent: PaidMcpAgent<Env, any, any>,
env?: { STRIPE_SUBSCRIPTION_PRICE_ID: string; BASE_URL: string }
) {
const priceId = env?.STRIPE_SUBSCRIPTION_PRICE_ID || null;
const baseUrl = env?.BASE_URL || null;
if (!priceId || !baseUrl) {
throw new Error("付费工具必须提供 Stripe Price ID 和 Base URL");
}
agent.paidTool(
"my_subscription_tool_name", // 工具名称
{
// 输入参数
input1: z.string(), // 使用 Zod 定义参数
input2: z.number(), // 例如,字符串、数字、布尔值
},
async ({ input1, input2 }: { input1: string; input2: number }) => ({
// 当调用工具时运行的函数
content: [
{ type: "text", text: `您提供了:${input1} 和 ${input2}` },
],
}),
{
priceId, // 使用 Stripe 订阅产品的价格 ID
successUrl: `${baseUrl}/payment/success`,
paymentReason: REUSABLE_PAYMENT_REASON, // 显示给用户的通用原因
}
);
}
mySubscriptionTool)my_subscription_tool_name)src/tools/index.ts 中添加你的工具:// 添加这一行与其他导出一起
export * from './mySubscriptionTool';
5