dexe-mcp 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +192 -85
- package/README.md +103 -80
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/addresses.js +1 -1
- package/dist/lib/ipfs.d.ts.map +1 -1
- package/dist/lib/ipfs.js +2 -1
- package/dist/lib/ipfs.js.map +1 -1
- package/dist/lib/markdownToSlate.d.ts +39 -0
- package/dist/lib/markdownToSlate.d.ts.map +1 -0
- package/dist/lib/markdownToSlate.js +203 -0
- package/dist/lib/markdownToSlate.js.map +1 -0
- package/dist/lib/merkleTree.d.ts +38 -0
- package/dist/lib/merkleTree.d.ts.map +1 -0
- package/dist/lib/merkleTree.js +83 -0
- package/dist/lib/merkleTree.js.map +1 -0
- package/dist/lib/signer.d.ts +12 -0
- package/dist/lib/signer.d.ts.map +1 -0
- package/dist/lib/signer.js +31 -0
- package/dist/lib/signer.js.map +1 -0
- package/dist/lib/subgraph.d.ts +2 -2
- package/dist/lib/subgraph.d.ts.map +1 -1
- package/dist/lib/subgraph.js +14 -9
- package/dist/lib/subgraph.js.map +1 -1
- package/dist/tools/daoDeploy.d.ts.map +1 -1
- package/dist/tools/daoDeploy.js +313 -63
- package/dist/tools/daoDeploy.js.map +1 -1
- package/dist/tools/flow.d.ts +62 -0
- package/dist/tools/flow.d.ts.map +1 -0
- package/dist/tools/flow.js +479 -0
- package/dist/tools/flow.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +12 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/ipfs.d.ts.map +1 -1
- package/dist/tools/ipfs.js +94 -28
- package/dist/tools/ipfs.js.map +1 -1
- package/dist/tools/merkle.d.ts +4 -0
- package/dist/tools/merkle.d.ts.map +1 -0
- package/dist/tools/merkle.js +174 -0
- package/dist/tools/merkle.js.map +1 -0
- package/dist/tools/otc.d.ts +5 -0
- package/dist/tools/otc.d.ts.map +1 -0
- package/dist/tools/otc.js +481 -0
- package/dist/tools/otc.js.map +1 -0
- package/dist/tools/proposal.js +28 -10
- package/dist/tools/proposal.js.map +1 -1
- package/dist/tools/proposalBuild.d.ts.map +1 -1
- package/dist/tools/proposalBuild.js +28 -13
- package/dist/tools/proposalBuild.js.map +1 -1
- package/dist/tools/proposalBuildComplex.d.ts +222 -0
- package/dist/tools/proposalBuildComplex.d.ts.map +1 -1
- package/dist/tools/proposalBuildComplex.js +511 -138
- package/dist/tools/proposalBuildComplex.js.map +1 -1
- package/dist/tools/proposalBuildInternal.js +24 -11
- package/dist/tools/proposalBuildInternal.js.map +1 -1
- package/dist/tools/proposalBuildMore.js +42 -21
- package/dist/tools/proposalBuildMore.js.map +1 -1
- package/dist/tools/proposalBuildOffchain.d.ts.map +1 -1
- package/dist/tools/proposalBuildOffchain.js +8 -5
- package/dist/tools/proposalBuildOffchain.js.map +1 -1
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +227 -0
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/subgraph.d.ts +4 -0
- package/dist/tools/subgraph.d.ts.map +1 -0
- package/dist/tools/subgraph.js +404 -0
- package/dist/tools/subgraph.js.map +1 -0
- package/dist/tools/txSend.d.ts +5 -0
- package/dist/tools/txSend.d.ts.map +1 -0
- package/dist/tools/txSend.js +87 -0
- package/dist/tools/txSend.js.map +1 -0
- package/dist/tools/voteBuild.d.ts.map +1 -1
- package/dist/tools/voteBuild.js +420 -0
- package/dist/tools/voteBuild.js.map +1 -1
- package/package.json +83 -75
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { isAddress } from "ethers";
|
|
3
|
+
import { gqlRequest } from "../lib/subgraph.js";
|
|
4
|
+
/**
|
|
5
|
+
* Subgraph-backed read tools. Each tool queries one of the three DeXe
|
|
6
|
+
* subgraphs (pools, validators, interactions) and returns structured data
|
|
7
|
+
* for AI agent decision-making.
|
|
8
|
+
*
|
|
9
|
+
* Env vars required:
|
|
10
|
+
* DEXE_SUBGRAPH_POOLS_URL — The Graph endpoint for DAO pools
|
|
11
|
+
* DEXE_SUBGRAPH_VALIDATORS_URL — The Graph endpoint for validators
|
|
12
|
+
* DEXE_SUBGRAPH_INTERACTIONS_URL — The Graph endpoint for interactions
|
|
13
|
+
*/
|
|
14
|
+
function errorResult(message) {
|
|
15
|
+
return { content: [{ type: "text", text: message }], isError: true };
|
|
16
|
+
}
|
|
17
|
+
function requireUrl(ctx, key) {
|
|
18
|
+
const url = ctx.config[key];
|
|
19
|
+
if (!url)
|
|
20
|
+
return null;
|
|
21
|
+
return url;
|
|
22
|
+
}
|
|
23
|
+
const ENV_HINT = {
|
|
24
|
+
subgraphPoolsUrl: "DEXE_SUBGRAPH_POOLS_URL",
|
|
25
|
+
subgraphValidatorsUrl: "DEXE_SUBGRAPH_VALIDATORS_URL",
|
|
26
|
+
subgraphInteractionsUrl: "DEXE_SUBGRAPH_INTERACTIONS_URL",
|
|
27
|
+
};
|
|
28
|
+
// ---------- queries ----------
|
|
29
|
+
const DAO_LIST_QUERY = /* GraphQL */ `
|
|
30
|
+
query getGovPoolsList($offset: Int!, $limit: Int!, $queryString: String!) {
|
|
31
|
+
daoPools(
|
|
32
|
+
skip: $offset
|
|
33
|
+
first: $limit
|
|
34
|
+
where: { name_contains_nocase: $queryString }
|
|
35
|
+
orderBy: votersCount
|
|
36
|
+
orderDirection: desc
|
|
37
|
+
) {
|
|
38
|
+
id
|
|
39
|
+
name
|
|
40
|
+
erc20Token
|
|
41
|
+
erc721Token
|
|
42
|
+
votersCount
|
|
43
|
+
proposalCount
|
|
44
|
+
totalCurrentTokenDelegated
|
|
45
|
+
totalCurrentTokenDelegatees
|
|
46
|
+
creationTime
|
|
47
|
+
creationBlock
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
`;
|
|
51
|
+
const DAO_MEMBERS_QUERY = /* GraphQL */ `
|
|
52
|
+
query getVotersInPool($poolId: String!, $offset: Int!, $limit: Int!) {
|
|
53
|
+
voterInPools(skip: $offset, first: $limit, where: { pool: $poolId }) {
|
|
54
|
+
id
|
|
55
|
+
APR
|
|
56
|
+
currentDelegateesCount
|
|
57
|
+
currentDelegatorsCount
|
|
58
|
+
engagedProposalsCount
|
|
59
|
+
joinedTimestamp
|
|
60
|
+
receivedDelegation
|
|
61
|
+
receivedNFTDelegation
|
|
62
|
+
receivedTreasuryDelegation
|
|
63
|
+
totalClaimedUSD
|
|
64
|
+
totalLockedUSD
|
|
65
|
+
totalPersonalVotingRewardUSD
|
|
66
|
+
totalMicropoolVotingRewardUSD
|
|
67
|
+
totalTreasuryVotingRewardUSD
|
|
68
|
+
expertNft {
|
|
69
|
+
id
|
|
70
|
+
tokenId
|
|
71
|
+
}
|
|
72
|
+
voter {
|
|
73
|
+
id
|
|
74
|
+
totalProposalsCreated
|
|
75
|
+
totalVotedProposals
|
|
76
|
+
totalVotes
|
|
77
|
+
currentVotesReceived
|
|
78
|
+
currentVotesDelegated
|
|
79
|
+
totalClaimedUSD
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
`;
|
|
84
|
+
const DELEGATION_MAP_QUERY = /* GraphQL */ `
|
|
85
|
+
query getDefaultDelegationsFromPool($offset: Int!, $limit: Int!, $delegatorIn: [String!]) {
|
|
86
|
+
voterInPoolPairs(
|
|
87
|
+
skip: $offset
|
|
88
|
+
first: $limit
|
|
89
|
+
where: { delegator_: { voter_in: $delegatorIn } }
|
|
90
|
+
) {
|
|
91
|
+
id
|
|
92
|
+
creationTimestamp
|
|
93
|
+
delegatedAmount
|
|
94
|
+
delegatedNfts
|
|
95
|
+
delegatedUSD
|
|
96
|
+
delegatedVotes
|
|
97
|
+
delegatee {
|
|
98
|
+
expertNft {
|
|
99
|
+
id
|
|
100
|
+
}
|
|
101
|
+
voter {
|
|
102
|
+
id
|
|
103
|
+
}
|
|
104
|
+
totalClaimedUSD
|
|
105
|
+
}
|
|
106
|
+
delegator {
|
|
107
|
+
voter {
|
|
108
|
+
id
|
|
109
|
+
}
|
|
110
|
+
pool {
|
|
111
|
+
id
|
|
112
|
+
erc20Token
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
`;
|
|
118
|
+
const DELEGATION_INCOMING_QUERY = /* GraphQL */ `
|
|
119
|
+
query getPoolIncomingDelegations($offset: Int!, $limit: Int!, $voterIn: [String!]) {
|
|
120
|
+
voterInPoolPairs(
|
|
121
|
+
skip: $offset
|
|
122
|
+
first: $limit
|
|
123
|
+
where: { delegatee_: { voter_in: $voterIn } }
|
|
124
|
+
) {
|
|
125
|
+
id
|
|
126
|
+
delegatedAmount
|
|
127
|
+
delegatedNfts
|
|
128
|
+
delegatedUSD
|
|
129
|
+
delegatedVotes
|
|
130
|
+
delegator {
|
|
131
|
+
voter {
|
|
132
|
+
id
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
delegatee {
|
|
136
|
+
voter {
|
|
137
|
+
id
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
`;
|
|
143
|
+
const VALIDATORS_QUERY = /* GraphQL */ `
|
|
144
|
+
query getDaoPoolValidators($offset: Int!, $limit: Int!, $address: String!) {
|
|
145
|
+
validatorInPools(
|
|
146
|
+
skip: $offset
|
|
147
|
+
first: $limit
|
|
148
|
+
orderBy: balance
|
|
149
|
+
orderDirection: desc
|
|
150
|
+
where: { pool: $address }
|
|
151
|
+
) {
|
|
152
|
+
id
|
|
153
|
+
balance
|
|
154
|
+
validatorAddress
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
`;
|
|
158
|
+
const USER_ACTIVITY_QUERY = /* GraphQL */ `
|
|
159
|
+
query getUserTransactions($offset: Int!, $limit: Int!, $address: Bytes!) {
|
|
160
|
+
transactions(
|
|
161
|
+
skip: $offset
|
|
162
|
+
first: $limit
|
|
163
|
+
where: { user: $address }
|
|
164
|
+
orderBy: timestamp
|
|
165
|
+
orderDirection: desc
|
|
166
|
+
) {
|
|
167
|
+
id
|
|
168
|
+
type
|
|
169
|
+
user
|
|
170
|
+
timestamp
|
|
171
|
+
interactionsCount
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
`;
|
|
175
|
+
const EXPERTS_QUERY = /* GraphQL */ `
|
|
176
|
+
query getLocalExpertsByPool($offset: Int!, $limit: Int!, $daoAddress: Bytes!) {
|
|
177
|
+
voterInPools(
|
|
178
|
+
skip: $offset
|
|
179
|
+
first: $limit
|
|
180
|
+
where: { pool_: { id: $daoAddress }, expertNft_: { id_not: null } }
|
|
181
|
+
) {
|
|
182
|
+
id
|
|
183
|
+
receivedTreasuryDelegation
|
|
184
|
+
receivedDelegation
|
|
185
|
+
voter {
|
|
186
|
+
id
|
|
187
|
+
}
|
|
188
|
+
expertNft {
|
|
189
|
+
id
|
|
190
|
+
tokenId
|
|
191
|
+
}
|
|
192
|
+
pool {
|
|
193
|
+
id
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
`;
|
|
198
|
+
// ---------- register ----------
|
|
199
|
+
export function registerSubgraphTools(server, ctx) {
|
|
200
|
+
registerDaoList(server, ctx);
|
|
201
|
+
registerDaoMembers(server, ctx);
|
|
202
|
+
registerDelegationMap(server, ctx);
|
|
203
|
+
registerValidatorList(server, ctx);
|
|
204
|
+
registerUserActivity(server, ctx);
|
|
205
|
+
registerDaoExperts(server, ctx);
|
|
206
|
+
}
|
|
207
|
+
// ---------- tools ----------
|
|
208
|
+
function registerDaoList(server, ctx) {
|
|
209
|
+
server.registerTool("dexe_read_dao_list", {
|
|
210
|
+
title: "Discover and list DAOs (subgraph)",
|
|
211
|
+
description: "Paginated DAO discovery via the pools subgraph. Search by name (case-insensitive), ordered by voter count descending. Requires DEXE_SUBGRAPH_POOLS_URL.",
|
|
212
|
+
inputSchema: {
|
|
213
|
+
query: z.string().default("").describe("Name search (case-insensitive, empty = all)"),
|
|
214
|
+
offset: z.number().int().min(0).default(0),
|
|
215
|
+
limit: z.number().int().min(1).max(100).default(20),
|
|
216
|
+
},
|
|
217
|
+
}, async ({ query = "", offset = 0, limit = 20 }) => {
|
|
218
|
+
const url = requireUrl(ctx, "subgraphPoolsUrl");
|
|
219
|
+
if (!url)
|
|
220
|
+
return errorResult(`${ENV_HINT.subgraphPoolsUrl} is not set.`);
|
|
221
|
+
try {
|
|
222
|
+
const data = await gqlRequest(url, DAO_LIST_QUERY, {
|
|
223
|
+
offset,
|
|
224
|
+
limit,
|
|
225
|
+
queryString: query,
|
|
226
|
+
});
|
|
227
|
+
const pools = data.daoPools;
|
|
228
|
+
const text = `Found ${pools.length} DAO(s) (offset=${offset}, limit=${limit}, query="${query}")`;
|
|
229
|
+
return {
|
|
230
|
+
content: [{ type: "text", text }],
|
|
231
|
+
structuredContent: { query, offset, limit, daoPools: pools },
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
return errorResult(`read_dao_list failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
function registerDaoMembers(server, ctx) {
|
|
240
|
+
server.registerTool("dexe_read_dao_members", {
|
|
241
|
+
title: "List DAO members with voting power (subgraph)",
|
|
242
|
+
description: "Paginated member list for a DAO — includes voting power, delegation counts, rewards, expert status. Requires DEXE_SUBGRAPH_POOLS_URL.",
|
|
243
|
+
inputSchema: {
|
|
244
|
+
govPool: z.string().describe("GovPool address (lowercased for subgraph)"),
|
|
245
|
+
offset: z.number().int().min(0).default(0),
|
|
246
|
+
limit: z.number().int().min(1).max(100).default(20),
|
|
247
|
+
},
|
|
248
|
+
}, async ({ govPool, offset = 0, limit = 20 }) => {
|
|
249
|
+
if (!isAddress(govPool))
|
|
250
|
+
return errorResult(`Invalid govPool: ${govPool}`);
|
|
251
|
+
const url = requireUrl(ctx, "subgraphPoolsUrl");
|
|
252
|
+
if (!url)
|
|
253
|
+
return errorResult(`${ENV_HINT.subgraphPoolsUrl} is not set.`);
|
|
254
|
+
try {
|
|
255
|
+
const data = await gqlRequest(url, DAO_MEMBERS_QUERY, {
|
|
256
|
+
poolId: govPool.toLowerCase(),
|
|
257
|
+
offset,
|
|
258
|
+
limit,
|
|
259
|
+
});
|
|
260
|
+
const members = data.voterInPools;
|
|
261
|
+
const text = `${members.length} member(s) in ${govPool} (offset=${offset}, limit=${limit})`;
|
|
262
|
+
return {
|
|
263
|
+
content: [{ type: "text", text }],
|
|
264
|
+
structuredContent: { govPool, offset, limit, members },
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
return errorResult(`read_dao_members failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
function registerDelegationMap(server, ctx) {
|
|
273
|
+
server.registerTool("dexe_read_delegation_map", {
|
|
274
|
+
title: "Delegation relationships — outgoing or incoming (subgraph)",
|
|
275
|
+
description: "Query delegation pairs from the pools subgraph. Use direction='outgoing' to see who a user delegated to, or 'incoming' to see who delegated to them. Requires DEXE_SUBGRAPH_POOLS_URL.",
|
|
276
|
+
inputSchema: {
|
|
277
|
+
addresses: z.array(z.string()).min(1).describe("VoterInPool IDs (format: govPool-voterAddress, lowercased)"),
|
|
278
|
+
direction: z.enum(["outgoing", "incoming"]).default("outgoing").describe("outgoing = who I delegated to; incoming = who delegated to me"),
|
|
279
|
+
offset: z.number().int().min(0).default(0),
|
|
280
|
+
limit: z.number().int().min(1).max(100).default(50),
|
|
281
|
+
},
|
|
282
|
+
}, async ({ addresses, direction = "outgoing", offset = 0, limit = 50 }) => {
|
|
283
|
+
const url = requireUrl(ctx, "subgraphPoolsUrl");
|
|
284
|
+
if (!url)
|
|
285
|
+
return errorResult(`${ENV_HINT.subgraphPoolsUrl} is not set.`);
|
|
286
|
+
try {
|
|
287
|
+
const lc = addresses.map((a) => a.toLowerCase());
|
|
288
|
+
const query = direction === "outgoing" ? DELEGATION_MAP_QUERY : DELEGATION_INCOMING_QUERY;
|
|
289
|
+
const variables = direction === "outgoing"
|
|
290
|
+
? { offset, limit, delegatorIn: lc }
|
|
291
|
+
: { offset, limit, voterIn: lc };
|
|
292
|
+
const data = await gqlRequest(url, query, variables);
|
|
293
|
+
const pairs = data.voterInPoolPairs;
|
|
294
|
+
const text = `${pairs.length} ${direction} delegation(s) for ${addresses.length} address(es)`;
|
|
295
|
+
return {
|
|
296
|
+
content: [{ type: "text", text }],
|
|
297
|
+
structuredContent: { addresses, direction, offset, limit, delegations: pairs },
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
return errorResult(`read_delegation_map failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
function registerValidatorList(server, ctx) {
|
|
306
|
+
server.registerTool("dexe_read_validator_list", {
|
|
307
|
+
title: "List validators in a DAO (subgraph)",
|
|
308
|
+
description: "Paginated validator list ordered by balance descending. Requires DEXE_SUBGRAPH_VALIDATORS_URL.",
|
|
309
|
+
inputSchema: {
|
|
310
|
+
govPool: z.string().describe("GovPool address"),
|
|
311
|
+
offset: z.number().int().min(0).default(0),
|
|
312
|
+
limit: z.number().int().min(1).max(100).default(50),
|
|
313
|
+
},
|
|
314
|
+
}, async ({ govPool, offset = 0, limit = 50 }) => {
|
|
315
|
+
if (!isAddress(govPool))
|
|
316
|
+
return errorResult(`Invalid govPool: ${govPool}`);
|
|
317
|
+
const url = requireUrl(ctx, "subgraphValidatorsUrl");
|
|
318
|
+
if (!url)
|
|
319
|
+
return errorResult(`${ENV_HINT.subgraphValidatorsUrl} is not set.`);
|
|
320
|
+
try {
|
|
321
|
+
const data = await gqlRequest(url, VALIDATORS_QUERY, {
|
|
322
|
+
offset,
|
|
323
|
+
limit,
|
|
324
|
+
address: govPool.toLowerCase(),
|
|
325
|
+
});
|
|
326
|
+
const validators = data.validatorInPools;
|
|
327
|
+
const text = `${validators.length} validator(s) in ${govPool} (offset=${offset}, limit=${limit})`;
|
|
328
|
+
return {
|
|
329
|
+
content: [{ type: "text", text }],
|
|
330
|
+
structuredContent: { govPool, offset, limit, validators },
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
catch (err) {
|
|
334
|
+
return errorResult(`read_validator_list failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
function registerUserActivity(server, ctx) {
|
|
339
|
+
server.registerTool("dexe_read_user_activity", {
|
|
340
|
+
title: "User transaction history across DAOs (subgraph)",
|
|
341
|
+
description: "Paginated transaction history for a user — proposals created, votes cast, delegations, claims. Ordered by timestamp descending. Requires DEXE_SUBGRAPH_INTERACTIONS_URL.",
|
|
342
|
+
inputSchema: {
|
|
343
|
+
user: z.string().describe("User wallet address"),
|
|
344
|
+
offset: z.number().int().min(0).default(0),
|
|
345
|
+
limit: z.number().int().min(1).max(100).default(50),
|
|
346
|
+
},
|
|
347
|
+
}, async ({ user, offset = 0, limit = 50 }) => {
|
|
348
|
+
if (!isAddress(user))
|
|
349
|
+
return errorResult(`Invalid user: ${user}`);
|
|
350
|
+
const url = requireUrl(ctx, "subgraphInteractionsUrl");
|
|
351
|
+
if (!url)
|
|
352
|
+
return errorResult(`${ENV_HINT.subgraphInteractionsUrl} is not set.`);
|
|
353
|
+
try {
|
|
354
|
+
const data = await gqlRequest(url, USER_ACTIVITY_QUERY, {
|
|
355
|
+
offset,
|
|
356
|
+
limit,
|
|
357
|
+
address: user.toLowerCase(),
|
|
358
|
+
});
|
|
359
|
+
const txs = data.transactions;
|
|
360
|
+
const text = `${txs.length} transaction(s) for ${user} (offset=${offset}, limit=${limit})`;
|
|
361
|
+
return {
|
|
362
|
+
content: [{ type: "text", text }],
|
|
363
|
+
structuredContent: { user, offset, limit, transactions: txs },
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
catch (err) {
|
|
367
|
+
return errorResult(`read_user_activity failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
function registerDaoExperts(server, ctx) {
|
|
372
|
+
server.registerTool("dexe_read_dao_experts", {
|
|
373
|
+
title: "List local experts in a DAO (subgraph)",
|
|
374
|
+
description: "Paginated list of local experts (holders of DAO-specific expert NFTs) with their delegation info. Requires DEXE_SUBGRAPH_POOLS_URL.",
|
|
375
|
+
inputSchema: {
|
|
376
|
+
govPool: z.string().describe("GovPool address"),
|
|
377
|
+
offset: z.number().int().min(0).default(0),
|
|
378
|
+
limit: z.number().int().min(1).max(100).default(50),
|
|
379
|
+
},
|
|
380
|
+
}, async ({ govPool, offset = 0, limit = 50 }) => {
|
|
381
|
+
if (!isAddress(govPool))
|
|
382
|
+
return errorResult(`Invalid govPool: ${govPool}`);
|
|
383
|
+
const url = requireUrl(ctx, "subgraphPoolsUrl");
|
|
384
|
+
if (!url)
|
|
385
|
+
return errorResult(`${ENV_HINT.subgraphPoolsUrl} is not set.`);
|
|
386
|
+
try {
|
|
387
|
+
const data = await gqlRequest(url, EXPERTS_QUERY, {
|
|
388
|
+
offset,
|
|
389
|
+
limit,
|
|
390
|
+
daoAddress: govPool.toLowerCase(),
|
|
391
|
+
});
|
|
392
|
+
const experts = data.voterInPools;
|
|
393
|
+
const text = `${experts.length} expert(s) in ${govPool} (offset=${offset}, limit=${limit})`;
|
|
394
|
+
return {
|
|
395
|
+
content: [{ type: "text", text }],
|
|
396
|
+
structuredContent: { govPool, offset, limit, experts },
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
catch (err) {
|
|
400
|
+
return errorResult(`read_dao_experts failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=subgraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subgraph.js","sourceRoot":"","sources":["../../src/tools/subgraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { SignerManager } from "../lib/signer.js";
|
|
3
|
+
import type { DexeConfig } from "../config.js";
|
|
4
|
+
export declare function registerTxTools(server: McpServer, config: DexeConfig, signer: SignerManager): void;
|
|
5
|
+
//# sourceMappingURL=txSend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"txSend.d.ts","sourceRoot":"","sources":["../../src/tools/txSend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,aAAa,GACpB,IAAI,CA2GN"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerTxTools(server, config, signer) {
|
|
3
|
+
server.tool("dexe_tx_send", "Sign and broadcast a transaction using the configured DEXE_PRIVATE_KEY. " +
|
|
4
|
+
"Pass the TxPayload fields returned by any dexe_*_build_* tool. " +
|
|
5
|
+
"Waits for on-chain confirmation and returns the receipt.", {
|
|
6
|
+
to: z.string().describe("Destination contract address"),
|
|
7
|
+
data: z.string().describe("ABI-encoded calldata (0x-prefixed hex)"),
|
|
8
|
+
value: z
|
|
9
|
+
.string()
|
|
10
|
+
.default("0")
|
|
11
|
+
.describe("Wei value as decimal string"),
|
|
12
|
+
gasLimit: z
|
|
13
|
+
.string()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe("Optional gas limit override (decimal string)"),
|
|
16
|
+
waitConfirmations: z
|
|
17
|
+
.number()
|
|
18
|
+
.int()
|
|
19
|
+
.min(0)
|
|
20
|
+
.max(12)
|
|
21
|
+
.default(1)
|
|
22
|
+
.describe("Confirmations to wait (0 = fire-and-forget)"),
|
|
23
|
+
}, async ({ to, data, value, gasLimit, waitConfirmations }) => {
|
|
24
|
+
const wallet = signer.requireSigner();
|
|
25
|
+
const tx = await wallet.sendTransaction({
|
|
26
|
+
to,
|
|
27
|
+
data,
|
|
28
|
+
value: BigInt(value),
|
|
29
|
+
chainId: BigInt(config.chainId),
|
|
30
|
+
...(gasLimit ? { gasLimit: BigInt(gasLimit) } : {}),
|
|
31
|
+
});
|
|
32
|
+
if (waitConfirmations === 0) {
|
|
33
|
+
return {
|
|
34
|
+
content: [
|
|
35
|
+
{
|
|
36
|
+
type: "text",
|
|
37
|
+
text: JSON.stringify({ txHash: tx.hash, from: wallet.address, status: "submitted" }, null, 2),
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const receipt = await tx.wait(waitConfirmations);
|
|
43
|
+
if (!receipt) {
|
|
44
|
+
return {
|
|
45
|
+
content: [
|
|
46
|
+
{
|
|
47
|
+
type: "text",
|
|
48
|
+
text: JSON.stringify({ txHash: tx.hash, status: "unknown" }, null, 2),
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const result = {
|
|
54
|
+
txHash: receipt.hash,
|
|
55
|
+
from: wallet.address,
|
|
56
|
+
blockNumber: receipt.blockNumber,
|
|
57
|
+
gasUsed: receipt.gasUsed.toString(),
|
|
58
|
+
status: receipt.status,
|
|
59
|
+
};
|
|
60
|
+
return {
|
|
61
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
server.tool("dexe_tx_status", "Check the receipt/status of a previously submitted transaction hash.", {
|
|
65
|
+
txHash: z.string().describe("Transaction hash to look up"),
|
|
66
|
+
}, async ({ txHash }) => {
|
|
67
|
+
const wallet = signer.requireSigner();
|
|
68
|
+
const provider = wallet.provider;
|
|
69
|
+
const receipt = await provider.getTransactionReceipt(txHash);
|
|
70
|
+
if (!receipt) {
|
|
71
|
+
return {
|
|
72
|
+
content: [{ type: "text", text: JSON.stringify({ status: "pending" }) }],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const result = {
|
|
76
|
+
txHash: receipt.hash,
|
|
77
|
+
status: receipt.status,
|
|
78
|
+
blockNumber: receipt.blockNumber,
|
|
79
|
+
gasUsed: receipt.gasUsed.toString(),
|
|
80
|
+
logsCount: receipt.logs.length,
|
|
81
|
+
};
|
|
82
|
+
return {
|
|
83
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=txSend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"txSend.js","sourceRoot":"","sources":["../../src/tools/txSend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,UAAU,eAAe,CAC7B,MAAiB,EACjB,MAAkB,EAClB,MAAqB;IAErB,MAAM,CAAC,IAAI,CACT,cAAc,EACd,0EAA0E;QACxE,iEAAiE;QACjE,0DAA0D,EAC5D;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACvD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QACnE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,OAAO,CAAC,GAAG,CAAC;aACZ,QAAQ,CAAC,6BAA6B,CAAC;QAC1C,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,8CAA8C,CAAC;QAC3D,iBAAiB,EAAE,CAAC;aACjB,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CAAC,6CAA6C,CAAC;KAC3D,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAEtC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;YACtC,EAAE;YACF,IAAI;YACJ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;YAC/B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,CAAC,CAAC;QAEH,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,EAC9D,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBACtE;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,OAAO,CAAC,IAAI;YACpB,IAAI,EAAE,MAAM,CAAC,OAAO;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;YACnC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,sEAAsE,EACtE;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAC3D,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAS,CAAC;QAElC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;aAClF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,OAAO,CAAC,IAAI;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;YACnC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;SAC/B,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voteBuild.d.ts","sourceRoot":"","sources":["../../src/tools/voteBuild.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"voteBuild.d.ts","sourceRoot":"","sources":["../../src/tools/voteBuild.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA2GhD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA+BhF"}
|