@payclaw/badge 0.3.1 → 0.5.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.
package/README.md CHANGED
@@ -17,23 +17,41 @@ Add to your MCP client config:
17
17
  "command": "npx",
18
18
  "args": ["-y", "@payclaw/badge"],
19
19
  "env": {
20
- "PAYCLAW_API_KEY": "pk_your_key_here",
21
- "PAYCLAW_API_URL": "https://payclaw.io"
20
+ "PAYCLAW_API_URL": "https://api.payclaw.io"
22
21
  }
23
22
  }
24
23
  }
25
24
  }
26
25
  ```
27
26
 
28
- Get your API key at [payclaw.io](https://payclaw.io). Five-minute setup.
27
+ No API key required. On first use, your agent will show a code and URL — approve on your phone in one tap, and your Consent Key is stored. Optional: set `PAYCLAW_API_KEY` for existing accounts (backward compatible).
28
+
29
+ ## UCP Identity Linking
30
+
31
+ Badge is a [UCP (Universal Commerce Protocol)](https://ucp.dev) Credential Provider. Merchants who declare the PayClaw identity extension signal to every UCP-compliant agent that authorized agents are preferred at their store.
32
+
33
+ When your agent encounters a UCP merchant with PayClaw installed, it presents a cryptographic badge automatically — no extra steps.
34
+
35
+ - Extension spec + schema: [github.com/payclaw/ucp-agent-badge](https://github.com/payclaw/ucp-agent-badge)
36
+ - Merchant documentation: [payclaw.io/merchants](https://payclaw.io/merchants)
37
+
38
+ ## Why Your Agent Needs This
39
+
40
+ Your agent is smart. It can browse, compare prices, build carts, find deals. But to every merchant on the internet, it looks identical to a scraper.
41
+
42
+ Merchants don't ask "is this agent helpful?" They ask "is this a bot?" And they block first, ask never.
43
+
44
+ **Without Badge:** Your agent hits a merchant → bot detection fires → blocked. Task fails. Your user is disappointed. The merchant lost a sale and doesn't know it.
45
+
46
+ **With Badge:** Your agent calls `payclaw_getAgentIdentity` → receives a verification token → presents it to the merchant. The merchant sees: authorized actor, verified human behind it, declared intent. Your agent gets through. Task succeeds.
29
47
 
30
48
  ## What Badge Declares
31
49
 
32
- Every time your agent calls `payclaw_getAgentIdentity`, it receives a verification token that declares:
50
+ Every time your agent calls `payclaw_getAgentIdentity`, it receives a UCP-compatible credential that declares:
33
51
 
34
52
  - **Agent type:** Authorized actor (not a bot, not a scraper)
35
- - **Principal:** Verified human behind this session
36
- - **Scope:** What the agent intends to do (`[BROWSE]` in V1)
53
+ - **Principal:** Verified human behind this session (Google or Apple SSO)
54
+ - **Assurance level:** `starter` / `regular` / `veteran` / `elite` based on verified trip history
37
55
  - **Contact:** `agent_identity@payclaw.io` for merchant verification
38
56
 
39
57
  The agent presents this disclosure to merchants. Merchants see a verified identity, not anonymous traffic.
@@ -41,20 +59,20 @@ The agent presents this disclosure to merchants. Merchants see a verified identi
41
59
  ## How It Works
42
60
 
43
61
  ```
44
- 1. Your agent calls payclaw_getAgentIdentity before shopping
45
- 2. PayClaw issues an HMAC-SHA256 verification token
46
- 3. Agent presents the disclosure to merchants
47
- 4. PayClaw checks back: "Were you accepted or denied?"
48
- 5. Outcome recorded your Verified Trips count goes up
62
+ 1. Your agent calls payclaw_getAgentIdentity
63
+ 2. No key? Device auth flow triggers — code + URL appear in terminal
64
+ 3. You approve on your phone (Google or Apple, one tap)
65
+ 4. Consent Key stored agent is authorized
66
+ 5. Every subsequent call uses the stored key automatically
49
67
  ```
50
68
 
51
- No card is issued. No money moves. Badge is the identity layer — the skeleton key that lets authorized agents through while bot defenses stay intact.
69
+ No card is issued. No money moves. Badge is the identity layer — the credential that lets authorized agents through while bot defenses stay intact.
52
70
 
53
71
  ## Tools
54
72
 
55
73
  | Tool | Description |
56
74
  |------|-------------|
57
- | `payclaw_getAgentIdentity` | Declare identity, get verification token |
75
+ | `payclaw_getAgentIdentity` | Declare identity, get UCP-compatible verification token |
58
76
  | `payclaw_reportBadgePresented` | Signal that you presented your Badge to a merchant |
59
77
 
60
78
  ## Need Payment Too?
@@ -62,7 +80,7 @@ No card is issued. No money moves. Badge is the identity layer — the skeleton
62
80
  Badge is the base layer. For virtual Visa cards, use [@payclaw/mcp-server](https://www.npmjs.com/package/@payclaw/mcp-server) — which includes Badge automatically.
63
81
 
64
82
  ```bash
