dexe-mcp 0.1.5 → 0.3.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 (111) hide show
  1. package/.mcp.example.json +12 -2
  2. package/CHANGELOG.md +84 -0
  3. package/FUTURE.md +26 -5
  4. package/README.md +105 -197
  5. package/dist/config.d.ts +12 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +34 -1
  8. package/dist/config.js.map +1 -1
  9. package/dist/index.js +16 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/addresses.d.ts +57 -0
  12. package/dist/lib/addresses.d.ts.map +1 -0
  13. package/dist/lib/addresses.js +83 -0
  14. package/dist/lib/addresses.js.map +1 -0
  15. package/dist/lib/calldata.d.ts +32 -0
  16. package/dist/lib/calldata.d.ts.map +1 -0
  17. package/dist/lib/calldata.js +28 -0
  18. package/dist/lib/calldata.js.map +1 -0
  19. package/dist/lib/govEnums.d.ts +12 -0
  20. package/dist/lib/govEnums.d.ts.map +1 -0
  21. package/dist/lib/govEnums.js +35 -0
  22. package/dist/lib/govEnums.js.map +1 -0
  23. package/dist/lib/ipfs.d.ts +60 -0
  24. package/dist/lib/ipfs.d.ts.map +1 -0
  25. package/dist/lib/ipfs.js +168 -0
  26. package/dist/lib/ipfs.js.map +1 -0
  27. package/dist/lib/markdownToSlate.d.ts +39 -0
  28. package/dist/lib/markdownToSlate.d.ts.map +1 -0
  29. package/dist/lib/markdownToSlate.js +203 -0
  30. package/dist/lib/markdownToSlate.js.map +1 -0
  31. package/dist/lib/multicall.d.ts +33 -0
  32. package/dist/lib/multicall.d.ts.map +1 -0
  33. package/dist/lib/multicall.js +46 -0
  34. package/dist/lib/multicall.js.map +1 -0
  35. package/dist/lib/proposalCatalog.d.ts +45 -0
  36. package/dist/lib/proposalCatalog.d.ts.map +1 -0
  37. package/dist/lib/proposalCatalog.js +416 -0
  38. package/dist/lib/proposalCatalog.js.map +1 -0
  39. package/dist/lib/signer.d.ts +12 -0
  40. package/dist/lib/signer.d.ts.map +1 -0
  41. package/dist/lib/signer.js +31 -0
  42. package/dist/lib/signer.js.map +1 -0
  43. package/dist/lib/subgraph.d.ts +15 -0
  44. package/dist/lib/subgraph.d.ts.map +1 -0
  45. package/dist/lib/subgraph.js +42 -0
  46. package/dist/lib/subgraph.js.map +1 -0
  47. package/dist/tools/dao.d.ts +4 -0
  48. package/dist/tools/dao.d.ts.map +1 -0
  49. package/dist/tools/dao.js +242 -0
  50. package/dist/tools/dao.js.map +1 -0
  51. package/dist/tools/daoDeploy.d.ts +4 -0
  52. package/dist/tools/daoDeploy.d.ts.map +1 -0
  53. package/dist/tools/daoDeploy.js +573 -0
  54. package/dist/tools/daoDeploy.js.map +1 -0
  55. package/dist/tools/flow.d.ts +5 -0
  56. package/dist/tools/flow.d.ts.map +1 -0
  57. package/dist/tools/flow.js +451 -0
  58. package/dist/tools/flow.js.map +1 -0
  59. package/dist/tools/index.d.ts.map +1 -1
  60. package/dist/tools/index.js +32 -0
  61. package/dist/tools/index.js.map +1 -1
  62. package/dist/tools/ipfs.d.ts +6 -0
  63. package/dist/tools/ipfs.d.ts.map +1 -0
  64. package/dist/tools/ipfs.js +376 -0
  65. package/dist/tools/ipfs.js.map +1 -0
  66. package/dist/tools/proposal.d.ts +4 -0
  67. package/dist/tools/proposal.d.ts.map +1 -0
  68. package/dist/tools/proposal.js +217 -0
  69. package/dist/tools/proposal.js.map +1 -0
  70. package/dist/tools/proposalBuild.d.ts +4 -0
  71. package/dist/tools/proposalBuild.d.ts.map +1 -0
  72. package/dist/tools/proposalBuild.js +372 -0
  73. package/dist/tools/proposalBuild.js.map +1 -0
  74. package/dist/tools/proposalBuildComplex.d.ts +4 -0
  75. package/dist/tools/proposalBuildComplex.d.ts.map +1 -0
  76. package/dist/tools/proposalBuildComplex.js +766 -0
  77. package/dist/tools/proposalBuildComplex.js.map +1 -0
  78. package/dist/tools/proposalBuildInternal.d.ts +4 -0
  79. package/dist/tools/proposalBuildInternal.d.ts.map +1 -0
  80. package/dist/tools/proposalBuildInternal.js +224 -0
  81. package/dist/tools/proposalBuildInternal.js.map +1 -0
  82. package/dist/tools/proposalBuildMore.d.ts +4 -0
  83. package/dist/tools/proposalBuildMore.d.ts.map +1 -0
  84. package/dist/tools/proposalBuildMore.js +457 -0
  85. package/dist/tools/proposalBuildMore.js.map +1 -0
  86. package/dist/tools/proposalBuildOffchain.d.ts +4 -0
  87. package/dist/tools/proposalBuildOffchain.d.ts.map +1 -0
  88. package/dist/tools/proposalBuildOffchain.js +389 -0
  89. package/dist/tools/proposalBuildOffchain.js.map +1 -0
  90. package/dist/tools/read.d.ts +4 -0
  91. package/dist/tools/read.d.ts.map +1 -0
  92. package/dist/tools/read.js +580 -0
  93. package/dist/tools/read.js.map +1 -0
  94. package/dist/tools/subgraph.d.ts +4 -0
  95. package/dist/tools/subgraph.d.ts.map +1 -0
  96. package/dist/tools/subgraph.js +404 -0
  97. package/dist/tools/subgraph.js.map +1 -0
  98. package/dist/tools/txSend.d.ts +5 -0
  99. package/dist/tools/txSend.d.ts.map +1 -0
  100. package/dist/tools/txSend.js +87 -0
  101. package/dist/tools/txSend.js.map +1 -0
  102. package/dist/tools/vote.d.ts +4 -0
  103. package/dist/tools/vote.d.ts.map +1 -0
  104. package/dist/tools/vote.js +196 -0
  105. package/dist/tools/vote.js.map +1 -0
  106. package/dist/tools/voteBuild.d.ts +4 -0
  107. package/dist/tools/voteBuild.d.ts.map +1 -0
  108. package/dist/tools/voteBuild.js +983 -0
  109. package/dist/tools/voteBuild.js.map +1 -0
  110. package/package.json +18 -5
  111. package/PLAN.md +0 -132
