@paybond/kit 0.12.1 → 0.12.3

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.
@@ -38,11 +38,15 @@ export type PaybondMCPSettings = {
38
38
  capabilityTokenCache?: McpCapabilityTokenCacheConfig;
39
39
  };
40
40
  export declare function formatMcpStdioFrame(response: JSONRPCResponse): string;
41
+ /** Newline-delimited JSON-RPC frame used by mcp-proxy and recent MCP SDKs. */
42
+ export declare function formatMcpNdjsonFrame(response: JSONRPCResponse): string;
41
43
  export declare class PaybondMCPServer {
42
44
  private readonly runtime;
43
45
  private readonly tools;
44
46
  private readonly toolPolicy;
45
47
  private initialized;
48
+ /** Framing negotiated from the first successfully parsed stdin message. */
49
+ private stdioFraming;
46
50
  constructor(settings: PaybondMCPSettings);
47
51
  listResourceTemplates(): Array<Record<string, unknown>>;
48
52
  readResource(uri: string): Promise<{
@@ -15,7 +15,7 @@ import { verifyAgentReceiptV1FromJSON } from "./agent-receipt.js";
15
15
  import { agentReceiptResourceTemplateDefinition, agentReceiptResourceUri, MCP_AGENT_RECEIPT_RESOURCE_MIME_TYPE, parseAgentReceiptResourceUri, } from "./mcp-receipt-resource.js";
16
16
  import { DEFAULT_PAYBOND_GATEWAY_BASE_URL, GatewayFraudClient, GatewaySignalClient, } from "./index.js";
17
17
  const SERVER_NAME = "Paybond MCP";
18
- const SERVER_VERSION = "0.12.1";
18
+ const SERVER_VERSION = "0.12.3";
19
19
  const MCP_PROTOCOL_VERSION = "2025-11-25";
20
20
  const DEFAULT_PRINCIPAL_PATH = "/v1/auth/principal";
21
21
  const DEFAULT_RECOGNITION_VERIFIER_ID = "paybond-gateway";
@@ -634,7 +634,10 @@ class PaybondMCPRuntime {
634
634
  requireEvidenceValidation(input) {
635
635
  this.evidenceGate.requirePass(input);
636
636
  }
637
- /** Resolve and cache the gateway principal during MCP server startup. */
637
+ /**
638
+ * Best-effort principal warm-up. Callers must not await this on the MCP
639
+ * initialize path; principal resolves lazily on first tool use.
640
+ */
638
641
  async preloadPrincipal() {
639
642
  await this.principal();
640
643
  }
@@ -901,11 +904,17 @@ export function formatMcpStdioFrame(response) {
901
904
  const body = JSON.stringify(response);
902
905
  return `Content-Length: ${Buffer.byteLength(body, "utf8")}\r\n\r\n${body}`;
903
906
  }
907
+ /** Newline-delimited JSON-RPC frame used by mcp-proxy and recent MCP SDKs. */
908
+ export function formatMcpNdjsonFrame(response) {
909
+ return `${JSON.stringify(response)}\n`;
910
+ }
904
911
  export class PaybondMCPServer {
905
912
  runtime;
906
913
  tools;
907
914
  toolPolicy;
908
915
  initialized = false;
916
+ /** Framing negotiated from the first successfully parsed stdin message. */
917
+ stdioFraming = "content-length";
909
918
  constructor(settings) {
910
919
  if (!settings.apiKey.trim()) {
911
920
  throw new Error("PAYBOND_API_KEY is required");
@@ -1006,7 +1015,12 @@ export class PaybondMCPServer {
1006
1015
  }
1007
1016
  switch (method) {
1008
1017
  case "initialize":
1009
- await this.runtime.preloadPrincipal();
1018
+ // Do not block the MCP handshake on Gateway principal preload. Registry
1019
+ // hosts time out initialize if egress is slow or blocked; principal is
1020
+ // resolved lazily on the first tool that needs it.
1021
+ void this.runtime.preloadPrincipal().catch(() => {
1022
+ // Best-effort warm cache; failures surface on subsequent tool calls.
1023
+ });
1010
1024
  return {
1011
1025
  jsonrpc: "2.0",
1012
1026
  id: message.id,
@@ -1101,7 +1115,11 @@ export class PaybondMCPServer {
1101
1115
  runStdio() {
1102
1116
  let buffer = Buffer.alloc(0);
1103
1117
  process.stdin.on("data", (chunk) => {
1104
- buffer = Buffer.concat([buffer, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8")]);
1118
+ buffer = Buffer.concat([
1119
+ buffer,
1120
+ Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8"),
1121
+ ]);
1122
+ // Prefer Content-Length frames when present (LSP-style MCP hosts).
1105
1123
  while (true) {
1106
1124
  const headerEnd = buffer.indexOf("\r\n\r\n");
1107
1125
  if (headerEnd < 0) {
@@ -1123,8 +1141,36 @@ export class PaybondMCPServer {
1123
1141
  }
1124
1142
  const body = buffer.subarray(bodyStart, frameEnd).toString("utf8");
1125
1143
  buffer = buffer.subarray(frameEnd);
1144
+ this.stdioFraming = "content-length";
1126
1145
  void this.handleLine(body);
1127
1146
  }
1147
+ // Do not let NDJSON parsing consume an in-progress Content-Length frame.
1148
+ const preview = buffer
1149
+ .subarray(0, Math.min(buffer.length, 64))
1150
+ .toString("utf8")
1151
+ .trimStart()
1152
+ .toLowerCase();
1153
+ if (preview.startsWith("content-length:")) {
1154
+ return;
1155
+ }
1156
+ // Newline-delimited JSON-RPC (mcp-proxy / recent MCP SDKs).
1157
+ while (true) {
1158
+ const newline = buffer.indexOf("\n");
1159
+ if (newline < 0) {
1160
+ break;
1161
+ }
1162
+ const rawLine = buffer
1163
+ .subarray(0, newline)
1164
+ .toString("utf8")
1165
+ .replace(/\r$/, "");
1166
+ buffer = buffer.subarray(newline + 1);
1167
+ const line = rawLine.trim();
1168
+ if (!line.startsWith("{")) {
1169
+ continue;
1170
+ }
1171
+ this.stdioFraming = "ndjson";
1172
+ void this.handleLine(line);
1173
+ }
1128
1174
  });
1129
1175
  process.stdin.on("end", () => {
1130
1176
  if (buffer.length > 0) {
@@ -1148,7 +1194,10 @@ export class PaybondMCPServer {
1148
1194
  }
1149
1195
  }
1150
1196
  writeResponse(response) {
1151
- process.stdout.write(formatMcpStdioFrame(response));
1197
+ const frame = this.stdioFraming === "ndjson"
1198
+ ? formatMcpNdjsonFrame(response)
1199
+ : formatMcpStdioFrame(response);
1200
+ process.stdout.write(frame);
1152
1201
  }
1153
1202
  buildTools(settings) {
1154
1203
  const tools = [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paybond/kit",
3
- "version": "0.12.1",
3
+ "version": "0.12.3",
4
4
  "mcpName": "io.github.nonameuserd/paybond",
5
5
  "description": "Paybond Kit for TypeScript: agent spend governance for paid tool calls with spend authorization, evidence receipts, refunds, disputes, hosted Gateway sessions, and settlement.",
6
6
  "license": "Apache-2.0",
@@ -7,7 +7,7 @@
7
7
  "name": "openai-shopping-agent",
8
8
  "dependencies": {
9
9
  "@openai/agents": "^0.4.0",
10
- "@paybond/kit": "^0.12.1",
10
+ "@paybond/kit": "^0.12.3",
11
11
  "zod": "^4.2.0"
12
12
  },
13
13
  "devDependencies": {
@@ -169,9 +169,9 @@
169
169
  }
170
170
  },
171
171
  "node_modules/@paybond/kit": {
172
- "version": "0.12.1",
173
- "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.1.tgz",
174
- "integrity": "sha512-/cDjnLyleCLOAjySsF8B9ERH7px4TbLNj/k91UHubEuO0/hxzoQkQH1R5iiM3i+XRWDr+Mv2pv64Zy0w9yDWtg==",
172
+ "version": "0.12.3",
173
+ "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.3.tgz",
174
+ "integrity": "sha512-D2HRZbUoAdJnlGaPYkvAeCs9hKqPxW7CRFjcST+TC+feSvbZzLmZ8KyF6YZb7oQSp0qBeovWwDGKBRoxgD50bg==",
175
175
  "license": "Apache-2.0",
176
176
  "dependencies": {
177
177
  "@noble/ed25519": "^2.2.1",
@@ -6,7 +6,7 @@
6
6
  "": {
7
7
  "name": "paybond-aws-operator",
8
8
  "dependencies": {
9
- "@paybond/kit": "^0.12.1"
9
+ "@paybond/kit": "^0.12.3"
10
10
  },
11
11
  "devDependencies": {
12
12
  "@types/node": "^22.10.1",
@@ -47,9 +47,9 @@
47
47
  }
48
48
  },
49
49
  "node_modules/@paybond/kit": {
50
- "version": "0.12.1",
51
- "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.1.tgz",
52
- "integrity": "sha512-/cDjnLyleCLOAjySsF8B9ERH7px4TbLNj/k91UHubEuO0/hxzoQkQH1R5iiM3i+XRWDr+Mv2pv64Zy0w9yDWtg==",
50
+ "version": "0.12.3",
51
+ "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.3.tgz",
52
+ "integrity": "sha512-D2HRZbUoAdJnlGaPYkvAeCs9hKqPxW7CRFjcST+TC+feSvbZzLmZ8KyF6YZb7oQSp0qBeovWwDGKBRoxgD50bg==",
53
53
  "license": "Apache-2.0",
54
54
  "dependencies": {
55
55
  "@noble/ed25519": "^2.2.1",
@@ -7,7 +7,7 @@
7
7
  "name": "paybond-claude-agents-demo",
8
8
  "dependencies": {
9
9
  "@anthropic-ai/claude-agent-sdk": "^0.2.100",
10
- "@paybond/kit": "^0.12.1",
10
+ "@paybond/kit": "^0.12.3",
11
11
  "zod": "^4.2.0"
12
12
  },
13
13
  "devDependencies": {
@@ -260,9 +260,9 @@
260
260
  }
261
261
  },
262
262
  "node_modules/@paybond/kit": {
263
- "version": "0.12.1",
264
- "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.1.tgz",
265
- "integrity": "sha512-/cDjnLyleCLOAjySsF8B9ERH7px4TbLNj/k91UHubEuO0/hxzoQkQH1R5iiM3i+XRWDr+Mv2pv64Zy0w9yDWtg==",
263
+ "version": "0.12.3",
264
+ "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.3.tgz",
265
+ "integrity": "sha512-D2HRZbUoAdJnlGaPYkvAeCs9hKqPxW7CRFjcST+TC+feSvbZzLmZ8KyF6YZb7oQSp0qBeovWwDGKBRoxgD50bg==",
266
266
  "license": "Apache-2.0",
267
267
  "dependencies": {
268
268
  "@noble/ed25519": "^2.2.1",
@@ -7,7 +7,7 @@
7
7
  "name": "paybond-mastra-travel-agent",
8
8
  "dependencies": {
9
9
  "@mastra/core": "^1.49.0",
10
- "@paybond/kit": "^0.12.1",
10
+ "@paybond/kit": "^0.12.3",
11
11
  "zod": "^4.2.0"
12
12
  },
13
13
  "devDependencies": {
@@ -412,9 +412,9 @@
412
412
  }
413
413
  },
414
414
  "node_modules/@paybond/kit": {
415
- "version": "0.12.1",
416
- "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.1.tgz",
417
- "integrity": "sha512-/cDjnLyleCLOAjySsF8B9ERH7px4TbLNj/k91UHubEuO0/hxzoQkQH1R5iiM3i+XRWDr+Mv2pv64Zy0w9yDWtg==",
415
+ "version": "0.12.3",
416
+ "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.3.tgz",
417
+ "integrity": "sha512-D2HRZbUoAdJnlGaPYkvAeCs9hKqPxW7CRFjcST+TC+feSvbZzLmZ8KyF6YZb7oQSp0qBeovWwDGKBRoxgD50bg==",
418
418
  "license": "Apache-2.0",
419
419
  "dependencies": {
420
420
  "@noble/ed25519": "^2.2.1",
@@ -6,7 +6,7 @@
6
6
  "": {
7
7
  "name": "paybond-mcp-coding-agent",
8
8
  "dependencies": {
9
- "@paybond/kit": "^0.12.1"
9
+ "@paybond/kit": "^0.12.3"
10
10
  },
11
11
  "devDependencies": {
12
12
  "@types/node": "^22.10.1",
@@ -47,9 +47,9 @@
47
47
  }
48
48
  },
49
49
  "node_modules/@paybond/kit": {
50
- "version": "0.12.1",
51
- "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.1.tgz",
52
- "integrity": "sha512-/cDjnLyleCLOAjySsF8B9ERH7px4TbLNj/k91UHubEuO0/hxzoQkQH1R5iiM3i+XRWDr+Mv2pv64Zy0w9yDWtg==",
50
+ "version": "0.12.3",
51
+ "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.3.tgz",
52
+ "integrity": "sha512-D2HRZbUoAdJnlGaPYkvAeCs9hKqPxW7CRFjcST+TC+feSvbZzLmZ8KyF6YZb7oQSp0qBeovWwDGKBRoxgD50bg==",
53
53
  "license": "Apache-2.0",
54
54
  "dependencies": {
55
55
  "@noble/ed25519": "^2.2.1",
@@ -7,7 +7,7 @@
7
7
  "name": "paybond-openai-agents-demo",
8
8
  "dependencies": {
9
9
  "@openai/agents": "^0.4.0",
10
- "@paybond/kit": "^0.12.1",
10
+ "@paybond/kit": "^0.12.3",
11
11
  "zod": "^4.2.0"
12
12
  },
13
13
  "devDependencies": {
@@ -169,9 +169,9 @@
169
169
  }
170
170
  },
171
171
  "node_modules/@paybond/kit": {
172
- "version": "0.12.1",
173
- "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.1.tgz",
174
- "integrity": "sha512-/cDjnLyleCLOAjySsF8B9ERH7px4TbLNj/k91UHubEuO0/hxzoQkQH1R5iiM3i+XRWDr+Mv2pv64Zy0w9yDWtg==",
172
+ "version": "0.12.3",
173
+ "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.3.tgz",
174
+ "integrity": "sha512-D2HRZbUoAdJnlGaPYkvAeCs9hKqPxW7CRFjcST+TC+feSvbZzLmZ8KyF6YZb7oQSp0qBeovWwDGKBRoxgD50bg==",
175
175
  "license": "Apache-2.0",
176
176
  "dependencies": {
177
177
  "@noble/ed25519": "^2.2.1",
@@ -6,7 +6,7 @@
6
6
  "": {
7
7
  "name": "paybond-procurement-agent",
8
8
  "dependencies": {
9
- "@paybond/kit": "^0.12.1"
9
+ "@paybond/kit": "^0.12.3"
10
10
  },
11
11
  "devDependencies": {
12
12
  "@types/node": "^22.10.1",
@@ -47,9 +47,9 @@
47
47
  }
48
48
  },
49
49
  "node_modules/@paybond/kit": {
50
- "version": "0.12.1",
51
- "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.1.tgz",
52
- "integrity": "sha512-/cDjnLyleCLOAjySsF8B9ERH7px4TbLNj/k91UHubEuO0/hxzoQkQH1R5iiM3i+XRWDr+Mv2pv64Zy0w9yDWtg==",
50
+ "version": "0.12.3",
51
+ "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.3.tgz",
52
+ "integrity": "sha512-D2HRZbUoAdJnlGaPYkvAeCs9hKqPxW7CRFjcST+TC+feSvbZzLmZ8KyF6YZb7oQSp0qBeovWwDGKBRoxgD50bg==",
53
53
  "license": "Apache-2.0",
54
54
  "dependencies": {
55
55
  "@noble/ed25519": "^2.2.1",
@@ -6,7 +6,7 @@
6
6
  "": {
7
7
  "name": "paybond-shopify-shopping-agent",
8
8
  "dependencies": {
9
- "@paybond/kit": "^0.12.1"
9
+ "@paybond/kit": "^0.12.3"
10
10
  },
11
11
  "devDependencies": {
12
12
  "@types/node": "^22.10.1",
@@ -47,9 +47,9 @@
47
47
  }
48
48
  },
49
49
  "node_modules/@paybond/kit": {
50
- "version": "0.12.1",
51
- "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.1.tgz",
52
- "integrity": "sha512-/cDjnLyleCLOAjySsF8B9ERH7px4TbLNj/k91UHubEuO0/hxzoQkQH1R5iiM3i+XRWDr+Mv2pv64Zy0w9yDWtg==",
50
+ "version": "0.12.3",
51
+ "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.3.tgz",
52
+ "integrity": "sha512-D2HRZbUoAdJnlGaPYkvAeCs9hKqPxW7CRFjcST+TC+feSvbZzLmZ8KyF6YZb7oQSp0qBeovWwDGKBRoxgD50bg==",
53
53
  "license": "Apache-2.0",
54
54
  "dependencies": {
55
55
  "@noble/ed25519": "^2.2.1",
@@ -6,7 +6,7 @@
6
6
  "": {
7
7
  "name": "paybond-stripe-agent-demo",
8
8
  "dependencies": {
9
- "@paybond/kit": "^0.12.1"
9
+ "@paybond/kit": "^0.12.2"
10
10
  },
11
11
  "devDependencies": {
12
12
  "@types/node": "^22.10.1",
@@ -47,9 +47,9 @@
47
47
  }
48
48
  },
49
49
  "node_modules/@paybond/kit": {
50
- "version": "0.12.1",
51
- "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.1.tgz",
52
- "integrity": "sha512-I/IdvsORxy5TE38dSZnPNMeRwe1kgmqoQxHi4IVUE5dCBkcPmIO+Sl/oh+h5qPbzhKMv1eLakIhFKhs+cM9VjQ==",
50
+ "version": "0.12.2",
51
+ "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.2.tgz",
52
+ "integrity": "sha512-oUCxOWvlTYe4W8dhsAT3we1ocuhSm1erILVD0BWNlUt11KkcViw0ifwcoYdj1dxUpISEcD+QjOVQUJ0g+kkAUw==",
53
53
  "license": "Apache-2.0",
54
54
  "dependencies": {
55
55
  "@noble/ed25519": "^2.2.1",
@@ -8,7 +8,7 @@
8
8
  "dependencies": {
9
9
  "@langchain/core": "^1.2.1",
10
10
  "@langchain/langgraph": "^1.4.7",
11
- "@paybond/kit": "^0.12.1",
11
+ "@paybond/kit": "^0.12.3",
12
12
  "zod": "^4.2.0"
13
13
  },
14
14
  "devDependencies": {
@@ -178,9 +178,9 @@
178
178
  }
179
179
  },
180
180
  "node_modules/@paybond/kit": {
181
- "version": "0.12.1",
182
- "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.1.tgz",
183
- "integrity": "sha512-/cDjnLyleCLOAjySsF8B9ERH7px4TbLNj/k91UHubEuO0/hxzoQkQH1R5iiM3i+XRWDr+Mv2pv64Zy0w9yDWtg==",
181
+ "version": "0.12.3",
182
+ "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.3.tgz",
183
+ "integrity": "sha512-D2HRZbUoAdJnlGaPYkvAeCs9hKqPxW7CRFjcST+TC+feSvbZzLmZ8KyF6YZb7oQSp0qBeovWwDGKBRoxgD50bg==",
184
184
  "license": "Apache-2.0",
185
185
  "dependencies": {
186
186
  "@noble/ed25519": "^2.2.1",
@@ -6,7 +6,7 @@
6
6
  "": {
7
7
  "name": "paybond-vercel-shopping-agent",
8
8
  "dependencies": {
9
- "@paybond/kit": "^0.12.1",
9
+ "@paybond/kit": "^0.12.3",
10
10
  "ai": "^5.0.0",
11
11
  "zod": "^4.2.0"
12
12
  },
@@ -104,9 +104,9 @@
104
104
  }
105
105
  },
106
106
  "node_modules/@paybond/kit": {
107
- "version": "0.12.1",
108
- "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.1.tgz",
109
- "integrity": "sha512-/cDjnLyleCLOAjySsF8B9ERH7px4TbLNj/k91UHubEuO0/hxzoQkQH1R5iiM3i+XRWDr+Mv2pv64Zy0w9yDWtg==",
107
+ "version": "0.12.3",
108
+ "resolved": "https://registry.npmjs.org/@paybond/kit/-/kit-0.12.3.tgz",
109
+ "integrity": "sha512-D2HRZbUoAdJnlGaPYkvAeCs9hKqPxW7CRFjcST+TC+feSvbZzLmZ8KyF6YZb7oQSp0qBeovWwDGKBRoxgD50bg==",
110
110
  "license": "Apache-2.0",
111
111
  "dependencies": {
112
112
  "@noble/ed25519": "^2.2.1",