@varun-ai07/covenant-mcp 1.0.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 (90) hide show
  1. package/README.md +1078 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +195 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/colors.d.ts +14 -0
  7. package/dist/colors.d.ts.map +1 -0
  8. package/dist/colors.js +14 -0
  9. package/dist/colors.js.map +1 -0
  10. package/dist/config.d.ts +396 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +191 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/handlers/transactions.d.ts +5 -0
  15. package/dist/handlers/transactions.d.ts.map +1 -0
  16. package/dist/handlers/transactions.js +82 -0
  17. package/dist/handlers/transactions.js.map +1 -0
  18. package/dist/handlers/wallet.d.ts +24 -0
  19. package/dist/handlers/wallet.d.ts.map +1 -0
  20. package/dist/handlers/wallet.js +264 -0
  21. package/dist/handlers/wallet.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +49 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/logger.d.ts +11 -0
  27. package/dist/logger.d.ts.map +1 -0
  28. package/dist/logger.js +31 -0
  29. package/dist/logger.js.map +1 -0
  30. package/dist/postinstall.d.ts +3 -0
  31. package/dist/postinstall.d.ts.map +1 -0
  32. package/dist/postinstall.js +38 -0
  33. package/dist/postinstall.js.map +1 -0
  34. package/dist/schemas.d.ts +48 -0
  35. package/dist/schemas.d.ts.map +1 -0
  36. package/dist/schemas.js +114 -0
  37. package/dist/schemas.js.map +1 -0
  38. package/dist/server.d.ts +23 -0
  39. package/dist/server.d.ts.map +1 -0
  40. package/dist/server.js +51 -0
  41. package/dist/server.js.map +1 -0
  42. package/dist/tools/batches.d.ts +3 -0
  43. package/dist/tools/batches.d.ts.map +1 -0
  44. package/dist/tools/batches.js +167 -0
  45. package/dist/tools/batches.js.map +1 -0
  46. package/dist/tools/collectives.d.ts +3 -0
  47. package/dist/tools/collectives.d.ts.map +1 -0
  48. package/dist/tools/collectives.js +168 -0
  49. package/dist/tools/collectives.js.map +1 -0
  50. package/dist/tools/disputes.d.ts +3 -0
  51. package/dist/tools/disputes.d.ts.map +1 -0
  52. package/dist/tools/disputes.js +129 -0
  53. package/dist/tools/disputes.js.map +1 -0
  54. package/dist/tools/escrow.d.ts +3 -0
  55. package/dist/tools/escrow.d.ts.map +1 -0
  56. package/dist/tools/escrow.js +238 -0
  57. package/dist/tools/escrow.js.map +1 -0
  58. package/dist/tools/insurance.d.ts +3 -0
  59. package/dist/tools/insurance.d.ts.map +1 -0
  60. package/dist/tools/insurance.js +101 -0
  61. package/dist/tools/insurance.js.map +1 -0
  62. package/dist/tools/market.d.ts +3 -0
  63. package/dist/tools/market.d.ts.map +1 -0
  64. package/dist/tools/market.js +303 -0
  65. package/dist/tools/market.js.map +1 -0
  66. package/dist/tools/protocol.d.ts +3 -0
  67. package/dist/tools/protocol.d.ts.map +1 -0
  68. package/dist/tools/protocol.js +121 -0
  69. package/dist/tools/protocol.js.map +1 -0
  70. package/dist/tools/receipts.d.ts +3 -0
  71. package/dist/tools/receipts.d.ts.map +1 -0
  72. package/dist/tools/receipts.js +88 -0
  73. package/dist/tools/receipts.js.map +1 -0
  74. package/dist/tools/registry.d.ts +3 -0
  75. package/dist/tools/registry.d.ts.map +1 -0
  76. package/dist/tools/registry.js +136 -0
  77. package/dist/tools/registry.js.map +1 -0
  78. package/dist/transports/http.d.ts +3 -0
  79. package/dist/transports/http.d.ts.map +1 -0
  80. package/dist/transports/http.js +121 -0
  81. package/dist/transports/http.js.map +1 -0
  82. package/dist/transports/stdio.d.ts +7 -0
  83. package/dist/transports/stdio.d.ts.map +1 -0
  84. package/dist/transports/stdio.js +9 -0
  85. package/dist/transports/stdio.js.map +1 -0
  86. package/dist/types.d.ts +89 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/types.js +24 -0
  89. package/dist/types.js.map +1 -0
  90. package/package.json +70 -0
