@harrylabsj/kiwi 0.7.9 → 0.7.11

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 (100) hide show
  1. package/contracts/commerce-intent/1.0/schema.json +124 -0
  2. package/contracts/delegation-policy/1.0/schema.json +143 -0
  3. package/contracts/effective-authorization/1.0/schema.json +167 -0
  4. package/contracts/kiwi-contracts.lock.json +1 -1
  5. package/contracts/manifest.json +25 -1
  6. package/contracts/persistent-task/1.0/schema.json +191 -0
  7. package/contracts/vectors/commerce-intent.invalid-no-items.json +7 -0
  8. package/contracts/vectors/commerce-intent.valid.json +32 -0
  9. package/contracts/vectors/delegation-policy.invalid-payment-auto.json +15 -0
  10. package/contracts/vectors/delegation-policy.valid.json +25 -0
  11. package/contracts/vectors/effective-authorization.invalid-deny-wins.json +20 -0
  12. package/contracts/vectors/effective-authorization.valid.json +23 -0
  13. package/contracts/vectors/persistent-task.invalid-no-idempotency.json +7 -0
  14. package/contracts/vectors/persistent-task.valid.json +45 -0
  15. package/dist/a2a/client/url-policy.js +52 -14
  16. package/dist/a2a/client/url-policy.js.map +1 -1
  17. package/dist/a2a/node.js +27 -1
  18. package/dist/a2a/node.js.map +1 -1
  19. package/dist/a2a/server/merchant-handler.d.ts +27 -0
  20. package/dist/a2a/server/merchant-handler.js +88 -10
  21. package/dist/a2a/server/merchant-handler.js.map +1 -1
  22. package/dist/a2a/signing-key.js +18 -0
  23. package/dist/a2a/signing-key.js.map +1 -1
  24. package/dist/buyer-core/a2a-knp.d.ts +71 -0
  25. package/dist/buyer-core/a2a-knp.js +139 -0
  26. package/dist/buyer-core/a2a-knp.js.map +1 -0
  27. package/dist/buyer-core/a2a-negotiator.d.ts +37 -0
  28. package/dist/buyer-core/a2a-negotiator.js +152 -0
  29. package/dist/buyer-core/a2a-negotiator.js.map +1 -0
  30. package/dist/buyer-core/a2a-quote-fetcher.d.ts +44 -0
  31. package/dist/buyer-core/a2a-quote-fetcher.js +178 -0
  32. package/dist/buyer-core/a2a-quote-fetcher.js.map +1 -0
  33. package/dist/buyer-core/build-service.d.ts +44 -0
  34. package/dist/buyer-core/build-service.js +76 -0
  35. package/dist/buyer-core/build-service.js.map +1 -0
  36. package/dist/buyer-core/errors.d.ts +31 -0
  37. package/dist/buyer-core/errors.js +52 -0
  38. package/dist/buyer-core/errors.js.map +1 -0
  39. package/dist/buyer-core/merchant-index.d.ts +64 -0
  40. package/dist/buyer-core/merchant-index.js +213 -0
  41. package/dist/buyer-core/merchant-index.js.map +1 -0
  42. package/dist/buyer-core/negotiator.d.ts +51 -0
  43. package/dist/buyer-core/negotiator.js +181 -0
  44. package/dist/buyer-core/negotiator.js.map +1 -0
  45. package/dist/buyer-core/quote-fetcher.d.ts +46 -0
  46. package/dist/buyer-core/quote-fetcher.js +166 -0
  47. package/dist/buyer-core/quote-fetcher.js.map +1 -0
  48. package/dist/buyer-core/service.d.ts +218 -0
  49. package/dist/buyer-core/service.js +558 -0
  50. package/dist/buyer-core/service.js.map +1 -0
  51. package/dist/buyer-core/store.d.ts +84 -0
  52. package/dist/buyer-core/store.js +256 -0
  53. package/dist/buyer-core/store.js.map +1 -0
  54. package/dist/cli.js +25 -0
  55. package/dist/cli.js.map +1 -1
  56. package/dist/config/profile.d.ts +9 -0
  57. package/dist/config/profile.js +23 -0
  58. package/dist/config/profile.js.map +1 -1
  59. package/dist/contracts/northbound-schema.d.ts +27 -0
  60. package/dist/contracts/northbound-schema.js +102 -0
  61. package/dist/contracts/northbound-schema.js.map +1 -0
  62. package/dist/handoff/destination.js +16 -5
  63. package/dist/handoff/destination.js.map +1 -1
  64. package/dist/http/cli.d.ts +16 -0
  65. package/dist/http/cli.js +123 -0
  66. package/dist/http/cli.js.map +1 -0
  67. package/dist/http/server.d.ts +39 -0
  68. package/dist/http/server.js +297 -0
  69. package/dist/http/server.js.map +1 -0
  70. package/dist/mcp/cli.d.ts +70 -0
  71. package/dist/mcp/cli.js +147 -0
  72. package/dist/mcp/cli.js.map +1 -0
  73. package/dist/mcp/server.d.ts +41 -0
  74. package/dist/mcp/server.js +141 -0
  75. package/dist/mcp/server.js.map +1 -0
  76. package/dist/mcp/tools.d.ts +28 -0
  77. package/dist/mcp/tools.js +299 -0
  78. package/dist/mcp/tools.js.map +1 -0
  79. package/dist/mcp/types.d.ts +107 -0
  80. package/dist/mcp/types.js +52 -0
  81. package/dist/mcp/types.js.map +1 -0
  82. package/dist/merchant/decision-backend.d.ts +82 -0
  83. package/dist/merchant/decision-backend.js +275 -0
  84. package/dist/merchant/decision-backend.js.map +1 -0
  85. package/dist/merchant/ops.d.ts +80 -0
  86. package/dist/merchant/ops.js +75 -0
  87. package/dist/merchant/ops.js.map +1 -0
  88. package/dist/merchant/ucp-profile.d.ts +39 -0
  89. package/dist/merchant/ucp-profile.js +55 -0
  90. package/dist/merchant/ucp-profile.js.map +1 -0
  91. package/dist/product-cli.d.ts +1 -1
  92. package/dist/product-cli.js +1 -1
  93. package/dist/product-cli.js.map +1 -1
  94. package/dist/trust/identity/auth-verifier.js +19 -1
  95. package/dist/trust/identity/auth-verifier.js.map +1 -1
  96. package/dist/trust/identity/message-signature.js +14 -8
  97. package/dist/trust/identity/message-signature.js.map +1 -1
  98. package/examples/profiles/merchant.deepseek.yaml +5 -0
  99. package/examples/profiles/merchant.fake.yaml +4 -0
  100. package/package.json +4 -2
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Copyright 2026 harrylabsj
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /**
17
+ * kiwi-buyer-mcp stdio server(战略 v2.5 §6.1)。
18
+ *
19
+ * 最小 JSON-RPC 2.0 MCP 实现:initialize 握手(version negotiation,fail-closed)、
20
+ * notifications/initialized、tools/list、tools/call;未实现方法一律
21
+ * METHOD_NOT_FOUND;初始化前调用 tools/* 返回 SERVER_NOT_INITIALIZED。
22
+ * 一行一行读 stdin(readline),每行一个 JSON-RPC 消息,响应写 stdout 换行分隔。
23
+ *
24
+ * 本 server 不持有任何商业状态——状态唯一权威在 KiwiBuyerService 的持久 store。
25
+ * 输入/输出均投影,不保存第二套状态机(§6.2)。
26
+ */
27
+ import { createInterface } from "node:readline";
28
+ import { MCP_ERROR } from "./types.js";
29
+ import { MCP_PROTOCOL_VERSIONS } from "./types.js";
30
+ import { McpError } from "../buyer-core/errors.js";
31
+ export class McpServer {
32
+ tools;
33
+ serverInfo;
34
+ initialized = false;
35
+ initRequested = false;
36
+ constructor(options) {
37
+ this.tools = new Map(options.tools.map((t) => [t.name, t]));
38
+ this.serverInfo = options.serverInfo;
39
+ }
40
+ /** 处理单个 JSON-RPC 消息,返回响应(notification 返回 undefined)。 */
41
+ async handleMessage(raw) {
42
+ let request;
43
+ try {
44
+ request = JSON.parse(raw);
45
+ }
46
+ catch {
47
+ return this.error(null, MCP_ERROR.PARSE_ERROR, "parse error: not valid JSON");
48
+ }
49
+ if (request.jsonrpc !== "2.0" || typeof request.method !== "string") {
50
+ return this.error(request.id, MCP_ERROR.INVALID_REQUEST, "invalid request: expected jsonrpc 2.0 request");
51
+ }
52
+ try {
53
+ switch (request.method) {
54
+ case "initialize":
55
+ return await this.handleInitialize(request);
56
+ case "notifications/initialized":
57
+ if (this.initRequested)
58
+ this.initialized = true;
59
+ return undefined;
60
+ case "tools/list":
61
+ return this.requireInit(request, () => this.handleListTools(request));
62
+ case "tools/call":
63
+ return this.requireInit(request, () => this.handleCallTool(request));
64
+ default:
65
+ return this.error(request.id, MCP_ERROR.METHOD_NOT_FOUND, `method not found: ${request.method}`);
66
+ }
67
+ }
68
+ catch (error) {
69
+ if (error instanceof McpError) {
70
+ return this.error(request.id, error.toJsonRpc().code, error.message, error.detail);
71
+ }
72
+ return this.error(request.id, MCP_ERROR.INTERNAL_ERROR, `internal error: ${error instanceof Error ? error.message : String(error)}`);
73
+ }
74
+ }
75
+ async requireInit(request, fn) {
76
+ if (!this.initialized) {
77
+ return this.error(request.id, MCP_ERROR.SERVER_NOT_INITIALIZED, "server not initialized: call initialize first");
78
+ }
79
+ return fn();
80
+ }
81
+ async handleInitialize(request) {
82
+ const params = (request.params ?? {});
83
+ const requested = params.protocolVersion;
84
+ if (typeof requested !== "string" || !MCP_PROTOCOL_VERSIONS.includes(requested)) {
85
+ // version negotiation fail-closed:未知版本拒绝(§6.10 兼容矩阵 fail closed)。
86
+ return this.error(request.id, MCP_ERROR.INVALID_PARAMS, `unsupported MCP protocol version: ${String(requested)}`);
87
+ }
88
+ // 规范:initialize 只协商版本;随后客户端发 notifications/initialized 后才允许
89
+ // tools/*。因此这里只标记 initRequested,不放行工具调用。
90
+ this.initRequested = true;
91
+ const result = {
92
+ protocolVersion: requested,
93
+ capabilities: { tools: { listChanged: false } },
94
+ serverInfo: this.serverInfo,
95
+ };
96
+ return this.result(request.id, result);
97
+ }
98
+ handleListTools(request) {
99
+ const result = {
100
+ tools: [...this.tools.values()].map((t) => ({
101
+ name: t.name,
102
+ description: t.description,
103
+ inputSchema: t.inputSchema,
104
+ })),
105
+ };
106
+ return this.result(request.id, result);
107
+ }
108
+ async handleCallTool(request) {
109
+ const params = (request.params ?? {});
110
+ if (typeof params.name !== "string") {
111
+ return this.error(request.id, MCP_ERROR.INVALID_PARAMS, "tools/call requires params.name");
112
+ }
113
+ const tool = this.tools.get(params.name);
114
+ if (tool === undefined) {
115
+ return this.error(request.id, MCP_ERROR.TOOL_NOT_FOUND, `tool not found: ${params.name}`);
116
+ }
117
+ const args = params.arguments !== undefined && typeof params.arguments === "object"
118
+ ? params.arguments
119
+ : {};
120
+ const toolResult = await tool.handle(args);
121
+ return this.result(request.id, toolResult);
122
+ }
123
+ result(id, result) {
124
+ return { jsonrpc: "2.0", id, result };
125
+ }
126
+ error(id, code, message, data) {
127
+ return { jsonrpc: "2.0", id, error: { code, message, data } };
128
+ }
129
+ /** 阻塞运行 stdio 循环(CLI 入口)。逐行读 stdin,逐行写 stdout。 */
130
+ async serve() {
131
+ const rl = createInterface({ input: process.stdin });
132
+ for await (const line of rl) {
133
+ if (line.trim() === "")
134
+ continue;
135
+ const response = await this.handleMessage(line);
136
+ if (response !== undefined)
137
+ process.stdout.write(`${JSON.stringify(response)}\n`);
138
+ }
139
+ }
140
+ }
141
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Copyright 2026 harrylabsj
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /**
17
+ * 7 个高层 Kiwi Sourcing Tools(战略 v2.5 §6.1,词表单一来源见 KIWI_SOURCING_TOOLS)。
18
+ *
19
+ * 原则:不暴露 KNP 每个底层消息、不复制 UCP 的 Catalog/Checkout tools;宿主 Agent
20
+ * 用少量跨 Merchant 高层工具完成『找供应商 → RFQ → 比较 → 磋商 → Agreement →
21
+ * UCP handoff』编排。每个写工具绑定 idempotency_key 并返回稳定 task_id /
22
+ * candidate_id / approval_id / agreement_id(§6.2)。业务错误经 isError 带内返回,
23
+ * 错误分类(McpError.code)作为跨宿主语义不变量(§6.10)。
24
+ */
25
+ import type { KiwiToolDefinition } from "./types.js";
26
+ import { KiwiBuyerService } from "../buyer-core/service.js";
27
+ /** 构造 7 个高层工具。任意 handler 抛出的 McpError 都会被转成 isError 结果。 */
28
+ export declare function buildKiwiTools(service: KiwiBuyerService): KiwiToolDefinition[];
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Copyright 2026 harrylabsj
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { McpError } from "../buyer-core/errors.js";
17
+ import { KiwiBuyerService } from "../buyer-core/service.js";
18
+ function ok(text) {
19
+ return { content: [{ type: "text", text }] };
20
+ }
21
+ function err(error) {
22
+ if (error instanceof McpError) {
23
+ return {
24
+ content: [{ type: "text", text: `error ${error.code}: ${error.message}` }],
25
+ isError: true,
26
+ };
27
+ }
28
+ return {
29
+ content: [{ type: "text", text: `error internal_error: ${error instanceof Error ? error.message : String(error)}` }],
30
+ isError: true,
31
+ };
32
+ }
33
+ /**
34
+ * ASK 动作遇 approval_required 时的结构化返回:不抛 isError,而是返回
35
+ * `{ approval_required: { approval_id }, ...extra }`——宿主拿到持久 approval_id
36
+ * 呈现给用户确认后调 kiwi_approve,再携 id 重试。approval_id 是 first-class 值,
37
+ * 不从错误文本解析。
38
+ */
39
+ function approvalRequiredOrErr(error, extra) {
40
+ if (error instanceof McpError && error.code === "approval_required") {
41
+ const approvalId = error.detail?.approval_id;
42
+ return ok(JSON.stringify({ approval_required: { approval_id: approvalId }, ...extra }));
43
+ }
44
+ return err(error);
45
+ }
46
+ /** 构造 7 个高层工具。任意 handler 抛出的 McpError 都会被转成 isError 结果。 */
47
+ export function buildKiwiTools(service) {
48
+ const tools = [
49
+ {
50
+ name: "kiwi_search",
51
+ description: "发现候选供应商,并按需跨商家搜索商品。只读。内部语义:Merchant routing + UCP Catalog orchestration + trust/freshness。",
52
+ inputSchema: {
53
+ $schema: "https://json-schema.org/draft/2020-12/schema",
54
+ type: "object",
55
+ additionalProperties: false,
56
+ required: ["query"],
57
+ properties: {
58
+ query: { type: "string", minLength: 1 },
59
+ category: { type: "string" },
60
+ region: { type: "string" },
61
+ },
62
+ },
63
+ async handle(args) {
64
+ try {
65
+ const result = await service.search({
66
+ query: String(args.query),
67
+ category: args.category === undefined ? undefined : String(args.category),
68
+ region: args.region === undefined ? undefined : String(args.region),
69
+ });
70
+ return ok(JSON.stringify({ merchants: result.merchants, note: result.note }));
71
+ }
72
+ catch (error) {
73
+ return err(error);
74
+ }
75
+ },
76
+ },
77
+ {
78
+ name: "kiwi_request_quotes",
79
+ description: "向一个或多个商家发起询价。写操作;必须携带 idempotency_key(可选,缺省自动生成),返回稳定 task_id;KNP RFQ fan-out。CommerceIntent 必须满足冻结契约。",
80
+ inputSchema: {
81
+ $schema: "https://json-schema.org/draft/2020-12/schema",
82
+ type: "object",
83
+ additionalProperties: false,
84
+ required: ["intent"],
85
+ properties: {
86
+ intent: {
87
+ type: "object",
88
+ additionalProperties: true,
89
+ required: ["intent_id", "intent_type", "items"],
90
+ properties: {
91
+ intent_id: { type: "string", minLength: 1 },
92
+ intent_type: { type: "string", enum: ["purchase", "procurement", "inquiry"] },
93
+ items: { type: "array", minItems: 1 },
94
+ },
95
+ },
96
+ idempotency_key: { type: "string", minLength: 1 },
97
+ merchant_ids: { type: "array", items: { type: "string", minLength: 1 } },
98
+ },
99
+ },
100
+ async handle(args) {
101
+ try {
102
+ const result = await service.requestQuotes({
103
+ intent: (args.intent ?? {}),
104
+ idempotency_key: args.idempotency_key === undefined ? undefined : String(args.idempotency_key),
105
+ merchant_ids: args.merchant_ids === undefined
106
+ ? undefined
107
+ : args.merchant_ids.map(String),
108
+ });
109
+ return ok(JSON.stringify({ task_id: result.task.task_id, task: result.task, created: result.created }));
110
+ }
111
+ catch (error) {
112
+ return err(error);
113
+ }
114
+ },
115
+ },
116
+ {
117
+ name: "kiwi_get_task",
118
+ description: "读取任务状态、报价、部分失败、待审批与过期信息。统一 status/resume 读取面;替代把 offer/pending 状态放在插件内存。",
119
+ inputSchema: {
120
+ $schema: "https://json-schema.org/draft/2020-12/schema",
121
+ type: "object",
122
+ additionalProperties: false,
123
+ required: ["task_id"],
124
+ properties: { task_id: { type: "string", minLength: 1 } },
125
+ },
126
+ async handle(args) {
127
+ try {
128
+ return ok(JSON.stringify(service.getTask(String(args.task_id))));
129
+ }
130
+ catch (error) {
131
+ return err(error);
132
+ }
133
+ },
134
+ },
135
+ {
136
+ name: "kiwi_negotiate",
137
+ description: "在委托边界内推进磋商。更新同一 task_id;CounterOffer / Clarification;可产生 candidate_id;受 DelegationPolicy max_rounds 等硬约束。",
138
+ inputSchema: {
139
+ $schema: "https://json-schema.org/draft/2020-12/schema",
140
+ type: "object",
141
+ additionalProperties: false,
142
+ required: ["task_id", "action", "summary"],
143
+ properties: {
144
+ task_id: { type: "string", minLength: 1 },
145
+ action: { type: "string", enum: ["counter_offer", "clarification"] },
146
+ summary: { type: "string", minLength: 1 },
147
+ },
148
+ },
149
+ async handle(args) {
150
+ try {
151
+ const result = await service.negotiate({
152
+ task_id: String(args.task_id),
153
+ action: args.action,
154
+ summary: String(args.summary),
155
+ });
156
+ return ok(JSON.stringify(result));
157
+ }
158
+ catch (error) {
159
+ return err(error);
160
+ }
161
+ },
162
+ },
163
+ {
164
+ name: "kiwi_accept_agreement",
165
+ description: "请求确认并接受非绑定协议。要求有效 approval_id + candidate_id;输出稳定 agreement_id。DelegationPolicy=ask 时若缺审批会返回 approval_required(含持久 approval_id),宿主完成人工审批后携 approval_id 重试。",
166
+ inputSchema: {
167
+ $schema: "https://json-schema.org/draft/2020-12/schema",
168
+ type: "object",
169
+ additionalProperties: false,
170
+ required: ["task_id", "candidate_id"],
171
+ properties: {
172
+ task_id: { type: "string", minLength: 1 },
173
+ candidate_id: { type: "string", minLength: 1 },
174
+ approval_id: { type: "string", minLength: 1 },
175
+ },
176
+ },
177
+ async handle(args) {
178
+ try {
179
+ const result = await service.acceptAgreement({
180
+ task_id: String(args.task_id),
181
+ candidate_id: String(args.candidate_id),
182
+ approval_id: args.approval_id === undefined ? undefined : String(args.approval_id),
183
+ });
184
+ return ok(JSON.stringify(result));
185
+ }
186
+ catch (error) {
187
+ return approvalRequiredOrErr(error, {
188
+ task_id: String(args.task_id),
189
+ candidate_id: String(args.candidate_id),
190
+ });
191
+ }
192
+ },
193
+ },
194
+ {
195
+ name: "kiwi_get_agreement",
196
+ description: "读取最终协议、provenance 与审计摘要。只读;Agreement retrieval + digest + audit summary。",
197
+ inputSchema: {
198
+ $schema: "https://json-schema.org/draft/2020-12/schema",
199
+ type: "object",
200
+ additionalProperties: false,
201
+ required: ["agreement_id"],
202
+ properties: { agreement_id: { type: "string", minLength: 1 } },
203
+ },
204
+ async handle(args) {
205
+ try {
206
+ return ok(JSON.stringify(service.getAgreement(String(args.agreement_id))));
207
+ }
208
+ catch (error) {
209
+ return err(error);
210
+ }
211
+ },
212
+ },
213
+ {
214
+ name: "kiwi_handoff",
215
+ description: "生成交易/PO/联系路径。Agreement → UCP Checkout / merchant transaction endpoint。ASK 时缺审批返回结构化 approval_required(含 approval_id),宿主 kiwi_approve 后携 id 重试。",
216
+ inputSchema: {
217
+ $schema: "https://json-schema.org/draft/2020-12/schema",
218
+ type: "object",
219
+ additionalProperties: false,
220
+ required: ["agreement_id", "destination_type"],
221
+ properties: {
222
+ agreement_id: { type: "string", minLength: 1 },
223
+ approval_id: { type: "string", minLength: 1 },
224
+ destination_type: { type: "string", minLength: 1 },
225
+ url: { type: "string" },
226
+ },
227
+ },
228
+ async handle(args) {
229
+ try {
230
+ const result = await service.handoff({
231
+ agreement_id: String(args.agreement_id),
232
+ approval_id: args.approval_id === undefined ? undefined : String(args.approval_id),
233
+ destination_type: String(args.destination_type),
234
+ url: args.url === undefined ? undefined : String(args.url),
235
+ });
236
+ return ok(JSON.stringify(result));
237
+ }
238
+ catch (error) {
239
+ return approvalRequiredOrErr(error, {
240
+ agreement_id: String(args.agreement_id),
241
+ destination_type: String(args.destination_type),
242
+ });
243
+ }
244
+ },
245
+ },
246
+ {
247
+ name: "kiwi_approve",
248
+ description: "批准一个持久审批(ASK 门)。宿主在向用户呈现非绑定协议/交接摘要并获得确认后调用;随后携 approval_id 重试 kiwi_accept_agreement / kiwi_handoff。写操作,受宿主审批系统二次拦截。",
249
+ inputSchema: {
250
+ $schema: "https://json-schema.org/draft/2020-12/schema",
251
+ type: "object",
252
+ additionalProperties: false,
253
+ required: ["approval_id"],
254
+ properties: {
255
+ approval_id: { type: "string", minLength: 1 },
256
+ note: { type: "string" },
257
+ },
258
+ },
259
+ async handle(args) {
260
+ try {
261
+ return ok(JSON.stringify(service.approve({
262
+ approval_id: String(args.approval_id),
263
+ note: args.note === undefined ? undefined : String(args.note),
264
+ })));
265
+ }
266
+ catch (error) {
267
+ return err(error);
268
+ }
269
+ },
270
+ },
271
+ {
272
+ name: "kiwi_reject",
273
+ description: "拒绝一个持久审批(deny 优先路径)。拒绝后同一 approval_id 无法再批准或形成协议/交接。",
274
+ inputSchema: {
275
+ $schema: "https://json-schema.org/draft/2020-12/schema",
276
+ type: "object",
277
+ additionalProperties: false,
278
+ required: ["approval_id"],
279
+ properties: {
280
+ approval_id: { type: "string", minLength: 1 },
281
+ reason: { type: "string" },
282
+ },
283
+ },
284
+ async handle(args) {
285
+ try {
286
+ return ok(JSON.stringify(service.reject({
287
+ approval_id: String(args.approval_id),
288
+ reason: args.reason === undefined ? undefined : String(args.reason),
289
+ })));
290
+ }
291
+ catch (error) {
292
+ return err(error);
293
+ }
294
+ },
295
+ },
296
+ ];
297
+ return tools.map(({ raw: _raw, ...t }) => t);
298
+ }
299
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Copyright 2026 harrylabsj
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /**
17
+ * kiwi-buyer-mcp 薄 facade 的 MCP 协议类型(战略 v2.5 §6.1 / §6.2)。
18
+ *
19
+ * 手写 stdio JSON-RPC 2.0 最小 MCP 实现(零新运行时依赖):只实现 initialize
20
+ * 握手、notifications/initialized、tools/list、tools/call 与 JSON-RPC 错误面。
21
+ * 其余 MCP 能力(resources/prompts/sampling/roots)不在 v0.1 范围内——严格
22
+ * fail-closed,遇到未实现方法返回 METHOD_NOT_FOUND。
23
+ *
24
+ * 对外只暴露 5—7 个高层 Sourcing Tools,不暴露 KNP 底层消息、不复制 UCP 的
25
+ * Catalog/Checkout primitives(§6.1)。每个写 tool 绑定 idempotency_key 并返回
26
+ * 稳定 task_id / candidate_id / approval_id / agreement_id(§6.2)。
27
+ */
28
+ /** MCP 协议版本:本 server 接受并回显的标准版本(v0.1)。Hermes v0.20.1 协商 2025-11-25。 */
29
+ export declare const MCP_PROTOCOL_VERSIONS: readonly ["2024-11-05", "2025-06-18", "2025-11-25"];
30
+ /** MCP 错误码(JSON-RPC 标准 + MCP 扩展)。 */
31
+ export declare const MCP_ERROR: {
32
+ readonly PARSE_ERROR: -32700;
33
+ readonly INVALID_REQUEST: -32600;
34
+ readonly METHOD_NOT_FOUND: -32601;
35
+ readonly INVALID_PARAMS: -32602;
36
+ readonly INTERNAL_ERROR: -32603;
37
+ readonly SERVER_NOT_INITIALIZED: -32002;
38
+ readonly TOOL_NOT_FOUND: -32002;
39
+ };
40
+ export type McpJsonRpcVersion = "2.0";
41
+ export interface JsonRpcRequest {
42
+ jsonrpc: McpJsonRpcVersion;
43
+ id: number | string | null;
44
+ method: string;
45
+ params?: unknown;
46
+ }
47
+ export interface JsonRpcResponse {
48
+ jsonrpc: McpJsonRpcVersion;
49
+ id: number | string | null;
50
+ result?: unknown;
51
+ error?: {
52
+ code: number;
53
+ message: string;
54
+ data?: unknown;
55
+ };
56
+ }
57
+ /** MCP initialize 请求参数(§6.1 version negotiation)。 */
58
+ export interface McpInitializeParams {
59
+ protocolVersion: string;
60
+ capabilities?: Record<string, unknown>;
61
+ clientInfo?: {
62
+ name: string;
63
+ version?: string;
64
+ };
65
+ }
66
+ export interface McpInitializeResult {
67
+ protocolVersion: string;
68
+ capabilities: {
69
+ tools: {
70
+ listChanged: boolean;
71
+ };
72
+ };
73
+ serverInfo: {
74
+ name: string;
75
+ version: string;
76
+ };
77
+ }
78
+ export interface McpListToolsResult {
79
+ tools: McpTool[];
80
+ }
81
+ export interface McpTool {
82
+ name: string;
83
+ description: string;
84
+ inputSchema: Record<string, unknown>;
85
+ }
86
+ export interface McpCallToolParams {
87
+ name: string;
88
+ arguments?: Record<string, unknown>;
89
+ }
90
+ export interface McpCallToolResult {
91
+ content: Array<{
92
+ type: "text";
93
+ text: string;
94
+ }>;
95
+ isError?: boolean;
96
+ }
97
+ /** 一个高层 Kiwi Sourcing Tool 的声明(§6.1 词表)。 */
98
+ export interface KiwiToolDefinition {
99
+ name: string;
100
+ description: string;
101
+ /** 输入 JSON Schema(2020-12,自包含)。 */
102
+ inputSchema: Record<string, unknown>;
103
+ handle(args: Record<string, unknown>): Promise<McpCallToolResult>;
104
+ }
105
+ /** 顶层 Kiwi Sourcing Tool 词表(单一来源,§6.1)。 */
106
+ export declare const KIWI_SOURCING_TOOLS: readonly ["kiwi_search", "kiwi_request_quotes", "kiwi_get_task", "kiwi_negotiate", "kiwi_accept_agreement", "kiwi_get_agreement", "kiwi_handoff", "kiwi_approve", "kiwi_reject"];
107
+ export type KiwiSourcingToolName = (typeof KIWI_SOURCING_TOOLS)[number];
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Copyright 2026 harrylabsj
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /**
17
+ * kiwi-buyer-mcp 薄 facade 的 MCP 协议类型(战略 v2.5 §6.1 / §6.2)。
18
+ *
19
+ * 手写 stdio JSON-RPC 2.0 最小 MCP 实现(零新运行时依赖):只实现 initialize
20
+ * 握手、notifications/initialized、tools/list、tools/call 与 JSON-RPC 错误面。
21
+ * 其余 MCP 能力(resources/prompts/sampling/roots)不在 v0.1 范围内——严格
22
+ * fail-closed,遇到未实现方法返回 METHOD_NOT_FOUND。
23
+ *
24
+ * 对外只暴露 5—7 个高层 Sourcing Tools,不暴露 KNP 底层消息、不复制 UCP 的
25
+ * Catalog/Checkout primitives(§6.1)。每个写 tool 绑定 idempotency_key 并返回
26
+ * 稳定 task_id / candidate_id / approval_id / agreement_id(§6.2)。
27
+ */
28
+ /** MCP 协议版本:本 server 接受并回显的标准版本(v0.1)。Hermes v0.20.1 协商 2025-11-25。 */
29
+ export const MCP_PROTOCOL_VERSIONS = ["2024-11-05", "2025-06-18", "2025-11-25"];
30
+ /** MCP 错误码(JSON-RPC 标准 + MCP 扩展)。 */
31
+ export const MCP_ERROR = {
32
+ PARSE_ERROR: -32700,
33
+ INVALID_REQUEST: -32600,
34
+ METHOD_NOT_FOUND: -32601,
35
+ INVALID_PARAMS: -32602,
36
+ INTERNAL_ERROR: -32603,
37
+ SERVER_NOT_INITIALIZED: -32002,
38
+ TOOL_NOT_FOUND: -32002,
39
+ };
40
+ /** 顶层 Kiwi Sourcing Tool 词表(单一来源,§6.1)。 */
41
+ export const KIWI_SOURCING_TOOLS = [
42
+ "kiwi_search",
43
+ "kiwi_request_quotes",
44
+ "kiwi_get_task",
45
+ "kiwi_negotiate",
46
+ "kiwi_accept_agreement",
47
+ "kiwi_get_agreement",
48
+ "kiwi_handoff",
49
+ "kiwi_approve",
50
+ "kiwi_reject",
51
+ ];
52
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;GAWG;AAEH,uEAAuE;AACvE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAU,CAAC;AAEzF,qCAAqC;AACrC,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,WAAW,EAAE,CAAC,KAAK;IACnB,eAAe,EAAE,CAAC,KAAK;IACvB,gBAAgB,EAAE,CAAC,KAAK;IACxB,cAAc,EAAE,CAAC,KAAK;IACtB,cAAc,EAAE,CAAC,KAAK;IACtB,sBAAsB,EAAE,CAAC,KAAK;IAC9B,cAAc,EAAE,CAAC,KAAK;CACd,CAAC;AA4DX,2CAA2C;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,aAAa;IACb,qBAAqB;IACrB,eAAe;IACf,gBAAgB;IAChB,uBAAuB;IACvB,oBAAoB;IACpB,cAAc;IACd,cAAc;IACd,aAAa;CACL,CAAC"}