@veyanet/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.
package/dist/cli.js ADDED
@@ -0,0 +1,441 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/http.ts
4
+ import express from "express";
5
+ import cors from "cors";
6
+ import { randomUUID } from "crypto";
7
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
8
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
9
+
10
+ // src/config.ts
11
+ var MCP_SERVICE_NAME = "@veyanet/mcp";
12
+ var MCP_SERVICE_VERSION = "1.0.0";
13
+ function loadConfig() {
14
+ const mcpApiKey = process.env.MCP_API_KEY?.trim() || null;
15
+ const relayer = process.env.VEYA_RELAYER_PRIVATE_KEY?.trim() || process.env.VEYA_DEPLOYER_PRIVATE_KEY?.trim() || null;
16
+ return {
17
+ port: Number(process.env.PORT || 8788),
18
+ host: process.env.HOST || "0.0.0.0",
19
+ publicMcpUrl: (process.env.PUBLIC_MCP_URL || "https://mcp.veyanet.tech/mcp").replace(/\/$/, ""),
20
+ chainId: Number(process.env.ROBINHOOD_CHAIN_ID || 46630),
21
+ rpcUrl: process.env.ROBINHOOD_RPC_URL || "https://rpc.testnet.chain.robinhood.com",
22
+ explorerUrl: process.env.ROBINHOOD_EXPLORER_URL || "https://explorer.testnet.chain.robinhood.com",
23
+ contractAddress: process.env.VEYA_CONTRACT_ADDRESS || "0x1a1Dc3c55550FCE9F70ef6cDEeF967c0b72a5d84",
24
+ apiUrl: (process.env.VEYA_API_URL || "https://api.veyanet.tech").replace(/\/$/, ""),
25
+ mcpApiKey,
26
+ relayerPrivateKey: relayer,
27
+ corsOrigins: (process.env.CORS_ORIGIN || "").split(",").map((s) => s.trim()).filter(Boolean),
28
+ nodeEnv: process.env.NODE_ENV || "development"
29
+ };
30
+ }
31
+ function writesEnabled(cfg2) {
32
+ return Boolean(cfg2.mcpApiKey && cfg2.relayerPrivateKey);
33
+ }
34
+
35
+ // src/auth.ts
36
+ function extractBearer(req) {
37
+ const h = req.header("authorization") || req.header("Authorization");
38
+ if (!h) return null;
39
+ const m = /^Bearer\s+(.+)$/i.exec(h.trim());
40
+ return m?.[1]?.trim() || null;
41
+ }
42
+ function assertWriteAuthorized(cfg2, bearer) {
43
+ if (!cfg2.mcpApiKey) {
44
+ throw new Error(
45
+ "Write tools disabled on this server (set MCP_API_KEY + VEYA_RELAYER_PRIVATE_KEY)"
46
+ );
47
+ }
48
+ if (!bearer || bearer !== cfg2.mcpApiKey) {
49
+ throw new Error("Unauthorized: provide Authorization: Bearer <MCP_API_KEY>");
50
+ }
51
+ if (!cfg2.relayerPrivateKey) {
52
+ throw new Error("Write tools disabled: VEYA_RELAYER_PRIVATE_KEY not configured");
53
+ }
54
+ }
55
+
56
+ // src/server.ts
57
+ import { AsyncLocalStorage } from "async_hooks";
58
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
59
+
60
+ // src/tools/public.ts
61
+ import { z } from "zod";
62
+
63
+ // src/sdk.ts
64
+ import { VeyaClient } from "@veyanet/sdk";
65
+ function createReadClient(cfg2) {
66
+ return new VeyaClient({
67
+ rpcUrl: cfg2.rpcUrl,
68
+ contractAddress: cfg2.contractAddress,
69
+ chainId: cfg2.chainId,
70
+ explorerUrl: cfg2.explorerUrl
71
+ });
72
+ }
73
+ function createWriteClient(cfg2) {
74
+ if (!cfg2.relayerPrivateKey) {
75
+ throw new Error("VEYA_RELAYER_PRIVATE_KEY required for write tools");
76
+ }
77
+ return new VeyaClient({
78
+ rpcUrl: cfg2.rpcUrl,
79
+ contractAddress: cfg2.contractAddress,
80
+ chainId: cfg2.chainId,
81
+ explorerUrl: cfg2.explorerUrl,
82
+ payerPrivateKey: cfg2.relayerPrivateKey
83
+ });
84
+ }
85
+ function parseHexBytes(value, expectedLen) {
86
+ const hex = value.trim().replace(/^0x/, "");
87
+ if (!/^[0-9a-fA-F]*$/.test(hex) || hex.length % 2 !== 0) {
88
+ throw new Error("Expected even-length hex string");
89
+ }
90
+ const buf = Buffer.from(hex, "hex");
91
+ if (expectedLen !== void 0 && buf.length !== expectedLen) {
92
+ throw new Error(`Expected ${expectedLen} bytes, got ${buf.length}`);
93
+ }
94
+ return Uint8Array.from(buf);
95
+ }
96
+
97
+ // src/tools/public.ts
98
+ function registerPublicTools(server, cfg2) {
99
+ server.tool(
100
+ "veya_describe",
101
+ "Honesty card: what this MCP is (AES sealed elsewhere, testnet 46630, not FHE/mainnet)",
102
+ {},
103
+ async () => ({
104
+ content: [
105
+ {
106
+ type: "text",
107
+ text: JSON.stringify(
108
+ {
109
+ name: MCP_SERVICE_NAME,
110
+ version: MCP_SERVICE_VERSION,
111
+ publicUrl: cfg2.publicMcpUrl,
112
+ settlement: {
113
+ network: "Robinhood Chain testnet",
114
+ chainId: cfg2.chainId,
115
+ contract: cfg2.contractAddress,
116
+ explorer: cfg2.explorerUrl,
117
+ rpc: cfg2.rpcUrl
118
+ },
119
+ productApi: cfg2.apiUrl,
120
+ sealed: "AES-256-GCM sealed-node (not FHE; TFHE is Phase 4)",
121
+ mainnet: "Not a VEYA settlement claim (Phase 3)",
122
+ writes: "Require Authorization: Bearer <MCP_API_KEY> when enabled on the server",
123
+ stdioSibling: "Local stdio MCP remains at veya-anchor/packages/mcp (operators)"
124
+ },
125
+ null,
126
+ 2
127
+ )
128
+ }
129
+ ]
130
+ })
131
+ );
132
+ server.tool(
133
+ "veya_ping_chain",
134
+ "Ping Robinhood Chain RPC \u2014 chain id, block, contract",
135
+ {},
136
+ async () => {
137
+ const client = createReadClient(cfg2);
138
+ const ping = await client.pingChain();
139
+ return {
140
+ content: [
141
+ {
142
+ type: "text",
143
+ text: JSON.stringify(
144
+ {
145
+ ...ping,
146
+ chainId: ping.chainId.toString(),
147
+ expectedChainId: cfg2.chainId,
148
+ config: client.describe()
149
+ },
150
+ null,
151
+ 2
152
+ )
153
+ }
154
+ ]
155
+ };
156
+ }
157
+ );
158
+ server.tool(
159
+ "veya_hash_blake3",
160
+ "Compute BLAKE3 hex digest (commitment helper)",
161
+ { data: z.string().min(1) },
162
+ async ({ data }) => {
163
+ const client = createReadClient(cfg2);
164
+ const hash = await client.hashBlake3(data);
165
+ return {
166
+ content: [{ type: "text", text: JSON.stringify({ hash }, null, 2) }]
167
+ };
168
+ }
169
+ );
170
+ server.tool(
171
+ "veya_verify_transaction",
172
+ "Verify a Veya.sol commitment from a Robinhood Chain tx hash",
173
+ { txHash: z.string().min(66) },
174
+ async ({ txHash }) => {
175
+ const client = createReadClient(cfg2);
176
+ const result = await client.verifyTransaction(txHash);
177
+ return {
178
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
179
+ };
180
+ }
181
+ );
182
+ server.tool(
183
+ "veya_api_health",
184
+ "Probe the public VEYA API /health (api.veyanet.tech) \u2014 honest degraded when fleet down",
185
+ {},
186
+ async () => {
187
+ const res = await fetch(`${cfg2.apiUrl}/health`, {
188
+ signal: AbortSignal.timeout(8e3)
189
+ });
190
+ const body = await res.json().catch(() => ({}));
191
+ return {
192
+ content: [
193
+ {
194
+ type: "text",
195
+ text: JSON.stringify({ httpStatus: res.status, body }, null, 2)
196
+ }
197
+ ]
198
+ };
199
+ }
200
+ );
201
+ }
202
+
203
+ // src/tools/write.ts
204
+ import { z as z2 } from "zod";
205
+ function registerWriteTools(server, cfg2, getBearer) {
206
+ if (!writesEnabled(cfg2)) {
207
+ server.tool(
208
+ "veya_writes_status",
209
+ "Reports that on-chain write tools are disabled on this server",
210
+ {},
211
+ async () => ({
212
+ content: [
213
+ {
214
+ type: "text",
215
+ text: JSON.stringify({
216
+ writesEnabled: false,
217
+ reason: "Set MCP_API_KEY and VEYA_RELAYER_PRIVATE_KEY to enable write tools"
218
+ })
219
+ }
220
+ ]
221
+ })
222
+ );
223
+ return;
224
+ }
225
+ function requireAuth() {
226
+ assertWriteAuthorized(cfg2, getBearer());
227
+ }
228
+ server.tool(
229
+ "veya_store_commitment",
230
+ "Write a 32-byte commitment to Veya.sol (requires MCP_API_KEY). Use content Use stamps prefer product-site + API.",
231
+ {
232
+ environmentUuidHex: z2.string().min(32),
233
+ commitmentHex: z2.string().min(64)
234
+ },
235
+ async ({ environmentUuidHex, commitmentHex }) => {
236
+ requireAuth();
237
+ const client = createWriteClient(cfg2);
238
+ const txHash = await client.requireEvm().storeCommitment(
239
+ parseHexBytes(environmentUuidHex, 16),
240
+ parseHexBytes(commitmentHex, 32)
241
+ );
242
+ return {
243
+ content: [
244
+ {
245
+ type: "text",
246
+ text: JSON.stringify({ txHash, explorer: client.explorerFor(txHash) }, null, 2)
247
+ }
248
+ ]
249
+ };
250
+ }
251
+ );
252
+ server.tool(
253
+ "veya_attest_execution",
254
+ "attestExecution on Veya.sol with ML-DSA bytes (requires MCP_API_KEY)",
255
+ {
256
+ environmentUuidHex: z2.string().min(32),
257
+ blake3HashHex: z2.string().min(64),
258
+ mldsaSigHex: z2.string().min(8)
259
+ },
260
+ async ({ environmentUuidHex, blake3HashHex, mldsaSigHex }) => {
261
+ requireAuth();
262
+ const client = createWriteClient(cfg2);
263
+ const txHash = await client.requireEvm().attestExecution(
264
+ parseHexBytes(environmentUuidHex, 16),
265
+ parseHexBytes(blake3HashHex, 32),
266
+ parseHexBytes(mldsaSigHex)
267
+ );
268
+ return {
269
+ content: [
270
+ {
271
+ type: "text",
272
+ text: JSON.stringify({ txHash, explorer: client.explorerFor(txHash) }, null, 2)
273
+ }
274
+ ]
275
+ };
276
+ }
277
+ );
278
+ server.tool(
279
+ "veya_register_environment",
280
+ "registerEnvironment on Veya.sol (requires MCP_API_KEY)",
281
+ {
282
+ environmentUuidHex: z2.string().min(32),
283
+ pqPubkeyHashHex: z2.string().min(64),
284
+ envType: z2.number().int().min(0).max(10).default(0)
285
+ },
286
+ async ({ environmentUuidHex, pqPubkeyHashHex, envType }) => {
287
+ requireAuth();
288
+ const client = createWriteClient(cfg2);
289
+ const txHash = await client.requireEvm().registerEnvironment(
290
+ parseHexBytes(environmentUuidHex, 16),
291
+ parseHexBytes(pqPubkeyHashHex, 32),
292
+ envType
293
+ );
294
+ return {
295
+ content: [
296
+ {
297
+ type: "text",
298
+ text: JSON.stringify({ txHash, explorer: client.explorerFor(txHash) }, null, 2)
299
+ }
300
+ ]
301
+ };
302
+ }
303
+ );
304
+ }
305
+
306
+ // src/server.ts
307
+ var requestAuth = new AsyncLocalStorage();
308
+ function createMcpServer(cfg2) {
309
+ const server = new McpServer({
310
+ name: MCP_SERVICE_NAME,
311
+ version: MCP_SERVICE_VERSION
312
+ });
313
+ registerPublicTools(server, cfg2);
314
+ registerWriteTools(server, cfg2, () => requestAuth.getStore()?.bearer ?? null);
315
+ return server;
316
+ }
317
+
318
+ // src/http.ts
319
+ function createHttpApp(cfg2 = loadConfig()) {
320
+ const app = express();
321
+ app.use(express.json({ limit: "1mb" }));
322
+ app.use(
323
+ cors({
324
+ origin(origin, cb) {
325
+ if (!origin) return cb(null, true);
326
+ if (cfg2.corsOrigins.length === 0) return cb(null, false);
327
+ if (cfg2.corsOrigins.includes(origin)) return cb(null, true);
328
+ return cb(null, false);
329
+ },
330
+ credentials: true
331
+ })
332
+ );
333
+ app.get("/health", (_req, res) => {
334
+ res.json({
335
+ status: "ok",
336
+ service: MCP_SERVICE_NAME,
337
+ version: MCP_SERVICE_VERSION,
338
+ publicMcpUrl: cfg2.publicMcpUrl,
339
+ chainId: cfg2.chainId,
340
+ contractAddress: cfg2.contractAddress,
341
+ writesEnabled: writesEnabled(cfg2),
342
+ sealed: "AES-256-GCM (not FHE)",
343
+ settlement: "Robinhood Chain testnet 46630"
344
+ });
345
+ });
346
+ app.post("/mcp", async (req, res) => {
347
+ const bearer = extractBearer(req);
348
+ await requestAuth.run({ bearer }, async () => {
349
+ try {
350
+ const server = createMcpServer(cfg2);
351
+ const transport = new StreamableHTTPServerTransport({
352
+ sessionIdGenerator: void 0
353
+ });
354
+ await server.connect(transport);
355
+ await transport.handleRequest(req, res, req.body);
356
+ res.on("close", () => {
357
+ void transport.close();
358
+ void server.close();
359
+ });
360
+ } catch (err) {
361
+ console.error("[veyanet/mcp] POST /mcp", err);
362
+ if (!res.headersSent) {
363
+ res.status(500).json({
364
+ jsonrpc: "2.0",
365
+ error: { code: -32603, message: "Internal server error" },
366
+ id: null
367
+ });
368
+ }
369
+ }
370
+ });
371
+ });
372
+ const sessions = /* @__PURE__ */ new Map();
373
+ app.post("/mcp/session", async (req, res) => {
374
+ const bearer = extractBearer(req);
375
+ await requestAuth.run({ bearer }, async () => {
376
+ try {
377
+ const sessionId = req.header("mcp-session-id") || void 0;
378
+ if (sessionId && sessions.has(sessionId)) {
379
+ await sessions.get(sessionId).handleRequest(req, res, req.body);
380
+ return;
381
+ }
382
+ if (!sessionId && isInitializeRequest(req.body)) {
383
+ const transport = new StreamableHTTPServerTransport({
384
+ sessionIdGenerator: () => randomUUID(),
385
+ onsessioninitialized: (id) => {
386
+ sessions.set(id, transport);
387
+ }
388
+ });
389
+ transport.onclose = () => {
390
+ if (transport.sessionId) sessions.delete(transport.sessionId);
391
+ };
392
+ const server = createMcpServer(cfg2);
393
+ await server.connect(transport);
394
+ await transport.handleRequest(req, res, req.body);
395
+ return;
396
+ }
397
+ res.status(400).json({
398
+ jsonrpc: "2.0",
399
+ error: { code: -32e3, message: "No valid MCP session" },
400
+ id: null
401
+ });
402
+ } catch (err) {
403
+ console.error("[veyanet/mcp] POST /mcp/session", err);
404
+ if (!res.headersSent) {
405
+ res.status(500).json({
406
+ jsonrpc: "2.0",
407
+ error: { code: -32603, message: "Internal server error" },
408
+ id: null
409
+ });
410
+ }
411
+ }
412
+ });
413
+ });
414
+ app.get("/", (_req, res) => {
415
+ res.type("html").send(`<!doctype html>
416
+ <html><head><meta charset="utf-8"/><title>VEYA MCP</title></head>
417
+ <body style="font-family:system-ui;max-width:40rem;margin:2rem auto;line-height:1.5">
418
+ <h1>VEYA MCP</h1>
419
+ <p>Paste this URL into Claude / Cursor (Streamable HTTP):</p>
420
+ <pre>${cfg2.publicMcpUrl}</pre>
421
+ <p>Local: <code>POST http://127.0.0.1:${cfg2.port}/mcp</code></p>
422
+ <p>Health: <a href="/health">/health</a></p>
423
+ <p>Settlement: Robinhood testnet <strong>46630</strong> \xB7 Sealed = AES-256-GCM (not FHE) \xB7 Not mainnet.</p>
424
+ <p>Local stdio MCP for operators: <code>veya-anchor/packages/mcp</code></p>
425
+ </body></html>`);
426
+ });
427
+ return app;
428
+ }
429
+ function startHttpServer(cfg2 = loadConfig()) {
430
+ const app = createHttpApp(cfg2);
431
+ return app.listen(cfg2.port, cfg2.host, () => {
432
+ console.log(`[veyanet/mcp] listening on http://${cfg2.host}:${cfg2.port}`);
433
+ console.log(`[veyanet/mcp] MCP POST ${cfg2.publicMcpUrl} (local /mcp)`);
434
+ console.log(`[veyanet/mcp] writesEnabled=${writesEnabled(cfg2)}`);
435
+ });
436
+ }
437
+
438
+ // src/cli.ts
439
+ var cfg = loadConfig();
440
+ startHttpServer(cfg);
441
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/http.ts","../src/config.ts","../src/auth.ts","../src/server.ts","../src/tools/public.ts","../src/sdk.ts","../src/tools/write.ts","../src/cli.ts"],"sourcesContent":["import express, { type Request, type Response } from \"express\";\r\nimport cors from \"cors\";\r\nimport { randomUUID } from \"node:crypto\";\r\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\r\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\r\nimport {\r\n loadConfig,\r\n writesEnabled,\r\n MCP_SERVICE_NAME,\r\n MCP_SERVICE_VERSION,\r\n type McpServiceConfig,\r\n} from \"./config.js\";\r\nimport { extractBearer } from \"./auth.js\";\r\nimport { createMcpServer, requestAuth } from \"./server.js\";\r\n\r\nexport function createHttpApp(cfg: McpServiceConfig = loadConfig()) {\r\n const app = express();\r\n app.use(express.json({ limit: \"1mb\" }));\r\n\r\n app.use(\r\n cors({\r\n origin(origin, cb) {\r\n if (!origin) return cb(null, true);\r\n if (cfg.corsOrigins.length === 0) return cb(null, false);\r\n if (cfg.corsOrigins.includes(origin)) return cb(null, true);\r\n return cb(null, false);\r\n },\r\n credentials: true,\r\n }),\r\n );\r\n\r\n app.get(\"/health\", (_req, res) => {\r\n res.json({\r\n status: \"ok\",\r\n service: MCP_SERVICE_NAME,\r\n version: MCP_SERVICE_VERSION,\r\n publicMcpUrl: cfg.publicMcpUrl,\r\n chainId: cfg.chainId,\r\n contractAddress: cfg.contractAddress,\r\n writesEnabled: writesEnabled(cfg),\r\n sealed: \"AES-256-GCM (not FHE)\",\r\n settlement: \"Robinhood Chain testnet 46630\",\r\n });\r\n });\r\n\r\n // Stateless Streamable HTTP — paste URL into Claude / Cursor (POST /mcp)\r\n app.post(\"/mcp\", async (req: Request, res: Response) => {\r\n const bearer = extractBearer(req);\r\n await requestAuth.run({ bearer }, async () => {\r\n try {\r\n const server = createMcpServer(cfg);\r\n const transport = new StreamableHTTPServerTransport({\r\n sessionIdGenerator: undefined,\r\n });\r\n await server.connect(transport);\r\n await transport.handleRequest(req, res, req.body);\r\n res.on(\"close\", () => {\r\n void transport.close();\r\n void server.close();\r\n });\r\n } catch (err) {\r\n console.error(\"[veyanet/mcp] POST /mcp\", err);\r\n if (!res.headersSent) {\r\n res.status(500).json({\r\n jsonrpc: \"2.0\",\r\n error: { code: -32603, message: \"Internal server error\" },\r\n id: null,\r\n });\r\n }\r\n }\r\n });\r\n });\r\n\r\n // Optional stateful path for clients that send MCP-Session-Id\r\n const sessions = new Map<string, StreamableHTTPServerTransport>();\r\n\r\n app.post(\"/mcp/session\", async (req: Request, res: Response) => {\r\n const bearer = extractBearer(req);\r\n await requestAuth.run({ bearer }, async () => {\r\n try {\r\n const sessionId = req.header(\"mcp-session-id\") || undefined;\r\n if (sessionId && sessions.has(sessionId)) {\r\n await sessions.get(sessionId)!.handleRequest(req, res, req.body);\r\n return;\r\n }\r\n if (!sessionId && isInitializeRequest(req.body)) {\r\n const transport = new StreamableHTTPServerTransport({\r\n sessionIdGenerator: () => randomUUID(),\r\n onsessioninitialized: (id) => {\r\n sessions.set(id, transport);\r\n },\r\n });\r\n transport.onclose = () => {\r\n if (transport.sessionId) sessions.delete(transport.sessionId);\r\n };\r\n const server = createMcpServer(cfg);\r\n await server.connect(transport);\r\n await transport.handleRequest(req, res, req.body);\r\n return;\r\n }\r\n res.status(400).json({\r\n jsonrpc: \"2.0\",\r\n error: { code: -32000, message: \"No valid MCP session\" },\r\n id: null,\r\n });\r\n } catch (err) {\r\n console.error(\"[veyanet/mcp] POST /mcp/session\", err);\r\n if (!res.headersSent) {\r\n res.status(500).json({\r\n jsonrpc: \"2.0\",\r\n error: { code: -32603, message: \"Internal server error\" },\r\n id: null,\r\n });\r\n }\r\n }\r\n });\r\n });\r\n\r\n app.get(\"/\", (_req, res) => {\r\n res.type(\"html\").send(`<!doctype html>\r\n<html><head><meta charset=\"utf-8\"/><title>VEYA MCP</title></head>\r\n<body style=\"font-family:system-ui;max-width:40rem;margin:2rem auto;line-height:1.5\">\r\n <h1>VEYA MCP</h1>\r\n <p>Paste this URL into Claude / Cursor (Streamable HTTP):</p>\r\n <pre>${cfg.publicMcpUrl}</pre>\r\n <p>Local: <code>POST http://127.0.0.1:${cfg.port}/mcp</code></p>\r\n <p>Health: <a href=\"/health\">/health</a></p>\r\n <p>Settlement: Robinhood testnet <strong>46630</strong> · Sealed = AES-256-GCM (not FHE) · Not mainnet.</p>\r\n <p>Local stdio MCP for operators: <code>veya-anchor/packages/mcp</code></p>\r\n</body></html>`);\r\n });\r\n\r\n return app;\r\n}\r\n\r\nexport function startHttpServer(cfg: McpServiceConfig = loadConfig()) {\r\n const app = createHttpApp(cfg);\r\n return app.listen(cfg.port, cfg.host, () => {\r\n console.log(`[veyanet/mcp] listening on http://${cfg.host}:${cfg.port}`);\r\n console.log(`[veyanet/mcp] MCP POST ${cfg.publicMcpUrl} (local /mcp)`);\r\n console.log(`[veyanet/mcp] writesEnabled=${writesEnabled(cfg)}`);\r\n });\r\n}\r\n","export type McpServiceConfig = {\r\n port: number;\r\n host: string;\r\n publicMcpUrl: string;\r\n chainId: number;\r\n rpcUrl: string;\r\n explorerUrl: string;\r\n contractAddress: string;\r\n apiUrl: string;\r\n mcpApiKey: string | null;\r\n relayerPrivateKey: string | null;\r\n corsOrigins: string[];\r\n nodeEnv: string;\r\n};\r\n\r\nexport const MCP_SERVICE_NAME = \"@veyanet/mcp\";\r\nexport const MCP_SERVICE_VERSION = \"1.0.0\";\r\n\r\nexport function loadConfig(): McpServiceConfig {\r\n const mcpApiKey = process.env.MCP_API_KEY?.trim() || null;\r\n const relayer =\r\n process.env.VEYA_RELAYER_PRIVATE_KEY?.trim() ||\r\n process.env.VEYA_DEPLOYER_PRIVATE_KEY?.trim() ||\r\n null;\r\n\r\n return {\r\n port: Number(process.env.PORT || 8788),\r\n host: process.env.HOST || \"0.0.0.0\",\r\n publicMcpUrl: (process.env.PUBLIC_MCP_URL || \"https://mcp.veyanet.tech/mcp\").replace(/\\/$/, \"\"),\r\n chainId: Number(process.env.ROBINHOOD_CHAIN_ID || 46630),\r\n rpcUrl: process.env.ROBINHOOD_RPC_URL || \"https://rpc.testnet.chain.robinhood.com\",\r\n explorerUrl:\r\n process.env.ROBINHOOD_EXPLORER_URL || \"https://explorer.testnet.chain.robinhood.com\",\r\n contractAddress:\r\n process.env.VEYA_CONTRACT_ADDRESS || \"0x1a1Dc3c55550FCE9F70ef6cDEeF967c0b72a5d84\",\r\n apiUrl: (process.env.VEYA_API_URL || \"https://api.veyanet.tech\").replace(/\\/$/, \"\"),\r\n mcpApiKey,\r\n relayerPrivateKey: relayer,\r\n corsOrigins: (process.env.CORS_ORIGIN || \"\")\r\n .split(\",\")\r\n .map((s) => s.trim())\r\n .filter(Boolean),\r\n nodeEnv: process.env.NODE_ENV || \"development\",\r\n };\r\n}\r\n\r\nexport function writesEnabled(cfg: McpServiceConfig): boolean {\r\n return Boolean(cfg.mcpApiKey && cfg.relayerPrivateKey);\r\n}\r\n","import type { Request } from \"express\";\r\nimport type { McpServiceConfig } from \"./config.js\";\r\n\r\nexport function extractBearer(req: Request): string | null {\r\n const h = req.header(\"authorization\") || req.header(\"Authorization\");\r\n if (!h) return null;\r\n const m = /^Bearer\\s+(.+)$/i.exec(h.trim());\r\n return m?.[1]?.trim() || null;\r\n}\r\n\r\n/** Write tools require MCP_API_KEY match. Fail closed if key unset. */\r\nexport function assertWriteAuthorized(cfg: McpServiceConfig, bearer: string | null): void {\r\n if (!cfg.mcpApiKey) {\r\n throw new Error(\r\n \"Write tools disabled on this server (set MCP_API_KEY + VEYA_RELAYER_PRIVATE_KEY)\",\r\n );\r\n }\r\n if (!bearer || bearer !== cfg.mcpApiKey) {\r\n throw new Error(\"Unauthorized: provide Authorization: Bearer <MCP_API_KEY>\");\r\n }\r\n if (!cfg.relayerPrivateKey) {\r\n throw new Error(\"Write tools disabled: VEYA_RELAYER_PRIVATE_KEY not configured\");\r\n }\r\n}\r\n","import { AsyncLocalStorage } from \"node:async_hooks\";\r\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\r\nimport {\r\n MCP_SERVICE_NAME,\r\n MCP_SERVICE_VERSION,\r\n type McpServiceConfig,\r\n} from \"./config.js\";\r\nimport { registerPublicTools } from \"./tools/public.js\";\r\nimport { registerWriteTools } from \"./tools/write.js\";\r\n\r\nexport const requestAuth = new AsyncLocalStorage<{ bearer: string | null }>();\r\n\r\nexport function createMcpServer(cfg: McpServiceConfig): McpServer {\r\n const server = new McpServer({\r\n name: MCP_SERVICE_NAME,\r\n version: MCP_SERVICE_VERSION,\r\n });\r\n\r\n registerPublicTools(server, cfg);\r\n registerWriteTools(server, cfg, () => requestAuth.getStore()?.bearer ?? null);\r\n\r\n return server;\r\n}\r\n","import { z } from \"zod\";\r\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\r\nimport { MCP_SERVICE_NAME, MCP_SERVICE_VERSION, type McpServiceConfig } from \"../config.js\";\r\nimport { createReadClient } from \"../sdk.js\";\r\n\r\nexport function registerPublicTools(server: McpServer, cfg: McpServiceConfig): void {\r\n server.tool(\r\n \"veya_describe\",\r\n \"Honesty card: what this MCP is (AES sealed elsewhere, testnet 46630, not FHE/mainnet)\",\r\n {},\r\n async () => ({\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify(\r\n {\r\n name: MCP_SERVICE_NAME,\r\n version: MCP_SERVICE_VERSION,\r\n publicUrl: cfg.publicMcpUrl,\r\n settlement: {\r\n network: \"Robinhood Chain testnet\",\r\n chainId: cfg.chainId,\r\n contract: cfg.contractAddress,\r\n explorer: cfg.explorerUrl,\r\n rpc: cfg.rpcUrl,\r\n },\r\n productApi: cfg.apiUrl,\r\n sealed: \"AES-256-GCM sealed-node (not FHE; TFHE is Phase 4)\",\r\n mainnet: \"Not a VEYA settlement claim (Phase 3)\",\r\n writes: \"Require Authorization: Bearer <MCP_API_KEY> when enabled on the server\",\r\n stdioSibling: \"Local stdio MCP remains at veya-anchor/packages/mcp (operators)\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n },\r\n ],\r\n }),\r\n );\r\n\r\n server.tool(\r\n \"veya_ping_chain\",\r\n \"Ping Robinhood Chain RPC — chain id, block, contract\",\r\n {},\r\n async () => {\r\n const client = createReadClient(cfg);\r\n const ping = await client.pingChain();\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify(\r\n {\r\n ...ping,\r\n chainId: ping.chainId.toString(),\r\n expectedChainId: cfg.chainId,\r\n config: client.describe(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n },\r\n ],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n \"veya_hash_blake3\",\r\n \"Compute BLAKE3 hex digest (commitment helper)\",\r\n { data: z.string().min(1) },\r\n async ({ data }) => {\r\n const client = createReadClient(cfg);\r\n const hash = await client.hashBlake3(data);\r\n return {\r\n content: [{ type: \"text\", text: JSON.stringify({ hash }, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n \"veya_verify_transaction\",\r\n \"Verify a Veya.sol commitment from a Robinhood Chain tx hash\",\r\n { txHash: z.string().min(66) },\r\n async ({ txHash }) => {\r\n const client = createReadClient(cfg);\r\n const result = await client.verifyTransaction(txHash);\r\n return {\r\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n \"veya_api_health\",\r\n \"Probe the public VEYA API /health (api.veyanet.tech) — honest degraded when fleet down\",\r\n {},\r\n async () => {\r\n const res = await fetch(`${cfg.apiUrl}/health`, {\r\n signal: AbortSignal.timeout(8000),\r\n });\r\n const body = await res.json().catch(() => ({}));\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify({ httpStatus: res.status, body }, null, 2),\r\n },\r\n ],\r\n };\r\n },\r\n );\r\n}\r\n","import { VeyaClient } from \"@veyanet/sdk\";\r\nimport type { McpServiceConfig } from \"./config.js\";\r\n\r\nexport function createReadClient(cfg: McpServiceConfig): VeyaClient {\r\n return new VeyaClient({\r\n rpcUrl: cfg.rpcUrl,\r\n contractAddress: cfg.contractAddress,\r\n chainId: cfg.chainId,\r\n explorerUrl: cfg.explorerUrl,\r\n });\r\n}\r\n\r\nexport function createWriteClient(cfg: McpServiceConfig): VeyaClient {\r\n if (!cfg.relayerPrivateKey) {\r\n throw new Error(\"VEYA_RELAYER_PRIVATE_KEY required for write tools\");\r\n }\r\n return new VeyaClient({\r\n rpcUrl: cfg.rpcUrl,\r\n contractAddress: cfg.contractAddress,\r\n chainId: cfg.chainId,\r\n explorerUrl: cfg.explorerUrl,\r\n payerPrivateKey: cfg.relayerPrivateKey,\r\n });\r\n}\r\n\r\nexport function parseHexBytes(value: string, expectedLen?: number): Uint8Array {\r\n const hex = value.trim().replace(/^0x/, \"\");\r\n if (!/^[0-9a-fA-F]*$/.test(hex) || hex.length % 2 !== 0) {\r\n throw new Error(\"Expected even-length hex string\");\r\n }\r\n const buf = Buffer.from(hex, \"hex\");\r\n if (expectedLen !== undefined && buf.length !== expectedLen) {\r\n throw new Error(`Expected ${expectedLen} bytes, got ${buf.length}`);\r\n }\r\n return Uint8Array.from(buf);\r\n}\r\n","import { z } from \"zod\";\r\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\r\nimport type { McpServiceConfig } from \"../config.js\";\r\nimport { writesEnabled } from \"../config.js\";\r\nimport { assertWriteAuthorized } from \"../auth.js\";\r\nimport { createWriteClient, parseHexBytes } from \"../sdk.js\";\r\n\r\n/**\r\n * Write tools are registered only when MCP_API_KEY + relayer key exist.\r\n * Callers must still pass Authorization: Bearer on the HTTP request;\r\n * bearer is read from request AsyncLocalStorage.\r\n */\r\nexport function registerWriteTools(\r\n server: McpServer,\r\n cfg: McpServiceConfig,\r\n getBearer: () => string | null,\r\n): void {\r\n if (!writesEnabled(cfg)) {\r\n server.tool(\r\n \"veya_writes_status\",\r\n \"Reports that on-chain write tools are disabled on this server\",\r\n {},\r\n async () => ({\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify({\r\n writesEnabled: false,\r\n reason: \"Set MCP_API_KEY and VEYA_RELAYER_PRIVATE_KEY to enable write tools\",\r\n }),\r\n },\r\n ],\r\n }),\r\n );\r\n return;\r\n }\r\n\r\n function requireAuth(): void {\r\n assertWriteAuthorized(cfg, getBearer());\r\n }\r\n\r\n server.tool(\r\n \"veya_store_commitment\",\r\n \"Write a 32-byte commitment to Veya.sol (requires MCP_API_KEY). Use content Use stamps prefer product-site + API.\",\r\n {\r\n environmentUuidHex: z.string().min(32),\r\n commitmentHex: z.string().min(64),\r\n },\r\n async ({ environmentUuidHex, commitmentHex }) => {\r\n requireAuth();\r\n const client = createWriteClient(cfg);\r\n const txHash = await client.requireEvm().storeCommitment(\r\n parseHexBytes(environmentUuidHex, 16),\r\n parseHexBytes(commitmentHex, 32),\r\n );\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify({ txHash, explorer: client.explorerFor(txHash) }, null, 2),\r\n },\r\n ],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n \"veya_attest_execution\",\r\n \"attestExecution on Veya.sol with ML-DSA bytes (requires MCP_API_KEY)\",\r\n {\r\n environmentUuidHex: z.string().min(32),\r\n blake3HashHex: z.string().min(64),\r\n mldsaSigHex: z.string().min(8),\r\n },\r\n async ({ environmentUuidHex, blake3HashHex, mldsaSigHex }) => {\r\n requireAuth();\r\n const client = createWriteClient(cfg);\r\n const txHash = await client.requireEvm().attestExecution(\r\n parseHexBytes(environmentUuidHex, 16),\r\n parseHexBytes(blake3HashHex, 32),\r\n parseHexBytes(mldsaSigHex),\r\n );\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify({ txHash, explorer: client.explorerFor(txHash) }, null, 2),\r\n },\r\n ],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n \"veya_register_environment\",\r\n \"registerEnvironment on Veya.sol (requires MCP_API_KEY)\",\r\n {\r\n environmentUuidHex: z.string().min(32),\r\n pqPubkeyHashHex: z.string().min(64),\r\n envType: z.number().int().min(0).max(10).default(0),\r\n },\r\n async ({ environmentUuidHex, pqPubkeyHashHex, envType }) => {\r\n requireAuth();\r\n const client = createWriteClient(cfg);\r\n const txHash = await client.requireEvm().registerEnvironment(\r\n parseHexBytes(environmentUuidHex, 16),\r\n parseHexBytes(pqPubkeyHashHex, 32),\r\n envType,\r\n );\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify({ txHash, explorer: client.explorerFor(txHash) }, null, 2),\r\n },\r\n ],\r\n };\r\n },\r\n );\r\n}\r\n","#!/usr/bin/env node\r\nimport { startHttpServer } from \"./http.js\";\r\nimport { loadConfig } from \"./config.js\";\r\n\r\nconst cfg = loadConfig();\r\nstartHttpServer(cfg);\r\n"],"mappings":"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","names":["cfg","cfg","cfg","cfg","z","cfg","z","cfg","cfg"]}
@@ -0,0 +1,29 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import * as http from 'http';
3
+ import * as express_serve_static_core from 'express-serve-static-core';
4
+
5
+ type McpServiceConfig = {
6
+ port: number;
7
+ host: string;
8
+ publicMcpUrl: string;
9
+ chainId: number;
10
+ rpcUrl: string;
11
+ explorerUrl: string;
12
+ contractAddress: string;
13
+ apiUrl: string;
14
+ mcpApiKey: string | null;
15
+ relayerPrivateKey: string | null;
16
+ corsOrigins: string[];
17
+ nodeEnv: string;
18
+ };
19
+ declare const MCP_SERVICE_NAME = "@veyanet/mcp";
20
+ declare const MCP_SERVICE_VERSION = "1.0.0";
21
+ declare function loadConfig(): McpServiceConfig;
22
+ declare function writesEnabled(cfg: McpServiceConfig): boolean;
23
+
24
+ declare function createMcpServer(cfg: McpServiceConfig): McpServer;
25
+
26
+ declare function createHttpApp(cfg?: McpServiceConfig): express_serve_static_core.Express;
27
+ declare function startHttpServer(cfg?: McpServiceConfig): http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
28
+
29
+ export { MCP_SERVICE_NAME, MCP_SERVICE_VERSION, type McpServiceConfig, createHttpApp, createMcpServer, loadConfig, startHttpServer, writesEnabled };