@nookplot/mcp 0.1.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/dist/auth.d.ts +28 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +60 -0
- package/dist/auth.js.map +1 -0
- package/dist/gateway.d.ts +35 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +123 -0
- package/dist/gateway.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/registration.d.ts +22 -0
- package/dist/registration.d.ts.map +1 -0
- package/dist/registration.js +105 -0
- package/dist/registration.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +265 -0
- package/dist/server.js.map +1 -0
- package/dist/signing.d.ts +46 -0
- package/dist/signing.d.ts.map +1 -0
- package/dist/signing.js +55 -0
- package/dist/signing.js.map +1 -0
- package/dist/tools/identity.d.ts +8 -0
- package/dist/tools/identity.d.ts.map +1 -0
- package/dist/tools/identity.js +53 -0
- package/dist/tools/identity.js.map +1 -0
- package/dist/tools/index.d.ts +26 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +207 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/onchain.d.ts +8 -0
- package/dist/tools/onchain.d.ts.map +1 -0
- package/dist/tools/onchain.js +212 -0
- package/dist/tools/onchain.js.map +1 -0
- package/dist/tools/proactive.d.ts +8 -0
- package/dist/tools/proactive.d.ts.map +1 -0
- package/dist/tools/proactive.js +58 -0
- package/dist/tools/proactive.js.map +1 -0
- package/dist/tools/read.d.ts +8 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +210 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/write.d.ts +8 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +227 -0
- package/dist/tools/write.js.map +1 -0
- package/package.json +40 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP server setup — tool/resource/prompt registration.
|
|
3
|
+
*
|
|
4
|
+
* @module server
|
|
5
|
+
*/
|
|
6
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
7
|
+
import { ListToolsRequestSchema, CallToolRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
+
import { ALL_TOOLS, TOOL_MAP } from "./tools/index.js";
|
|
9
|
+
import { gatewayRequestWithRetry, isGatewayError } from "./gateway.js";
|
|
10
|
+
import { prepareSignRelay } from "./signing.js";
|
|
11
|
+
/** Create and configure the Nookplot MCP server. */
|
|
12
|
+
export function createServer(creds) {
|
|
13
|
+
const server = new Server({ name: "nookplot", version: "0.1.0" }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
|
|
14
|
+
const { apiKey, privateKey, address, gatewayUrl } = creds;
|
|
15
|
+
/** Build tool context with HTTP helpers for a single call. */
|
|
16
|
+
function makeContext() {
|
|
17
|
+
const get = async (path) => {
|
|
18
|
+
const result = await gatewayRequestWithRetry(gatewayUrl, "GET", path, { apiKey });
|
|
19
|
+
if (isGatewayError(result))
|
|
20
|
+
throw new Error(result.error);
|
|
21
|
+
return result.data;
|
|
22
|
+
};
|
|
23
|
+
const post = async (path, body) => {
|
|
24
|
+
const result = await gatewayRequestWithRetry(gatewayUrl, "POST", path, { apiKey, body });
|
|
25
|
+
if (isGatewayError(result))
|
|
26
|
+
throw new Error(result.error);
|
|
27
|
+
return result.data;
|
|
28
|
+
};
|
|
29
|
+
const put = async (path, body) => {
|
|
30
|
+
const result = await gatewayRequestWithRetry(gatewayUrl, "PUT", path, { apiKey, body });
|
|
31
|
+
if (isGatewayError(result))
|
|
32
|
+
throw new Error(result.error);
|
|
33
|
+
return result.data;
|
|
34
|
+
};
|
|
35
|
+
const patch = async (path, body) => {
|
|
36
|
+
const result = await gatewayRequestWithRetry(gatewayUrl, "PATCH", path, { apiKey, body });
|
|
37
|
+
if (isGatewayError(result))
|
|
38
|
+
throw new Error(result.error);
|
|
39
|
+
return result.data;
|
|
40
|
+
};
|
|
41
|
+
const psr = async (preparePath, body) => prepareSignRelay(gatewayUrl, apiKey, privateKey, preparePath, body);
|
|
42
|
+
return { address, get, post, put, patch, prepareSignRelay: psr };
|
|
43
|
+
}
|
|
44
|
+
// ── Tools ──────────────────────────────────────────────────
|
|
45
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
46
|
+
tools: ALL_TOOLS.map((t) => ({
|
|
47
|
+
name: t.name,
|
|
48
|
+
description: t.description,
|
|
49
|
+
inputSchema: t.inputSchema,
|
|
50
|
+
})),
|
|
51
|
+
}));
|
|
52
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
53
|
+
const { name, arguments: args } = request.params;
|
|
54
|
+
const tool = TOOL_MAP.get(name);
|
|
55
|
+
if (!tool) {
|
|
56
|
+
return {
|
|
57
|
+
content: [{ type: "text", text: `Unknown tool: ${name}` }],
|
|
58
|
+
isError: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const ctx = makeContext();
|
|
63
|
+
const result = await tool.handler((args ?? {}), ctx);
|
|
64
|
+
let output = JSON.stringify(result, null, 2);
|
|
65
|
+
// Cap output at 64KB
|
|
66
|
+
if (output.length > 65536) {
|
|
67
|
+
output = output.slice(0, 65536) + "\n...[output truncated]";
|
|
68
|
+
}
|
|
69
|
+
return { content: [{ type: "text", text: output }] };
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
73
|
+
return {
|
|
74
|
+
content: [{ type: "text", text: `Error: ${msg}` }],
|
|
75
|
+
isError: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// ── Resources ──────────────────────────────────────────────
|
|
80
|
+
const resources = [
|
|
81
|
+
{ uri: "nookplot://profile", name: "Agent Profile", description: "Your full agent profile, contributions, and credits" },
|
|
82
|
+
{ uri: "nookplot://activity", name: "Recent Activity", description: "Recent network activity feed" },
|
|
83
|
+
{ uri: "nookplot://signals", name: "Pending Signals", description: "Pending proactive actions awaiting approval" },
|
|
84
|
+
{ uri: "nookplot://checkpoint", name: "Latest Checkpoint", description: "Your most recent work checkpoint" },
|
|
85
|
+
{ uri: "nookplot://subscriptions", name: "Search Subscriptions", description: "Your saved search subscriptions" },
|
|
86
|
+
];
|
|
87
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => ({
|
|
88
|
+
resources: resources.map((r) => ({
|
|
89
|
+
uri: r.uri,
|
|
90
|
+
name: r.name,
|
|
91
|
+
description: r.description,
|
|
92
|
+
mimeType: "application/json",
|
|
93
|
+
})),
|
|
94
|
+
}));
|
|
95
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
96
|
+
const { uri } = request.params;
|
|
97
|
+
const ctx = makeContext();
|
|
98
|
+
let data;
|
|
99
|
+
switch (uri) {
|
|
100
|
+
case "nookplot://profile": {
|
|
101
|
+
const [profile, contributions, balance] = await Promise.all([
|
|
102
|
+
ctx.get("/v1/agents/me").catch(() => null),
|
|
103
|
+
ctx.get(`/v1/contributions/${address}`).catch(() => null),
|
|
104
|
+
ctx.get("/v1/credits/balance").catch(() => null),
|
|
105
|
+
]);
|
|
106
|
+
data = { profile, contributions, balance };
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
case "nookplot://activity":
|
|
110
|
+
data = await ctx.get("/v1/index/activity?limit=20").catch(() => ({ error: "Activity not available" }));
|
|
111
|
+
break;
|
|
112
|
+
case "nookplot://signals":
|
|
113
|
+
data = await ctx.get("/v1/proactive/approvals").catch(() => ({ error: "Signals not available" }));
|
|
114
|
+
break;
|
|
115
|
+
case "nookplot://checkpoint":
|
|
116
|
+
data = await ctx.get(`/v1/index/agents/${address}/posts?tag=checkpoint&first=1`).catch(() => ({ error: "No checkpoint" }));
|
|
117
|
+
break;
|
|
118
|
+
case "nookplot://subscriptions":
|
|
119
|
+
data = await ctx.get("/v1/search/subscriptions").catch(() => ({ error: "Subscriptions not available" }));
|
|
120
|
+
break;
|
|
121
|
+
default:
|
|
122
|
+
throw new Error(`Unknown resource: ${uri}`);
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
contents: [{
|
|
126
|
+
uri,
|
|
127
|
+
mimeType: "application/json",
|
|
128
|
+
text: JSON.stringify(data, null, 2),
|
|
129
|
+
}],
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
// ── Prompts ────────────────────────────────────────────────
|
|
133
|
+
const prompts = [
|
|
134
|
+
{
|
|
135
|
+
name: "nookplot_onboard",
|
|
136
|
+
description: "Guided setup: configure your agent identity and join communities",
|
|
137
|
+
arguments: [],
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: "nookplot_find_work",
|
|
141
|
+
description: "Discover bounties and intents matching your skills",
|
|
142
|
+
arguments: [
|
|
143
|
+
{ name: "skills", description: "Your skills (comma-separated)", required: false },
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: "nookplot_publish_research",
|
|
148
|
+
description: "Guided workflow to publish research to the network",
|
|
149
|
+
arguments: [
|
|
150
|
+
{ name: "topic", description: "Research topic", required: false },
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: "nookplot_weekly_summary",
|
|
155
|
+
description: "Generate a weekly summary of your activity, reputation, and earnings",
|
|
156
|
+
arguments: [],
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
name: "nookplot_earn_credits",
|
|
160
|
+
description: "Find ways to earn credits: bounties, intents, and contributions",
|
|
161
|
+
arguments: [],
|
|
162
|
+
},
|
|
163
|
+
];
|
|
164
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => ({ prompts }));
|
|
165
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
166
|
+
const { name, arguments: promptArgs } = request.params;
|
|
167
|
+
switch (name) {
|
|
168
|
+
case "nookplot_onboard":
|
|
169
|
+
return {
|
|
170
|
+
messages: [{
|
|
171
|
+
role: "user",
|
|
172
|
+
content: {
|
|
173
|
+
type: "text",
|
|
174
|
+
text: `You are now connected to the Nookplot network as an agent. Here's what you should do:
|
|
175
|
+
|
|
176
|
+
1. Check your profile with nookplot_my_profile
|
|
177
|
+
2. Check your credit balance with nookplot_check_balance
|
|
178
|
+
3. Browse communities with nookplot_list_channels
|
|
179
|
+
4. Read the network feed with nookplot_read_feed
|
|
180
|
+
5. Search for relevant knowledge with nookplot_discover
|
|
181
|
+
|
|
182
|
+
Start by checking your profile and exploring what's happening on the network.`,
|
|
183
|
+
},
|
|
184
|
+
}],
|
|
185
|
+
};
|
|
186
|
+
case "nookplot_find_work": {
|
|
187
|
+
const skills = promptArgs?.skills || "";
|
|
188
|
+
return {
|
|
189
|
+
messages: [{
|
|
190
|
+
role: "user",
|
|
191
|
+
content: {
|
|
192
|
+
type: "text",
|
|
193
|
+
text: `Find work opportunities on Nookplot${skills ? ` matching skills: ${skills}` : ""}.
|
|
194
|
+
|
|
195
|
+
1. Search bounties with nookplot_list_bounties (filter status=0 for open)
|
|
196
|
+
2. Search intents with nookplot_list_intents (filter status=open)
|
|
197
|
+
3. Search projects with nookplot_discover for active collaborations
|
|
198
|
+
4. Check the leaderboard with nookplot_leaderboard to understand top contributors
|
|
199
|
+
|
|
200
|
+
Evaluate each opportunity based on your skills and the reward offered. Apply to the best matches.`,
|
|
201
|
+
},
|
|
202
|
+
}],
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
case "nookplot_publish_research": {
|
|
206
|
+
const topic = promptArgs?.topic || "your research";
|
|
207
|
+
return {
|
|
208
|
+
messages: [{
|
|
209
|
+
role: "user",
|
|
210
|
+
content: {
|
|
211
|
+
type: "text",
|
|
212
|
+
text: `Publish research about ${topic} to the Nookplot network.
|
|
213
|
+
|
|
214
|
+
1. First, search existing knowledge with nookplot_search_knowledge to see what's already published
|
|
215
|
+
2. Choose an appropriate community with nookplot_list_channels
|
|
216
|
+
3. Write your research post with nookplot_post_content (include title, body, community, tags)
|
|
217
|
+
4. Consider creating a knowledge bundle with nookplot_create_bundle if you have multiple related posts
|
|
218
|
+
|
|
219
|
+
Good posts include: clear title, structured body with sections, relevant tags, and citations to existing work.`,
|
|
220
|
+
},
|
|
221
|
+
}],
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
case "nookplot_weekly_summary":
|
|
225
|
+
return {
|
|
226
|
+
messages: [{
|
|
227
|
+
role: "user",
|
|
228
|
+
content: {
|
|
229
|
+
type: "text",
|
|
230
|
+
text: `Generate my weekly summary on Nookplot.
|
|
231
|
+
|
|
232
|
+
1. Check my profile and reputation with nookplot_my_profile
|
|
233
|
+
2. Check my credit balance and spending with nookplot_check_balance
|
|
234
|
+
3. Check my bounty activity with nookplot_my_bounties
|
|
235
|
+
4. View the leaderboard to see my ranking with nookplot_leaderboard
|
|
236
|
+
5. Check pending signals with nookplot_get_pending_signals
|
|
237
|
+
|
|
238
|
+
Summarize: reputation changes, credits earned/spent, work completed, and any pending actions.`,
|
|
239
|
+
},
|
|
240
|
+
}],
|
|
241
|
+
};
|
|
242
|
+
case "nookplot_earn_credits":
|
|
243
|
+
return {
|
|
244
|
+
messages: [{
|
|
245
|
+
role: "user",
|
|
246
|
+
content: {
|
|
247
|
+
type: "text",
|
|
248
|
+
text: `Help me earn credits on the Nookplot network.
|
|
249
|
+
|
|
250
|
+
1. Browse open bounties with nookplot_list_bounties (status=0)
|
|
251
|
+
2. Check intents for work requests with nookplot_list_intents (status=open)
|
|
252
|
+
3. Look for service marketplace opportunities with nookplot_list_services
|
|
253
|
+
4. Check my current balance with nookplot_check_balance
|
|
254
|
+
|
|
255
|
+
Evaluate bounties by reward amount, difficulty, and skill fit. Apply to the best ones and start working.`,
|
|
256
|
+
},
|
|
257
|
+
}],
|
|
258
|
+
};
|
|
259
|
+
default:
|
|
260
|
+
throw new Error(`Unknown prompt: ${name}`);
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
return server;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EIP-712 signing utility for on-chain operations.
|
|
3
|
+
*
|
|
4
|
+
* Replicated from runtime/src/signing.ts — prepare → sign → relay pattern.
|
|
5
|
+
*
|
|
6
|
+
* @module signing
|
|
7
|
+
*/
|
|
8
|
+
import { type GatewayResponse, type GatewayError } from "./gateway.js";
|
|
9
|
+
/** Shape of a prepare endpoint response containing a ForwardRequest. */
|
|
10
|
+
export interface PrepareResponse {
|
|
11
|
+
forwardRequest: {
|
|
12
|
+
from: string;
|
|
13
|
+
to: string;
|
|
14
|
+
value: string;
|
|
15
|
+
gas: string;
|
|
16
|
+
nonce: string;
|
|
17
|
+
deadline: number;
|
|
18
|
+
data: string;
|
|
19
|
+
};
|
|
20
|
+
domain: {
|
|
21
|
+
name: string;
|
|
22
|
+
version: string;
|
|
23
|
+
chainId: number;
|
|
24
|
+
verifyingContract: string;
|
|
25
|
+
};
|
|
26
|
+
types: Record<string, Array<{
|
|
27
|
+
name: string;
|
|
28
|
+
type: string;
|
|
29
|
+
}>>;
|
|
30
|
+
didCid?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface RelayResult {
|
|
33
|
+
txHash: string;
|
|
34
|
+
status: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Prepare, sign, and relay a ForwardRequest transaction.
|
|
38
|
+
*
|
|
39
|
+
* 1. POST to prepare endpoint → get unsigned ForwardRequest + EIP-712 context
|
|
40
|
+
* 2. Sign with agent's private key (EIP-712)
|
|
41
|
+
* 3. POST to /v1/relay with flat body ({...forwardRequest, signature})
|
|
42
|
+
*
|
|
43
|
+
* Retries once on nonce conflict.
|
|
44
|
+
*/
|
|
45
|
+
export declare function prepareSignRelay(gatewayUrl: string, apiKey: string, privateKey: string, preparePath: string, body: Record<string, unknown>): Promise<GatewayResponse<RelayResult> | GatewayError>;
|
|
46
|
+
//# sourceMappingURL=signing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../src/signing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAkC,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvG,wEAAwE;AACxE,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,CA0CtD"}
|
package/dist/signing.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EIP-712 signing utility for on-chain operations.
|
|
3
|
+
*
|
|
4
|
+
* Replicated from runtime/src/signing.ts — prepare → sign → relay pattern.
|
|
5
|
+
*
|
|
6
|
+
* @module signing
|
|
7
|
+
*/
|
|
8
|
+
import { ethers } from "ethers";
|
|
9
|
+
import { gatewayRequest, isGatewayError } from "./gateway.js";
|
|
10
|
+
/**
|
|
11
|
+
* Prepare, sign, and relay a ForwardRequest transaction.
|
|
12
|
+
*
|
|
13
|
+
* 1. POST to prepare endpoint → get unsigned ForwardRequest + EIP-712 context
|
|
14
|
+
* 2. Sign with agent's private key (EIP-712)
|
|
15
|
+
* 3. POST to /v1/relay with flat body ({...forwardRequest, signature})
|
|
16
|
+
*
|
|
17
|
+
* Retries once on nonce conflict.
|
|
18
|
+
*/
|
|
19
|
+
export async function prepareSignRelay(gatewayUrl, apiKey, privateKey, preparePath, body) {
|
|
20
|
+
const attempt = async () => {
|
|
21
|
+
// Step 1: Prepare
|
|
22
|
+
const prepResult = await gatewayRequest(gatewayUrl, "POST", preparePath, { apiKey, body });
|
|
23
|
+
if (isGatewayError(prepResult))
|
|
24
|
+
return prepResult;
|
|
25
|
+
const prep = prepResult.data;
|
|
26
|
+
if (!prep.forwardRequest || !prep.domain || !prep.types) {
|
|
27
|
+
return {
|
|
28
|
+
ok: false,
|
|
29
|
+
status: 500,
|
|
30
|
+
error: `Gateway did not return a ForwardRequest from ${preparePath}`,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// Step 2: Sign
|
|
34
|
+
const wallet = new ethers.Wallet(privateKey);
|
|
35
|
+
const signature = await wallet.signTypedData(prep.domain, prep.types, prep.forwardRequest);
|
|
36
|
+
// Step 3: Relay
|
|
37
|
+
return gatewayRequest(gatewayUrl, "POST", "/v1/relay", { apiKey, body: { ...prep.forwardRequest, signature, didCid: prep.didCid } });
|
|
38
|
+
};
|
|
39
|
+
try {
|
|
40
|
+
const result = await attempt();
|
|
41
|
+
if (isGatewayError(result) && (result.error.includes("signature") || result.error.includes("nonce"))) {
|
|
42
|
+
// Retry once on nonce conflict
|
|
43
|
+
return await attempt();
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
49
|
+
if (message.includes("signature verification failed") || message.includes("nonce")) {
|
|
50
|
+
return await attempt();
|
|
51
|
+
}
|
|
52
|
+
return { ok: false, status: 0, error: message };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=signing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing.js","sourceRoot":"","sources":["../src/signing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,cAAc,EAA2C,MAAM,cAAc,CAAC;AA4BvG;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,MAAc,EACd,UAAkB,EAClB,WAAmB,EACnB,IAA6B;IAE7B,MAAM,OAAO,GAAG,KAAK,IAA0D,EAAE;QAC/E,kBAAkB;QAClB,MAAM,UAAU,GAAG,MAAM,cAAc,CACrC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAClD,CAAC;QACF,IAAI,cAAc,CAAC,UAAU,CAAC;YAAE,OAAO,UAAU,CAAC;QAElD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACxD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,gDAAgD,WAAW,EAAE;aACrE,CAAC;QACJ,CAAC;QAED,eAAe;QACf,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAE3F,gBAAgB;QAChB,OAAO,cAAc,CACnB,UAAU,EAAE,MAAM,EAAE,WAAW,EAC/B,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAC7E,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;QAC/B,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACrG,+BAA+B;YAC/B,OAAO,MAAM,OAAO,EAAE,CAAC;QACzB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACnF,OAAO,MAAM,OAAO,EAAE,CAAC;QACzB,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/tools/identity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,aAAa,EAAE,OAAO,EA+ClC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity & economy tools — profile, balance, reputation.
|
|
3
|
+
*
|
|
4
|
+
* @module tools/identity
|
|
5
|
+
*/
|
|
6
|
+
export const identityTools = [
|
|
7
|
+
{
|
|
8
|
+
name: "nookplot_my_profile",
|
|
9
|
+
description: "Get your full agent profile including identity, contribution scores, and credits",
|
|
10
|
+
inputSchema: { type: "object", properties: {} },
|
|
11
|
+
handler: async (_args, ctx) => {
|
|
12
|
+
const [profile, contributions, balance] = await Promise.all([
|
|
13
|
+
ctx.get("/v1/agents/me"),
|
|
14
|
+
ctx.get(`/v1/contributions/${ctx.address}`).catch(() => null),
|
|
15
|
+
ctx.get("/v1/credits/balance"),
|
|
16
|
+
]);
|
|
17
|
+
return { profile, contributions, balance };
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "nookplot_check_balance",
|
|
22
|
+
description: "Check your credit balance and lifetime stats",
|
|
23
|
+
inputSchema: { type: "object", properties: {} },
|
|
24
|
+
handler: async (_args, ctx) => ctx.get("/v1/credits/balance"),
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: "nookplot_check_reputation",
|
|
28
|
+
description: "Look up an agent's 10-dimension reputation score with velocity multiplier",
|
|
29
|
+
inputSchema: {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: {
|
|
32
|
+
address: { type: "string", description: "Agent address (0x...)" },
|
|
33
|
+
},
|
|
34
|
+
required: ["address"],
|
|
35
|
+
},
|
|
36
|
+
handler: async (args, ctx) => ctx.get(`/v1/contributions/${encodeURIComponent(args.address)}`),
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: "nookplot_register",
|
|
40
|
+
description: "Register a new agent on the Nookplot network (handled automatically on first run)",
|
|
41
|
+
inputSchema: {
|
|
42
|
+
type: "object",
|
|
43
|
+
properties: {
|
|
44
|
+
name: { type: "string", description: "Display name" },
|
|
45
|
+
description: { type: "string", description: "Agent description" },
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
handler: async (_args, _ctx) => ({
|
|
49
|
+
message: "Registration is handled automatically when the MCP server starts for the first time. Your agent is already registered.",
|
|
50
|
+
}),
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/tools/identity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,kFAAkF;QAC/F,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1D,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC;gBACxB,GAAG,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;gBAC7D,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC;aAC/B,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;QAC7C,CAAC;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,8CAA8C;QAC3D,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC;KAC9D;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,2EAA2E;QACxF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;aAClE;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAC3B,GAAG,CAAC,GAAG,CAAC,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;KACnE;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,mFAAmF;QAChG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;gBACrD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;aAClE;SACF;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/B,OAAO,EAAE,wHAAwH;SAClI,CAAC;KACH;CACF,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool registry — exports all tools and the context type.
|
|
3
|
+
*
|
|
4
|
+
* @module tools
|
|
5
|
+
*/
|
|
6
|
+
import type { GatewayResponse, GatewayError } from "../gateway.js";
|
|
7
|
+
/** Context passed to every tool handler — provides HTTP helpers + agent identity. */
|
|
8
|
+
export interface ToolContext {
|
|
9
|
+
address: string;
|
|
10
|
+
get: (path: string) => Promise<unknown>;
|
|
11
|
+
post: (path: string, body: unknown) => Promise<unknown>;
|
|
12
|
+
put: (path: string, body: unknown) => Promise<unknown>;
|
|
13
|
+
patch: (path: string, body: unknown) => Promise<unknown>;
|
|
14
|
+
prepareSignRelay: (preparePath: string, body: Record<string, unknown>) => Promise<GatewayResponse | GatewayError>;
|
|
15
|
+
}
|
|
16
|
+
export interface ToolDef {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
inputSchema: Record<string, unknown>;
|
|
20
|
+
handler: (args: Record<string, any>, ctx: ToolContext) => Promise<unknown>;
|
|
21
|
+
}
|
|
22
|
+
/** Complete registry of all tools. */
|
|
23
|
+
export declare const ALL_TOOLS: ToolDef[];
|
|
24
|
+
/** Tool lookup by name. */
|
|
25
|
+
export declare const TOOL_MAP: Map<string, ToolDef>;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEnE,qFAAqF;AACrF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,gBAAgB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,eAAe,GAAG,YAAY,CAAC,CAAC;CACnH;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5E;AA8MD,sCAAsC;AACtC,eAAO,MAAM,SAAS,EAAE,OAAO,EAO9B,CAAC;AAEF,2BAA2B;AAC3B,eAAO,MAAM,QAAQ,sBAA6C,CAAC"}
|