@@ -0,0 +1,101 @@
1
+ /**
2
+ * AgentInsurance MCP Tools
3
+ *
4
+ * claim_insurance — Submit an insurance claim for a failed task
5
+ * get_claim — Get claim details
6
+ * get_claim_counter — Get total claims
7
+ */
8
+ import { z } from "zod";
9
+ import { formatEther } from "viem";
10
+ import { loadAbi, CONTRACTS, getAccount } from "../config.js";
11
+ import { executeOrPrepare, readContract } from "../handlers/wallet.js";
12
+ import { formatTxResult, formatReadResult, formatError } from "../handlers/transactions.js";
13
+ const ABI = loadAbi("AgentInsurance");
14
+ // Input validation schemas
15
+ const claimInsuranceSchema = z.object({
16
+ taskId: z.number().int().positive(),
17
+ });
18
+ export function registerInsuranceTools(server) {
19
+ // ──────────────────────────────────────────────────────────────
20
+ // claim_insurance
21
+ // ──────────────────────────────────────────────────────────────
22
+ server.registerTool("claim_insurance", {
23
+ title: "Claim Insurance",
24
+ description: "Submit an insurance claim for a failed task. " +
25
+ "May require governance approval depending on claim type.",
26
+ inputSchema: {
27
+ taskId: z.number().describe("Task ID to claim insurance for"),
28
+ },
29
+ }, async ({ taskId }) => {
30
+ try {
31
+ const validation = claimInsuranceSchema.safeParse({ taskId });
32
+ if (!validation.success) {
33
+ return formatError(new Error(`Invalid input: ${validation.error.issues.map(e => e.message).join(", ")}`));
34
+ }
35
+ const account = getAccount();
36
+ if (!account) {
37
+ return formatError(new Error("No private key configured"));
38
+ }
39
+ const result = await executeOrPrepare(CONTRACTS.AgentInsurance, ABI, "claimInsurance", [BigInt(taskId)]);
40
+ return formatTxResult(result);
41
+ }
42
+ catch (e) {
43
+ return formatError(e);
44
+ }
45
+ });
46
+ // ──────────────────────────────────────────────────────────────
47
+ // get_claim
48
+ // ──────────────────────────────────────────────────────────────
49
+ server.registerTool("get_claim", {
50
+ title: "Get Insurance Claim",
51
+ description: "Retrieve details of an insurance claim.",
52
+ inputSchema: {
53
+ claimId: z.number().describe("Claim ID"),
54
+ },
55
+ }, async ({ claimId }) => {
56
+ try {
57
+ const data = await readContract(CONTRACTS.AgentInsurance, ABI, "getClaim", [BigInt(claimId)]);
58
+ const enriched = {
59
+ ...data,
60
+ amountEth: data.amount ? formatEther(data.amount) : "0",
61
+ };
62
+ return formatReadResult(enriched, `Insurance Claim #${claimId}`);
63
+ }
64
+ catch (e) {
65
+ return formatError(e);
66
+ }
67
+ });
68
+ // ──────────────────────────────────────────────────────────────
69
+ // get_claim_counter
70
+ // ──────────────────────────────────────────────────────────────
71
+ server.registerTool("get_claim_counter", {
72
+ title: "Get Claim Counter",
73
+ description: "Get the total number of insurance claims filed.",
74
+ inputSchema: {},
75
+ }, async () => {
76
+ try {
77
+ const count = await readContract(CONTRACTS.AgentInsurance, ABI, "claimCounter", []);
78
+ return formatReadResult({ count: Number(count) }, "Insurance Claim Counter");
79
+ }
80
+ catch (e) {
81
+ return formatError(e);
82
+ }
83
+ });
84
+ // ──────────────────────────────────────────────────────────────
85
+ // get_coverage_percent
86
+ // ──────────────────────────────────────────────────────────────
87
+ server.registerTool("get_coverage_percent", {
88
+ title: "Get Coverage Percentage",
89
+ description: "Get the insurance coverage percentage (e.g., 80% = 80).",
90
+ inputSchema: {},
91
+ }, async () => {
92
+ try {
93
+ const percent = await readContract(CONTRACTS.AgentInsurance, ABI, "CLAIM_COVERAGE_PERCENT", []);
94
+ return formatReadResult({ coveragePercent: Number(percent) }, "Coverage Percentage");
95
+ }
96
+ catch (e) {
97
+ return formatError(e);
98
+ }
99
+ });
100
+ }
101
+ //# sourceMappingURL=insurance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insurance.js","sourceRoot":"","sources":["../../src/tools/insurance.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 registerMarketTools(server: McpServer): void;
3
+ //# sourceMappingURL=market.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../src/tools/market.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkDzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyV3D"}
@@ -0,0 +1,303 @@
1
+ /**
2
+ * OpenTaskMarket MCP Tools
3
+ *
4
+ * post_task — Post an open task for bidding
5
+ * get_open_task — Read open task details
6
+ * submit_bid — Submit a bid on an open task
7
+ * get_bid — Get bid details
8
+ * select_worker — Select a winning bidder
9
+ * make_counter_offer — Make a counter offer on a bid
10
+ * accept_counter_offer — Accept a counter offer (worker)
11
+ * withdraw_bid — Withdraw your bid
12
+ * cancel_task — Cancel an open task
13
+ */
14
+ import { z } from "zod";
15
+ import { parseEther, formatEther, isAddress } from "viem";
16
+ import { loadAbi, CONTRACTS, getAccount } from "../config.js";
17
+ import { executeOrPrepare, readContract } from "../handlers/wallet.js";
18
+ import { formatTxResult, formatReadResult, formatError } from "../handlers/transactions.js";
19
+ const ABI = loadAbi("OpenTaskMarket");
20
+ // Task status enum for OpenTaskMarket
21
+ const TASK_STATUS = {
22
+ 0: "Open",
23
+ 1: "InProgress",
24
+ 2: "Completed",
25
+ 3: "Cancelled",
26
+ };
27
+ // Input validation schemas
28
+ const postTaskSchema = z.object({
29
+ maxPayment: z.string().regex(/^\d+\.?\d*$/, "Invalid ETH amount format")
30
+ .refine(val => {
31
+ const payment = parseFloat(val);
32
+ return payment >= 0.001 && payment <= 1000;
33
+ }, { message: "Payment must be between 0.001 and 1000 ETH" }),
34
+ deadline: z.number().int().positive()
35
+ .refine(val => {
36
+ const deadlineMs = val * 1000;
37
+ const now = Date.now();
38
+ const oneYear = now + (365 * 24 * 60 * 60 * 1000);
39
+ return deadlineMs > now && deadlineMs < oneYear;
40
+ }, { message: "Deadline must be a future timestamp within 1 year" }),
41
+ descriptionHash: z.string().min(1).max(100),
42
+ });
43
+ const submitBidSchema = z.object({
44
+ taskId: z.number().int().positive(),
45
+ price: z.string().regex(/^\d+\.?\d*$/, "Invalid ETH amount format")
46
+ .refine(val => parseFloat(val) > 0, { message: "Price must be positive" }),
47
+ timeEstimate: z.number().int().positive(),
48
+ proposalHash: z.string().min(1).max(200),
49
+ });
50
+ const selectWorkerSchema = z.object({
51
+ taskId: z.number().int().positive(),
52
+ worker: z.string().refine(isAddress, { message: "Invalid worker address" }),
53
+ });
54
+ const counterOfferSchema = z.object({
55
+ taskId: z.number().int().positive(),
56
+ bidder: z.string().refine(isAddress, { message: "Invalid bidder address" }),
57
+ counterPrice: z.string().regex(/^\d+\.?\d*$/, "Invalid ETH amount format"),
58
+ counterTimeEstimate: z.number().int().positive(),
59
+ counterProposalHash: z.string().min(1).max(200),
60
+ });
61
+ export function registerMarketTools(server) {
62
+ // ──────────────────────────────────────────────────────────────
63
+ // post_task
64
+ // ──────────────────────────────────────────────────────────────
65
+ server.registerTool("post_open_task", {
66
+ title: "Post Open Task",
67
+ description: "Post an open task for competitive bidding. Workers can submit bids. " +
68
+ "Client sends maxPayment as msg.value. Returns the new taskId.",
69
+ inputSchema: {
70
+ maxPayment: z.string().describe("Maximum payment in ETH (e.g. '0.05')"),
71
+ deadline: z.number().describe("Unix timestamp deadline (seconds)"),
72
+ descriptionHash: z.string().describe("IPFS CID or hash for task description"),
73
+ },
74
+ }, async ({ maxPayment, deadline, descriptionHash }) => {
75
+ try {
76
+ const validation = postTaskSchema.safeParse({ maxPayment, deadline, descriptionHash });
77
+ if (!validation.success) {
78
+ return formatError(new Error(`Invalid input: ${validation.error.issues.map(e => e.message).join(", ")}`));
79
+ }
80
+ const account = getAccount();
81
+ if (!account) {
82
+ return formatError(new Error("No private key configured — cannot send transactions"));
83
+ }
84
+ const paymentWei = parseEther(maxPayment);
85
+ const result = await executeOrPrepare(CONTRACTS.OpenTaskMarket, ABI, "postTask", [paymentWei, BigInt(deadline), descriptionHash], paymentWei);
86
+ return formatTxResult(result);
87
+ }
88
+ catch (e) {
89
+ return formatError(e);
90
+ }
91
+ });
92
+ // ──────────────────────────────────────────────────────────────
93
+ // get_open_task
94
+ // ──────────────────────────────────────────────────────────────
95
+ server.registerTool("get_open_task", {
96
+ title: "Get Open Task Details",
97
+ description: "Retrieve details of an open market task including bids and selected worker.",
98
+ inputSchema: {
99
+ taskId: z.number().describe("Numeric task ID"),
100
+ },
101
+ }, async ({ taskId }) => {
102
+ try {
103
+ const data = await readContract(CONTRACTS.OpenTaskMarket, ABI, "getTask", [BigInt(taskId)]);
104
+ const enriched = {
105
+ ...data,
106
+ statusLabel: TASK_STATUS[data.status] ?? `Unknown(${data.status})`,
107
+ maxPaymentEth: formatEther(data.maxPayment),
108
+ selectedPriceEth: data.selectedPrice ? formatEther(data.selectedPrice) : "0",
109
+ };
110
+ return formatReadResult(enriched, `Open Task #${taskId}`);
111
+ }
112
+ catch (e) {
113
+ return formatError(e);
114
+ }
115
+ });
116
+ // ──────────────────────────────────────────────────────────────
117
+ // submit_bid
118
+ // ──────────────────────────────────────────────────────────────
119
+ server.registerTool("submit_bid", {
120
+ title: "Submit Bid",
121
+ description: "Submit a bid on an open task. Include your proposed price, time estimate, and proposal hash.",
122
+ inputSchema: {
123
+ taskId: z.number().describe("Task ID to bid on"),
124
+ price: z.string().describe("Your bid price in ETH"),
125
+ timeEstimate: z.number().describe("Estimated completion time in seconds"),
126
+ proposalHash: z.string().describe("IPFS CID or hash of your proposal"),
127
+ },
128
+ }, async ({ taskId, price, timeEstimate, proposalHash }) => {
129
+ try {
130
+ const validation = submitBidSchema.safeParse({ taskId, price, timeEstimate, proposalHash });
131
+ if (!validation.success) {
132
+ return formatError(new Error(`Invalid input: ${validation.error.issues.map(e => e.message).join(", ")}`));
133
+ }
134
+ const account = getAccount();
135
+ if (!account) {
136
+ return formatError(new Error("No private key configured"));
137
+ }
138
+ const priceWei = parseEther(price);
139
+ const result = await executeOrPrepare(CONTRACTS.OpenTaskMarket, ABI, "submitBid", [BigInt(taskId), priceWei, BigInt(timeEstimate), proposalHash]);
140
+ return formatTxResult(result);
141
+ }
142
+ catch (e) {
143
+ return formatError(e);
144
+ }
145
+ });
146
+ // ──────────────────────────────────────────────────────────────
147
+ // get_bid
148
+ // ──────────────────────────────────────────────────────────────
149
+ server.registerTool("get_bid", {
150
+ title: "Get Bid Details",
151
+ description: "Retrieve a specific bid on an open task by taskId and bidder address.",
152
+ inputSchema: {
153
+ taskId: z.number().describe("Task ID"),
154
+ bidder: z.string().describe("Bidder's Ethereum address"),
155
+ },
156
+ }, async ({ taskId, bidder }) => {
157
+ try {
158
+ const data = await readContract(CONTRACTS.OpenTaskMarket, ABI, "getBid", [BigInt(taskId), bidder]);
159
+ const enriched = {
160
+ priceEth: formatEther(data.price),
161
+ timeEstimate: data.timeEstimate,
162
+ proposalHash: data.proposalHash,
163
+ bidAt: data.bidAt,
164
+ bidder: data.bidderAddr,
165
+ hasCounter: data.hasCounter,
166
+ counterPriceEth: data.counterPrice ? formatEther(data.counterPrice) : "0",
167
+ counterTimeEstimate: data.counterTimeEstimate,
168
+ counterProposalHash: data.counterProposalHash,
169
+ };
170
+ return formatReadResult(enriched, `Bid on Task #${taskId}`);
171
+ }
172
+ catch (e) {
173
+ return formatError(e);
174
+ }
175
+ });
176
+ // ──────────────────────────────────────────────────────────────
177
+ // select_worker
178
+ // ──────────────────────────────────────────────────────────────
179
+ server.registerTool("select_worker", {
180
+ title: "Select Worker",
181
+ description: "Select a winning bidder for your open task. Only the task client can call this. " +
182
+ "Transitions task to InProgress and assigns the worker.",
183
+ inputSchema: {
184
+ taskId: z.number().describe("Task ID"),
185
+ worker: z.string().describe("Address of the selected worker/bidder"),
186
+ },
187
+ }, async ({ taskId, worker }) => {
188
+ try {
189
+ const validation = selectWorkerSchema.safeParse({ taskId, worker });
190
+ if (!validation.success) {
191
+ return formatError(new Error(`Invalid input: ${validation.error.issues.map(e => e.message).join(", ")}`));
192
+ }
193
+ const account = getAccount();
194
+ if (!account) {
195
+ return formatError(new Error("No private key configured"));
196
+ }
197
+ const result = await executeOrPrepare(CONTRACTS.OpenTaskMarket, ABI, "selectWorker", [BigInt(taskId), worker], undefined, "OpenTaskMarket");
198
+ return formatTxResult(result);
199
+ }
200
+ catch (e) {
201
+ return formatError(e);
202
+ }
203
+ });
204
+ // ──────────────────────────────────────────────────────────────
205
+ // make_counter_offer
206
+ // ──────────────────────────────────────────────────────────────
207
+ server.registerTool("make_counter_offer", {
208
+ title: "Make Counter Offer",
209
+ description: "Task client makes a counter offer to a worker's bid. " +
210
+ "The worker can then accept or reject the counter.",
211
+ inputSchema: {
212
+ taskId: z.number().describe("Task ID"),
213
+ bidder: z.string().describe("Bidder address to counter"),
214
+ counterPrice: z.string().describe("Counter price in ETH"),
215
+ counterTimeEstimate: z.number().describe("Counter time estimate in seconds"),
216
+ counterProposalHash: z.string().describe("IPFS CID for counter proposal"),
217
+ },
218
+ }, async ({ taskId, bidder, counterPrice, counterTimeEstimate, counterProposalHash }) => {
219
+ try {
220
+ const validation = counterOfferSchema.safeParse({ taskId, bidder, counterPrice, counterTimeEstimate, counterProposalHash });
221
+ if (!validation.success) {
222
+ return formatError(new Error(`Invalid input: ${validation.error.issues.map(e => e.message).join(", ")}`));
223
+ }
224
+ const account = getAccount();
225
+ if (!account) {
226
+ return formatError(new Error("No private key configured"));
227
+ }
228
+ const priceWei = parseEther(counterPrice);
229
+ const result = await executeOrPrepare(CONTRACTS.OpenTaskMarket, ABI, "makeCounterOffer", [BigInt(taskId), bidder, priceWei, BigInt(counterTimeEstimate), counterProposalHash], undefined, "OpenTaskMarket");
230
+ return formatTxResult(result);
231
+ }
232
+ catch (e) {
233
+ return formatError(e);
234
+ }
235
+ });
236
+ // ──────────────────────────────────────────────────────────────
237
+ // accept_counter_offer
238
+ // ──────────────────────────────────────────────────────────────
239
+ server.registerTool("accept_counter_offer", {
240
+ title: "Accept Counter Offer",
241
+ description: "Worker accepts the client's counter offer on their bid.",
242
+ inputSchema: {
243
+ taskId: z.number().describe("Task ID"),
244
+ },
245
+ }, async ({ taskId }) => {
246
+ try {
247
+ const account = getAccount();
248
+ if (!account) {
249
+ return formatError(new Error("No private key configured"));
250
+ }
251
+ const result = await executeOrPrepare(CONTRACTS.OpenTaskMarket, ABI, "acceptCounterOffer", [BigInt(taskId)]);
252
+ return formatTxResult(result);
253
+ }
254
+ catch (e) {
255
+ return formatError(e);
256
+ }
257
+ });
258
+ // ──────────────────────────────────────────────────────────────
259
+ // withdraw_bid
260
+ // ──────────────────────────────────────────────────────────────
261
+ server.registerTool("withdraw_bid", {
262
+ title: "Withdraw Bid",
263
+ description: "Withdraw your bid from an open task before being selected.",
264
+ inputSchema: {
265
+ taskId: z.number().describe("Task ID"),
266
+ },
267
+ }, async ({ taskId }) => {
268
+ try {
269
+ const account = getAccount();
270
+ if (!account) {
271
+ return formatError(new Error("No private key configured"));
272
+ }
273
+ const result = await executeOrPrepare(CONTRACTS.OpenTaskMarket, ABI, "withdrawBid", [BigInt(taskId)]);
274
+ return formatTxResult(result);
275
+ }
276
+ catch (e) {
277
+ return formatError(e);
278
+ }
279
+ });
280
+ // ──────────────────────────────────────────────────────────────
281
+ // cancel_open_task
282
+ // ──────────────────────────────────────────────────────────────
283
+ server.registerTool("cancel_open_task", {
284
+ title: "Cancel Open Task",
285
+ description: "Cancel an open task and refund the escrowed payment.",
286
+ inputSchema: {
287
+ taskId: z.number().describe("Task ID to cancel"),
288
+ },
289
+ }, async ({ taskId }) => {
290
+ try {
291
+ const account = getAccount();
292
+ if (!account) {
293
+ return formatError(new Error("No private key configured"));
294
+ }
295
+ const result = await executeOrPrepare(CONTRACTS.OpenTaskMarket, ABI, "cancelTask", [BigInt(taskId)], undefined, "OpenTaskMarket");
296
+ return formatTxResult(result);
297
+ }
298
+ catch (e) {
299
+ return formatError(e);
300
+ }
301
+ });
302
+ }
303
+ //# sourceMappingURL=market.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/tools/market.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 registerProtocolTools(server: McpServer): void;
3
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/tools/protocol.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4I7D"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Protocol-wide MCP Tools
3
+ *
4
+ * get_stats — Aggregate protocol statistics
5
+ * get_leaderboard — Top agents by reputation
6
+ */
7
+ import { z } from "zod";
8
+ import { formatEther } from "viem";
9
+ import { loadAbi, CONTRACTS } from "../config.js";
10
+ import { readContract } from "../handlers/wallet.js";
11
+ import { formatReadResult, formatError } from "../handlers/transactions.js";
12
+ const registryAbi = loadAbi("AgentRegistry");
13
+ const escrowAbi = loadAbi("TaskEscrow");
14
+ // Input validation schemas
15
+ const getStatsSchema = z.object({}); // No parameters
16
+ const getLeaderboardSchema = z.object({
17
+ limit: z.number().int().min(1).max(50).optional().default(10)
18
+ });
19
+ export function registerProtocolTools(server) {
20
+ // ──────────────────────────────────────────────────────────────
21
+ // get_stats
22
+ // ──────────────────────────────────────────────────────────────
23
+ server.registerTool("get_stats", {
24
+ title: "Protocol Statistics",
25
+ description: "Get aggregate COVENANT protocol stats: total agents, tasks created, " +
26
+ "tasks completed, total volume, fees collected, and active agents.",
27
+ inputSchema: {},
28
+ }, async () => {
29
+ try {
30
+ // Validate input (no parameters for get_stats)
31
+ const validationResult = getStatsSchema.safeParse({});
32
+ if (!validationResult.success) {
33
+ return formatError(new Error(`Invalid input: ${validationResult.error.issues.map((e) => e.message).join(", ")}`));
34
+ }
35
+ // Fetch stats from both contracts in parallel
36
+ const [totalAgents, totalTasks, completedTasks, totalVolume, totalFees] = await Promise.all([
37
+ readContract(CONTRACTS.AgentRegistry, registryAbi, "totalAgents", []),
38
+ readContract(CONTRACTS.TaskEscrow, escrowAbi, "totalTasks", []),
39
+ readContract(CONTRACTS.TaskEscrow, escrowAbi, "completedTasks", []),
40
+ readContract(CONTRACTS.TaskEscrow, escrowAbi, "totalVolume", []),
41
+ readContract(CONTRACTS.TaskEscrow, escrowAbi, "totalFees", []),
42
+ ]);
43
+ const stats = {
44
+ totalAgents: Number(totalAgents),
45
+ totalTasks: Number(totalTasks),
46
+ completedTasks: Number(completedTasks),
47
+ totalVolumeEth: formatEther(totalVolume),
48
+ totalFeesEth: formatEther(totalFees),
49
+ completionRate: Number(totalTasks) > 0
50
+ ? `${((Number(completedTasks) / Number(totalTasks)) * 100).toFixed(1)}%`
51
+ : "N/A",
52
+ };
53
+ return formatReadResult(stats, "COVENANT Protocol Statistics");
54
+ }
55
+ catch (e) {
56
+ return formatError(e);
57
+ }
58
+ });
59
+ // ──────────────────────────────────────────────────────────────
60
+ // get_leaderboard
61
+ // ──────────────────────────────────────────────────────────────
62
+ server.registerTool("get_leaderboard", {
63
+ title: "Agent Leaderboard",
64
+ description: "Retrieve the top N agents ranked by reputation score. " +
65
+ "Returns agent address, name, reputation, tasks completed/failed, and stake.",
66
+ inputSchema: {
67
+ limit: z
68
+ .number()
69
+ .optional()
70
+ .describe("Number of top agents to return (default 10, max 50)"),
71
+ },
72
+ }, async ({ limit }) => {
73
+ try {
74
+ // Validate input
75
+ const validationResult = getLeaderboardSchema.safeParse({ limit });
76
+ if (!validationResult.success) {
77
+ return formatError(new Error(`Invalid input: ${validationResult.error.issues.map((e) => e.message).join(", ")}`));
78
+ }
79
+ const { limit: validatedLimit } = validationResult.data;
80
+ const topN = Math.min(validatedLimit ?? 10, 50);
81
+ // Get total agent count
82
+ const totalAgents = Number(await readContract(CONTRACTS.AgentRegistry, registryAbi, "totalAgents", []));
83
+ if (totalAgents === 0) {
84
+ return formatReadResult({ agents: [], totalAgents: 0 }, "No registered agents yet");
85
+ }
86
+ // Fetch all agents (the contract stores addresses, we iterate)
87
+ // getAgentByIndex is the pattern used by the leaderboard frontend
88
+ const agents = [];
89
+ const count = Math.min(totalAgents, 200); // safety cap
90
+ const agentPromises = [];
91
+ for (let i = 0; i < count; i++) {
92
+ agentPromises.push(readContract(CONTRACTS.AgentRegistry, registryAbi, "getAgentByIndex", [BigInt(i)]).catch(() => null) // skip if index doesn't exist
93
+ );
94
+ }
95
+ const results = await Promise.all(agentPromises);
96
+ for (const agent of results) {
97
+ if (agent && agent.isActive) {
98
+ agents.push(agent);
99
+ }
100
+ }
101
+ // Sort by reputation descending
102
+ agents.sort((a, b) => Number(b.reputation ?? 0) - Number(a.reputation ?? 0));
103
+ // Take top N
104
+ const topAgents = agents.slice(0, topN).map((a, i) => ({
105
+ rank: i + 1,
106
+ address: a.addr ?? a.address ?? "unknown",
107
+ name: a.name,
108
+ reputation: Number(a.reputation),
109
+ tasksCompleted: Number(a.tasksCompleted ?? 0),
110
+ tasksFailed: Number(a.tasksFailed ?? 0),
111
+ stakedEth: formatEther(a.stakedAmount ?? 0n),
112
+ capabilities: a.capabilities ?? [],
113
+ }));
114
+ return formatReadResult({ totalAgents, showing: topAgents.length, agents: topAgents }, "COVENANT Agent Leaderboard");
115
+ }
116
+ catch (e) {
117
+ return formatError(e);
118
+ }
119
+ });
120
+ }
121
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/tools/protocol.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 registerReceiptTools(server: McpServer): void;
3
+ //# sourceMappingURL=receipts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../../src/tools/receipts.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+F5D"}