@pincerpay/mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +30 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/client.d.ts +28 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +60 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/index.d.ts +5 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +3 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/prompts/debug-transaction.d.ts +3 -0
  16. package/dist/prompts/debug-transaction.d.ts.map +1 -0
  17. package/dist/prompts/debug-transaction.js +31 -0
  18. package/dist/prompts/debug-transaction.js.map +1 -0
  19. package/dist/prompts/get-started.d.ts +3 -0
  20. package/dist/prompts/get-started.d.ts.map +1 -0
  21. package/dist/prompts/get-started.js +40 -0
  22. package/dist/prompts/get-started.js.map +1 -0
  23. package/dist/prompts/index.d.ts +3 -0
  24. package/dist/prompts/index.d.ts.map +1 -0
  25. package/dist/prompts/index.js +11 -0
  26. package/dist/prompts/index.js.map +1 -0
  27. package/dist/prompts/integrate-agent.d.ts +3 -0
  28. package/dist/prompts/integrate-agent.d.ts.map +1 -0
  29. package/dist/prompts/integrate-agent.js +41 -0
  30. package/dist/prompts/integrate-agent.js.map +1 -0
  31. package/dist/prompts/integrate-merchant.d.ts +3 -0
  32. package/dist/prompts/integrate-merchant.d.ts.map +1 -0
  33. package/dist/prompts/integrate-merchant.js +39 -0
  34. package/dist/prompts/integrate-merchant.js.map +1 -0
  35. package/dist/resources/chain-config.d.ts +3 -0
  36. package/dist/resources/chain-config.d.ts.map +1 -0
  37. package/dist/resources/chain-config.js +29 -0
  38. package/dist/resources/chain-config.js.map +1 -0
  39. package/dist/resources/docs.d.ts +3 -0
  40. package/dist/resources/docs.d.ts.map +1 -0
  41. package/dist/resources/docs.js +460 -0
  42. package/dist/resources/docs.js.map +1 -0
  43. package/dist/resources/index.d.ts +4 -0
  44. package/dist/resources/index.d.ts.map +1 -0
  45. package/dist/resources/index.js +9 -0
  46. package/dist/resources/index.js.map +1 -0
  47. package/dist/resources/openapi-spec.d.ts +4 -0
  48. package/dist/resources/openapi-spec.d.ts.map +1 -0
  49. package/dist/resources/openapi-spec.js +28 -0
  50. package/dist/resources/openapi-spec.js.map +1 -0
  51. package/dist/server.d.ts +18 -0
  52. package/dist/server.d.ts.map +1 -0
  53. package/dist/server.js +48 -0
  54. package/dist/server.js.map +1 -0
  55. package/dist/tools/check-transaction.d.ts +4 -0
  56. package/dist/tools/check-transaction.d.ts.map +1 -0
  57. package/dist/tools/check-transaction.js +50 -0
  58. package/dist/tools/check-transaction.js.map +1 -0
  59. package/dist/tools/estimate-gas.d.ts +3 -0
  60. package/dist/tools/estimate-gas.d.ts.map +1 -0
  61. package/dist/tools/estimate-gas.js +88 -0
  62. package/dist/tools/estimate-gas.js.map +1 -0
  63. package/dist/tools/generate-ucp.d.ts +3 -0
  64. package/dist/tools/generate-ucp.d.ts.map +1 -0
  65. package/dist/tools/generate-ucp.js +103 -0
  66. package/dist/tools/generate-ucp.js.map +1 -0
  67. package/dist/tools/index.d.ts +4 -0
  68. package/dist/tools/index.d.ts.map +1 -0
  69. package/dist/tools/index.js +19 -0
  70. package/dist/tools/index.js.map +1 -0
  71. package/dist/tools/list-chains.d.ts +4 -0
  72. package/dist/tools/list-chains.d.ts.map +1 -0
  73. package/dist/tools/list-chains.js +56 -0
  74. package/dist/tools/list-chains.js.map +1 -0
  75. package/dist/tools/scaffold-agent.d.ts +3 -0
  76. package/dist/tools/scaffold-agent.d.ts.map +1 -0
  77. package/dist/tools/scaffold-agent.js +93 -0
  78. package/dist/tools/scaffold-agent.js.map +1 -0
  79. package/dist/tools/scaffold-middleware.d.ts +3 -0
  80. package/dist/tools/scaffold-middleware.d.ts.map +1 -0
  81. package/dist/tools/scaffold-middleware.js +160 -0
  82. package/dist/tools/scaffold-middleware.js.map +1 -0
  83. package/dist/tools/validate-config.d.ts +3 -0
  84. package/dist/tools/validate-config.d.ts.map +1 -0
  85. package/dist/tools/validate-config.js +105 -0
  86. package/dist/tools/validate-config.js.map +1 -0
  87. package/dist/transport/http.d.ts +7 -0
  88. package/dist/transport/http.d.ts.map +1 -0
  89. package/dist/transport/http.js +34 -0
  90. package/dist/transport/http.js.map +1 -0
  91. package/package.json +70 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-transaction.js","sourceRoot":"","sources":["../../src/tools/check-transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,WAAW,GAAG;IAClB,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACP,qEAAqE,CACtE;CACJ,CAAC;AAEF,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,MAAyB;IAEzB,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,2EAA2E;QACzE,0FAA0F;QAC1F,+CAA+C,EACjD,WAAW,EACX,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;qBACvD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBACtC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,uCAAuC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;qBAChG;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerEstimateGas(server: McpServer): void;