@@ -0,0 +1,376 @@
1
+ import { z } from "zod";
2
+ import { cidForBytes, cidForJson, fetchIpfs, parseCid, PinataClient, } from "../lib/ipfs.js";
3
+ import { markdownToSlate } from "../lib/markdownToSlate.js";
4
+ export function registerIpfsTools(server, ctx) {
5
+ const gateways = resolveGateways(ctx);
6
+ registerUploadProposalMetadata(server, ctx);
7
+ registerUploadDaoMetadata(server, ctx);
8
+ registerUploadFile(server, ctx);
9
+ registerFetch(server, gateways);
10
+ registerCidInfo(server, gateways);
11
+ registerCidForJson(server);
12
+ }
13
+ function errorResult(message) {
14
+ return { content: [{ type: "text", text: message }], isError: true };
15
+ }
16
+ /**
17
+ * Build the gateway chain used by fetch/cid_info. Primary gateway is a single
18
+ * dedicated endpoint the user configures — public gateways are only added if
19
+ * the user opts in via `DEXE_IPFS_GATEWAYS_FALLBACK`. Returns an empty array
20
+ * if nothing is configured; the fetch tool fails clean in that case.
21
+ */
22
+ function resolveGateways(_ctx) {
23
+ const out = [];
24
+ const primary = process.env.DEXE_IPFS_GATEWAY?.trim();
25
+ if (primary)
26
+ out.push(primary.replace(/\/$/, ""));
27
+ const fallback = process.env.DEXE_IPFS_GATEWAYS_FALLBACK?.trim();
28
+ if (fallback) {
29
+ for (const g of fallback.split(",").map((s) => s.trim().replace(/\/$/, ""))) {
30
+ if (g && !out.includes(g))
31
+ out.push(g);
32
+ }
33
+ }
34
+ return out;
35
+ }
36
+ const NO_GATEWAY_HINT = "No IPFS gateway configured. Set DEXE_IPFS_GATEWAY to a dedicated gateway " +
37
+ "(Pinata gives one free with your JWT — e.g. https://<your-subdomain>.mypinata.cloud — " +
38
+ "or use Filebase / Quicknode / a self-hosted gateway). " +
39
+ "Public gateways (dweb.link, ipfs.io) are unreliable and not defaulted. " +
40
+ "Optional best-effort fallback: DEXE_IPFS_GATEWAYS_FALLBACK=https://dweb.link,https://ipfs.io.";
41
+ function requirePinata(ctx) {
42
+ if (!ctx.config.pinataJwt) {
43
+ return {
44
+ error: "DEXE_PINATA_JWT is not set. Add your Pinata JWT to the MCP env block to enable uploads.",
45
+ };
46
+ }
47
+ return new PinataClient(ctx.config.pinataJwt);
48
+ }
49
+ // ---------- dexe_ipfs_upload_proposal_metadata ----------
50
+ function registerUploadProposalMetadata(server, ctx) {
51
+ server.registerTool("dexe_ipfs_upload_proposal_metadata", {
52
+ title: "Upload proposal metadata JSON to IPFS (Pinata)",
53
+ description: "Pins `{ proposalName, proposalDescription, ... }` (the shape DeXe proposals expect) to IPFS via Pinata. Returns the CID for use as `descriptionURL` in `GovPool.createProposal`.",
54
+ inputSchema: {
55
+ title: z.string().min(1),
56
+ description: z.string().default("").describe("Proposal description — supports full Markdown: # headings, **bold**, *italic*, " +
57
+ "~~strikethrough~~, [links](url), `inline code`, ```code blocks```, " +
58
+ "- bullet lists, 1. numbered lists. Automatically converted to the Slate " +
59
+ "editor node format the frontend expects. Plain text also works."),
60
+ extra: z
61
+ .record(z.unknown())
62
+ .optional()
63
+ .describe("Optional extra fields merged into the metadata object"),
64
+ },
65
+ outputSchema: {
66
+ cid: z.string(),
67
+ size: z.number(),
68
+ pinnedAt: z.string(),
69
+ descriptionURL: z.string(),
70
+ },
71
+ }, async ({ title, description = "", extra }) => {
72
+ const client = requirePinata(ctx);
73
+ if ("error" in client)
74
+ return errorResult(client.error);
75
+ try {
76
+ const slateDescription = markdownToSlate(description);
77
+ const payload = { proposalName: title, proposalDescription: JSON.stringify(slateDescription), ...(extra ?? {}) };
78
+ const res = await client.pinJson(payload, { name: `proposal:${title.slice(0, 48)}` });
79
+ const structured = {
80
+ cid: res.cid,
81
+ size: res.size,
82
+ pinnedAt: res.pinnedAt,
83
+ descriptionURL: res.cid,
84
+ };
85
+ return {
86
+ content: [
87
+ {
88
+ type: "text",
89
+ text: `Pinned proposal metadata → ${res.cid} (${res.size} bytes, ${res.pinnedAt})\nUse as descriptionURL.`,
90
+ },
91
+ ],
92
+ structuredContent: structured,
93
+ };
94
+ }
95
+ catch (err) {
96
+ return errorResult(err instanceof Error ? err.message : String(err));
97
+ }
98
+ });
99
+ }
100
+ // ---------- dexe_ipfs_upload_dao_metadata ----------
101
+ /**
102
+ * Matches the frontend's nested IPFS upload chain for DAO descriptionURL.
103
+ *
104
+ * Frontend does 3 uploads:
105
+ * 1. Avatar file → CID v1 (optional)
106
+ * 2. Description text/JSON → CID v0 → "ipfs://<cid>"
107
+ * 3. Outer metadata wrapper (references #1 and #2) → CID v0 → "ipfs://<cid>"
108
+ *
109
+ * The outer CID (#3) becomes `descriptionURL` in `deployGovPool`.
110
+ *
111
+ * Outer metadata shape (must match for frontend UI compatibility):
112
+ * {
113
+ * avatarUrl: "https://<cidV1>.ipfs.4everland.io/<filename>" | "",
114
+ * avatarCID: "<cidV1>" | undefined,
115
+ * avatarFileName: "<filename>.jpeg" | "",
116
+ * daoName: string,
117
+ * websiteUrl: string,
118
+ * description: "ipfs://<cidV0>", // nested CID pointing to description content
119
+ * socialLinks: [["twitter", "https://..."], ...],
120
+ * documents: [{ name: string, url: string }, ...]
121
+ * }
122
+ */
123
+ function registerUploadDaoMetadata(server, ctx) {
124
+ server.registerTool("dexe_ipfs_upload_dao_metadata", {
125
+ title: "Upload DAO metadata to IPFS (frontend-compatible nested format)",
126
+ description: "Uploads DAO metadata to IPFS using the exact schema the DeXe frontend expects. " +
127
+ "Performs a nested upload chain: (1) description content → IPFS, (2) outer metadata referencing the description CID → IPFS. " +
128
+ "Returns the outer CID for use as `descriptionURL` in `deployGovPool`. " +
129
+ "If avatarCID is provided (from a prior `dexe_ipfs_upload_file` call), it's wired into the metadata. " +
130
+ "Field names match the frontend exactly: `daoName`, `websiteUrl`, `socialLinks`, `documents`.",
131
+ inputSchema: {
132
+ daoName: z.string().min(1).describe("DAO name (displayed in UI)"),
133
+ description: z.string().default("").describe("DAO description — supports full Markdown: # headings, **bold**, *italic*, " +
134
+ "~~strikethrough~~, [links](url), `inline code`, ```code blocks```, " +
135
+ "- bullet lists, 1. numbered lists. Automatically converted to the Slate " +
136
+ "editor node format the frontend expects. Plain text also works."),
137
+ websiteUrl: z.string().default("").describe("DAO website URL"),
138
+ avatarCID: z.string().optional().describe("CID v1 of a previously uploaded avatar image (from dexe_ipfs_upload_file). Omit if no avatar."),
139
+ avatarFileName: z.string().optional().describe("Avatar filename with extension, e.g. 'logo.jpeg'. Required if avatarCID is provided."),
140
+ socialLinks: z
141
+ .array(z.tuple([z.string(), z.string()]))
142
+ .optional()
143
+ .describe('Social links as [platform, url] tuples, e.g. [["twitter", "https://x.com/dao"]]'),
144
+ documents: z
145
+ .array(z.object({ name: z.string(), url: z.string() }))
146
+ .optional()
147
+ .describe("External documents, e.g. [{ name: \"Whitepaper\", url: \"https://...\" }]"),
148
+ },
149
+ outputSchema: {
150
+ cid: z.string(),
151
+ descriptionCid: z.string(),
152
+ size: z.number(),
153
+ pinnedAt: z.string(),
154
+ descriptionURL: z.string(),
155
+ },
156
+ }, async ({ daoName, description = "", websiteUrl = "", avatarCID, avatarFileName, socialLinks, documents, }) => {
157
+ const client = requirePinata(ctx);
158
+ if ("error" in client)
159
+ return errorResult(client.error);
160
+ try {
161
+ // Step 1: Upload description content as its own IPFS pin.
162
+ // The frontend stores descriptions as Slate editor node arrays and
163
+ // renders them via SlateDescendant[]. We convert markdown/plain text
164
+ // to the full Slate format (headings, bold, links, lists, etc.)
165
+ // using remark-slate-transformer with frontend-matching overrides.
166
+ const descriptionPayload = markdownToSlate(description);
167
+ const descriptionRes = await client.pinJson(descriptionPayload, {
168
+ name: `dao-desc:${daoName.slice(0, 40)}`,
169
+ });
170
+ const descriptionIpfsPath = `ipfs://${descriptionRes.cid}`;
171
+ // Step 2: Build the outer metadata wrapper (matches frontend schema exactly)
172
+ let avatarUrl = "";
173
+ if (avatarCID && avatarFileName) {
174
+ // Frontend uses 4everland gateway: https://<cidV1>.ipfs.4everland.io/<filename>
175
+ avatarUrl = `https://${avatarCID}.ipfs.4everland.io/${avatarFileName}`;
176
+ }
177
+ const outerPayload = {
178
+ avatarUrl,
179
+ avatarCID: avatarCID ?? undefined,
180
+ avatarFileName: avatarFileName ?? "",
181
+ daoName,
182
+ websiteUrl,
183
+ description: descriptionIpfsPath,
184
+ socialLinks: socialLinks ?? [],
185
+ documents: documents ?? [],
186
+ };
187
+ // Step 3: Upload the outer metadata wrapper
188
+ const metadataRes = await client.pinJson(outerPayload, {
189
+ name: `dao:${daoName.slice(0, 48)}`,
190
+ });
191
+ const structured = {
192
+ cid: metadataRes.cid,
193
+ descriptionCid: descriptionRes.cid,
194
+ size: metadataRes.size,
195
+ pinnedAt: metadataRes.pinnedAt,
196
+ descriptionURL: metadataRes.cid,
197
+ };
198
+ return {
199
+ content: [
200
+ {
201
+ type: "text",
202
+ text: `Pinned DAO metadata (frontend-compatible):\n` +
203
+ ` description content → ${descriptionRes.cid}\n` +
204
+ ` outer metadata → ${metadataRes.cid} (${metadataRes.size} bytes)\n` +
205
+ `Use "${metadataRes.cid}" as descriptionURL in deployGovPool.`,
206
+ },
207
+ ],
208
+ structuredContent: structured,
209
+ };
210
+ }
211
+ catch (err) {
212
+ return errorResult(err instanceof Error ? err.message : String(err));
213
+ }
214
+ });
215
+ }
216
+ // ---------- dexe_ipfs_upload_file ----------
217
+ function registerUploadFile(server, ctx) {
218
+ server.registerTool("dexe_ipfs_upload_file", {
219
+ title: "Upload raw bytes (avatar, attachment, etc.) to IPFS (Pinata)",
220
+ description: "Pins a file to IPFS. Accepts base64-encoded bytes; returns the CID. Use for DAO avatars or proposal attachments.",
221
+ inputSchema: {
222
+ base64: z.string().min(1).describe("Base64-encoded file bytes"),
223
+ fileName: z.string().default("file"),
224
+ contentType: z.string().default("application/octet-stream"),
225
+ },
226
+ outputSchema: {
227
+ cid: z.string(),
228
+ size: z.number(),
229
+ pinnedAt: z.string(),
230
+ },
231
+ }, async ({ base64, fileName = "file", contentType = "application/octet-stream" }) => {
232
+ const client = requirePinata(ctx);
233
+ if ("error" in client)
234
+ return errorResult(client.error);
235
+ try {
236
+ const bytes = Uint8Array.from(Buffer.from(base64, "base64"));
237
+ const res = await client.pinFile(bytes, { fileName, contentType, name: fileName });
238
+ const structured = { cid: res.cid, size: res.size, pinnedAt: res.pinnedAt };
239
+ return {
240
+ content: [
241
+ {
242
+ type: "text",
243
+ text: `Pinned ${fileName} (${bytes.length} bytes) → ${res.cid} (size on IPFS=${res.size})`,
244
+ },
245
+ ],
246
+ structuredContent: structured,
247
+ };
248
+ }
249
+ catch (err) {
250
+ return errorResult(err instanceof Error ? err.message : String(err));
251
+ }
252
+ });
253
+ }
254
+ // ---------- dexe_ipfs_fetch ----------
255
+ function registerFetch(server, defaultGateways) {
256
+ server.registerTool("dexe_ipfs_fetch", {
257
+ title: "Fetch content by CID (dedicated gateway, optional fallback)",
258
+ description: "Fetches IPFS content via the gateway configured in DEXE_IPFS_GATEWAY (recommended: a dedicated gateway — Pinata gives one with the JWT). Public gateways are NOT a default because they're unreliable; opt in via DEXE_IPFS_GATEWAYS_FALLBACK (comma-separated) for best-effort fallback after the primary. Returns parsed JSON when content-type is JSON, plus raw bytes size.",
259
+ inputSchema: {
260
+ cid: z.string().describe("CID (with or without ipfs:// prefix)"),
261
+ timeoutMs: z.number().int().min(500).max(30_000).default(4000),
262
+ },
263
+ outputSchema: {
264
+ cid: z.string(),
265
+ gateway: z.string(),
266
+ contentType: z.string(),
267
+ sizeBytes: z.number(),
268
+ attempts: z.number(),
269
+ json: z.unknown().nullable(),
270
+ },
271
+ }, async ({ cid, timeoutMs = 4000 }) => {
272
+ if (defaultGateways.length === 0)
273
+ return errorResult(NO_GATEWAY_HINT);
274
+ try {
275
+ const res = await fetchIpfs(cid, {
276
+ gateways: defaultGateways,
277
+ perRequestTimeoutMs: timeoutMs,
278
+ });
279
+ const structured = {
280
+ cid: res.cid,
281
+ gateway: res.gateway,
282
+ contentType: res.contentType,
283
+ sizeBytes: res.bytes.length,
284
+ attempts: res.attempts,
285
+ json: res.json,
286
+ };
287
+ const preview = res.json != null
288
+ ? JSON.stringify(res.json, null, 2).slice(0, 800)
289
+ : `(${res.bytes.length} bytes of ${res.contentType})`;
290
+ return {
291
+ content: [
292
+ {
293
+ type: "text",
294
+ text: `CID ${res.cid} via ${res.gateway} (attempts=${res.attempts})\n${preview}`,
295
+ },
296
+ ],
297
+ structuredContent: structured,
298
+ };
299
+ }
300
+ catch (err) {
301
+ return errorResult(err instanceof Error ? err.message : String(err));
302
+ }
303
+ });
304
+ }
305
+ // ---------- dexe_ipfs_cid_info ----------
306
+ function registerCidInfo(server, gateways) {
307
+ server.registerTool("dexe_ipfs_cid_info", {
308
+ title: "Parse a CID, show version/codec, compute the alternate version + gateway URLs",
309
+ description: "Parses a CIDv0 or CIDv1, reports codec + multihash, converts between v0↔v1 when legal, and emits the gateway URL for each configured gateway.",
310
+ inputSchema: {
311
+ cid: z.string().describe("CID (with or without ipfs:// prefix)"),
312
+ },
313
+ outputSchema: {
314
+ cid: z.string(),
315
+ version: z.number(),
316
+ codec: z.string(),
317
+ multihash: z.string(),
318
+ alternate: z.string().nullable(),
319
+ gatewayUrls: z.array(z.string()),
320
+ },
321
+ }, async ({ cid }) => {
322
+ try {
323
+ const info = parseCid(cid);
324
+ const gatewayUrls = gateways.length
325
+ ? gateways.map((g) => `${g.replace(/\/+$/, "").replace(/\/ipfs$/, "")}/ipfs/${info.cid}`)
326
+ : [];
327
+ const structured = { ...info, gatewayUrls };
328
+ return {
329
+ content: [
330
+ {
331
+ type: "text",
332
+ text: `CID : ${info.cid}\n` +
333
+ `Version: v${info.version}\n` +
334
+ `Codec : ${info.codec}\n` +
335
+ `Multihash (base58btc): ${info.multihash}\n` +
336
+ `Alt : ${info.alternate ?? "(no legal alternate)"}\n` +
337
+ `Gateway URLs:\n${gatewayUrls.map((u) => ` ${u}`).join("\n")}`,
338
+ },
339
+ ],
340
+ structuredContent: structured,
341
+ };
342
+ }
343
+ catch (err) {
344
+ return errorResult(err instanceof Error ? err.message : String(err));
345
+ }
346
+ });
347
+ }
348
+ // ---------- dexe_ipfs_cid_for_json ----------
349
+ function registerCidForJson(server) {
350
+ server.registerTool("dexe_ipfs_cid_for_json", {
351
+ title: "Compute the CIDv1 for a JSON value locally — no network",
352
+ description: "Computes the deterministic CIDv1 (json codec, sha-256) for arbitrary JSON. Useful for dry-run flows: precompute the CID, build/sign a proposal with it as `descriptionURL`, then upload separately. The CID computed here matches what Pinata returns for the same bytes encoded with the multiformats json codec.",
353
+ inputSchema: {
354
+ value: z.unknown(),
355
+ },
356
+ outputSchema: {
357
+ cid: z.string(),
358
+ codec: z.string(),
359
+ },
360
+ }, async ({ value }) => {
361
+ try {
362
+ const cid = await cidForJson(value);
363
+ return {
364
+ content: [{ type: "text", text: `CID (json, sha-256): ${cid}` }],
365
+ structuredContent: { cid, codec: "json" },
366
+ };
367
+ }
368
+ catch (err) {
369
+ return errorResult(err instanceof Error ? err.message : String(err));
370
+ }
371
+ });
372
+ }
373
+ // Keep this export so `cidForBytes` isn't flagged as dead code by strict builds;
374
+ // tools can opt into it later.
375
+ export { cidForBytes };
376
+ //# sourceMappingURL=ipfs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs.js","sourceRoot":"","sources":["../../src/tools/ipfs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ToolContext } from "./context.js";
3
+ export declare function registerProposalTools(server: McpServer, ctx: ToolContext): void;
4
+ //# sourceMappingURL=proposal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal.d.ts","sourceRoot":"","sources":["../../src/tools/proposal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAYhD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAK/E"}
@@ -0,0 +1,217 @@
1
+ import { z } from "zod";
2
+ import { Interface, isAddress } from "ethers";
3
+ import { RpcProvider } from "../rpc.js";
4
+ import { multicall } from "../lib/multicall.js";
5
+ import { proposalStateLabel } from "../lib/govEnums.js";
6
+ import { gqlRequest, PROPOSAL_INTERACTIONS_QUERY } from "../lib/subgraph.js";
7
+ const GOV_POOL_READ_ABI = [
8
+ "function getProposalState(uint256 proposalId) view returns (uint8)",
9
+ "function getProposalRequiredQuorum(uint256 proposalId) view returns (uint256)",
10
+ "function getProposals(uint256 offset, uint256 limit) view returns (tuple(tuple(tuple(bool earlyCompletion, bool delegatedVotingAllowed, bool validatorsVote, uint64 duration, uint64 durationValidators, uint64 executionDelay, uint128 quorum, uint128 quorumValidators, uint256 minVotesForVoting, uint256 minVotesForCreating, tuple(address rewardToken, uint256 creationReward, uint256 executionReward, uint256 voteRewardsCoefficient) rewardsInfo, string executorDescription) settings, uint64 voteEnd, uint64 executeAfter, bool executed, uint256 votesFor, uint256 votesAgainst, uint256 rawVotesFor, uint256 rawVotesAgainst, uint256 givenRewards) core, string descriptionURL, tuple(address executor, uint256 value, bytes data)[] actionsOnFor, tuple(address executor, uint256 value, bytes data)[] actionsOnAgainst)[] proposals, tuple(uint256 proposalId, uint256 executeAfter, uint256 quorum, uint256 rawVotesFor, uint256 rawVotesAgainst, bool executed, tuple(bool earlyCompletion, bool delegatedVotingAllowed, bool validatorsVote, uint64 duration, uint64 durationValidators, uint64 executionDelay, uint128 quorum, uint128 quorumValidators, uint256 minVotesForVoting, uint256 minVotesForCreating, tuple(address rewardToken, uint256 creationReward, uint256 executionReward, uint256 voteRewardsCoefficient) rewardsInfo, string executorDescription) settings)[] validatorProposals, uint8[] proposalStates, uint256[] requiredQuorums, uint256[] requiredValidatorsQuorums)",
11
+ ];
12
+ export function registerProposalTools(server, ctx) {
13
+ const rpc = new RpcProvider(ctx.config);
14
+ registerProposalState(server, ctx, rpc);
15
+ registerProposalList(server, ctx, rpc);
16
+ registerProposalVoters(server, ctx);
17
+ }
18
+ function errorResult(message) {
19
+ return { content: [{ type: "text", text: message }], isError: true };
20
+ }
21
+ function registerProposalState(server, ctx, rpc) {
22
+ server.registerTool("dexe_proposal_state", {
23
+ title: "Live proposal state + required quorum",
24
+ description: "Reads `getProposalState` and `getProposalRequiredQuorum` on a GovPool in one multicall. Returns named state (Voting, Defeated, SucceededFor, ExecutedFor, …) and the quorum threshold.",
25
+ inputSchema: {
26
+ govPool: z.string().describe("GovPool contract address"),
27
+ proposalId: z.union([z.string(), z.number()]).describe("Proposal id (uint256)"),
28
+ },
29
+ outputSchema: {
30
+ govPool: z.string(),
31
+ proposalId: z.string(),
32
+ state: z.string(),
33
+ stateIndex: z.number(),
34
+ requiredQuorum: z.string(),
35
+ },
36
+ }, async ({ govPool, proposalId }) => {
37
+ if (!isAddress(govPool))
38
+ return errorResult(`Invalid GovPool address: ${govPool}`);
39
+ const id = BigInt(proposalId);
40
+ try {
41
+ const provider = rpc.requireProvider();
42
+ const iface = new Interface(GOV_POOL_READ_ABI);
43
+ const calls = [
44
+ { target: govPool, iface, method: "getProposalState", args: [id] },
45
+ { target: govPool, iface, method: "getProposalRequiredQuorum", args: [id] },
46
+ ];
47
+ const [stateR, quorumR] = await multicall(provider, calls);
48
+ if (!stateR?.success || !quorumR?.success) {
49
+ return errorResult("Multicall failed — is govPool valid and proposalId known?");
50
+ }
51
+ const stateIndex = Number(stateR.value);
52
+ const state = proposalStateLabel(stateIndex);
53
+ const requiredQuorum = quorumR.value.toString();
54
+ const structured = {
55
+ govPool,
56
+ proposalId: id.toString(),
57
+ state,
58
+ stateIndex,
59
+ requiredQuorum,
60
+ };
61
+ return {
62
+ content: [
63
+ {
64
+ type: "text",
65
+ text: `Proposal ${id} on ${govPool}: state=${state} (${stateIndex}), requiredQuorum=${requiredQuorum}`,
66
+ },
67
+ ],
68
+ structuredContent: structured,
69
+ };
70
+ }
71
+ catch (err) {
72
+ return errorResult(`proposal_state failed: ${err instanceof Error ? err.message : String(err)}`);
73
+ }
74
+ });
75
+ }
76
+ function registerProposalList(server, ctx, rpc) {
77
+ server.registerTool("dexe_proposal_list", {
78
+ title: "List proposals on a GovPool",
79
+ description: "Calls `GovPool.getProposals(offset, limit)` and returns a compact summary per proposal: id, descriptionURL, state, votesFor/Against, voteEnd, executed.",
80
+ inputSchema: {
81
+ govPool: z.string().describe("GovPool contract address"),
82
+ offset: z.number().int().min(0).default(0),
83
+ limit: z.number().int().min(1).max(100).default(20),
84
+ },
85
+ outputSchema: {
86
+ govPool: z.string(),
87
+ offset: z.number(),
88
+ limit: z.number(),
89
+ proposals: z.array(z.object({
90
+ proposalId: z.string(),
91
+ descriptionURL: z.string(),
92
+ state: z.string(),
93
+ stateIndex: z.number(),
94
+ votesFor: z.string(),
95
+ votesAgainst: z.string(),
96
+ voteEnd: z.string(),
97
+ executed: z.boolean(),
98
+ requiredQuorum: z.string(),
99
+ })),
100
+ },
101
+ }, async ({ govPool, offset = 0, limit = 20 }) => {
102
+ if (!isAddress(govPool))
103
+ return errorResult(`Invalid GovPool address: ${govPool}`);
104
+ try {
105
+ const provider = rpc.requireProvider();
106
+ const iface = new Interface(GOV_POOL_READ_ABI);
107
+ const [res] = await multicall(provider, [
108
+ {
109
+ target: govPool,
110
+ iface,
111
+ method: "getProposals",
112
+ args: [BigInt(offset), BigInt(limit)],
113
+ },
114
+ ]);
115
+ if (!res?.success)
116
+ return errorResult("getProposals reverted");
117
+ const raw = res.value;
118
+ const proposals = raw.proposals.map((p, i) => {
119
+ const idx = Number(raw.proposalStates[i] ?? 9);
120
+ return {
121
+ proposalId: String(offset + i + 1),
122
+ descriptionURL: p.descriptionURL,
123
+ state: proposalStateLabel(idx),
124
+ stateIndex: idx,
125
+ votesFor: p.core.votesFor.toString(),
126
+ votesAgainst: p.core.votesAgainst.toString(),
127
+ voteEnd: p.core.voteEnd.toString(),
128
+ executed: p.core.executed,
129
+ requiredQuorum: (raw.requiredQuorums[i] ?? 0n).toString(),
130
+ };
131
+ });
132
+ const structured = { govPool, offset, limit, proposals };
133
+ const text = `Proposals on ${govPool} [offset=${offset}, limit=${limit}] — ${proposals.length} returned\n` +
134
+ proposals
135
+ .map((p) => ` #${p.proposalId} ${p.state.padEnd(22)} for=${p.votesFor} against=${p.votesAgainst} ${p.executed ? "executed" : ""}`)
136
+ .join("\n");
137
+ return {
138
+ content: [{ type: "text", text }],
139
+ structuredContent: structured,
140
+ };
141
+ }
142
+ catch (err) {
143
+ return errorResult(`proposal_list failed: ${err instanceof Error ? err.message : String(err)}`);
144
+ }
145
+ });
146
+ }
147
+ function registerProposalVoters(server, ctx) {
148
+ server.registerTool("dexe_proposal_voters", {
149
+ title: "Voter list for a proposal (subgraph)",
150
+ description: "Fetches voters from the DeXe interactions subgraph. Requires DEXE_SUBGRAPH_INTERACTIONS_URL env var. Paginated.",
151
+ inputSchema: {
152
+ govPool: z.string().describe("GovPool address (used as filter on `pool` field)"),
153
+ proposalId: z.union([z.string(), z.number()]),
154
+ first: z.number().int().min(1).max(200).default(50),
155
+ skip: z.number().int().min(0).default(0),
156
+ },
157
+ outputSchema: {
158
+ govPool: z.string(),
159
+ proposalId: z.string(),
160
+ voters: z.array(z.object({
161
+ voter: z.string(),
162
+ interactionType: z.string(),
163
+ totalVote: z.string(),
164
+ timestamp: z.string(),
165
+ transactionHash: z.string(),
166
+ })),
167
+ },
168
+ }, async ({ govPool, proposalId, first = 50, skip = 0 }) => {
169
+ if (!isAddress(govPool))
170
+ return errorResult(`Invalid GovPool address: ${govPool}`);
171
+ const url = ctx.config.subgraphPoolsUrl;
172
+ if (!url) {
173
+ return errorResult("DEXE_SUBGRAPH_POOLS_URL is not set. Add it to the MCP env block (The Graph endpoint for DeXe pools subgraph).");
174
+ }
175
+ const id = BigInt(proposalId).toString();
176
+ const num = Number(id);
177
+ const buf = new ArrayBuffer(4);
178
+ new DataView(buf).setUint32(0, num, true);
179
+ const leHex = [...new Uint8Array(buf)].map((b) => b.toString(16).padStart(2, "0")).join("");
180
+ const compositeId = `${govPool.toLowerCase()}${leHex}`;
181
+ try {
182
+ const data = await gqlRequest(url, PROPOSAL_INTERACTIONS_QUERY, {
183
+ proposalId: compositeId,
184
+ first,
185
+ skip,
186
+ });
187
+ const voters = data.proposalInteractions.map((pi) => {
188
+ // Voter entity id = `<userAddr><poolAddr>` (40+40 hex, no separator).
189
+ // Slice the user address out of the composite, falling back to a
190
+ // nested user id if a future schema exposes one.
191
+ const raw = pi.voter?.voter?.id ?? pi.voter?.id ?? "";
192
+ const userAddr = raw.length >= 42 ? raw.slice(0, 42) : raw;
193
+ return {
194
+ voter: userAddr,
195
+ interactionType: pi.interactionType,
196
+ totalVote: pi.totalVote,
197
+ timestamp: pi.timestamp,
198
+ transactionHash: pi.hash,
199
+ };
200
+ });
201
+ const structured = { govPool, proposalId: id, voters };
202
+ return {
203
+ content: [
204
+ {
205
+ type: "text",
206
+ text: `Voters for proposal ${id} on ${govPool}: ${voters.length} returned (first=${first}, skip=${skip})`,
207
+ },
208
+ ],
209
+ structuredContent: structured,
210
+ };
211
+ }
212
+ catch (err) {
213
+ return errorResult(`proposal_voters failed: ${err instanceof Error ? err.message : String(err)}`);
214
+ }
215
+ });
216
+ }
217
+ //# sourceMappingURL=proposal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal.js","sourceRoot":"","sources":["../../src/tools/proposal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ToolContext } from "./context.js";
3
+ export declare function registerProposalBuildTools(server: McpServer, ctx: ToolContext): void;
4
+ //# sourceMappingURL=proposalBuild.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposalBuild.d.ts","sourceRoot":"","sources":["../../src/tools/proposalBuild.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAwChD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAOpF"}