INTEGRITY Dokumentace

Platba z Agents SDK

Pomocí Cloudflare Agents SDK plaťte za služby MPP. Tento mppx SDK zajišťuje opakování plateb u HTTP požadavků a volání nástrojů přes Model Context Protocol (MCP).

Předpoklady

Vytvořte projekt Cloudflare Agents. Dobijte účet u platební metody, kterou služba přijímá.

Konfigurace plateb

  1. Nainstalujte Agents SDK, mppx, a viem:

    npm i agents mppx viem
  2. Uložte soukromý platební klíč jako Tajný klíč Workeru:

    npx wrangler secret put MPP_PRIVATE_KEY
  3. Vytvořte platební metodu jednou:

    src/payments.js
    import { tempo } from "mppx/client";
    import { privateKeyToAccount } from "viem/accounts";
    
    export function createPaymentMethods(privateKey) {
    	const account = privateKeyToAccount(privateKey);
    
    	return [tempo.charge({ account })];
    }
    src/payments.ts
    import { tempo } from "mppx/client";
    import { privateKeyToAccount } from "viem/accounts";
    
    export function createPaymentMethods(privateKey: string) {
      const account = privateKeyToAccount(privateKey as `0x${string}`);
    
      return [tempo.charge({ account })] as const;
    }

Platba za HTTP službu

Vytvořte klienta podporujícího platby v onStart(). Omezte automatické platby na důvěryhodné origins:

src/agent.js
import { Agent } from "agents";
import { Mppx } from "mppx/client";
import { createPaymentMethods } from "./payments";

export class BuyerAgent extends Agent {
	methods;
	payments;

	async onStart() {
		this.methods = createPaymentMethods(this.env.MPP_PRIVATE_KEY);
		this.payments = Mppx.create({
			acceptPaymentPolicy: { origins: ["https://api.example.com"] },
			methods: this.methods,
			polyfill: false,
		});
	}

	async buyReport() {
		const response = await this.payments.fetch(
			"https://api.example.com/reports/latest",
		);

		if (!response.ok) throw new Error(`Request failed: ${response.status}`);
		return response.json();
	}
}
src/agent.ts
import { Agent } from "agents";
import { Mppx } from "mppx/client";
import { createPaymentMethods } from "./payments";

type PaymentEnv = Env & { MPP_PRIVATE_KEY: string };

export class BuyerAgent extends Agent<PaymentEnv> {
	methods!: ReturnType<typeof createPaymentMethods>;
	payments!: ReturnType<typeof Mppx.create>;

	async onStart() {
		this.methods = createPaymentMethods(this.env.MPP_PRIVATE_KEY);
		this.payments = Mppx.create({
			acceptPaymentPolicy: { origins: ["https://api.example.com"] },
			methods: this.methods,
			polyfill: false,
		});
	}

	async buyReport() {
		const response = await this.payments.fetch(
			"https://api.example.com/reports/latest",
		);

		if (!response.ok) throw new Error(`Request failed: ${response.status}`);
		return response.json();
	}
}

Bezplatné endpointy procházejí beze změny. Placené endpointy spustí opakování platby a vrátí Payment-Receipt hlavička.

Platba za nástroj MCP

Připojte Agenta pomocí addMcpServer(). Před obalením jeho klienta počkejte na navázání připojení:

src/agent.js
import { Agent } from "agents";
import { McpClient } from "mppx/mcp/client";
import { createPaymentMethods } from "./payments";

export class BuyerAgent extends Agent {
	methods;

	async onStart() {
		this.methods = createPaymentMethods(this.env.MPP_PRIVATE_KEY);
	}

	async paidSearch() {
		const connection = await this.addMcpServer(
			"premium-search",
			"https://mcp.example.com/mcp",
		);
		if (connection.state === "authenticating") {
			return { authUrl: connection.authUrl };
		}

		await this.mcp.waitForConnections();

		const server = this.getMcpServers().servers[connection.id];
		const mcpConnection = this.mcp.mcpConnections[connection.id];
		if (server?.state !== "ready" || !mcpConnection) {
			throw new Error("MCP server is not ready.");
		}

		const client = McpClient.wrap(mcpConnection.client, {
			methods: this.methods,
		});
		const result = await client.callTool({
			name: "premium_search",
			arguments: { query: "Cloudflare Agents" },
		});

		return { content: result.content, receipt: result.receipt };
	}
}
src/agent.ts
import { Agent } from "agents";
import { McpClient } from "mppx/mcp/client";
import { createPaymentMethods } from "./payments";

type PaymentEnv = Env & { MPP_PRIVATE_KEY: string };

export class BuyerAgent extends Agent<PaymentEnv> {
	methods!: ReturnType<typeof createPaymentMethods>;

	async onStart() {
		this.methods = createPaymentMethods(this.env.MPP_PRIVATE_KEY);
	}

	async paidSearch() {
		const connection = await this.addMcpServer(
			"premium-search",
			"https://mcp.example.com/mcp",
		);
		if (connection.state === "authenticating") {
			return { authUrl: connection.authUrl };
		}

		await this.mcp.waitForConnections();

		const server = this.getMcpServers().servers[connection.id];
		const mcpConnection = this.mcp.mcpConnections[connection.id];
		if (server?.state !== "ready" || !mcpConnection) {
			throw new Error("MCP server is not ready.");
		}

		const client = McpClient.wrap(mcpConnection.client, {
			methods: this.methods,
		});
		const result = await client.callTool({
			name: "premium_search",
			arguments: { query: "Cloudflare Agents" },
		});

		return { content: result.content, receipt: result.receipt };
	}
}

Pokud paidSearch() vrací authUrl, pošlete uživatele na tuto URL a po autorizaci to zkuste znovu.

Wrapper opakuje placené volání nástroje s MPP Credential. Výsledek obsahuje MPP Receipt jako result.receipt.

Ve výchozím nastavení oba klienti automaticky platí kompatibilní Challenge. Použijte onChallenge pro HTTP nebo onPaymentRequired pro MCP, když platba vyžaduje schválení. Částky výzvy jsou celočíselné základní jednotky, nikoli desetinné zobrazované hodnoty.

Platba za služby x402

mppx HTTP klient také rozpoznává x402 Challenges. Vedle metody MPP nakonfigurujte metodu EVM kompatibilní s x402. Služba nevyžaduje žádné úpravy. Konfiguraci najdete v Použití MPP s x402 ↗.

Chcete-li přijímat platby, přejděte na Přijímání plateb pomocí MPP. Pro možnosti připojení MCP si přečtěte API klienta MCP.