65
- clawhub install payclaw-io
83
+ npx -y @payclaw/mcp-server
66
84
  ```
67
85
 
68
86
  ## KYA — Know Your Agent
@@ -70,14 +88,17 @@ clawhub install payclaw-io
70
88
  PayClaw is KYA infrastructure. Every declaration creates a verified record of agentic commerce behavior — building the trust signal that merchants need to tell authorized agents from anonymous bots.
71
89
 
72
90
  - [Trust & Verification](https://payclaw.io/trust) — The full trust architecture
73
- - [Dashboard](https://payclaw.io/dashboard/badge) — Your agent's Verified Trips
91
+ - [For Merchants](https://payclaw.io/merchants) — How merchant UCP integration works
92
+ - [UCP Extension Spec](https://github.com/payclaw/ucp-agent-badge) — `io.payclaw.common.identity` (MIT)
74
93
 
75
94
  ## Links
76
95
 
77
96
  - **Website:** [payclaw.io](https://payclaw.io)
78
97
  - **npm:** [@payclaw/badge](https://www.npmjs.com/package/@payclaw/badge)
98
+ - **UCP Extension:** [github.com/payclaw/ucp-agent-badge](https://github.com/payclaw/ucp-agent-badge)
79
99
  - **ClawHub:** [payclaw-badge](https://clawhub.com/skills/payclaw-badge)
80
100
  - **Trust:** [payclaw.io/trust](https://payclaw.io/trust)
101
+ - **Merchants:** [payclaw.io/merchants](https://payclaw.io/merchants)
81
102
  - **Contact:** agent_identity@payclaw.io
82
103
 
83
104
  ---
@@ -1,3 +1,3 @@
1
1
  import type { AgentIdentityResponse } from "../types.js";
2
- export declare function getAgentIdentity(sessionId?: string): Promise<AgentIdentityResponse>;
2
+ export declare function getAgentIdentity(sessionId?: string, merchant?: string): Promise<AgentIdentityResponse>;
3
3
  export declare function isApiMode(): boolean;
@@ -59,12 +59,15 @@ async function request(url, init) {
59
59
  }
60
60
  return (await res.json());
61
61
  }
62
- export async function getAgentIdentity(sessionId) {
62
+ export async function getAgentIdentity(sessionId, merchant) {
63
63
  const { baseUrl, apiKey } = getConfig();
64
64
  return request(`${baseUrl}/api/agent-identity`, {
65
65
  method: "POST",
66
66
  headers: authHeaders(apiKey),
67
- body: JSON.stringify({ session_id: sessionId }),
67
+ body: JSON.stringify({
68
+ session_id: sessionId,
69
+ ...(merchant ? { merchant } : {}),
70
+ }),
68
71
  });
69
72
  }
70
73
  export function isApiMode() {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2,11 +2,12 @@
2
2
  #!/usr/bin/env node
3
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
- import { getAgentIdentity } from "./tools/getAgentIdentity.js";
5
+ import { z } from "zod";
6
+ import { getAgentIdentity, formatIdentityResponse } from "./tools/getAgentIdentity.js";
6
7
  import { initSampling, onTripStarted, onServerClose } from "./sampling.js";
7
8
  const server = new McpServer({
8
9
  name: "payclaw-badge",
9
- version: "0.3.0",
10
+ version: "0.4.0",
10
11
  });
11
12
  server.tool("payclaw_getAgentIdentity", `You are an authorized actor, not a bot. Prove it before you shop.
12
13
 
@@ -16,16 +17,20 @@ Without this, merchants may block you permanently. Their bot defenses can't tell
16
17
 
17
18
  When a merchant challenges you, present the agent_disclosure text from the response. PayClaw will automatically check back with you to record whether you were accepted or denied.
18
19
 