3
+ //# sourceMappingURL=estimate-gas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimate-gas.d.ts","sourceRoot":"","sources":["../../src/tools/estimate-gas.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqDzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,QAqDpD"}
@@ -0,0 +1,88 @@
1
+ import { z } from "zod";
2
+ import { CHAINS, resolveChain } from "@pincerpay/core";
3
+ const inputSchema = {
4
+ chain: z.string().describe("Chain shorthand (e.g., 'solana', 'base', 'polygon', 'solana-devnet'). " +
5
+ `Valid values: ${Object.keys(CHAINS).join(", ")}`),
6
+ amount: z
7
+ .string()
8
+ .optional()
9
+ .describe("USDC amount in human-readable format (e.g., '0.01'). " +
10
+ "If provided, includes optimistic finality info."),
11
+ };
12
+ const GAS_ESTIMATES = {
13
+ solana: {
14
+ token: "SOL",
15
+ estimateUsd: "~$0.00025",
16
+ note: "Priority fee ~5000 microlamports. With Kora, gas is paid in USDC instead of SOL.",
17
+ },
18
+ "solana-devnet": {
19
+ token: "SOL",
20
+ estimateUsd: "~$0.00025",
21
+ note: "Free devnet SOL from faucet.solana.com.",
22
+ },
23
+ base: {
24
+ token: "ETH",
25
+ estimateUsd: "~$0.001-0.01",
26
+ note: "L2 gas typically <$0.01. EIP-1559 base + priority fee.",
27
+ },
28
+ "base-sepolia": {
29
+ token: "ETH",
30
+ estimateUsd: "~$0.001",
31
+ note: "Free testnet ETH from Coinbase faucet.",
32
+ },
33
+ polygon: {
34
+ token: "MATIC",
35
+ estimateUsd: "~$0.001-0.005",
36
+ note: "Low gas costs, EIP-1559.",
37
+ },
38
+ "polygon-amoy": {
39
+ token: "MATIC",
40
+ estimateUsd: "~$0.001",
41
+ note: "Free testnet MATIC from faucet.",
42
+ },
43
+ };
44
+ export function registerEstimateGas(server) {
45
+ server.tool("estimate-gas-cost", "Estimate the gas/transaction fee for a USDC payment on a given chain. " +
46
+ "Returns the native gas token, estimated USD cost, and notes about " +
47
+ "Kora gasless transactions (Solana) or L2 gas optimization.", inputSchema, async ({ chain, amount }) => {
48
+ const chainConfig = resolveChain(chain);
49
+ if (!chainConfig) {
50
+ return {
51
+ content: [
52
+ {
53
+ type: "text",
54
+ text: `Unknown chain: "${chain}". Valid chains: ${Object.keys(CHAINS).join(", ")}`,
55
+ },
56
+ ],
57
+ isError: true,
58
+ };
59
+ }
60
+ const estimate = GAS_ESTIMATES[chain] ?? {
61
+ token: chainConfig.namespace === "solana" ? "SOL" : "ETH",
62
+ estimateUsd: "unknown",
63
+ note: "No gas estimate available for this chain.",
64
+ };
65
+ const parsedAmount = amount ? parseFloat(amount) : undefined;
66
+ const isOptimistic = parsedAmount !== undefined ? parsedAmount < 1.0 : undefined;
67
+ const result = {
68
+ chain: chainConfig.shorthand,
69
+ name: chainConfig.name,
70
+ gasToken: estimate.token,
71
+ estimatedGasCostUsd: estimate.estimateUsd,
72
+ note: estimate.note,
73
+ ...(isOptimistic !== undefined && {
74
+ optimisticFinality: isOptimistic,
75
+ optimisticNote: isOptimistic
76
+ ? "Sub-$1 payments use optimistic finality (~200ms) — resource delivered before block confirmation."
77
+ : "Payment will wait for full block confirmation before resource delivery.",
78
+ }),
79
+ blockTimeMs: chainConfig.blockTimeMs,
80
+ };
81
+ return {
82
+ content: [
83
+ { type: "text", text: JSON.stringify(result, null, 2) },
84
+ ],
85
+ };
86
+ });
87
+ }
88
+ //# sourceMappingURL=estimate-gas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimate-gas.js","sourceRoot":"","sources":["../../src/tools/estimate-gas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerGenerateUcp(server: McpServer): void;
3
+ //# sourceMappingURL=generate-ucp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-ucp.d.ts","sourceRoot":"","sources":["../../src/tools/generate-ucp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiCzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,QAoFpD"}
@@ -0,0 +1,103 @@
1
+ import { z } from "zod";
2
+ import { resolveChain, CHAINS } from "@pincerpay/core";
3
+ const inputSchema = {
4
+ merchantName: z.string().describe("Business or project name."),
5
+ merchantUrl: z
6
+ .string()
7
+ .url()
8
+ .describe("Base URL of the merchant API (e.g., 'https://api.example.com')."),
9
+ walletAddress: z
10
+ .string()
11
+ .describe("Merchant's USDC wallet address."),
12
+ chains: z
13
+ .array(z.string())
14
+ .default(["solana"])
15
+ .describe(`Supported chain shorthands. Valid: ${Object.keys(CHAINS).join(", ")}`),
16
+ endpoints: z
17
+ .array(z.object({
18
+ path: z.string().describe("API path, e.g. '/api/weather'."),
19
+ method: z
20
+ .enum(["GET", "POST", "PUT", "DELETE"])
21
+ .default("GET"),
22
+ price: z.string().describe("USDC price, e.g. '0.01'."),
23
+ description: z.string().describe("What this endpoint provides."),
24
+ }))
25
+ .min(1)
26
+ .describe("Paywalled endpoints to advertise."),
27
+ };
28
+ export function registerGenerateUcp(server) {
29
+ server.tool("generate-ucp-manifest", "Generate a /.well-known/ucp JSON manifest for agent-readable commerce discovery. " +
30
+ "UCP (Universal Commerce Protocol) lets AI agents discover your API's " +
31
+ "payment requirements, supported chains, and endpoint pricing. " +
32
+ "Place the output at /.well-known/ucp on your domain.", inputSchema, async ({ merchantName, merchantUrl, walletAddress, chains, endpoints }) => {
33
+ const errors = [];
34
+ const chainConfigs = chains.map((c) => {
35
+ const config = resolveChain(c);
36
+ if (!config) {
37
+ errors.push(`Unknown chain: "${c}"`);
38
+ return null;
39
+ }
40
+ return {
41
+ network: config.caip2Id,
42
+ token: "USDC",
43
+ tokenAddress: config.usdcAddress,
44
+ };
45
+ });
46
+ if (errors.length > 0) {
47
+ return {
48
+ content: [
49
+ {
50
+ type: "text",
51
+ text: errors.join("\n") +
52
+ `\nValid chains: ${Object.keys(CHAINS).join(", ")}`,
53
+ },
54
+ ],
55
+ isError: true,
56
+ };
57
+ }
58
+ const manifest = {
59
+ version: "1.0",
60
+ merchant: {
61
+ name: merchantName,
62
+ url: merchantUrl,
63
+ },
64
+ payment: {
65
+ handler: "pincerpay",
66
+ facilitator: "https://facilitator.pincerpay.com",
67
+ chains: chainConfigs,
68
+ payTo: walletAddress,
69
+ },
70
+ endpoints: endpoints.map((ep) => ({
71
+ path: ep.path,
72
+ method: ep.method,
73
+ price: { amount: ep.price, currency: "USDC" },
74
+ description: ep.description,
75
+ })),
76
+ };
77
+ const manifestJson = JSON.stringify(manifest, null, 2);
78
+ return {
79
+ content: [
80
+ {
81
+ type: "text",
82
+ text: `## UCP Manifest\n\n` +
83
+ `Serve this JSON at \`${merchantUrl}/.well-known/ucp\`:\n\n` +
84
+ `\`\`\`json\n${manifestJson}\n\`\`\`\n\n` +
85
+ `### How to Serve\n\n` +
86
+ `**Express:**\n` +
87
+ `\`\`\`typescript\n` +
88
+ `app.get("/.well-known/ucp", (req, res) => {\n` +
89
+ ` res.json(${JSON.stringify(manifest)});\n` +
90
+ `});\n` +
91
+ `\`\`\`\n\n` +
92
+ `**Hono:**\n` +
93
+ `\`\`\`typescript\n` +
94
+ `app.get("/.well-known/ucp", (c) => c.json(${JSON.stringify(manifest)}));\n` +
95
+ `\`\`\`\n\n` +
96
+ `AI agents discover this manifest to learn what your API offers,\n` +
97
+ `which chains you accept, and how much each endpoint costs.`,
98
+ },
99
+ ],
100
+ };
101
+ });
102
+ }
103
+ //# sourceMappingURL=generate-ucp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-ucp.js","sourceRoot":"","sources":["../../src/tools/generate-ucp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { FacilitatorClient } from "../client.js";
3
+ export declare function registerTools(server: McpServer, client: FacilitatorClient): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAStD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,QAWzE"}
@@ -0,0 +1,19 @@
1
+ import { registerListChains } from "./list-chains.js";
2
+ import { registerEstimateGas } from "./estimate-gas.js";
3
+ import { registerValidateConfig } from "./validate-config.js";
4
+ import { registerCheckTransaction } from "./check-transaction.js";
5
+ import { registerScaffoldMiddleware } from "./scaffold-middleware.js";
6
+ import { registerScaffoldAgent } from "./scaffold-agent.js";
7
+ import { registerGenerateUcp } from "./generate-ucp.js";
8
+ export function registerTools(server, client) {
9
+ // Operations tools (facilitator interaction)
10
+ registerListChains(server, client);
11
+ registerCheckTransaction(server, client);
12
+ registerEstimateGas(server);
13
+ // Developer tools (scaffolding + validation)
14
+ registerValidateConfig(server);
15
+ registerScaffoldMiddleware(server);
16
+ registerScaffoldAgent(server);
17
+ registerGenerateUcp(server);
18
+ }
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,MAAyB;IACxE,6CAA6C;IAC7C,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5B,6CAA6C;IAC7C,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { FacilitatorClient } from "../client.js";
3
+ export declare function registerListChains(server: McpServer, client: FacilitatorClient): void;
4
+ //# sourceMappingURL=list-chains.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-chains.d.ts","sourceRoot":"","sources":["../../src/tools/list-chains.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAatD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,iBAAiB,QAoD1B"}
@@ -0,0 +1,56 @@
1
+ import { z } from "zod";
2
+ import { CHAINS } from "@pincerpay/core";
3
+ const inputSchema = {
4
+ source: z
5
+ .enum(["local", "facilitator"])
6
+ .default("local")
7
+ .describe("'local' returns all known PincerPay chain configs. " +
8
+ "'facilitator' queries the live facilitator for currently registered schemes."),
9
+ };
10
+ export function registerListChains(server, client) {
11
+ server.tool("list-supported-chains", "Returns supported blockchain networks and their USDC configurations. " +
12
+ "Includes Solana (primary), Base, and Polygon with mainnet/testnet variants. " +
13
+ "Shows chain shorthand, CAIP-2 ID, USDC contract address, and block time.", inputSchema, async ({ source }) => {
14
+ if (source === "facilitator") {
15
+ try {
16
+ const result = await client.getSupported();
17
+ return {
18
+ content: [
19
+ {
20
+ type: "text",
21
+ text: JSON.stringify(result, null, 2),
22
+ },
23
+ ],
24
+ };
25
+ }
26
+ catch (err) {
27
+ return {
28
+ content: [
29
+ {
30
+ type: "text",
31
+ text: `Failed to reach facilitator: ${err instanceof Error ? err.message : String(err)}`,
32
+ },
33
+ ],
34
+ isError: true,
35
+ };
36
+ }
37
+ }
38
+ const chains = Object.values(CHAINS).map((c) => ({
39
+ shorthand: c.shorthand,
40
+ name: c.name,
41
+ caip2Id: c.caip2Id,
42
+ namespace: c.namespace,
43
+ usdcAddress: c.usdcAddress,
44
+ usdcDecimals: c.usdcDecimals,
45
+ testnet: c.testnet,
46
+ explorerUrl: c.explorerUrl,
47
+ blockTimeMs: c.blockTimeMs,
48
+ }));
49
+ return {
50
+ content: [
51
+ { type: "text", text: JSON.stringify(chains, null, 2) },
52
+ ],
53
+ };
54
+ });
55
+ }
56
+ //# sourceMappingURL=list-chains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-chains.js","sourceRoot":"","sources":["../../src/tools/list-chains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,WAAW,GAAG;IAClB,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;SAC9B,OAAO,CAAC,OAAO,CAAC;SAChB,QAAQ,CACP,qDAAqD;QACnD,8EAA8E,CACjF;CACJ,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,MAAyB;IAEzB,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,uEAAuE;QACrE,8EAA8E;QAC9E,0EAA0E,EAC5E,WAAW,EACX,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;gBAC3C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;yBACtC;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;yBACzF;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/C,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACjE;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerScaffoldAgent(server: McpServer): void;
3
+ //# sourceMappingURL=scaffold-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-agent.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold-agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgCzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QA8EtD"}
@@ -0,0 +1,93 @@
1
+ import { z } from "zod";
2
+ const inputSchema = {
3
+ chain: z
4
+ .enum([
5
+ "solana",
6
+ "base",
7
+ "polygon",
8
+ "solana-devnet",
9
+ "base-sepolia",
10
+ "polygon-amoy",
11
+ ])
12
+ .default("solana")
13
+ .describe("Primary chain the agent will use."),
14
+ maxPerTransaction: z
15
+ .string()
16
+ .optional()
17
+ .describe("Max USDC per transaction in base units (6 decimals). E.g., '100000' = $0.10, '1000000' = $1.00."),
18
+ maxPerDay: z
19
+ .string()
20
+ .optional()
21
+ .describe("Max USDC per day in base units (6 decimals). E.g., '5000000' = $5.00, '10000000' = $10.00."),
22
+ typescript: z
23
+ .boolean()
24
+ .default(true)
25
+ .describe("Generate TypeScript (true) or JavaScript (false)."),
26
+ };
27
+ export function registerScaffoldAgent(server) {
28
+ server.tool("scaffold-agent-client", "Generate agent-side code that automatically handles x402 USDC payments. " +
29
+ "Produces a PincerPayAgent setup with wallet configuration and " +
30
+ "spending policies. The agent's fetch() is a drop-in replacement " +
31
+ "for standard fetch that handles 402 challenges automatically.", inputSchema, async ({ chain, maxPerTransaction, maxPerDay, typescript }) => {
32
+ const isSolana = chain.startsWith("solana");
33
+ const keyVar = isSolana ? "AGENT_SOLANA_KEY" : "AGENT_EVM_KEY";
34
+ const keyProp = isSolana ? "solanaPrivateKey" : "evmPrivateKey";
35
+ const bang = typescript ? "!" : "";
36
+ let policiesBlock = "";
37
+ if (maxPerTransaction || maxPerDay) {
38
+ const entries = [];
39
+ if (maxPerTransaction)
40
+ entries.push(` maxPerTransaction: "${maxPerTransaction}"`);
41
+ if (maxPerDay)
42
+ entries.push(` maxPerDay: "${maxPerDay}"`);
43
+ policiesBlock =
44
+ `\n // Spending policies use base units (6 decimals): 1 USDC = "1000000", $0.10 = "100000"` +
45
+ `\n policies: [\n {\n${entries.join(",\n")},\n },\n ],`;
46
+ }
47
+ const code = `import { PincerPayAgent } from "@pincerpay/agent";
48
+
49
+ const agent = await PincerPayAgent.create({
50
+ chains: ["${chain}"],
51
+ ${keyProp}: process.env.${keyVar}${bang},${policiesBlock}
52
+ });
53
+
54
+ // Use agent.fetch() as a drop-in replacement for fetch.
55
+ // It automatically handles HTTP 402 challenges by signing USDC payments.
56
+ const response = await agent.fetch("https://your-api.example.com/endpoint");
57
+ const data = await response.json();
58
+ console.log(data);`;
59
+ const envValue = isSolana
60
+ ? "your_base58_solana_private_key"
61
+ : "0xYourEvmPrivateKey";
62
+ const lang = typescript ? "typescript" : "javascript";
63
+ return {
64
+ content: [
65
+ {
66
+ type: "text",
67
+ text: `## Install\n\n\`\`\`bash\nnpm install @pincerpay/agent\n\`\`\`\n\n` +
68
+ `## Code\n\n\`\`\`${lang}\n${code}\n\`\`\`\n\n` +
69
+ `## Environment Variables\n\n\`\`\`\n${keyVar}=${envValue}\n\`\`\`\n\n` +
70
+ `## How It Works\n\n` +
71
+ `1. Agent calls a paywalled API endpoint\n` +
72
+ `2. Server responds with HTTP 402 + x402 payment challenge\n` +
73
+ `3. Agent SDK automatically signs a USDC transfer\n` +
74
+ `4. PincerPay facilitator verifies + broadcasts the transaction\n` +
75
+ `5. Server delivers the protected resource\n\n` +
76
+ `Spending policies prevent runaway spending — the agent will reject\n` +
77
+ `payments that exceed the configured limits.\n\n` +
78
+ `## USDC Base Units Reference\n\n` +
79
+ `| Human Amount | Base Units |\n` +
80
+ `|-------------|------------|\n` +
81
+ `| $0.01 | \`"10000"\` |\n` +
82
+ `| $0.10 | \`"100000"\` |\n` +
83
+ `| $1.00 | \`"1000000"\` |\n` +
84
+ `| $10.00 | \`"10000000"\` |\n\n` +
85
+ `**Important:** Route \`price\` uses human-readable amounts (e.g., \`"0.01"\`), ` +
86
+ `but spending \`policies\` use base units (6 decimals). ` +
87
+ `Multiply the human amount by 1,000,000 to get base units.`,
88
+ },
89
+ ],
90
+ };
91
+ });
92
+ }
93
+ //# sourceMappingURL=scaffold-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-agent.js","sourceRoot":"","sources":["../../src/tools/scaffold-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,CAAC;SACL,IAAI,CAAC;QACJ,QAAQ;QACR,MAAM;QACN,SAAS;QACT,eAAe;QACf,cAAc;QACd,cAAc;KACf,CAAC;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,mCAAmC,CAAC;IAChD,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,iGAAiG,CAClG;IACH,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,4FAA4F,CAC7F;IACH,UAAU,EAAE,CAAC;SACV,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,mDAAmD,CAAC;CACjE,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,0EAA0E;QACxE,gEAAgE;QAChE,kEAAkE;QAClE,+DAA+D,EACjE,WAAW,EACX,KAAK,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE;QAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAC;QAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAC;QAChE,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAEnC,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,iBAAiB,IAAI,SAAS,EAAE,CAAC;YACnC,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,IAAI,iBAAiB;gBACnB,OAAO,CAAC,IAAI,CACV,6BAA6B,iBAAiB,GAAG,CAClD,CAAC;YACJ,IAAI,SAAS;gBACX,OAAO,CAAC,IAAI,CAAC,qBAAqB,SAAS,GAAG,CAAC,CAAC;YAClD,aAAa;gBACX,4FAA4F;oBAC5F,2BAA2B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;QACpE,CAAC;QAED,MAAM,IAAI,GAAG;;;cAGL,KAAK;IACf,OAAO,iBAAiB,MAAM,GAAG,IAAI,IAAI,aAAa;;;;;;;mBAOvC,CAAC;QAEd,MAAM,QAAQ,GAAG,QAAQ;YACvB,CAAC,CAAC,gCAAgC;YAClC,CAAC,CAAC,qBAAqB,CAAC;QAE1B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;QAEtD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EACF,oEAAoE;wBACpE,oBAAoB,IAAI,KAAK,IAAI,cAAc;wBAC/C,uCAAuC,MAAM,IAAI,QAAQ,cAAc;wBACvE,qBAAqB;wBACrB,2CAA2C;wBAC3C,6DAA6D;wBAC7D,oDAAoD;wBACpD,kEAAkE;wBAClE,+CAA+C;wBAC/C,sEAAsE;wBACtE,iDAAiD;wBACjD,kCAAkC;wBAClC,iCAAiC;wBACjC,gCAAgC;wBAChC,2BAA2B;wBAC3B,4BAA4B;wBAC5B,6BAA6B;wBAC7B,iCAAiC;wBACjC,iFAAiF;wBACjF,yDAAyD;wBACzD,2DAA2D;iBAC9D;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerScaffoldMiddleware(server: McpServer): void;
3
+ //# sourceMappingURL=scaffold-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-middleware.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold-middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqIzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QA4D3D"}
@@ -0,0 +1,160 @@
1
+ import { z } from "zod";
2
+ const inputSchema = {
3
+ framework: z
4
+ .enum(["express", "hono", "nextjs"])
5
+ .describe("Web framework to generate middleware for. " +
6
+ "Use 'nextjs' for Next.js App Router (generates Hono adapter in catch-all route)."),
7
+ routes: z
8
+ .array(z.object({
9
+ pattern: z
10
+ .string()
11
+ .describe("Route pattern, e.g. 'GET /api/weather'."),
12
+ price: z.string().describe("USDC price, e.g. '0.01'."),
13
+ chain: z.string().default("solana").describe("Chain shorthand."),
14
+ description: z.string().optional(),
15
+ }))
16
+ .min(1)
17
+ .describe("Paywalled routes to configure."),
18
+ merchantAddress: z
19
+ .string()
20
+ .optional()
21
+ .describe("Merchant wallet address (placeholder used if omitted)."),
22
+ typescript: z
23
+ .boolean()
24
+ .default(true)
25
+ .describe("Generate TypeScript (true) or JavaScript (false)."),
26
+ };
27
+ function generateExpressCode(addr, routesBlock, ts) {
28
+ const bang = ts ? "!" : "";
29
+ return `import express from "express";
30
+ import { pincerpay } from "@pincerpay/merchant/express";
31
+
32
+ const app = express();
33
+
34
+ app.use(
35
+ pincerpay({
36
+ apiKey: process.env.PINCERPAY_API_KEY${bang},
37
+ merchantAddress: "${addr}",
38
+ routes: {
39
+ ${routesBlock}
40
+ },
41
+ })
42
+ );
43
+
44
+ // Your route handlers below — any route matching the patterns
45
+ // above will require x402 USDC payment before the handler runs.
46
+ app.get("/api/example", (req, res) => {
47
+ res.json({ message: "Paid content!" });
48
+ });
49
+
50
+ const port = process.env.PORT ?? 3000;
51
+ app.listen(port, () => {
52
+ console.log(\`Server running at http://localhost:\${port}\`);
53
+ });`;
54
+ }
55
+ function generateHonoCode(addr, routesBlock, ts) {
56
+ const bang = ts ? "!" : "";
57
+ return `import { Hono } from "hono";
58
+ import { serve } from "@hono/node-server";
59
+ import { pincerpayHono } from "@pincerpay/merchant/hono";
60
+
61
+ const app = new Hono();
62
+
63
+ app.use(
64
+ "*",
65
+ pincerpayHono({
66
+ apiKey: process.env.PINCERPAY_API_KEY${bang},
67
+ merchantAddress: "${addr}",
68
+ routes: {
69
+ ${routesBlock}
70
+ },
71
+ })
72
+ );
73
+
74
+ // Your route handlers below — any route matching the patterns
75
+ // above will require x402 USDC payment before the handler runs.
76
+ app.get("/api/example", (c) => {
77
+ return c.json({ message: "Paid content!" });
78
+ });
79
+
80
+ serve({ fetch: app.fetch, port: Number(process.env.PORT ?? 3000) });`;
81
+ }
82
+ function generateNextjsCode(addr, routesBlock, ts) {
83
+ const bang = ts ? "!" : "";
84
+ return `// app/api/[...route]/route.ts
85
+ import { Hono } from "hono";
86
+ import { handle } from "hono/vercel";
87
+ import { pincerpayHono } from "@pincerpay/merchant/hono";
88
+
89
+ // basePath must match the catch-all route location
90
+ const app = new Hono().basePath("/api");
91
+
92
+ app.use(
93
+ "*",
94
+ pincerpayHono({
95
+ apiKey: process.env.PINCERPAY_API_KEY${bang},
96
+ merchantAddress: "${addr}",
97
+ routes: {
98
+ ${routesBlock}
99
+ },
100
+ })
101
+ );
102
+
103
+ // Route handlers — paths are relative to basePath ("/api")
104
+ app.get("/example", (c) => {
105
+ return c.json({ message: "Paid content!" });
106
+ });
107
+
108
+ export const GET = handle(app);
109
+ export const POST = handle(app);
110
+ export const PUT = handle(app);
111
+ export const DELETE = handle(app);`;
112
+ }
113
+ export function registerScaffoldMiddleware(server) {
114
+ server.tool("scaffold-x402-middleware", "Generate Express, Hono, or Next.js middleware code that adds x402 USDC payment walls to API routes. " +
115
+ "Produces a complete, copy-paste-ready code snippet with PincerPay SDK setup, " +
116
+ "route configuration, and environment variable usage. " +
117
+ "Next.js uses a Hono adapter in a catch-all App Router route. " +
118
+ "Supports Solana (primary), Base, and Polygon chains.", inputSchema, async ({ framework, routes, merchantAddress, typescript }) => {
119
+ const addr = merchantAddress ?? "YOUR_WALLET_ADDRESS";
120
+ const routesBlock = routes
121
+ .map((r) => {
122
+ const desc = r.description
123
+ ? `, description: "${r.description}"`
124
+ : "";
125
+ return ` "${r.pattern}": { price: "${r.price}", chain: "${r.chain}"${desc} }`;
126
+ })
127
+ .join(",\n");
128
+ const code = framework === "express"
129
+ ? generateExpressCode(addr, routesBlock, typescript)
130
+ : framework === "nextjs"
131
+ ? generateNextjsCode(addr, routesBlock, typescript)
132
+ : generateHonoCode(addr, routesBlock, typescript);
133
+ const installCmd = framework === "express"
134
+ ? "npm install @pincerpay/merchant express"
135
+ : framework === "nextjs"
136
+ ? "npm install @pincerpay/merchant hono"
137
+ : "npm install @pincerpay/merchant hono @hono/node-server";
138
+ const lang = typescript ? "typescript" : "javascript";
139
+ const nextjsNote = framework === "nextjs"
140
+ ? `\n## Next.js Notes\n\n` +
141
+ `- Place this file at \`app/api/[...route]/route.ts\`\n` +
142
+ `- The \`basePath("/api")\` must match the catch-all route location\n` +
143
+ `- Route handlers use paths relative to basePath (e.g., \`/weather\` serves \`/api/weather\`)\n` +
144
+ `- Export each HTTP method you need (GET, POST, PUT, DELETE)\n\n`
145
+ : "";
146
+ return {
147
+ content: [
148
+ {
149
+ type: "text",
150
+ text: `## Install\n\n\`\`\`bash\n${installCmd}\n\`\`\`\n\n` +
151
+ `## Code\n\n\`\`\`${lang}\n${code}\n\`\`\`\n\n` +
152
+ nextjsNote +
153
+ `## Environment Variables\n\n\`\`\`\nPINCERPAY_API_KEY=pp_live_your_key_here\n\`\`\`\n\n` +
154
+ `Get your API key from https://pincerpay.com/dashboard/settings`,
155
+ },
156
+ ],
157
+ };
158
+ });
159
+ }
160
+ //# sourceMappingURL=scaffold-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-middleware.js","sourceRoot":"","sources":["../../src/tools/scaffold-middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerValidateConfig(server: McpServer): void;
3
+ //# sourceMappingURL=validate-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-config.d.ts","sourceRoot":"","sources":["../../src/tools/validate-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QAmIvD"}