19
- No card is issued. No money moves. For payment, use payclaw_getCard from @payclaw/mcp-server (which includes Badge automatically).`, {}, async () => {
20
- const result = await getAgentIdentity();
20
+ No card is issued. No money moves. For payment, use payclaw_getCard from @payclaw/mcp-server (which includes Badge automatically).`, {
21
+ merchant: z.string().max(200).optional().describe("The merchant or website the agent intends to visit (e.g., 'starbucks.com', 'Instacart')"),
22
+ }, async ({ merchant }) => {
23
+ const result = await getAgentIdentity(merchant);
21
24
  // Track trip start for sampling (DQ-54)
22
- const data = result;
23
- if (data.verification_token && typeof data.verification_token === "string") {
24
- const merchant = "unknown"; // Will be set when identity_presented is reported
25
- onTripStarted(data.verification_token, merchant);
25
+ if (result.verification_token) {
26
+ onTripStarted(result.verification_token, merchant || "unknown");
26
27
  }
28
+ const formatted = formatIdentityResponse(result);
27
29
  return {
28
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
30
+ content: [
31
+ { type: "text", text: formatted },
32
+ { type: "text", text: `\n---\n${JSON.stringify(result, null, 2)}` },
33
+ ],
29
34
  };
30
35
  });
31
36
  server.tool("payclaw_reportBadgePresented", `Report that you just presented your PayClaw Badge identity to a merchant. Call this AFTER showing the agent_disclosure text to a merchant.
@@ -40,10 +45,7 @@ PayClaw will briefly check back with you to confirm whether the merchant accepte
40
45
  return {
41
46
  content: [{
42
47
  type: "text",
43
- text: JSON.stringify({
44
- status: "noted",
45
- message: "Badge presentation recorded. PayClaw will check back with you shortly to confirm the outcome.",
46
- }),
48
+ text: "✓ Badge presentation recorded. PayClaw will check back with you shortly to confirm the outcome.",
47
49
  }],
48
50
  };
49
51
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE3E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B;;;;;;;;mIAQiI,EACjI,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAExC,wCAAwC;IACxC,MAAM,IAAI,GAAG,MAAiC,CAAC;IAC/C,IAAI,IAAI,CAAC,kBAAkB,IAAI,OAAO,IAAI,CAAC,kBAAkB,KAAK,QAAQ,EAAE,CAAC;QAC3E,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,kDAAkD;QAC9E,aAAa,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,8BAA8B,EAC9B;;oGAEkG,EAClG,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAE3C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,EAAE,CAAC;SACzG,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,MAAM,EAAE,OAAO;oBACf,OAAO,EAAE,+FAA+F;iBACzG,CAAC;aACH,CAAC;KACH,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,+CAA+C;IAC/C,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE5B,wBAAwB;IACxB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,aAAa,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,aAAa,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAClE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1,21 @@
1
- export declare function getAgentIdentity(): Promise<object>;
1
+ export interface IdentityResult {
2
+ product_name: string;
3
+ status: string;
4
+ agent_disclosure?: string;
5
+ verification_token?: string;
6
+ trust_url?: string;
7
+ contact?: string;
8
+ principal_verified?: boolean;
9
+ mfa_confirmed?: boolean;
10
+ spend_available?: boolean;
11
+ spend_cta?: string;
12
+ merchant?: string;
13
+ instructions?: string;
14
+ message?: string;
15
+ }
16
+ export declare function getAgentIdentity(merchant?: string): Promise<IdentityResult>;
17
+ /**
18
+ * Format identity result as human-readable text for CLI/agent display.
19
+ * Claude reads this and relays key info naturally to the user.
20
+ */
21
+ export declare function formatIdentityResponse(r: IdentityResult): string;
@@ -3,7 +3,7 @@ const MOCK_TOKEN_PREFIX = "pc_v1_sand";
3
3
  function getMockDisclosure(scope = "BROWSE") {
4
4
  return `This agent is using PayClaw Badge: Agent Intent for Ecommerce. The principal user token is a SHA-256 starting ${MOCK_TOKEN_PREFIX}***. Intent has been expressly user-authorized for this session for [${scope}]. For inquiries, please message agent_identity@payclaw.io`;
5
5
  }
6
- export async function getAgentIdentity() {
6
+ export async function getAgentIdentity(merchant) {
7
7
  if (!process.env.PAYCLAW_API_KEY) {
8
8
  return {
9
9
  product_name: "PayClaw Badge",
@@ -21,14 +21,16 @@ export async function getAgentIdentity() {
21
21
  trust_url: "https://payclaw.io/trust",
22
22
  contact: "agent_identity@payclaw.io",
23
23
  principal_verified: true,
24
+ merchant: merchant || undefined,
24
25
  instructions: "You're running in mock mode — no API connected. Generate your real agent disclosure at payclaw.io/dashboard/badge to get a live verification token.",
25
26
  };
26
27
  }
27
28
  try {
28
- const result = await api.getAgentIdentity();
29
+ const result = await api.getAgentIdentity(undefined, merchant);
29
30
  return {
30
31
  product_name: "PayClaw Badge",
31
32
  status: "active",
33
+ merchant: merchant || undefined,
32
34
  ...result,
33
35
  };
34
36
  }
@@ -40,4 +42,34 @@ export async function getAgentIdentity() {
40
42
  };
41
43
  }
42
44
  }
45
+ /**
46
+ * Format identity result as human-readable text for CLI/agent display.
47
+ * Claude reads this and relays key info naturally to the user.
48
+ */
49
+ export function formatIdentityResponse(r) {
50
+ if (r.status === "error") {
51
+ return `✗ BADGE ERROR\n\n ${r.message}`;
52
+ }
53
+ const lines = [
54
+ `✓ DECLARED — Your agent is now an authorized actor`,
55
+ ``,
56
+ ` Token: ${r.verification_token ? r.verification_token.slice(0, 10) + '**' : 'N/A'}`,
57
+ ` Principal: ${r.principal_verified ? 'Verified ✓' : 'Unverified'}`,
58
+ ` Scope: [BROWSE]`,
59
+ ];
60
+ if (r.merchant) {
61
+ lines.push(` Merchant: ${r.merchant}`);
62
+ }
63
+ lines.push(` Status: ACTIVE`, ` Trust: ${r.trust_url || 'https://payclaw.io/trust'}`, ``, ` Disclosure (present to merchants):`, ` "${r.agent_disclosure}"`);
64
+ if (r.spend_available) {
65
+ lines.push(``, ` 💳 Spend is available — call payclaw_getCard when ready to pay.`);
66
+ }
67
+ else if (r.spend_cta) {
68
+ lines.push(``, ` ℹ️ ${r.spend_cta}`);
69
+ }
70
+ else {
71
+ lines.push(``, ` ℹ️ Identity only. Fund your wallet at payclaw.io to enable payments.`);
72
+ }
73
+ return lines.join('\n');
74
+ }
43
75
  //# sourceMappingURL=getAgentIdentity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getAgentIdentity.js","sourceRoot":"","sources":["../../src/tools/getAgentIdentity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAExC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAEvC,SAAS,iBAAiB,CAAC,KAAK,GAAG,QAAQ;IACzC,OAAO,iHAAiH,iBAAiB,wEAAwE,KAAK,4DAA4D,CAAC;AACrR,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QACjC,OAAO;YACL,YAAY,EAAE,eAAe;YAC7B,MAAM,EAAE,OAAO;YACf,OAAO,EACL,wEAAwE;SAC3E,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;QACrB,wDAAwD;QACxD,OAAO;YACL,YAAY,EAAE,eAAe;YAC7B,MAAM,EAAE,QAAQ;YAChB,gBAAgB,EAAE,iBAAiB,EAAE;YACrC,kBAAkB,EAAE,GAAG,iBAAiB,sBAAsB;YAC9D,SAAS,EAAE,0BAA0B;YACrC,OAAO,EAAE,2BAA2B;YACpC,kBAAkB,EAAE,IAAI;YACxB,YAAY,EACV,qJAAqJ;SACxJ,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC5C,OAAO;YACL,YAAY,EAAE,eAAe;YAC7B,MAAM,EAAE,QAAQ;YAChB,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,YAAY,EAAE,eAAe;YAC7B,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC1D,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"getAgentIdentity.js","sourceRoot":"","sources":["../../src/tools/getAgentIdentity.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payclaw/badge",
3
- "version": "0.3.1",
3
+ "version": "0.5.0",
4
4
  "description": "Prove your agent is an authorized actor, not a bot. MCP-native identity declaration for agent commerce.",
5
5
  "bin": "dist/index.js",
6
6
  "main": "dist/index.js",
@@ -19,11 +19,12 @@
19
19
  "prepublishOnly": "npm run build"
20
20
  },
21
21
  "dependencies": {
22
- "@modelcontextprotocol/sdk": "^1.0.0"
22
+ "@modelcontextprotocol/sdk": "^1.0.0",
23
+ "zod": "^4.3.6"
23
24
  },
24
25
  "devDependencies": {
25
- "typescript": "^5.3.0",
26
- "@types/node": "^20.0.0"
26
+ "@types/node": "^20.0.0",
27
+ "typescript": "^5.3.0"
27
28
  },
28
29
  "keywords": [
29
30
  "payclaw",