@secondlayer/mcp 0.3.0 → 0.3.1
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/bin-http.js +5 -5
- package/dist/bin-http.js.map +5 -5
- package/dist/bin.js +5 -5
- package/dist/bin.js.map +5 -5
- package/dist/index.js +5 -5
- package/dist/index.js.map +5 -5
- package/package.json +2 -2
package/dist/bin-http.js
CHANGED
|
@@ -11,7 +11,7 @@ import { fileURLToPath } from "node:url";
|
|
|
11
11
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
12
12
|
|
|
13
13
|
// src/tools/templates.ts
|
|
14
|
-
import { z } from "zod";
|
|
14
|
+
import { z } from "zod/v4";
|
|
15
15
|
import { templates, getTemplateById, getTemplatesByCategory } from "@secondlayer/subgraphs/templates";
|
|
16
16
|
|
|
17
17
|
// src/lib/tool.ts
|
|
@@ -63,7 +63,7 @@ function registerTemplateTools(server) {
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
// src/tools/scaffold.ts
|
|
66
|
-
import { z as z2 } from "zod";
|
|
66
|
+
import { z as z2 } from "zod/v4";
|
|
67
67
|
|
|
68
68
|
// src/lib/scaffold-generate.ts
|
|
69
69
|
function isAbiBuffer(t) {
|
|
@@ -284,7 +284,7 @@ function registerScaffoldTools(server) {
|
|
|
284
284
|
}
|
|
285
285
|
|
|
286
286
|
// src/tools/streams.ts
|
|
287
|
-
import { z as z3 } from "zod";
|
|
287
|
+
import { z as z3 } from "zod/v4";
|
|
288
288
|
|
|
289
289
|
// src/lib/client.ts
|
|
290
290
|
import { SecondLayer } from "@secondlayer/sdk";
|
|
@@ -485,7 +485,7 @@ function registerStreamTools(server) {
|
|
|
485
485
|
}
|
|
486
486
|
|
|
487
487
|
// src/tools/subgraphs.ts
|
|
488
|
-
import { z as z4 } from "zod";
|
|
488
|
+
import { z as z4 } from "zod/v4";
|
|
489
489
|
|
|
490
490
|
// src/lib/bundle.ts
|
|
491
491
|
import esbuild from "esbuild";
|
|
@@ -765,5 +765,5 @@ httpServer.listen(port, () => {
|
|
|
765
765
|
console.error("Warning: SECONDLAYER_MCP_SECRET not set, authentication disabled");
|
|
766
766
|
});
|
|
767
767
|
|
|
768
|
-
//# debugId=
|
|
768
|
+
//# debugId=21D5DE1DFDBB85A364756E2164756E21
|
|
769
769
|
//# sourceMappingURL=bin-http.js.map
|
package/dist/bin-http.js.map
CHANGED
|
@@ -4,19 +4,19 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"#!/usr/bin/env node\nimport { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { createServer } from \"./server.ts\";\n\nconst port = parseInt(process.env.SECONDLAYER_MCP_PORT || \"3100\");\nconst secret = process.env.SECONDLAYER_MCP_SECRET;\nconst sessions = new Map<string, StreamableHTTPServerTransport>();\n\nfunction authenticate(req: IncomingMessage): boolean {\n if (!secret) return true;\n return req.headers.authorization === `Bearer ${secret}`;\n}\n\nconst httpServer = createHttpServer(async (req: IncomingMessage, res: ServerResponse) => {\n // Only handle /mcp endpoint\n const url = new URL(req.url ?? \"/\", `http://localhost:${port}`);\n if (url.pathname !== \"/mcp\") {\n res.writeHead(404).end(JSON.stringify({ error: \"Not found\" }));\n return;\n }\n\n // Auth check\n if (!authenticate(req)) {\n res.writeHead(401).end(JSON.stringify({ error: \"Unauthorized\" }));\n return;\n }\n\n const sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n\n if (req.method === \"POST\") {\n // Read body with 1MB limit\n const MAX_BODY = 1_048_576;\n const chunks: Buffer[] = [];\n let totalSize = 0;\n for await (const chunk of req) {\n totalSize += (chunk as Buffer).length;\n if (totalSize > MAX_BODY) {\n res.writeHead(413).end(JSON.stringify({ error: \"Request body too large\" }));\n return;\n }\n chunks.push(chunk as Buffer);\n }\n let body: any;\n try {\n body = JSON.parse(Buffer.concat(chunks).toString());\n } catch {\n res.writeHead(400).end(JSON.stringify({ error: \"Invalid JSON\" }));\n return;\n }\n\n // Check if this is an initialize request (new session)\n const isInitialize = Array.isArray(body)\n ? body.some((m: { method?: string }) => m.method === \"initialize\")\n : body.method === \"initialize\";\n\n if (isInitialize) {\n // Create new session\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => crypto.randomUUID(),\n });\n const server = createServer();\n await server.connect(transport);\n\n // Store session after handling (sessionId is set after first request)\n await transport.handleRequest(req, res, body);\n\n if (transport.sessionId) {\n sessions.set(transport.sessionId, transport);\n transport.onclose = () => {\n if (transport.sessionId) sessions.delete(transport.sessionId);\n };\n }\n return;\n }\n\n // Existing session\n if (!sessionId || !sessions.has(sessionId)) {\n res.writeHead(400).end(JSON.stringify({ error: \"Invalid or missing session ID\" }));\n return;\n }\n await sessions.get(sessionId)!.handleRequest(req, res, body);\n } else if (req.method === \"GET\") {\n // SSE stream for existing session\n if (!sessionId || !sessions.has(sessionId)) {\n res.writeHead(400).end(JSON.stringify({ error: \"Invalid or missing session ID\" }));\n return;\n }\n await sessions.get(sessionId)!.handleRequest(req, res);\n } else if (req.method === \"DELETE\") {\n // Session teardown\n if (sessionId && sessions.has(sessionId)) {\n const transport = sessions.get(sessionId)!;\n await transport.handleRequest(req, res);\n await transport.close();\n sessions.delete(sessionId);\n } else {\n res.writeHead(400).end(JSON.stringify({ error: \"Invalid or missing session ID\" }));\n }\n } else {\n res.writeHead(405).end(JSON.stringify({ error: \"Method not allowed\" }));\n }\n});\n\nhttpServer.listen(port, () => {\n console.error(`SecondLayer MCP HTTP server listening on port ${port}`);\n if (!secret) console.error(\"Warning: SECONDLAYER_MCP_SECRET not set, authentication disabled\");\n});\n",
|
|
6
6
|
"import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerTemplateTools } from \"./tools/templates.ts\";\nimport { registerScaffoldTools } from \"./tools/scaffold.ts\";\nimport { registerStreamTools } from \"./tools/streams.ts\";\nimport { registerSubgraphTools } from \"./tools/subgraphs.ts\";\nimport { registerAccountTools } from \"./tools/account.ts\";\nimport { registerResources } from \"./resources.ts\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, \"../package.json\"), \"utf-8\"));\n\nexport function createServer(): McpServer {\n const server = new McpServer({\n name: \"secondlayer\",\n version: pkg.version,\n });\n\n registerTemplateTools(server);\n registerScaffoldTools(server);\n registerStreamTools(server);\n registerSubgraphTools(server);\n registerAccountTools(server);\n registerResources(server);\n\n return server;\n}\n",
|
|
7
|
-
"import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { templates, getTemplateById, getTemplatesByCategory } from \"@secondlayer/subgraphs/templates\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nexport function registerTemplateTools(server: McpServer) {\n defineTool<{ category?: string }>(\n server,\n \"templates_list\",\n \"List available subgraph templates. Returns metadata only — use templates_get for full code.\",\n { category: z.enum([\"defi\", \"nft\", \"token\", \"infrastructure\"]).optional().describe(\"Filter by category\") },\n async ({ category }) => {\n const list = category ? getTemplatesByCategory(category) : templates;\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(list.map((t) => ({\n id: t.id,\n name: t.name,\n description: t.description,\n category: t.category,\n })), null, 2),\n }],\n };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"templates_get\",\n \"Get a template's full code and prompt by ID.\",\n { id: z.string().describe(\"Template ID (e.g. 'dex-swaps')\") },\n async ({ id }) => {\n const template = getTemplateById(id);\n if (!template) {\n return { content: [{ type: \"text\", text: `Template \"${id}\" not found. Use templates_list to see available templates.` }], isError: true };\n }\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ id: template.id, name: template.name, description: template.description, category: template.category, code: template.code, prompt: template.prompt }, null, 2),\n }],\n };\n },\n );\n}\n",
|
|
7
|
+
"import { z } from \"zod/v4\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { templates, getTemplateById, getTemplatesByCategory } from \"@secondlayer/subgraphs/templates\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nexport function registerTemplateTools(server: McpServer) {\n defineTool<{ category?: string }>(\n server,\n \"templates_list\",\n \"List available subgraph templates. Returns metadata only — use templates_get for full code.\",\n { category: z.enum([\"defi\", \"nft\", \"token\", \"infrastructure\"]).optional().describe(\"Filter by category\") },\n async ({ category }) => {\n const list = category ? getTemplatesByCategory(category) : templates;\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(list.map((t) => ({\n id: t.id,\n name: t.name,\n description: t.description,\n category: t.category,\n })), null, 2),\n }],\n };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"templates_get\",\n \"Get a template's full code and prompt by ID.\",\n { id: z.string().describe(\"Template ID (e.g. 'dex-swaps')\") },\n async ({ id }) => {\n const template = getTemplateById(id);\n if (!template) {\n return { content: [{ type: \"text\", text: `Template \"${id}\" not found. Use templates_list to see available templates.` }], isError: true };\n }\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ id: template.id, name: template.name, description: template.description, category: template.category, code: template.code, prompt: template.prompt }, null, 2),\n }],\n };\n },\n );\n}\n",
|
|
8
8
|
"import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\ninterface ToolResult {\n content: Array<{ type: \"text\"; text: string }>;\n isError?: boolean;\n}\n\n/**\n * Type-safe wrapper around McpServer.tool() that avoids TS2589.\n *\n * The MCP SDK's Zod-generic `tool()` signature recurses past TypeScript's\n * instantiation depth limit when schemas contain discriminated unions or\n * nested optionals. This helper isolates the boundary cast to one place\n * so tool files stay fully typed via the explicit `T` generic.\n *\n * Schema is typed as Record<string, unknown> to prevent TypeScript from\n * resolving the deeply recursive ZodRawShapeCompat constraint. Zod still\n * validates at runtime.\n */\nexport function defineTool<T>(\n server: McpServer,\n name: string,\n description: string,\n schema: Record<string, unknown>,\n handler: (args: T) => Promise<ToolResult> | ToolResult,\n): void {\n const wrappedHandler = async (args: T): Promise<ToolResult> => {\n try {\n return await handler(args);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const status = err instanceof Error && \"status\" in err ? (err as any).status : 0;\n const type =\n status === 401 ? \"unauthorized\" :\n status === 404 ? \"not_found\" :\n status === 429 ? \"rate_limited\" :\n status >= 500 ? \"server_error\" : \"error\";\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: { type, status, message } }) }],\n isError: true,\n };\n }\n };\n (server.tool as Function)(name, description, schema, wrappedHandler);\n}\n",
|
|
9
|
-
"import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { generateSubgraphCode } from \"../lib/scaffold-generate.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nconst API_BASE = process.env.SECONDLAYER_API_URL || \"https://api.secondlayer.tools\";\n\nasync function fetchAbi(contractId: string): Promise<{ functions: any[]; maps: any[] }> {\n const res = await fetch(`${API_BASE}/api/node/contracts/${contractId}/abi`, {\n signal: AbortSignal.timeout(10_000),\n });\n if (!res.ok) {\n if (res.status === 404) throw new Error(`Contract not found: ${contractId}`);\n throw new Error(`Failed to fetch ABI: HTTP ${res.status}`);\n }\n const abi = await res.json() as Record<string, any>;\n return {\n functions: abi.functions ?? [],\n maps: abi.maps ?? [],\n };\n}\n\nexport function registerScaffoldTools(server: McpServer) {\n defineTool<{ contractId: string; subgraphName?: string }>(\n server,\n \"scaffold_from_contract\",\n \"Generate a subgraph scaffold from a deployed Stacks contract. Fetches the ABI automatically.\",\n {\n contractId: z.string().describe(\"Fully qualified contract ID (e.g. SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01)\"),\n subgraphName: z.string().optional().describe(\"Override the subgraph name (defaults to contract name)\"),\n },\n async ({ contractId, subgraphName }) => {\n const { functions, maps } = await fetchAbi(contractId);\n const code = generateSubgraphCode(contractId, functions, subgraphName, maps);\n return { content: [{ type: \"text\", text: code }] };\n },\n );\n\n defineTool<{ abi: string; contractId: string; subgraphName?: string }>(\n server,\n \"scaffold_from_abi\",\n \"Generate a subgraph scaffold from a provided ABI JSON. Use when you already have the ABI.\",\n {\n abi: z.string().describe(\"ABI JSON string (the full contract ABI object)\"),\n contractId: z.string().describe(\"Fully qualified contract ID\"),\n subgraphName: z.string().optional().describe(\"Override the subgraph name\"),\n },\n async ({ abi, contractId, subgraphName }) => {\n let parsed: Record<string, any>;\n try {\n parsed = JSON.parse(abi);\n } catch {\n return { content: [{ type: \"text\", text: \"Invalid ABI JSON\" }], isError: true };\n }\n const code = generateSubgraphCode(\n contractId,\n parsed.functions ?? [],\n subgraphName,\n parsed.maps ?? [],\n );\n return { content: [{ type: \"text\", text: code }] };\n },\n );\n}\n",
|
|
9
|
+
"import { z } from \"zod/v4\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { generateSubgraphCode } from \"../lib/scaffold-generate.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nconst API_BASE = process.env.SECONDLAYER_API_URL || \"https://api.secondlayer.tools\";\n\nasync function fetchAbi(contractId: string): Promise<{ functions: any[]; maps: any[] }> {\n const res = await fetch(`${API_BASE}/api/node/contracts/${contractId}/abi`, {\n signal: AbortSignal.timeout(10_000),\n });\n if (!res.ok) {\n if (res.status === 404) throw new Error(`Contract not found: ${contractId}`);\n throw new Error(`Failed to fetch ABI: HTTP ${res.status}`);\n }\n const abi = await res.json() as Record<string, any>;\n return {\n functions: abi.functions ?? [],\n maps: abi.maps ?? [],\n };\n}\n\nexport function registerScaffoldTools(server: McpServer) {\n defineTool<{ contractId: string; subgraphName?: string }>(\n server,\n \"scaffold_from_contract\",\n \"Generate a subgraph scaffold from a deployed Stacks contract. Fetches the ABI automatically.\",\n {\n contractId: z.string().describe(\"Fully qualified contract ID (e.g. SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01)\"),\n subgraphName: z.string().optional().describe(\"Override the subgraph name (defaults to contract name)\"),\n },\n async ({ contractId, subgraphName }) => {\n const { functions, maps } = await fetchAbi(contractId);\n const code = generateSubgraphCode(contractId, functions, subgraphName, maps);\n return { content: [{ type: \"text\", text: code }] };\n },\n );\n\n defineTool<{ abi: string; contractId: string; subgraphName?: string }>(\n server,\n \"scaffold_from_abi\",\n \"Generate a subgraph scaffold from a provided ABI JSON. Use when you already have the ABI.\",\n {\n abi: z.string().describe(\"ABI JSON string (the full contract ABI object)\"),\n contractId: z.string().describe(\"Fully qualified contract ID\"),\n subgraphName: z.string().optional().describe(\"Override the subgraph name\"),\n },\n async ({ abi, contractId, subgraphName }) => {\n let parsed: Record<string, any>;\n try {\n parsed = JSON.parse(abi);\n } catch {\n return { content: [{ type: \"text\", text: \"Invalid ABI JSON\" }], isError: true };\n }\n const code = generateSubgraphCode(\n contractId,\n parsed.functions ?? [],\n subgraphName,\n parsed.maps ?? [],\n );\n return { content: [{ type: \"text\", text: code }] };\n },\n );\n}\n",
|
|
10
10
|
"/**\n * Subgraph scaffold generator — copied from apps/web/src/lib/scaffold/generate.ts.\n * Browser-safe, pure string templating, no deps.\n */\n\ntype AbiType = string | Record<string, unknown>;\n\ninterface AbiFunction {\n name: string;\n access: \"public\" | \"read-only\" | \"private\";\n args: ReadonlyArray<{ name: string; type: AbiType }>;\n outputs: AbiType;\n}\n\ninterface AbiMap {\n name: string;\n key: AbiType;\n value: AbiType;\n}\n\ntype ColumnType = \"uint\" | \"int\" | \"principal\" | \"boolean\" | \"text\" | \"jsonb\" | \"serial\";\n\ninterface MappedColumn {\n type: ColumnType;\n nullable: boolean;\n}\n\nfunction isAbiBuffer(t: AbiType): t is { buff: { length: number } } {\n return typeof t === \"object\" && t !== null && \"buff\" in t;\n}\nfunction isAbiStringAscii(t: AbiType): t is { \"string-ascii\": { length: number } } {\n return typeof t === \"object\" && t !== null && \"string-ascii\" in t;\n}\nfunction isAbiStringUtf8(t: AbiType): t is { \"string-utf8\": { length: number } } {\n return typeof t === \"object\" && t !== null && \"string-utf8\" in t;\n}\nfunction isAbiOptional(t: AbiType): t is { optional: AbiType } {\n return typeof t === \"object\" && t !== null && \"optional\" in t;\n}\nfunction isAbiTuple(t: AbiType): t is { tuple: ReadonlyArray<{ name: string; type: AbiType }> } {\n return typeof t === \"object\" && t !== null && \"tuple\" in t;\n}\nfunction isAbiList(t: AbiType): t is { list: { type: AbiType; length: number } } {\n return typeof t === \"object\" && t !== null && \"list\" in t;\n}\nfunction isAbiResponse(t: AbiType): t is { response: { ok: AbiType; error: AbiType } } {\n return typeof t === \"object\" && t !== null && \"response\" in t;\n}\n\nfunction mapType(abiType: AbiType, nullable: boolean): MappedColumn {\n if (typeof abiType === \"string\") {\n switch (abiType) {\n case \"uint128\":\n return { type: \"uint\", nullable };\n case \"int128\":\n return { type: \"int\", nullable };\n case \"principal\":\n case \"trait_reference\":\n return { type: \"principal\", nullable };\n case \"bool\":\n return { type: \"boolean\", nullable };\n default: {\n const s = abiType;\n if (s.includes(\"uint\")) return { type: \"uint\", nullable };\n if (s.includes(\"int\")) return { type: \"int\", nullable };\n if (s.includes(\"string\") || s.includes(\"ascii\") || s.includes(\"utf8\")) {\n return { type: \"text\", nullable };\n }\n if (s.includes(\"buff\")) return { type: \"text\", nullable };\n return { type: \"jsonb\", nullable };\n }\n }\n }\n\n if (isAbiBuffer(abiType)) return { type: \"text\", nullable };\n if (isAbiStringAscii(abiType) || isAbiStringUtf8(abiType)) {\n return { type: \"text\", nullable };\n }\n if (isAbiOptional(abiType)) return mapType((abiType as { optional: AbiType }).optional, true);\n if (isAbiList(abiType) || isAbiTuple(abiType)) return { type: \"jsonb\", nullable };\n if (isAbiResponse(abiType)) {\n return mapType((abiType as { response: { ok: AbiType } }).response.ok, nullable);\n }\n\n return { type: \"jsonb\", nullable };\n}\n\nfunction clarityTypeToSubgraphColumn(abiType: AbiType): MappedColumn {\n return mapType(abiType, false);\n}\n\nfunction toSnake(name: string): string {\n return name.replace(/-/g, \"_\");\n}\n\nfunction toCamel(name: string): string {\n return name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction buildColumns(args: ReadonlyArray<{ name: string; type: AbiType }>): string {\n if (args.length === 0) return \" _placeholder: { type: 'text' }\";\n return args\n .map((arg) => {\n const mapped = clarityTypeToSubgraphColumn(arg.type);\n const nullable = mapped.nullable ? \", nullable: true\" : \"\";\n return ` ${toSnake(arg.name)}: { type: '${mapped.type}'${nullable} }`;\n })\n .join(\",\\n\");\n}\n\nfunction buildInsertCall(tableName: string, args: ReadonlyArray<{ name: string; type: AbiType }>): string {\n if (args.length === 0) {\n return ` ctx.insert('${tableName}', {\\n sender: ctx.tx.sender,\\n });`;\n }\n\n const mappings = args.map((arg) => {\n return ` ${toSnake(arg.name)}: event.${toCamel(arg.name)}`;\n });\n\n return ` ctx.insert('${tableName}', {\\n${mappings.join(\",\\n\")},\\n });`;\n}\n\nexport function generateSubgraphCode(\n contractId: string,\n functions: readonly AbiFunction[],\n subgraphName?: string,\n events?: readonly AbiMap[],\n): string {\n const contractParts = contractId.split(\".\");\n const contractName = contractParts[contractParts.length - 1] ?? contractId;\n const name = subgraphName ?? contractName;\n\n const publicFunctions = functions.filter((f) => f.access === \"public\");\n const hasEvents = events && events.length > 0;\n\n if (publicFunctions.length === 0 && !hasEvents) {\n return `// No public functions or events selected for ${contractId}`;\n }\n\n const tableDefs: string[] = [];\n\n if (hasEvents) {\n for (const ev of events) {\n const tableName = toSnake(ev.name);\n let columns: string;\n if (isAbiTuple(ev.value)) {\n columns = buildColumns(ev.value.tuple);\n } else {\n columns = ` value: { type: '${clarityTypeToSubgraphColumn(ev.value).type}' }`;\n }\n tableDefs.push(` ${tableName}: {\\n columns: {\\n${columns}\\n }\\n }`);\n }\n }\n\n for (const fn of publicFunctions) {\n const tableName = toSnake(fn.name);\n const columns = buildColumns(fn.args);\n tableDefs.push(` ${tableName}: {\\n columns: {\\n${columns}\\n }\\n }`);\n }\n\n const schemaBlock = tableDefs.join(\",\\n\");\n\n const sourceEntries: string[] = [`{ contract: '${contractId}' }`];\n\n const handlerEntries: string[] = [];\n\n if (hasEvents) {\n for (const ev of events) {\n const tableName = toSnake(ev.name);\n let insertCall: string;\n if (isAbiTuple(ev.value)) {\n insertCall = buildInsertCall(tableName, ev.value.tuple);\n } else {\n insertCall = ` ctx.insert('${tableName}', {\\n value: event.value,\\n });`;\n }\n handlerEntries.push(` '${contractId}::${ev.name}': async (event, ctx) => {\\n${insertCall}\\n }`);\n }\n }\n\n for (const fn of publicFunctions) {\n const tableName = toSnake(fn.name);\n const insertCall = buildInsertCall(tableName, fn.args);\n handlerEntries.push(` '${contractId}::${fn.name}': async (event, ctx) => {\\n${insertCall}\\n }`);\n }\n\n const handlersBlock = handlerEntries.join(\",\\n\\n\");\n\n return `import { defineSubgraph } from '@secondlayer/subgraphs';\n\nexport default defineSubgraph({\n name: '${name}',\n sources: [${sourceEntries.join(\", \")}],\n schema: {\n${schemaBlock}\n },\n handlers: {\n${handlersBlock}\n }\n});\n`;\n}\n\nexport type { AbiFunction, AbiMap };\n",
|
|
11
|
-
"import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getClient, apiRequest } from \"../lib/client.ts\";\nimport { formatStreamSummary, formatDeliverySummary, withCap } from \"../lib/format.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\n/** Filter schema — full 13-type discriminated union for MCP JSON Schema generation. */\nconst FilterSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"stx_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), minAmount: z.number().optional(), maxAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_mint\"), recipient: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_burn\"), sender: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_lock\"), lockedAddress: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_mint\"), recipient: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_burn\"), sender: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"nft_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"nft_mint\"), recipient: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"nft_burn\"), sender: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"contract_call\"), contractId: z.string().optional(), functionName: z.string().optional(), caller: z.string().optional() }),\n z.object({ type: z.literal(\"contract_deploy\"), deployer: z.string().optional(), contractName: z.string().optional() }),\n z.object({ type: z.literal(\"print_event\"), contractId: z.string().optional(), topic: z.string().optional(), contains: z.string().optional() }),\n]);\n\ntype Filter = z.infer<typeof FilterSchema>;\n\nexport function registerStreamTools(server: McpServer) {\n defineTool<{ status?: string }>(\n server,\n \"streams_list\",\n \"List all webhook streams. Returns summary fields only.\",\n { status: z.enum([\"active\", \"inactive\", \"paused\", \"failed\"]).optional().describe(\"Filter by status\") },\n async ({ status }) => {\n const { streams } = await getClient().streams.list(status ? { status } : undefined);\n return {\n content: [{ type: \"text\", text: JSON.stringify(streams.map(formatStreamSummary), null, 2) }],\n };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_get\",\n \"Get full details of a stream by ID (accepts UUID prefix).\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n const stream = await getClient().streams.get(id);\n return { content: [{ type: \"text\", text: JSON.stringify(stream, null, 2) }] };\n },\n );\n\n defineTool<{ name: string; endpointUrl: string; filters: Filter[] }>(\n server,\n \"streams_create\",\n \"Create a new webhook stream with filters.\",\n {\n name: z.string().describe(\"Stream name\"),\n endpointUrl: z.string().describe(\"Webhook endpoint URL\"),\n filters: z.array(FilterSchema).min(1).describe(\"Event filters (at least one required)\"),\n },\n async ({ name, endpointUrl, filters }) => {\n const result = await getClient().streams.create({ name, endpointUrl, filters });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ id: result.stream.id, signingSecret: result.signingSecret }, null, 2) }],\n };\n },\n );\n\n defineTool<{ id: string; name?: string; endpointUrl?: string; filters?: Filter[] }>(\n server,\n \"streams_update\",\n \"Update a stream's name, endpoint, or filters.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n name: z.string().optional().describe(\"New name\"),\n endpointUrl: z.string().optional().describe(\"New endpoint URL\"),\n filters: z.array(FilterSchema).min(1).optional().describe(\"New filters\"),\n },\n async ({ id, name, endpointUrl, filters }) => {\n const data: Record<string, unknown> = {};\n if (name !== undefined) data.name = name;\n if (endpointUrl !== undefined) data.endpointUrl = endpointUrl;\n if (filters !== undefined) data.filters = filters;\n const stream = await getClient().streams.update(id, data as any);\n return { content: [{ type: \"text\", text: JSON.stringify(formatStreamSummary(stream), null, 2) }] };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_delete\",\n \"Delete a stream permanently.\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n await getClient().streams.delete(id);\n return { content: [{ type: \"text\", text: `Stream ${id} deleted.` }] };\n },\n );\n\n defineTool<{ id: string; enabled: boolean }>(\n server,\n \"streams_toggle\",\n \"Enable or disable a stream.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n enabled: z.boolean().describe(\"true to enable, false to disable\"),\n },\n async ({ id, enabled }) => {\n const stream = enabled\n ? await getClient().streams.enable(id)\n : await getClient().streams.disable(id);\n return { content: [{ type: \"text\", text: JSON.stringify({ id: stream.id, status: stream.status }, null, 2) }] };\n },\n );\n\n defineTool<{ id: string; limit?: number; status?: string }>(\n server,\n \"streams_deliveries\",\n \"List recent deliveries for a stream (max 25).\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n limit: z.number().max(25).optional().describe(\"Max results (default 25)\"),\n status: z.string().optional().describe(\"Filter by delivery status\"),\n },\n async ({ id, limit, status }) => {\n const { deliveries } = await getClient().streams.listDeliveries(id, { limit: limit ?? 25, status });\n const result = withCap(deliveries.map(formatDeliverySummary), 25);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ confirm?: boolean }>(\n server,\n \"streams_pause_all\",\n \"Pause all active streams. Without confirm: true, returns a preview of streams that would be paused.\",\n {\n confirm: z.boolean().optional().describe(\"Set to true to execute. Omit or false for preview only.\"),\n },\n async ({ confirm }) => {\n if (!confirm) {\n const { streams } = await getClient().streams.list({ status: \"active\" });\n const names = streams.map((s) => s.name);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ preview: true, count: names.length, streams: names }, null, 2),\n }],\n };\n }\n const result = await getClient().streams.pauseAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ paused: result.paused, streams: result.streams.map(formatStreamSummary) }, null, 2),\n }],\n };\n },\n );\n\n defineTool<{ confirm?: boolean }>(\n server,\n \"streams_resume_all\",\n \"Resume all paused streams. Without confirm: true, returns a preview of streams that would be resumed.\",\n {\n confirm: z.boolean().optional().describe(\"Set to true to execute. Omit or false for preview only.\"),\n },\n async ({ confirm }) => {\n if (!confirm) {\n const { streams } = await getClient().streams.list({ status: \"paused\" });\n const names = streams.map((s) => s.name);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ preview: true, count: names.length, streams: names }, null, 2),\n }],\n };\n }\n const result = await getClient().streams.resumeAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ resumed: result.resumed, streams: result.streams.map(formatStreamSummary) }, null, 2),\n }],\n };\n },\n );\n\n defineTool<{ id: string; fromBlock: number; toBlock: number }>(\n server,\n \"streams_replay\",\n \"Replay blocks through a stream, re-delivering events for a block range.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n fromBlock: z.number().describe(\"Start block height (inclusive)\"),\n toBlock: z.number().describe(\"End block height (inclusive)\"),\n },\n async ({ id, fromBlock, toBlock }) => {\n const result = await apiRequest<{ streamId: string; fromBlock: number; toBlock: number; jobCount: number; message: string }>(\n \"POST\", `/api/streams/${id}/replay`, { fromBlock, toBlock },\n );\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_rotate_secret\",\n \"Rotate the signing secret for a stream. Returns the new secret.\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n const result = await getClient().streams.rotateSecret(id);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n}\n",
|
|
11
|
+
"import { z } from \"zod/v4\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getClient, apiRequest } from \"../lib/client.ts\";\nimport { formatStreamSummary, formatDeliverySummary, withCap } from \"../lib/format.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\n/** Filter schema — full 13-type discriminated union for MCP JSON Schema generation. */\nconst FilterSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"stx_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), minAmount: z.number().optional(), maxAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_mint\"), recipient: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_burn\"), sender: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_lock\"), lockedAddress: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_mint\"), recipient: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_burn\"), sender: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"nft_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"nft_mint\"), recipient: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"nft_burn\"), sender: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"contract_call\"), contractId: z.string().optional(), functionName: z.string().optional(), caller: z.string().optional() }),\n z.object({ type: z.literal(\"contract_deploy\"), deployer: z.string().optional(), contractName: z.string().optional() }),\n z.object({ type: z.literal(\"print_event\"), contractId: z.string().optional(), topic: z.string().optional(), contains: z.string().optional() }),\n]);\n\ntype Filter = z.infer<typeof FilterSchema>;\n\nexport function registerStreamTools(server: McpServer) {\n defineTool<{ status?: string }>(\n server,\n \"streams_list\",\n \"List all webhook streams. Returns summary fields only.\",\n { status: z.enum([\"active\", \"inactive\", \"paused\", \"failed\"]).optional().describe(\"Filter by status\") },\n async ({ status }) => {\n const { streams } = await getClient().streams.list(status ? { status } : undefined);\n return {\n content: [{ type: \"text\", text: JSON.stringify(streams.map(formatStreamSummary), null, 2) }],\n };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_get\",\n \"Get full details of a stream by ID (accepts UUID prefix).\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n const stream = await getClient().streams.get(id);\n return { content: [{ type: \"text\", text: JSON.stringify(stream, null, 2) }] };\n },\n );\n\n defineTool<{ name: string; endpointUrl: string; filters: Filter[] }>(\n server,\n \"streams_create\",\n \"Create a new webhook stream with filters.\",\n {\n name: z.string().describe(\"Stream name\"),\n endpointUrl: z.string().describe(\"Webhook endpoint URL\"),\n filters: z.array(FilterSchema).min(1).describe(\"Event filters (at least one required)\"),\n },\n async ({ name, endpointUrl, filters }) => {\n const result = await getClient().streams.create({ name, endpointUrl, filters });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ id: result.stream.id, signingSecret: result.signingSecret }, null, 2) }],\n };\n },\n );\n\n defineTool<{ id: string; name?: string; endpointUrl?: string; filters?: Filter[] }>(\n server,\n \"streams_update\",\n \"Update a stream's name, endpoint, or filters.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n name: z.string().optional().describe(\"New name\"),\n endpointUrl: z.string().optional().describe(\"New endpoint URL\"),\n filters: z.array(FilterSchema).min(1).optional().describe(\"New filters\"),\n },\n async ({ id, name, endpointUrl, filters }) => {\n const data: Record<string, unknown> = {};\n if (name !== undefined) data.name = name;\n if (endpointUrl !== undefined) data.endpointUrl = endpointUrl;\n if (filters !== undefined) data.filters = filters;\n const stream = await getClient().streams.update(id, data as any);\n return { content: [{ type: \"text\", text: JSON.stringify(formatStreamSummary(stream), null, 2) }] };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_delete\",\n \"Delete a stream permanently.\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n await getClient().streams.delete(id);\n return { content: [{ type: \"text\", text: `Stream ${id} deleted.` }] };\n },\n );\n\n defineTool<{ id: string; enabled: boolean }>(\n server,\n \"streams_toggle\",\n \"Enable or disable a stream.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n enabled: z.boolean().describe(\"true to enable, false to disable\"),\n },\n async ({ id, enabled }) => {\n const stream = enabled\n ? await getClient().streams.enable(id)\n : await getClient().streams.disable(id);\n return { content: [{ type: \"text\", text: JSON.stringify({ id: stream.id, status: stream.status }, null, 2) }] };\n },\n );\n\n defineTool<{ id: string; limit?: number; status?: string }>(\n server,\n \"streams_deliveries\",\n \"List recent deliveries for a stream (max 25).\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n limit: z.number().max(25).optional().describe(\"Max results (default 25)\"),\n status: z.string().optional().describe(\"Filter by delivery status\"),\n },\n async ({ id, limit, status }) => {\n const { deliveries } = await getClient().streams.listDeliveries(id, { limit: limit ?? 25, status });\n const result = withCap(deliveries.map(formatDeliverySummary), 25);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ confirm?: boolean }>(\n server,\n \"streams_pause_all\",\n \"Pause all active streams. Without confirm: true, returns a preview of streams that would be paused.\",\n {\n confirm: z.boolean().optional().describe(\"Set to true to execute. Omit or false for preview only.\"),\n },\n async ({ confirm }) => {\n if (!confirm) {\n const { streams } = await getClient().streams.list({ status: \"active\" });\n const names = streams.map((s) => s.name);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ preview: true, count: names.length, streams: names }, null, 2),\n }],\n };\n }\n const result = await getClient().streams.pauseAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ paused: result.paused, streams: result.streams.map(formatStreamSummary) }, null, 2),\n }],\n };\n },\n );\n\n defineTool<{ confirm?: boolean }>(\n server,\n \"streams_resume_all\",\n \"Resume all paused streams. Without confirm: true, returns a preview of streams that would be resumed.\",\n {\n confirm: z.boolean().optional().describe(\"Set to true to execute. Omit or false for preview only.\"),\n },\n async ({ confirm }) => {\n if (!confirm) {\n const { streams } = await getClient().streams.list({ status: \"paused\" });\n const names = streams.map((s) => s.name);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ preview: true, count: names.length, streams: names }, null, 2),\n }],\n };\n }\n const result = await getClient().streams.resumeAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ resumed: result.resumed, streams: result.streams.map(formatStreamSummary) }, null, 2),\n }],\n };\n },\n );\n\n defineTool<{ id: string; fromBlock: number; toBlock: number }>(\n server,\n \"streams_replay\",\n \"Replay blocks through a stream, re-delivering events for a block range.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n fromBlock: z.number().describe(\"Start block height (inclusive)\"),\n toBlock: z.number().describe(\"End block height (inclusive)\"),\n },\n async ({ id, fromBlock, toBlock }) => {\n const result = await apiRequest<{ streamId: string; fromBlock: number; toBlock: number; jobCount: number; message: string }>(\n \"POST\", `/api/streams/${id}/replay`, { fromBlock, toBlock },\n );\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_rotate_secret\",\n \"Rotate the signing secret for a stream. Returns the new secret.\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n const result = await getClient().streams.rotateSecret(id);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n}\n",
|
|
12
12
|
"import { SecondLayer } from \"@secondlayer/sdk\";\n\nlet instance: SecondLayer | null = null;\n\n/** Lazy SDK singleton from SECONDLAYER_API_KEY env var. */\nexport function getClient(): SecondLayer {\n if (!instance) {\n const apiKey = process.env.SECONDLAYER_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"SECONDLAYER_API_KEY environment variable is required. \" +\n \"Get your key at https://app.secondlayer.tools/settings/api-keys\"\n );\n }\n instance = new SecondLayer({ apiKey });\n }\n return instance;\n}\n\n/** Raw fetch helper for API endpoints not covered by the SDK. */\nexport async function apiRequest<T>(method: string, path: string, body?: unknown): Promise<T> {\n const apiKey = process.env.SECONDLAYER_API_KEY;\n if (!apiKey) throw new Error(\"SECONDLAYER_API_KEY required\");\n const baseUrl = process.env.SECONDLAYER_API_URL || \"https://api.secondlayer.tools\";\n const res = await fetch(`${baseUrl}${path}`, {\n method,\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` },\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw Object.assign(new Error(text || `HTTP ${res.status}`), { status: res.status });\n }\n if (res.status === 204) return undefined as T;\n return res.json() as Promise<T>;\n}\n",
|
|
13
13
|
"/** Summarize a stream for list responses. */\nexport function formatStreamSummary(s: {\n id: string;\n name: string;\n status: string;\n endpointUrl: string;\n totalDeliveries: number;\n failedDeliveries: number;\n}) {\n return {\n id: s.id,\n name: s.name,\n status: s.status,\n endpointUrl: s.endpointUrl,\n totalDeliveries: s.totalDeliveries,\n failedDeliveries: s.failedDeliveries,\n };\n}\n\n/** Summarize a subgraph for list responses. */\nexport function formatSubgraphSummary(s: {\n name: string;\n status: string;\n tables: string[] | Record<string, unknown>;\n lastProcessedBlock: number;\n}) {\n return {\n name: s.name,\n status: s.status,\n tables: Array.isArray(s.tables) ? s.tables : Object.keys(s.tables),\n lastProcessedBlock: s.lastProcessedBlock,\n };\n}\n\n/** Summarize delivery for list responses. */\nexport function formatDeliverySummary(d: {\n id: string;\n blockHeight: number;\n status: string;\n statusCode: number | null;\n attempts: number;\n createdAt: string;\n}) {\n return {\n id: d.id,\n blockHeight: d.blockHeight,\n status: d.status,\n statusCode: d.statusCode,\n attempts: d.attempts,\n createdAt: d.createdAt,\n };\n}\n\n/** Cap array length and return truncation metadata. */\nexport function withCap<T>(items: T[], cap: number): { items: T[]; truncated: boolean; total: number } {\n return {\n items: items.slice(0, cap),\n truncated: items.length > cap,\n total: items.length,\n };\n}\n",
|
|
14
|
-
"import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getClient } from \"../lib/client.ts\";\nimport { formatSubgraphSummary, withCap } from \"../lib/format.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\nimport { bundleSubgraphCode } from \"../lib/bundle.ts\";\n\nexport function registerSubgraphTools(server: McpServer) {\n defineTool<Record<string, never>>(\n server,\n \"subgraphs_list\",\n \"List all deployed subgraphs. Returns summary fields only.\",\n {},\n async () => {\n const { data } = await getClient().subgraphs.list();\n return {\n content: [{ type: \"text\", text: JSON.stringify(data.map(formatSubgraphSummary), null, 2) }],\n };\n },\n );\n\n defineTool<{ name: string }>(\n server,\n \"subgraphs_get\",\n \"Get full details of a subgraph including schema, health, and table columns.\",\n { name: z.string().describe(\"Subgraph name\") },\n async ({ name }) => {\n const detail = await getClient().subgraphs.get(name);\n return { content: [{ type: \"text\", text: JSON.stringify(detail, null, 2) }] };\n },\n );\n\n defineTool<{\n name: string; table: string; filters?: Record<string, string>;\n sort?: string; order?: string; limit?: number; offset?: number;\n fields?: string; count?: boolean;\n }>(\n server,\n \"subgraphs_query\",\n \"Query rows from a subgraph table (max 200 rows). Filters support operators: \\\"amount.gte\\\": \\\"1000\\\", \\\"sender.neq\\\": \\\"SP...\\\", \\\"name.like\\\": \\\"%token%\\\". Available operators: eq, neq, gt, gte, lt, lte, like.\",\n {\n name: z.string().describe(\"Subgraph name\"),\n table: z.string().describe(\"Table name\"),\n filters: z.record(z.string(), z.string()).optional().describe(\"Column filters — plain values or with operators (e.g. {\\\"amount.gte\\\": \\\"1000\\\", \\\"sender\\\": \\\"SP...\\\"})\"),\n sort: z.string().optional().describe(\"Column to sort by\"),\n order: z.enum([\"asc\", \"desc\"]).optional().describe(\"Sort order\"),\n limit: z.number().max(200).optional().describe(\"Max rows (default 50, max 200)\"),\n offset: z.number().optional().describe(\"Offset for pagination\"),\n fields: z.string().optional().describe(\"Comma-separated column list to return (e.g. \\\"sender,amount\\\")\"),\n count: z.boolean().optional().describe(\"If true, return row count instead of rows\"),\n },\n async ({ name, table, filters, sort, order, limit, offset, fields, count }) => {\n if (count) {\n const result = await getClient().subgraphs.queryTableCount(name, table, { filters, sort, order });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n }\n const rows = await getClient().subgraphs.queryTable(name, table, {\n filters,\n sort,\n order,\n limit: limit ?? 50,\n offset,\n fields,\n });\n const cap = limit ?? 50;\n const result = withCap(rows as Record<string, unknown>[], cap > 200 ? 200 : cap);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ name: string; fromBlock?: number; toBlock?: number }>(\n server,\n \"subgraphs_reindex\",\n \"Reindex a subgraph from a specific block range.\",\n {\n name: z.string().describe(\"Subgraph name\"),\n fromBlock: z.number().optional().describe(\"Start block (defaults to beginning)\"),\n toBlock: z.number().optional().describe(\"End block (defaults to latest)\"),\n },\n async ({ name, fromBlock, toBlock }) => {\n const result = await getClient().subgraphs.reindex(name, { fromBlock, toBlock });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ name: string }>(\n server,\n \"subgraphs_delete\",\n \"Delete a subgraph permanently.\",\n { name: z.string().describe(\"Subgraph name\") },\n async ({ name }) => {\n const result = await getClient().subgraphs.delete(name);\n return { content: [{ type: \"text\", text: result.message }] };\n },\n );\n\n defineTool<{ code: string; reindex?: boolean }>(\n server,\n \"subgraphs_deploy\",\n \"Deploy a subgraph from TypeScript code. Pass the full defineSubgraph() source — it will be bundled, validated, and deployed.\",\n {\n code: z.string().describe(\"TypeScript source code containing a defineSubgraph() call\"),\n reindex: z.boolean().optional().describe(\"Force reindex on breaking schema change (drops and rebuilds all data)\"),\n },\n async ({ code, reindex }) => {\n const bundled = await bundleSubgraphCode(code);\n const result = await getClient().subgraphs.deploy({\n name: bundled.name,\n version: bundled.version,\n description: bundled.description,\n sources: bundled.sources,\n schema: bundled.schema,\n handlerCode: bundled.handlerCode,\n reindex,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n },\n );\n}\n",
|
|
14
|
+
"import { z } from \"zod/v4\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getClient } from \"../lib/client.ts\";\nimport { formatSubgraphSummary, withCap } from \"../lib/format.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\nimport { bundleSubgraphCode } from \"../lib/bundle.ts\";\n\nexport function registerSubgraphTools(server: McpServer) {\n defineTool<Record<string, never>>(\n server,\n \"subgraphs_list\",\n \"List all deployed subgraphs. Returns summary fields only.\",\n {},\n async () => {\n const { data } = await getClient().subgraphs.list();\n return {\n content: [{ type: \"text\", text: JSON.stringify(data.map(formatSubgraphSummary), null, 2) }],\n };\n },\n );\n\n defineTool<{ name: string }>(\n server,\n \"subgraphs_get\",\n \"Get full details of a subgraph including schema, health, and table columns.\",\n { name: z.string().describe(\"Subgraph name\") },\n async ({ name }) => {\n const detail = await getClient().subgraphs.get(name);\n return { content: [{ type: \"text\", text: JSON.stringify(detail, null, 2) }] };\n },\n );\n\n defineTool<{\n name: string; table: string; filters?: Record<string, string>;\n sort?: string; order?: string; limit?: number; offset?: number;\n fields?: string; count?: boolean;\n }>(\n server,\n \"subgraphs_query\",\n \"Query rows from a subgraph table (max 200 rows). Filters support operators: \\\"amount.gte\\\": \\\"1000\\\", \\\"sender.neq\\\": \\\"SP...\\\", \\\"name.like\\\": \\\"%token%\\\". Available operators: eq, neq, gt, gte, lt, lte, like.\",\n {\n name: z.string().describe(\"Subgraph name\"),\n table: z.string().describe(\"Table name\"),\n filters: z.record(z.string(), z.string()).optional().describe(\"Column filters — plain values or with operators (e.g. {\\\"amount.gte\\\": \\\"1000\\\", \\\"sender\\\": \\\"SP...\\\"})\"),\n sort: z.string().optional().describe(\"Column to sort by\"),\n order: z.enum([\"asc\", \"desc\"]).optional().describe(\"Sort order\"),\n limit: z.number().max(200).optional().describe(\"Max rows (default 50, max 200)\"),\n offset: z.number().optional().describe(\"Offset for pagination\"),\n fields: z.string().optional().describe(\"Comma-separated column list to return (e.g. \\\"sender,amount\\\")\"),\n count: z.boolean().optional().describe(\"If true, return row count instead of rows\"),\n },\n async ({ name, table, filters, sort, order, limit, offset, fields, count }) => {\n if (count) {\n const result = await getClient().subgraphs.queryTableCount(name, table, { filters, sort, order });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n }\n const rows = await getClient().subgraphs.queryTable(name, table, {\n filters,\n sort,\n order,\n limit: limit ?? 50,\n offset,\n fields,\n });\n const cap = limit ?? 50;\n const result = withCap(rows as Record<string, unknown>[], cap > 200 ? 200 : cap);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ name: string; fromBlock?: number; toBlock?: number }>(\n server,\n \"subgraphs_reindex\",\n \"Reindex a subgraph from a specific block range.\",\n {\n name: z.string().describe(\"Subgraph name\"),\n fromBlock: z.number().optional().describe(\"Start block (defaults to beginning)\"),\n toBlock: z.number().optional().describe(\"End block (defaults to latest)\"),\n },\n async ({ name, fromBlock, toBlock }) => {\n const result = await getClient().subgraphs.reindex(name, { fromBlock, toBlock });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ name: string }>(\n server,\n \"subgraphs_delete\",\n \"Delete a subgraph permanently.\",\n { name: z.string().describe(\"Subgraph name\") },\n async ({ name }) => {\n const result = await getClient().subgraphs.delete(name);\n return { content: [{ type: \"text\", text: result.message }] };\n },\n );\n\n defineTool<{ code: string; reindex?: boolean }>(\n server,\n \"subgraphs_deploy\",\n \"Deploy a subgraph from TypeScript code. Pass the full defineSubgraph() source — it will be bundled, validated, and deployed.\",\n {\n code: z.string().describe(\"TypeScript source code containing a defineSubgraph() call\"),\n reindex: z.boolean().optional().describe(\"Force reindex on breaking schema change (drops and rebuilds all data)\"),\n },\n async ({ code, reindex }) => {\n const bundled = await bundleSubgraphCode(code);\n const result = await getClient().subgraphs.deploy({\n name: bundled.name,\n version: bundled.version,\n description: bundled.description,\n sources: bundled.sources,\n schema: bundled.schema,\n handlerCode: bundled.handlerCode,\n reindex,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n },\n );\n}\n",
|
|
15
15
|
"import esbuild from \"esbuild\";\nimport { validateSubgraphDefinition } from \"@secondlayer/subgraphs/validate\";\nimport { sourceKey } from \"@secondlayer/subgraphs\";\n\ninterface BundleResult {\n name: string;\n version?: string;\n description?: string;\n sources: string[];\n schema: Record<string, unknown>;\n handlerCode: string;\n}\n\nexport async function bundleSubgraphCode(code: string): Promise<BundleResult> {\n let result: esbuild.BuildResult;\n try {\n result = await esbuild.build({\n stdin: { contents: code, loader: \"ts\", resolveDir: process.cwd() },\n bundle: true,\n platform: \"node\",\n format: \"esm\",\n external: [\"@secondlayer/subgraphs\"],\n write: false,\n });\n } catch (err: unknown) {\n throw new Error(`Bundle failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n const handlerCode = new TextDecoder().decode(result.outputFiles![0]!.contents);\n\n let mod: Record<string, unknown>;\n try {\n const dataUri = `data:text/javascript;base64,${Buffer.from(handlerCode).toString(\"base64\")}`;\n mod = await import(dataUri);\n } catch (err: unknown) {\n throw new Error(`Module evaluation failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n const def = mod.default ?? mod;\n\n let validated: ReturnType<typeof validateSubgraphDefinition>;\n try {\n validated = validateSubgraphDefinition(def);\n } catch (err: unknown) {\n throw new Error(`Validation failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n return {\n name: validated.name,\n version: validated.version,\n description: validated.description,\n sources: validated.sources.map(sourceKey),\n schema: validated.schema,\n handlerCode,\n };\n}\n",
|
|
16
16
|
"import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { apiRequest } from \"../lib/client.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nexport function registerAccountTools(server: McpServer) {\n defineTool<Record<string, never>>(\n server,\n \"account_whoami\",\n \"Show the authenticated account's email and plan.\",\n {},\n async () => {\n const result = await apiRequest<{ email: string; plan: string }>(\"GET\", \"/api/accounts/me\");\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n}\n",
|
|
17
17
|
"import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { templates } from \"@secondlayer/subgraphs/templates\";\n\nconst FILTERS_REFERENCE = [\n { type: \"stx_transfer\", fields: [\"sender\", \"recipient\", \"minAmount\", \"maxAmount\"] },\n { type: \"stx_mint\", fields: [\"recipient\", \"minAmount\"] },\n { type: \"stx_burn\", fields: [\"sender\", \"minAmount\"] },\n { type: \"stx_lock\", fields: [\"lockedAddress\", \"minAmount\"] },\n { type: \"ft_transfer\", fields: [\"sender\", \"recipient\", \"assetIdentifier\", \"minAmount\"] },\n { type: \"ft_mint\", fields: [\"recipient\", \"assetIdentifier\", \"minAmount\"] },\n { type: \"ft_burn\", fields: [\"sender\", \"assetIdentifier\", \"minAmount\"] },\n { type: \"nft_transfer\", fields: [\"sender\", \"recipient\", \"assetIdentifier\", \"tokenId\"] },\n { type: \"nft_mint\", fields: [\"recipient\", \"assetIdentifier\", \"tokenId\"] },\n { type: \"nft_burn\", fields: [\"sender\", \"assetIdentifier\", \"tokenId\"] },\n { type: \"contract_call\", fields: [\"contractId\", \"functionName\", \"caller\"] },\n { type: \"contract_deploy\", fields: [\"deployer\", \"contractName\"] },\n { type: \"print_event\", fields: [\"contractId\", \"topic\", \"contains\"] },\n];\n\nconst COLUMN_TYPES = [\n { type: \"uint\", sqlType: \"bigint\", description: \"Unsigned integer (Clarity uint)\" },\n { type: \"int\", sqlType: \"bigint\", description: \"Signed integer (Clarity int)\" },\n { type: \"text\", sqlType: \"text\", description: \"UTF-8 string\" },\n { type: \"principal\", sqlType: \"text\", description: \"Stacks address (standard or contract)\" },\n { type: \"bool\", sqlType: \"boolean\", description: \"Boolean value\" },\n { type: \"json\", sqlType: \"jsonb\", description: \"Arbitrary JSON data\" },\n {\n options: [\"nullable\", \"indexed\", \"search\"],\n description: \"Column options: nullable allows NULL, indexed creates a B-tree index, search enables full-text search\",\n },\n];\n\nexport function registerResources(server: McpServer) {\n server.resource(\n \"filters\",\n \"secondlayer://filters\",\n { description: \"Stream filter types and their available fields\" },\n async () => ({\n contents: [{\n uri: \"secondlayer://filters\",\n mimeType: \"application/json\",\n text: JSON.stringify(FILTERS_REFERENCE, null, 2),\n }],\n }),\n );\n\n server.resource(\n \"column-types\",\n \"secondlayer://column-types\",\n { description: \"Subgraph column types, SQL mappings, and options\" },\n async () => ({\n contents: [{\n uri: \"secondlayer://column-types\",\n mimeType: \"application/json\",\n text: JSON.stringify(COLUMN_TYPES, null, 2),\n }],\n }),\n );\n\n server.resource(\n \"templates\",\n \"secondlayer://templates\",\n { description: \"Available subgraph templates with descriptions and categories\" },\n async () => ({\n contents: [{\n uri: \"secondlayer://templates\",\n mimeType: \"application/json\",\n text: JSON.stringify(\n templates.map(({ id, name, description, category }) => ({ id, name, description, category })),\n null,\n 2,\n ),\n }],\n }),\n );\n}\n"
|
|
18
18
|
],
|
|
19
19
|
"mappings": ";;;AACA,yBAAS;AACT;;;ACFA;AACA;AACA;AACA;;;ACHA;AAEA;;;ACiBO,SAAS,UAAa,CAC3B,QACA,MACA,aACA,QACA,SACM;AAAA,EACN,MAAM,iBAAiB,OAAO,SAAiC;AAAA,IAC7D,IAAI;AAAA,MACF,OAAO,MAAM,QAAQ,IAAI;AAAA,MACzB,OAAO,KAAc;AAAA,MACrB,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC/D,MAAM,SAAS,eAAe,SAAS,YAAY,MAAO,IAAY,SAAS;AAAA,MAC/E,MAAM,OACJ,WAAW,MAAM,iBACjB,WAAW,MAAM,cACjB,WAAW,MAAM,iBACjB,UAAU,MAAM,iBAAiB;AAAA,MACnC,OAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,EAAE,MAAM,QAAQ,QAAQ,EAAE,CAAC,EAAE,CAAC;AAAA,QACtF,SAAS;AAAA,MACX;AAAA;AAAA;AAAA,EAGH,OAAO,KAAkB,MAAM,aAAa,QAAQ,cAAc;AAAA;;;ADtC9D,SAAS,qBAAqB,CAAC,QAAmB;AAAA,EACvD,WACE,QACA,kBACA,+FACA,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,OAAO,SAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,SAAS,oBAAoB,EAAE,GACzG,SAAS,eAAe;AAAA,IACtB,MAAM,OAAO,WAAW,uBAAuB,QAAQ,IAAI;AAAA,IAC3D,OAAO;AAAA,MACL,SAAS,CAAC;AAAA,QACR,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,KAAK,IAAI,CAAC,OAAO;AAAA,UACpC,IAAI,EAAE;AAAA,UACN,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,UAAU,EAAE;AAAA,QACd,EAAE,GAAG,MAAM,CAAC;AAAA,MACd,CAAC;AAAA,IACH;AAAA,GAEJ;AAAA,EAEA,WACE,QACA,iBACA,gDACA,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,gCAAgC,EAAE,GAC5D,SAAS,SAAS;AAAA,IAChB,MAAM,WAAW,gBAAgB,EAAE;AAAA,IACnC,IAAI,CAAC,UAAU;AAAA,MACb,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,aAAa,gEAAgE,CAAC,GAAG,SAAS,KAAK;AAAA,IAC1I;AAAA,IACA,OAAO;AAAA,MACL,SAAS,CAAC;AAAA,QACR,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,EAAE,IAAI,SAAS,IAAI,MAAM,SAAS,MAAM,aAAa,SAAS,aAAa,UAAU,SAAS,UAAU,MAAM,SAAS,MAAM,QAAQ,SAAS,OAAO,GAAG,MAAM,CAAC;AAAA,MACtL,CAAC;AAAA,IACH;AAAA,GAEJ;AAAA;;;AE5CF,cAAS;;;AC2BT,SAAS,WAAW,CAAC,GAA+C;AAAA,EAClE,OAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,UAAU;AAAA;AAE1D,SAAS,gBAAgB,CAAC,GAAyD;AAAA,EACjF,OAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,kBAAkB;AAAA;AAElE,SAAS,eAAe,CAAC,GAAwD;AAAA,EAC/E,OAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,iBAAiB;AAAA;AAEjE,SAAS,aAAa,CAAC,GAAwC;AAAA,EAC7D,OAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,cAAc;AAAA;AAE9D,SAAS,UAAU,CAAC,GAA4E;AAAA,EAC9F,OAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,WAAW;AAAA;AAE3D,SAAS,SAAS,CAAC,GAA8D;AAAA,EAC/E,OAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,UAAU;AAAA;AAE1D,SAAS,aAAa,CAAC,GAAgE;AAAA,EACrF,OAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,cAAc;AAAA;AAG9D,SAAS,OAAO,CAAC,SAAkB,UAAiC;AAAA,EAClE,IAAI,OAAO,YAAY,UAAU;AAAA,IAC/B,QAAQ;AAAA,WACD;AAAA,QACH,OAAO,EAAE,MAAM,QAAQ,SAAS;AAAA,WAC7B;AAAA,QACH,OAAO,EAAE,MAAM,OAAO,SAAS;AAAA,WAC5B;AAAA,WACA;AAAA,QACH,OAAO,EAAE,MAAM,aAAa,SAAS;AAAA,WAClC;AAAA,QACH,OAAO,EAAE,MAAM,WAAW,SAAS;AAAA,eAC5B;AAAA,QACP,MAAM,IAAI;AAAA,QACV,IAAI,EAAE,SAAS,MAAM;AAAA,UAAG,OAAO,EAAE,MAAM,QAAQ,SAAS;AAAA,QACxD,IAAI,EAAE,SAAS,KAAK;AAAA,UAAG,OAAO,EAAE,MAAM,OAAO,SAAS;AAAA,QACtD,IAAI,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,OAAO,KAAK,EAAE,SAAS,MAAM,GAAG;AAAA,UACrE,OAAO,EAAE,MAAM,QAAQ,SAAS;AAAA,QAClC;AAAA,QACA,IAAI,EAAE,SAAS,MAAM;AAAA,UAAG,OAAO,EAAE,MAAM,QAAQ,SAAS;AAAA,QACxD,OAAO,EAAE,MAAM,SAAS,SAAS;AAAA,MACnC;AAAA;AAAA,EAEJ;AAAA,EAEA,IAAI,YAAY,OAAO;AAAA,IAAG,OAAO,EAAE,MAAM,QAAQ,SAAS;AAAA,EAC1D,IAAI,iBAAiB,OAAO,KAAK,gBAAgB,OAAO,GAAG;AAAA,IACzD,OAAO,EAAE,MAAM,QAAQ,SAAS;AAAA,EAClC;AAAA,EACA,IAAI,cAAc,OAAO;AAAA,IAAG,OAAO,QAAS,QAAkC,UAAU,IAAI;AAAA,EAC5F,IAAI,UAAU,OAAO,KAAK,WAAW,OAAO;AAAA,IAAG,OAAO,EAAE,MAAM,SAAS,SAAS;AAAA,EAChF,IAAI,cAAc,OAAO,GAAG;AAAA,IAC1B,OAAO,QAAS,QAA0C,SAAS,IAAI,QAAQ;AAAA,EACjF;AAAA,EAEA,OAAO,EAAE,MAAM,SAAS,SAAS;AAAA;AAGnC,SAAS,2BAA2B,CAAC,SAAgC;AAAA,EACnE,OAAO,QAAQ,SAAS,KAAK;AAAA;AAG/B,SAAS,OAAO,CAAC,MAAsB;AAAA,EACrC,OAAO,KAAK,QAAQ,MAAM,GAAG;AAAA;AAG/B,SAAS,OAAO,CAAC,MAAsB;AAAA,EACrC,OAAO,KAAK,QAAQ,aAAa,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AAAA;AAG5D,SAAS,YAAY,CAAC,MAA8D;AAAA,EAClF,IAAI,KAAK,WAAW;AAAA,IAAG,OAAO;AAAA,EAC9B,OAAO,KACJ,IAAI,CAAC,QAAQ;AAAA,IACZ,MAAM,SAAS,4BAA4B,IAAI,IAAI;AAAA,IACnD,MAAM,WAAW,OAAO,WAAW,qBAAqB;AAAA,IACxD,OAAO,WAAW,QAAQ,IAAI,IAAI,eAAe,OAAO,QAAQ;AAAA,GACjE,EACA,KAAK;AAAA,CAAK;AAAA;AAGf,SAAS,eAAe,CAAC,WAAmB,MAA8D;AAAA,EACxG,IAAI,KAAK,WAAW,GAAG;AAAA,IACrB,OAAO,qBAAqB;AAAA;AAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,WAAW,KAAK,IAAI,CAAC,QAAQ;AAAA,IACjC,OAAO,WAAW,QAAQ,IAAI,IAAI,YAAY,QAAQ,IAAI,IAAI;AAAA,GAC/D;AAAA,EAED,OAAO,qBAAqB;AAAA,EAAkB,SAAS,KAAK;AAAA,CAAK;AAAA;AAAA;AAG5D,SAAS,oBAAoB,CAClC,YACA,WACA,cACA,QACQ;AAAA,EACR,MAAM,gBAAgB,WAAW,MAAM,GAAG;AAAA,EAC1C,MAAM,eAAe,cAAc,cAAc,SAAS,MAAM;AAAA,EAChE,MAAM,OAAO,gBAAgB;AAAA,EAE7B,MAAM,kBAAkB,UAAU,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AAAA,EACrE,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,EAE5C,IAAI,gBAAgB,WAAW,KAAK,CAAC,WAAW;AAAA,IAC9C,OAAO,iDAAiD;AAAA,EAC1D;AAAA,EAEA,MAAM,YAAsB,CAAC;AAAA,EAE7B,IAAI,WAAW;AAAA,IACb,WAAW,MAAM,QAAQ;AAAA,MACvB,MAAM,YAAY,QAAQ,GAAG,IAAI;AAAA,MACjC,IAAI;AAAA,MACJ,IAAI,WAAW,GAAG,KAAK,GAAG;AAAA,QACxB,UAAU,aAAa,GAAG,MAAM,KAAK;AAAA,MACvC,EAAO;AAAA,QACL,UAAU,2BAA2B,4BAA4B,GAAG,KAAK,EAAE;AAAA;AAAA,MAE7E,UAAU,KAAK,OAAO;AAAA;AAAA,EAAmC;AAAA;AAAA,MAAyB;AAAA,IACpF;AAAA,EACF;AAAA,EAEA,WAAW,MAAM,iBAAiB;AAAA,IAChC,MAAM,YAAY,QAAQ,GAAG,IAAI;AAAA,IACjC,MAAM,UAAU,aAAa,GAAG,IAAI;AAAA,IACpC,UAAU,KAAK,OAAO;AAAA;AAAA,EAAmC;AAAA;AAAA,MAAyB;AAAA,EACpF;AAAA,EAEA,MAAM,cAAc,UAAU,KAAK;AAAA,CAAK;AAAA,EAExC,MAAM,gBAA0B,CAAC,gBAAgB,eAAe;AAAA,EAEhE,MAAM,iBAA2B,CAAC;AAAA,EAElC,IAAI,WAAW;AAAA,IACb,WAAW,MAAM,QAAQ;AAAA,MACvB,MAAM,YAAY,QAAQ,GAAG,IAAI;AAAA,MACjC,IAAI;AAAA,MACJ,IAAI,WAAW,GAAG,KAAK,GAAG;AAAA,QACxB,aAAa,gBAAgB,WAAW,GAAG,MAAM,KAAK;AAAA,MACxD,EAAO;AAAA,QACL,aAAa,qBAAqB;AAAA;AAAA;AAAA;AAAA,MAEpC,eAAe,KAAK,QAAQ,eAAe,GAAG;AAAA,EAAmC;AAAA,MAAmB;AAAA,IACtG;AAAA,EACF;AAAA,EAEA,WAAW,MAAM,iBAAiB;AAAA,IAChC,MAAM,YAAY,QAAQ,GAAG,IAAI;AAAA,IACjC,MAAM,aAAa,gBAAgB,WAAW,GAAG,IAAI;AAAA,IACrD,eAAe,KAAK,QAAQ,eAAe,GAAG;AAAA,EAAmC;AAAA,MAAmB;AAAA,EACtG;AAAA,EAEA,MAAM,gBAAgB,eAAe,KAAK;AAAA;AAAA,CAAO;AAAA,EAEjD,OAAO;AAAA;AAAA;AAAA,WAGE;AAAA,cACG,cAAc,KAAK,IAAI;AAAA;AAAA,EAEnC;AAAA;AAAA;AAAA,EAGA;AAAA;AAAA;AAAA;AAAA;;;AD/LF,IAAM,WAAW,QAAQ,IAAI,uBAAuB;AAEpD,eAAe,QAAQ,CAAC,YAAgE;AAAA,EACtF,MAAM,MAAM,MAAM,MAAM,GAAG,+BAA+B,kBAAkB;AAAA,IAC1E,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AAAA,EACD,IAAI,CAAC,IAAI,IAAI;AAAA,IACX,IAAI,IAAI,WAAW;AAAA,MAAK,MAAM,IAAI,MAAM,uBAAuB,YAAY;AAAA,IAC3E,MAAM,IAAI,MAAM,6BAA6B,IAAI,QAAQ;AAAA,EAC3D;AAAA,EACA,MAAM,MAAM,MAAM,IAAI,KAAK;AAAA,EAC3B,OAAO;AAAA,IACL,WAAW,IAAI,aAAa,CAAC;AAAA,IAC7B,MAAM,IAAI,QAAQ,CAAC;AAAA,EACrB;AAAA;AAGK,SAAS,qBAAqB,CAAC,QAAmB;AAAA,EACvD,WACE,QACA,0BACA,gGACA;AAAA,IACE,YAAY,GAAE,OAAO,EAAE,SAAS,6FAA6F;AAAA,IAC7H,cAAc,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wDAAwD;AAAA,EACvG,GACA,SAAS,YAAY,mBAAmB;AAAA,IACtC,QAAQ,WAAW,SAAS,MAAM,SAAS,UAAU;AAAA,IACrD,MAAM,OAAO,qBAAqB,YAAY,WAAW,cAAc,IAAI;AAAA,IAC3E,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC,EAAE;AAAA,GAErD;AAAA,EAEA,WACE,QACA,qBACA,6FACA;AAAA,IACE,KAAK,GAAE,OAAO,EAAE,SAAS,gDAAgD;AAAA,IACzE,YAAY,GAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,IAC7D,cAAc,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4BAA4B;AAAA,EAC3E,GACA,SAAS,KAAK,YAAY,mBAAmB;AAAA,IAC3C,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,SAAS,KAAK,MAAM,GAAG;AAAA,MACvB,MAAM;AAAA,MACN,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,mBAAmB,CAAC,GAAG,SAAS,KAAK;AAAA;AAAA,IAEhF,MAAM,OAAO,qBACX,YACA,OAAO,aAAa,CAAC,GACrB,cACA,OAAO,QAAQ,CAAC,CAClB;AAAA,IACA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC,EAAE;AAAA,GAErD;AAAA;;;AE9DF,cAAS;;;ACAT;AAEA,IAAI,WAA+B;AAG5B,SAAS,SAAS,GAAgB;AAAA,EACvC,IAAI,CAAC,UAAU;AAAA,IACb,MAAM,SAAS,QAAQ,IAAI;AAAA,IAC3B,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,IAAI,MACR,2DACA,iEACF;AAAA,IACF;AAAA,IACA,WAAW,IAAI,YAAY,EAAE,OAAO,CAAC;AAAA,EACvC;AAAA,EACA,OAAO;AAAA;AAIT,eAAsB,UAAa,CAAC,QAAgB,MAAc,MAA4B;AAAA,EAC5F,MAAM,SAAS,QAAQ,IAAI;AAAA,EAC3B,IAAI,CAAC;AAAA,IAAQ,MAAM,IAAI,MAAM,8BAA8B;AAAA,EAC3D,MAAM,UAAU,QAAQ,IAAI,uBAAuB;AAAA,EACnD,MAAM,MAAM,MAAM,MAAM,GAAG,UAAU,QAAQ;AAAA,IAC3C;AAAA,IACA,SAAS,EAAE,gBAAgB,oBAAoB,eAAe,UAAU,SAAS;AAAA,IACjF,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EACtC,CAAC;AAAA,EACD,IAAI,CAAC,IAAI,IAAI;AAAA,IACX,MAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,IAC5C,MAAM,OAAO,OAAO,IAAI,MAAM,QAAQ,QAAQ,IAAI,QAAQ,GAAG,EAAE,QAAQ,IAAI,OAAO,CAAC;AAAA,EACrF;AAAA,EACA,IAAI,IAAI,WAAW;AAAA,IAAK;AAAA,EACxB,OAAO,IAAI,KAAK;AAAA;;;ACjCX,SAAS,mBAAmB,CAAC,GAOjC;AAAA,EACD,OAAO;AAAA,IACL,IAAI,EAAE;AAAA,IACN,MAAM,EAAE;AAAA,IACR,QAAQ,EAAE;AAAA,IACV,aAAa,EAAE;AAAA,IACf,iBAAiB,EAAE;AAAA,IACnB,kBAAkB,EAAE;AAAA,EACtB;AAAA;AAIK,SAAS,qBAAqB,CAAC,GAKnC;AAAA,EACD,OAAO;AAAA,IACL,MAAM,EAAE;AAAA,IACR,QAAQ,EAAE;AAAA,IACV,QAAQ,MAAM,QAAQ,EAAE,MAAM,IAAI,EAAE,SAAS,OAAO,KAAK,EAAE,MAAM;AAAA,IACjE,oBAAoB,EAAE;AAAA,EACxB;AAAA;AAIK,SAAS,qBAAqB,CAAC,GAOnC;AAAA,EACD,OAAO;AAAA,IACL,IAAI,EAAE;AAAA,IACN,aAAa,EAAE;AAAA,IACf,QAAQ,EAAE;AAAA,IACV,YAAY,EAAE;AAAA,IACd,UAAU,EAAE;AAAA,IACZ,WAAW,EAAE;AAAA,EACf;AAAA;AAIK,SAAS,OAAU,CAAC,OAAY,KAAgE;AAAA,EACrG,OAAO;AAAA,IACL,OAAO,MAAM,MAAM,GAAG,GAAG;AAAA,IACzB,WAAW,MAAM,SAAS;AAAA,IAC1B,OAAO,MAAM;AAAA,EACf;AAAA;;;AFpDF,IAAM,eAAe,GAAE,mBAAmB,QAAQ;AAAA,EAChD,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,cAAc,GAAG,QAAQ,GAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EACjL,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,UAAU,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EAC5G,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,UAAU,GAAG,QAAQ,GAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EACzG,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,UAAU,GAAG,eAAe,GAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EAChH,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,aAAa,GAAG,QAAQ,GAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,GAAG,iBAAiB,GAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EACtL,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,SAAS,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,GAAG,iBAAiB,GAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EACnJ,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,SAAS,GAAG,QAAQ,GAAE,OAAO,EAAE,SAAS,GAAG,iBAAiB,GAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EAChJ,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,cAAc,GAAG,QAAQ,GAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,GAAG,iBAAiB,GAAE,OAAO,EAAE,SAAS,GAAG,SAAS,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EACrL,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,UAAU,GAAG,WAAW,GAAE,OAAO,EAAE,SAAS,GAAG,iBAAiB,GAAE,OAAO,EAAE,SAAS,GAAG,SAAS,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EAClJ,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,UAAU,GAAG,QAAQ,GAAE,OAAO,EAAE,SAAS,GAAG,iBAAiB,GAAE,OAAO,EAAE,SAAS,GAAG,SAAS,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EAC/I,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,eAAe,GAAG,YAAY,GAAE,OAAO,EAAE,SAAS,GAAG,cAAc,GAAE,OAAO,EAAE,SAAS,GAAG,QAAQ,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EACpJ,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,iBAAiB,GAAG,UAAU,GAAE,OAAO,EAAE,SAAS,GAAG,cAAc,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EACrH,GAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,aAAa,GAAG,YAAY,GAAE,OAAO,EAAE,SAAS,GAAG,OAAO,GAAE,OAAO,EAAE,SAAS,GAAG,UAAU,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAC/I,CAAC;AAIM,SAAS,mBAAmB,CAAC,QAAmB;AAAA,EACrD,WACE,QACA,gBACA,0DACA,EAAE,QAAQ,GAAE,KAAK,CAAC,UAAU,YAAY,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,kBAAkB,EAAE,GACrG,SAAS,aAAa;AAAA,IACpB,QAAQ,YAAY,MAAM,UAAU,EAAE,QAAQ,KAAK,SAAS,EAAE,OAAO,IAAI,SAAS;AAAA,IAClF,OAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,IAAI,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,IAC7F;AAAA,GAEJ;AAAA,EAEA,WACE,QACA,eACA,6DACA,EAAE,IAAI,GAAE,OAAO,EAAE,SAAS,uBAAuB,EAAE,GACnD,SAAS,SAAS;AAAA,IAChB,MAAM,SAAS,MAAM,UAAU,EAAE,QAAQ,IAAI,EAAE;AAAA,IAC/C,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,GAEhF;AAAA,EAEA,WACE,QACA,kBACA,6CACA;AAAA,IACE,MAAM,GAAE,OAAO,EAAE,SAAS,aAAa;AAAA,IACvC,aAAa,GAAE,OAAO,EAAE,SAAS,sBAAsB;AAAA,IACvD,SAAS,GAAE,MAAM,YAAY,EAAE,IAAI,CAAC,EAAE,SAAS,uCAAuC;AAAA,EACxF,GACA,SAAS,MAAM,aAAa,cAAc;AAAA,IACxC,MAAM,SAAS,MAAM,UAAU,EAAE,QAAQ,OAAO,EAAE,MAAM,aAAa,QAAQ,CAAC;AAAA,IAC9E,OAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,IAAI,eAAe,OAAO,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,IAC1H;AAAA,GAEJ;AAAA,EAEA,WACE,QACA,kBACA,iDACA;AAAA,IACE,IAAI,GAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,IAC/C,MAAM,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,UAAU;AAAA,IAC/C,aAAa,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,IAC9D,SAAS,GAAE,MAAM,YAAY,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,aAAa;AAAA,EACzE,GACA,SAAS,IAAI,MAAM,aAAa,cAAc;AAAA,IAC5C,MAAM,OAAgC,CAAC;AAAA,IACvC,IAAI,SAAS;AAAA,MAAW,KAAK,OAAO;AAAA,IACpC,IAAI,gBAAgB;AAAA,MAAW,KAAK,cAAc;AAAA,IAClD,IAAI,YAAY;AAAA,MAAW,KAAK,UAAU;AAAA,IAC1C,MAAM,SAAS,MAAM,UAAU,EAAE,QAAQ,OAAO,IAAI,IAAW;AAAA,IAC/D,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,oBAAoB,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,GAErG;AAAA,EAEA,WACE,QACA,kBACA,gCACA,EAAE,IAAI,GAAE,OAAO,EAAE,SAAS,uBAAuB,EAAE,GACnD,SAAS,SAAS;AAAA,IAChB,MAAM,UAAU,EAAE,QAAQ,OAAO,EAAE;AAAA,IACnC,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,cAAc,CAAC,EAAE;AAAA,GAExE;AAAA,EAEA,WACE,QACA,kBACA,+BACA;AAAA,IACE,IAAI,GAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,IAC/C,SAAS,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,EAClE,GACA,SAAS,IAAI,cAAc;AAAA,IACzB,MAAM,SAAS,UACX,MAAM,UAAU,EAAE,QAAQ,OAAO,EAAE,IACnC,MAAM,UAAU,EAAE,QAAQ,QAAQ,EAAE;AAAA,IACxC,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,IAAI,OAAO,IAAI,QAAQ,OAAO,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,GAElH;AAAA,EAEA,WACE,QACA,sBACA,iDACA;AAAA,IACE,IAAI,GAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,IAC/C,OAAO,GAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,IACxE,QAAQ,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,EACpE,GACA,SAAS,IAAI,OAAO,aAAa;AAAA,IAC/B,QAAQ,eAAe,MAAM,UAAU,EAAE,QAAQ,eAAe,IAAI,EAAE,OAAO,SAAS,IAAI,OAAO,CAAC;AAAA,IAClG,MAAM,SAAS,QAAQ,WAAW,IAAI,qBAAqB,GAAG,EAAE;AAAA,IAChE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,GAEhF;AAAA,EAEA,WACE,QACA,qBACA,uGACA;AAAA,IACE,SAAS,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,yDAAyD;AAAA,EACpG,GACA,SAAS,cAAc;AAAA,IACrB,IAAI,CAAC,SAAS;AAAA,MACZ,QAAQ,YAAY,MAAM,UAAU,EAAE,QAAQ,KAAK,EAAE,QAAQ,SAAS,CAAC;AAAA,MACvE,MAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MACvC,OAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,MAAM;AAAA,UACN,MAAM,KAAK,UAAU,EAAE,SAAS,MAAM,OAAO,MAAM,QAAQ,SAAS,MAAM,GAAG,MAAM,CAAC;AAAA,QACtF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,MAAM,SAAS,MAAM,UAAU,EAAE,QAAQ,SAAS;AAAA,IAClD,OAAO;AAAA,MACL,SAAS,CAAC;AAAA,QACR,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,EAAE,QAAQ,OAAO,QAAQ,SAAS,OAAO,QAAQ,IAAI,mBAAmB,EAAE,GAAG,MAAM,CAAC;AAAA,MAC3G,CAAC;AAAA,IACH;AAAA,GAEJ;AAAA,EAEA,WACE,QACA,sBACA,yGACA;AAAA,IACE,SAAS,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,yDAAyD;AAAA,EACpG,GACA,SAAS,cAAc;AAAA,IACrB,IAAI,CAAC,SAAS;AAAA,MACZ,QAAQ,YAAY,MAAM,UAAU,EAAE,QAAQ,KAAK,EAAE,QAAQ,SAAS,CAAC;AAAA,MACvE,MAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MACvC,OAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,MAAM;AAAA,UACN,MAAM,KAAK,UAAU,EAAE,SAAS,MAAM,OAAO,MAAM,QAAQ,SAAS,MAAM,GAAG,MAAM,CAAC;AAAA,QACtF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,MAAM,SAAS,MAAM,UAAU,EAAE,QAAQ,UAAU;AAAA,IACnD,OAAO;AAAA,MACL,SAAS,CAAC;AAAA,QACR,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,SAAS,SAAS,OAAO,QAAQ,IAAI,mBAAmB,EAAE,GAAG,MAAM,CAAC;AAAA,MAC7G,CAAC;AAAA,IACH;AAAA,GAEJ;AAAA,EAEA,WACE,QACA,kBACA,2EACA;AAAA,IACE,IAAI,GAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,IAC/C,WAAW,GAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,IAC/D,SAAS,GAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,EAC7D,GACA,SAAS,IAAI,WAAW,cAAc;AAAA,IACpC,MAAM,SAAS,MAAM,WACnB,QAAQ,gBAAgB,aAAa,EAAE,WAAW,QAAQ,CAC5D;AAAA,IACA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,GAEhF;AAAA,EAEA,WACE,QACA,yBACA,mEACA,EAAE,IAAI,GAAE,OAAO,EAAE,SAAS,uBAAuB,EAAE,GACnD,SAAS,SAAS;AAAA,IAChB,MAAM,SAAS,MAAM,UAAU,EAAE,QAAQ,aAAa,EAAE;AAAA,IACxD,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,GAEhF;AAAA;;;AGpNF,cAAS;;;ACAT;AACA;AACA;AAWA,eAAsB,kBAAkB,CAAC,MAAqC;AAAA,EAC5E,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,MAAM,QAAQ,MAAM;AAAA,MAC3B,OAAO,EAAE,UAAU,MAAM,QAAQ,MAAM,YAAY,QAAQ,IAAI,EAAE;AAAA,MACjE,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU,CAAC,wBAAwB;AAAA,MACnC,OAAO;AAAA,IACT,CAAC;AAAA,IACD,OAAO,KAAc;AAAA,IACrB,MAAM,IAAI,MAAM,kBAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG;AAAA;AAAA,EAEtF,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,OAAO,YAAa,GAAI,QAAQ;AAAA,EAE7E,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,UAAU,+BAA+B,OAAO,KAAK,WAAW,EAAE,SAAS,QAAQ;AAAA,IACzF,MAAM,MAAa;AAAA,IACnB,OAAO,KAAc;AAAA,IACrB,MAAM,IAAI,MAAM,6BAA6B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG;AAAA;AAAA,EAEjG,MAAM,MAAM,IAAI,WAAW;AAAA,EAE3B,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,YAAY,2BAA2B,GAAG;AAAA,IAC1C,OAAO,KAAc;AAAA,IACrB,MAAM,IAAI,MAAM,sBAAsB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG;AAAA;AAAA,EAG1F,OAAO;AAAA,IACL,MAAM,UAAU;AAAA,IAChB,SAAS,UAAU;AAAA,IACnB,aAAa,UAAU;AAAA,IACvB,SAAS,UAAU,QAAQ,IAAI,SAAS;AAAA,IACxC,QAAQ,UAAU;AAAA,IAClB;AAAA,EACF;AAAA;;;AD7CK,SAAS,qBAAqB,CAAC,QAAmB;AAAA,EACvD,WACE,QACA,kBACA,6DACA,CAAC,GACD,YAAY;AAAA,IACV,QAAQ,SAAS,MAAM,UAAU,EAAE,UAAU,KAAK;AAAA,IAClD,OAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,KAAK,IAAI,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,IAC5F;AAAA,GAEJ;AAAA,EAEA,WACE,QACA,iBACA,+EACA,EAAE,MAAM,GAAE,OAAO,EAAE,SAAS,eAAe,EAAE,GAC7C,SAAS,WAAW;AAAA,IAClB,MAAM,SAAS,MAAM,UAAU,EAAE,UAAU,IAAI,IAAI;AAAA,IACnD,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,GAEhF;AAAA,EAEA,WAKE,QACA,mBACA,0MACA;AAAA,IACE,MAAM,GAAE,OAAO,EAAE,SAAS,eAAe;AAAA,IACzC,OAAO,GAAE,OAAO,EAAE,SAAS,YAAY;AAAA,IACvC,SAAS,GAAE,OAAO,GAAE,OAAO,GAAG,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,kGAAyG;AAAA,IACvK,MAAM,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,IACxD,OAAO,GAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,YAAY;AAAA,IAC/D,OAAO,GAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,IAC/E,QAAQ,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAC9D,QAAQ,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8DAAgE;AAAA,IACvG,OAAO,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACpF,GACA,SAAS,MAAM,OAAO,SAAS,MAAM,OAAO,OAAO,QAAQ,QAAQ,YAAY;AAAA,IAC7E,IAAI,OAAO;AAAA,MACT,MAAM,UAAS,MAAM,UAAU,EAAE,UAAU,gBAAgB,MAAM,OAAO,EAAE,SAAS,MAAM,MAAM,CAAC;AAAA,MAChG,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,SAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,IACA,MAAM,OAAO,MAAM,UAAU,EAAE,UAAU,WAAW,MAAM,OAAO;AAAA,MAC/D;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,SAAS;AAAA,MAChB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACD,MAAM,MAAM,SAAS;AAAA,IACrB,MAAM,SAAS,QAAQ,MAAmC,MAAM,MAAM,MAAM,GAAG;AAAA,IAC/E,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,GAEhF;AAAA,EAEA,WACE,QACA,qBACA,mDACA;AAAA,IACE,MAAM,GAAE,OAAO,EAAE,SAAS,eAAe;AAAA,IACzC,WAAW,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,IAC/E,SAAS,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,EAC1E,GACA,SAAS,MAAM,WAAW,cAAc;AAAA,IACtC,MAAM,SAAS,MAAM,UAAU,EAAE,UAAU,QAAQ,MAAM,EAAE,WAAW,QAAQ,CAAC;AAAA,IAC/E,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,GAEhF;AAAA,EAEA,WACE,QACA,oBACA,kCACA,EAAE,MAAM,GAAE,OAAO,EAAE,SAAS,eAAe,EAAE,GAC7C,SAAS,WAAW;AAAA,IAClB,MAAM,SAAS,MAAM,UAAU,EAAE,UAAU,OAAO,IAAI;AAAA,IACtD,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,QAAQ,CAAC,EAAE;AAAA,GAE/D;AAAA,EAEA,WACE,QACA,oBACA,gIACA;AAAA,IACE,MAAM,GAAE,OAAO,EAAE,SAAS,2DAA2D;AAAA,IACrF,SAAS,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uEAAuE;AAAA,EAClH,GACA,SAAS,MAAM,cAAc;AAAA,IAC3B,MAAM,UAAU,MAAM,mBAAmB,IAAI;AAAA,IAC7C,MAAM,SAAS,MAAM,UAAU,EAAE,UAAU,OAAO;AAAA,MAChD,MAAM,QAAQ;AAAA,MACd,SAAS,QAAQ;AAAA,MACjB,aAAa,QAAQ;AAAA,MACrB,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,aAAa,QAAQ;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,IACD,OAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC;AAAA,IACnE;AAAA,GAEJ;AAAA;;;AEnHK,SAAS,oBAAoB,CAAC,QAAmB;AAAA,EACtD,WACE,QACA,kBACA,oDACA,CAAC,GACD,YAAY;AAAA,IACV,MAAM,SAAS,MAAM,WAA4C,OAAO,kBAAkB;AAAA,IAC1F,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,GAEhF;AAAA;;;ACbF,sBAAS;AAET,IAAM,oBAAoB;AAAA,EACxB,EAAE,MAAM,gBAAgB,QAAQ,CAAC,UAAU,aAAa,aAAa,WAAW,EAAE;AAAA,EAClF,EAAE,MAAM,YAAY,QAAQ,CAAC,aAAa,WAAW,EAAE;AAAA,EACvD,EAAE,MAAM,YAAY,QAAQ,CAAC,UAAU,WAAW,EAAE;AAAA,EACpD,EAAE,MAAM,YAAY,QAAQ,CAAC,iBAAiB,WAAW,EAAE;AAAA,EAC3D,EAAE,MAAM,eAAe,QAAQ,CAAC,UAAU,aAAa,mBAAmB,WAAW,EAAE;AAAA,EACvF,EAAE,MAAM,WAAW,QAAQ,CAAC,aAAa,mBAAmB,WAAW,EAAE;AAAA,EACzE,EAAE,MAAM,WAAW,QAAQ,CAAC,UAAU,mBAAmB,WAAW,EAAE;AAAA,EACtE,EAAE,MAAM,gBAAgB,QAAQ,CAAC,UAAU,aAAa,mBAAmB,SAAS,EAAE;AAAA,EACtF,EAAE,MAAM,YAAY,QAAQ,CAAC,aAAa,mBAAmB,SAAS,EAAE;AAAA,EACxE,EAAE,MAAM,YAAY,QAAQ,CAAC,UAAU,mBAAmB,SAAS,EAAE;AAAA,EACrE,EAAE,MAAM,iBAAiB,QAAQ,CAAC,cAAc,gBAAgB,QAAQ,EAAE;AAAA,EAC1E,EAAE,MAAM,mBAAmB,QAAQ,CAAC,YAAY,cAAc,EAAE;AAAA,EAChE,EAAE,MAAM,eAAe,QAAQ,CAAC,cAAc,SAAS,UAAU,EAAE;AACrE;AAEA,IAAM,eAAe;AAAA,EACnB,EAAE,MAAM,QAAQ,SAAS,UAAU,aAAa,kCAAkC;AAAA,EAClF,EAAE,MAAM,OAAO,SAAS,UAAU,aAAa,+BAA+B;AAAA,EAC9E,EAAE,MAAM,QAAQ,SAAS,QAAQ,aAAa,eAAe;AAAA,EAC7D,EAAE,MAAM,aAAa,SAAS,QAAQ,aAAa,wCAAwC;AAAA,EAC3F,EAAE,MAAM,QAAQ,SAAS,WAAW,aAAa,gBAAgB;AAAA,EACjE,EAAE,MAAM,QAAQ,SAAS,SAAS,aAAa,sBAAsB;AAAA,EACrE;AAAA,IACE,SAAS,CAAC,YAAY,WAAW,QAAQ;AAAA,IACzC,aAAa;AAAA,EACf;AACF;AAEO,SAAS,iBAAiB,CAAC,QAAmB;AAAA,EACnD,OAAO,SACL,WACA,yBACA,EAAE,aAAa,iDAAiD,GAChE,aAAa;AAAA,IACX,UAAU,CAAC;AAAA,MACT,KAAK;AAAA,MACL,UAAU;AAAA,MACV,MAAM,KAAK,UAAU,mBAAmB,MAAM,CAAC;AAAA,IACjD,CAAC;AAAA,EACH,EACF;AAAA,EAEA,OAAO,SACL,gBACA,8BACA,EAAE,aAAa,mDAAmD,GAClE,aAAa;AAAA,IACX,UAAU,CAAC;AAAA,MACT,KAAK;AAAA,MACL,UAAU;AAAA,MACV,MAAM,KAAK,UAAU,cAAc,MAAM,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH,EACF;AAAA,EAEA,OAAO,SACL,aACA,2BACA,EAAE,aAAa,gEAAgE,GAC/E,aAAa;AAAA,IACX,UAAU,CAAC;AAAA,MACT,KAAK;AAAA,MACL,UAAU;AAAA,MACV,MAAM,KAAK,UACT,WAAU,IAAI,GAAG,IAAI,MAAM,aAAa,gBAAgB,EAAE,IAAI,MAAM,aAAa,SAAS,EAAE,GAC5F,MACA,CACF;AAAA,IACF,CAAC;AAAA,EACH,EACF;AAAA;;;AX/DF,IAAM,aAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,IAAM,MAAM,KAAK,MAAM,aAAa,KAAK,YAAW,iBAAiB,GAAG,OAAO,CAAC;AAEzE,SAAS,YAAY,GAAc;AAAA,EACxC,MAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS,IAAI;AAAA,EACf,CAAC;AAAA,EAED,sBAAsB,MAAM;AAAA,EAC5B,sBAAsB,MAAM;AAAA,EAC5B,oBAAoB,MAAM;AAAA,EAC1B,sBAAsB,MAAM;AAAA,EAC5B,qBAAqB,MAAM;AAAA,EAC3B,kBAAkB,MAAM;AAAA,EAExB,OAAO;AAAA;;;ADtBT,IAAM,OAAO,SAAS,QAAQ,IAAI,wBAAwB,MAAM;AAChE,IAAM,SAAS,QAAQ,IAAI;AAC3B,IAAM,WAAW,IAAI;AAErB,SAAS,YAAY,CAAC,KAA+B;AAAA,EACnD,IAAI,CAAC;AAAA,IAAQ,OAAO;AAAA,EACpB,OAAO,IAAI,QAAQ,kBAAkB,UAAU;AAAA;AAGjD,IAAM,aAAa,iBAAiB,OAAO,KAAsB,QAAwB;AAAA,EAEvF,MAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,oBAAoB,MAAM;AAAA,EAC9D,IAAI,IAAI,aAAa,QAAQ;AAAA,IAC3B,IAAI,UAAU,GAAG,EAAE,IAAI,KAAK,UAAU,EAAE,OAAO,YAAY,CAAC,CAAC;AAAA,IAC7D;AAAA,EACF;AAAA,EAGA,IAAI,CAAC,aAAa,GAAG,GAAG;AAAA,IACtB,IAAI,UAAU,GAAG,EAAE,IAAI,KAAK,UAAU,EAAE,OAAO,eAAe,CAAC,CAAC;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,IAAI,QAAQ;AAAA,EAE9B,IAAI,IAAI,WAAW,QAAQ;AAAA,IAEzB,MAAM,WAAW;AAAA,IACjB,MAAM,SAAmB,CAAC;AAAA,IAC1B,IAAI,YAAY;AAAA,IAChB,iBAAiB,SAAS,KAAK;AAAA,MAC7B,aAAc,MAAiB;AAAA,MAC/B,IAAI,YAAY,UAAU;AAAA,QACxB,IAAI,UAAU,GAAG,EAAE,IAAI,KAAK,UAAU,EAAE,OAAO,yBAAyB,CAAC,CAAC;AAAA,QAC1E;AAAA,MACF;AAAA,MACA,OAAO,KAAK,KAAe;AAAA,IAC7B;AAAA,IACA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,OAAO,KAAK,MAAM,OAAO,OAAO,MAAM,EAAE,SAAS,CAAC;AAAA,MAClD,MAAM;AAAA,MACN,IAAI,UAAU,GAAG,EAAE,IAAI,KAAK,UAAU,EAAE,OAAO,eAAe,CAAC,CAAC;AAAA,MAChE;AAAA;AAAA,IAIF,MAAM,eAAe,MAAM,QAAQ,IAAI,IACnC,KAAK,KAAK,CAAC,MAA2B,EAAE,WAAW,YAAY,IAC/D,KAAK,WAAW;AAAA,IAEpB,IAAI,cAAc;AAAA,MAEhB,MAAM,YAAY,IAAI,8BAA8B;AAAA,QAClD,oBAAoB,MAAM,OAAO,WAAW;AAAA,MAC9C,CAAC;AAAA,MACD,MAAM,SAAS,aAAa;AAAA,MAC5B,MAAM,OAAO,QAAQ,SAAS;AAAA,MAG9B,MAAM,UAAU,cAAc,KAAK,KAAK,IAAI;AAAA,MAE5C,IAAI,UAAU,WAAW;AAAA,QACvB,SAAS,IAAI,UAAU,WAAW,SAAS;AAAA,QAC3C,UAAU,UAAU,MAAM;AAAA,UACxB,IAAI,UAAU;AAAA,YAAW,SAAS,OAAO,UAAU,SAAS;AAAA;AAAA,MAEhE;AAAA,MACA;AAAA,IACF;AAAA,IAGA,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,SAAS,GAAG;AAAA,MAC1C,IAAI,UAAU,GAAG,EAAE,IAAI,KAAK,UAAU,EAAE,OAAO,gCAAgC,CAAC,CAAC;AAAA,MACjF;AAAA,IACF;AAAA,IACA,MAAM,SAAS,IAAI,SAAS,EAAG,cAAc,KAAK,KAAK,IAAI;AAAA,EAC7D,EAAO,SAAI,IAAI,WAAW,OAAO;AAAA,IAE/B,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,SAAS,GAAG;AAAA,MAC1C,IAAI,UAAU,GAAG,EAAE,IAAI,KAAK,UAAU,EAAE,OAAO,gCAAgC,CAAC,CAAC;AAAA,MACjF;AAAA,IACF;AAAA,IACA,MAAM,SAAS,IAAI,SAAS,EAAG,cAAc,KAAK,GAAG;AAAA,EACvD,EAAO,SAAI,IAAI,WAAW,UAAU;AAAA,IAElC,IAAI,aAAa,SAAS,IAAI,SAAS,GAAG;AAAA,MACxC,MAAM,YAAY,SAAS,IAAI,SAAS;AAAA,MACxC,MAAM,UAAU,cAAc,KAAK,GAAG;AAAA,MACtC,MAAM,UAAU,MAAM;AAAA,MACtB,SAAS,OAAO,SAAS;AAAA,IAC3B,EAAO;AAAA,MACL,IAAI,UAAU,GAAG,EAAE,IAAI,KAAK,UAAU,EAAE,OAAO,gCAAgC,CAAC,CAAC;AAAA;AAAA,EAErF,EAAO;AAAA,IACL,IAAI,UAAU,GAAG,EAAE,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,CAAC,CAAC;AAAA;AAAA,CAEzE;AAED,WAAW,OAAO,MAAM,MAAM;AAAA,EAC5B,QAAQ,MAAM,iDAAiD,MAAM;AAAA,EACrE,IAAI,CAAC;AAAA,IAAQ,QAAQ,MAAM,kEAAkE;AAAA,CAC9F;",
|
|
20
|
-
"debugId": "
|
|
20
|
+
"debugId": "21D5DE1DFDBB85A364756E2164756E21",
|
|
21
21
|
"names": []
|
|
22
22
|
}
|
package/dist/bin.js
CHANGED
|
@@ -10,7 +10,7 @@ import { fileURLToPath } from "node:url";
|
|
|
10
10
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
11
|
|
|
12
12
|
// src/tools/templates.ts
|
|
13
|
-
import { z } from "zod";
|
|
13
|
+
import { z } from "zod/v4";
|
|
14
14
|
import { templates, getTemplateById, getTemplatesByCategory } from "@secondlayer/subgraphs/templates";
|
|
15
15
|
|
|
16
16
|
// src/lib/tool.ts
|
|
@@ -62,7 +62,7 @@ function registerTemplateTools(server) {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
// src/tools/scaffold.ts
|
|
65
|
-
import { z as z2 } from "zod";
|
|
65
|
+
import { z as z2 } from "zod/v4";
|
|
66
66
|
|
|
67
67
|
// src/lib/scaffold-generate.ts
|
|
68
68
|
function isAbiBuffer(t) {
|
|
@@ -283,7 +283,7 @@ function registerScaffoldTools(server) {
|
|
|
283
283
|
}
|
|
284
284
|
|
|
285
285
|
// src/tools/streams.ts
|
|
286
|
-
import { z as z3 } from "zod";
|
|
286
|
+
import { z as z3 } from "zod/v4";
|
|
287
287
|
|
|
288
288
|
// src/lib/client.ts
|
|
289
289
|
import { SecondLayer } from "@secondlayer/sdk";
|
|
@@ -484,7 +484,7 @@ function registerStreamTools(server) {
|
|
|
484
484
|
}
|
|
485
485
|
|
|
486
486
|
// src/tools/subgraphs.ts
|
|
487
|
-
import { z as z4 } from "zod";
|
|
487
|
+
import { z as z4 } from "zod/v4";
|
|
488
488
|
|
|
489
489
|
// src/lib/bundle.ts
|
|
490
490
|
import esbuild from "esbuild";
|
|
@@ -683,5 +683,5 @@ var server = createServer();
|
|
|
683
683
|
var transport = new StdioServerTransport;
|
|
684
684
|
await server.connect(transport);
|
|
685
685
|
|
|
686
|
-
//# debugId=
|
|
686
|
+
//# debugId=F830DB7DED293A7D64756E2164756E21
|
|
687
687
|
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
CHANGED
|
@@ -4,19 +4,19 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"#!/usr/bin/env node\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.ts\";\n\nconst server = createServer();\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n",
|
|
6
6
|
"import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerTemplateTools } from \"./tools/templates.ts\";\nimport { registerScaffoldTools } from \"./tools/scaffold.ts\";\nimport { registerStreamTools } from \"./tools/streams.ts\";\nimport { registerSubgraphTools } from \"./tools/subgraphs.ts\";\nimport { registerAccountTools } from \"./tools/account.ts\";\nimport { registerResources } from \"./resources.ts\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, \"../package.json\"), \"utf-8\"));\n\nexport function createServer(): McpServer {\n const server = new McpServer({\n name: \"secondlayer\",\n version: pkg.version,\n });\n\n registerTemplateTools(server);\n registerScaffoldTools(server);\n registerStreamTools(server);\n registerSubgraphTools(server);\n registerAccountTools(server);\n registerResources(server);\n\n return server;\n}\n",
|
|
7
|
-
"import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { templates, getTemplateById, getTemplatesByCategory } from \"@secondlayer/subgraphs/templates\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nexport function registerTemplateTools(server: McpServer) {\n defineTool<{ category?: string }>(\n server,\n \"templates_list\",\n \"List available subgraph templates. Returns metadata only — use templates_get for full code.\",\n { category: z.enum([\"defi\", \"nft\", \"token\", \"infrastructure\"]).optional().describe(\"Filter by category\") },\n async ({ category }) => {\n const list = category ? getTemplatesByCategory(category) : templates;\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(list.map((t) => ({\n id: t.id,\n name: t.name,\n description: t.description,\n category: t.category,\n })), null, 2),\n }],\n };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"templates_get\",\n \"Get a template's full code and prompt by ID.\",\n { id: z.string().describe(\"Template ID (e.g. 'dex-swaps')\") },\n async ({ id }) => {\n const template = getTemplateById(id);\n if (!template) {\n return { content: [{ type: \"text\", text: `Template \"${id}\" not found. Use templates_list to see available templates.` }], isError: true };\n }\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ id: template.id, name: template.name, description: template.description, category: template.category, code: template.code, prompt: template.prompt }, null, 2),\n }],\n };\n },\n );\n}\n",
|
|
7
|
+
"import { z } from \"zod/v4\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { templates, getTemplateById, getTemplatesByCategory } from \"@secondlayer/subgraphs/templates\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nexport function registerTemplateTools(server: McpServer) {\n defineTool<{ category?: string }>(\n server,\n \"templates_list\",\n \"List available subgraph templates. Returns metadata only — use templates_get for full code.\",\n { category: z.enum([\"defi\", \"nft\", \"token\", \"infrastructure\"]).optional().describe(\"Filter by category\") },\n async ({ category }) => {\n const list = category ? getTemplatesByCategory(category) : templates;\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(list.map((t) => ({\n id: t.id,\n name: t.name,\n description: t.description,\n category: t.category,\n })), null, 2),\n }],\n };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"templates_get\",\n \"Get a template's full code and prompt by ID.\",\n { id: z.string().describe(\"Template ID (e.g. 'dex-swaps')\") },\n async ({ id }) => {\n const template = getTemplateById(id);\n if (!template) {\n return { content: [{ type: \"text\", text: `Template \"${id}\" not found. Use templates_list to see available templates.` }], isError: true };\n }\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ id: template.id, name: template.name, description: template.description, category: template.category, code: template.code, prompt: template.prompt }, null, 2),\n }],\n };\n },\n );\n}\n",
|
|
8
8
|
"import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\ninterface ToolResult {\n content: Array<{ type: \"text\"; text: string }>;\n isError?: boolean;\n}\n\n/**\n * Type-safe wrapper around McpServer.tool() that avoids TS2589.\n *\n * The MCP SDK's Zod-generic `tool()` signature recurses past TypeScript's\n * instantiation depth limit when schemas contain discriminated unions or\n * nested optionals. This helper isolates the boundary cast to one place\n * so tool files stay fully typed via the explicit `T` generic.\n *\n * Schema is typed as Record<string, unknown> to prevent TypeScript from\n * resolving the deeply recursive ZodRawShapeCompat constraint. Zod still\n * validates at runtime.\n */\nexport function defineTool<T>(\n server: McpServer,\n name: string,\n description: string,\n schema: Record<string, unknown>,\n handler: (args: T) => Promise<ToolResult> | ToolResult,\n): void {\n const wrappedHandler = async (args: T): Promise<ToolResult> => {\n try {\n return await handler(args);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const status = err instanceof Error && \"status\" in err ? (err as any).status : 0;\n const type =\n status === 401 ? \"unauthorized\" :\n status === 404 ? \"not_found\" :\n status === 429 ? \"rate_limited\" :\n status >= 500 ? \"server_error\" : \"error\";\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: { type, status, message } }) }],\n isError: true,\n };\n }\n };\n (server.tool as Function)(name, description, schema, wrappedHandler);\n}\n",
|
|
9
|
-
"import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { generateSubgraphCode } from \"../lib/scaffold-generate.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nconst API_BASE = process.env.SECONDLAYER_API_URL || \"https://api.secondlayer.tools\";\n\nasync function fetchAbi(contractId: string): Promise<{ functions: any[]; maps: any[] }> {\n const res = await fetch(`${API_BASE}/api/node/contracts/${contractId}/abi`, {\n signal: AbortSignal.timeout(10_000),\n });\n if (!res.ok) {\n if (res.status === 404) throw new Error(`Contract not found: ${contractId}`);\n throw new Error(`Failed to fetch ABI: HTTP ${res.status}`);\n }\n const abi = await res.json() as Record<string, any>;\n return {\n functions: abi.functions ?? [],\n maps: abi.maps ?? [],\n };\n}\n\nexport function registerScaffoldTools(server: McpServer) {\n defineTool<{ contractId: string; subgraphName?: string }>(\n server,\n \"scaffold_from_contract\",\n \"Generate a subgraph scaffold from a deployed Stacks contract. Fetches the ABI automatically.\",\n {\n contractId: z.string().describe(\"Fully qualified contract ID (e.g. SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01)\"),\n subgraphName: z.string().optional().describe(\"Override the subgraph name (defaults to contract name)\"),\n },\n async ({ contractId, subgraphName }) => {\n const { functions, maps } = await fetchAbi(contractId);\n const code = generateSubgraphCode(contractId, functions, subgraphName, maps);\n return { content: [{ type: \"text\", text: code }] };\n },\n );\n\n defineTool<{ abi: string; contractId: string; subgraphName?: string }>(\n server,\n \"scaffold_from_abi\",\n \"Generate a subgraph scaffold from a provided ABI JSON. Use when you already have the ABI.\",\n {\n abi: z.string().describe(\"ABI JSON string (the full contract ABI object)\"),\n contractId: z.string().describe(\"Fully qualified contract ID\"),\n subgraphName: z.string().optional().describe(\"Override the subgraph name\"),\n },\n async ({ abi, contractId, subgraphName }) => {\n let parsed: Record<string, any>;\n try {\n parsed = JSON.parse(abi);\n } catch {\n return { content: [{ type: \"text\", text: \"Invalid ABI JSON\" }], isError: true };\n }\n const code = generateSubgraphCode(\n contractId,\n parsed.functions ?? [],\n subgraphName,\n parsed.maps ?? [],\n );\n return { content: [{ type: \"text\", text: code }] };\n },\n );\n}\n",
|
|
9
|
+
"import { z } from \"zod/v4\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { generateSubgraphCode } from \"../lib/scaffold-generate.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nconst API_BASE = process.env.SECONDLAYER_API_URL || \"https://api.secondlayer.tools\";\n\nasync function fetchAbi(contractId: string): Promise<{ functions: any[]; maps: any[] }> {\n const res = await fetch(`${API_BASE}/api/node/contracts/${contractId}/abi`, {\n signal: AbortSignal.timeout(10_000),\n });\n if (!res.ok) {\n if (res.status === 404) throw new Error(`Contract not found: ${contractId}`);\n throw new Error(`Failed to fetch ABI: HTTP ${res.status}`);\n }\n const abi = await res.json() as Record<string, any>;\n return {\n functions: abi.functions ?? [],\n maps: abi.maps ?? [],\n };\n}\n\nexport function registerScaffoldTools(server: McpServer) {\n defineTool<{ contractId: string; subgraphName?: string }>(\n server,\n \"scaffold_from_contract\",\n \"Generate a subgraph scaffold from a deployed Stacks contract. Fetches the ABI automatically.\",\n {\n contractId: z.string().describe(\"Fully qualified contract ID (e.g. SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01)\"),\n subgraphName: z.string().optional().describe(\"Override the subgraph name (defaults to contract name)\"),\n },\n async ({ contractId, subgraphName }) => {\n const { functions, maps } = await fetchAbi(contractId);\n const code = generateSubgraphCode(contractId, functions, subgraphName, maps);\n return { content: [{ type: \"text\", text: code }] };\n },\n );\n\n defineTool<{ abi: string; contractId: string; subgraphName?: string }>(\n server,\n \"scaffold_from_abi\",\n \"Generate a subgraph scaffold from a provided ABI JSON. Use when you already have the ABI.\",\n {\n abi: z.string().describe(\"ABI JSON string (the full contract ABI object)\"),\n contractId: z.string().describe(\"Fully qualified contract ID\"),\n subgraphName: z.string().optional().describe(\"Override the subgraph name\"),\n },\n async ({ abi, contractId, subgraphName }) => {\n let parsed: Record<string, any>;\n try {\n parsed = JSON.parse(abi);\n } catch {\n return { content: [{ type: \"text\", text: \"Invalid ABI JSON\" }], isError: true };\n }\n const code = generateSubgraphCode(\n contractId,\n parsed.functions ?? [],\n subgraphName,\n parsed.maps ?? [],\n );\n return { content: [{ type: \"text\", text: code }] };\n },\n );\n}\n",
|
|
10
10
|
"/**\n * Subgraph scaffold generator — copied from apps/web/src/lib/scaffold/generate.ts.\n * Browser-safe, pure string templating, no deps.\n */\n\ntype AbiType = string | Record<string, unknown>;\n\ninterface AbiFunction {\n name: string;\n access: \"public\" | \"read-only\" | \"private\";\n args: ReadonlyArray<{ name: string; type: AbiType }>;\n outputs: AbiType;\n}\n\ninterface AbiMap {\n name: string;\n key: AbiType;\n value: AbiType;\n}\n\ntype ColumnType = \"uint\" | \"int\" | \"principal\" | \"boolean\" | \"text\" | \"jsonb\" | \"serial\";\n\ninterface MappedColumn {\n type: ColumnType;\n nullable: boolean;\n}\n\nfunction isAbiBuffer(t: AbiType): t is { buff: { length: number } } {\n return typeof t === \"object\" && t !== null && \"buff\" in t;\n}\nfunction isAbiStringAscii(t: AbiType): t is { \"string-ascii\": { length: number } } {\n return typeof t === \"object\" && t !== null && \"string-ascii\" in t;\n}\nfunction isAbiStringUtf8(t: AbiType): t is { \"string-utf8\": { length: number } } {\n return typeof t === \"object\" && t !== null && \"string-utf8\" in t;\n}\nfunction isAbiOptional(t: AbiType): t is { optional: AbiType } {\n return typeof t === \"object\" && t !== null && \"optional\" in t;\n}\nfunction isAbiTuple(t: AbiType): t is { tuple: ReadonlyArray<{ name: string; type: AbiType }> } {\n return typeof t === \"object\" && t !== null && \"tuple\" in t;\n}\nfunction isAbiList(t: AbiType): t is { list: { type: AbiType; length: number } } {\n return typeof t === \"object\" && t !== null && \"list\" in t;\n}\nfunction isAbiResponse(t: AbiType): t is { response: { ok: AbiType; error: AbiType } } {\n return typeof t === \"object\" && t !== null && \"response\" in t;\n}\n\nfunction mapType(abiType: AbiType, nullable: boolean): MappedColumn {\n if (typeof abiType === \"string\") {\n switch (abiType) {\n case \"uint128\":\n return { type: \"uint\", nullable };\n case \"int128\":\n return { type: \"int\", nullable };\n case \"principal\":\n case \"trait_reference\":\n return { type: \"principal\", nullable };\n case \"bool\":\n return { type: \"boolean\", nullable };\n default: {\n const s = abiType;\n if (s.includes(\"uint\")) return { type: \"uint\", nullable };\n if (s.includes(\"int\")) return { type: \"int\", nullable };\n if (s.includes(\"string\") || s.includes(\"ascii\") || s.includes(\"utf8\")) {\n return { type: \"text\", nullable };\n }\n if (s.includes(\"buff\")) return { type: \"text\", nullable };\n return { type: \"jsonb\", nullable };\n }\n }\n }\n\n if (isAbiBuffer(abiType)) return { type: \"text\", nullable };\n if (isAbiStringAscii(abiType) || isAbiStringUtf8(abiType)) {\n return { type: \"text\", nullable };\n }\n if (isAbiOptional(abiType)) return mapType((abiType as { optional: AbiType }).optional, true);\n if (isAbiList(abiType) || isAbiTuple(abiType)) return { type: \"jsonb\", nullable };\n if (isAbiResponse(abiType)) {\n return mapType((abiType as { response: { ok: AbiType } }).response.ok, nullable);\n }\n\n return { type: \"jsonb\", nullable };\n}\n\nfunction clarityTypeToSubgraphColumn(abiType: AbiType): MappedColumn {\n return mapType(abiType, false);\n}\n\nfunction toSnake(name: string): string {\n return name.replace(/-/g, \"_\");\n}\n\nfunction toCamel(name: string): string {\n return name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction buildColumns(args: ReadonlyArray<{ name: string; type: AbiType }>): string {\n if (args.length === 0) return \" _placeholder: { type: 'text' }\";\n return args\n .map((arg) => {\n const mapped = clarityTypeToSubgraphColumn(arg.type);\n const nullable = mapped.nullable ? \", nullable: true\" : \"\";\n return ` ${toSnake(arg.name)}: { type: '${mapped.type}'${nullable} }`;\n })\n .join(\",\\n\");\n}\n\nfunction buildInsertCall(tableName: string, args: ReadonlyArray<{ name: string; type: AbiType }>): string {\n if (args.length === 0) {\n return ` ctx.insert('${tableName}', {\\n sender: ctx.tx.sender,\\n });`;\n }\n\n const mappings = args.map((arg) => {\n return ` ${toSnake(arg.name)}: event.${toCamel(arg.name)}`;\n });\n\n return ` ctx.insert('${tableName}', {\\n${mappings.join(\",\\n\")},\\n });`;\n}\n\nexport function generateSubgraphCode(\n contractId: string,\n functions: readonly AbiFunction[],\n subgraphName?: string,\n events?: readonly AbiMap[],\n): string {\n const contractParts = contractId.split(\".\");\n const contractName = contractParts[contractParts.length - 1] ?? contractId;\n const name = subgraphName ?? contractName;\n\n const publicFunctions = functions.filter((f) => f.access === \"public\");\n const hasEvents = events && events.length > 0;\n\n if (publicFunctions.length === 0 && !hasEvents) {\n return `// No public functions or events selected for ${contractId}`;\n }\n\n const tableDefs: string[] = [];\n\n if (hasEvents) {\n for (const ev of events) {\n const tableName = toSnake(ev.name);\n let columns: string;\n if (isAbiTuple(ev.value)) {\n columns = buildColumns(ev.value.tuple);\n } else {\n columns = ` value: { type: '${clarityTypeToSubgraphColumn(ev.value).type}' }`;\n }\n tableDefs.push(` ${tableName}: {\\n columns: {\\n${columns}\\n }\\n }`);\n }\n }\n\n for (const fn of publicFunctions) {\n const tableName = toSnake(fn.name);\n const columns = buildColumns(fn.args);\n tableDefs.push(` ${tableName}: {\\n columns: {\\n${columns}\\n }\\n }`);\n }\n\n const schemaBlock = tableDefs.join(\",\\n\");\n\n const sourceEntries: string[] = [`{ contract: '${contractId}' }`];\n\n const handlerEntries: string[] = [];\n\n if (hasEvents) {\n for (const ev of events) {\n const tableName = toSnake(ev.name);\n let insertCall: string;\n if (isAbiTuple(ev.value)) {\n insertCall = buildInsertCall(tableName, ev.value.tuple);\n } else {\n insertCall = ` ctx.insert('${tableName}', {\\n value: event.value,\\n });`;\n }\n handlerEntries.push(` '${contractId}::${ev.name}': async (event, ctx) => {\\n${insertCall}\\n }`);\n }\n }\n\n for (const fn of publicFunctions) {\n const tableName = toSnake(fn.name);\n const insertCall = buildInsertCall(tableName, fn.args);\n handlerEntries.push(` '${contractId}::${fn.name}': async (event, ctx) => {\\n${insertCall}\\n }`);\n }\n\n const handlersBlock = handlerEntries.join(\",\\n\\n\");\n\n return `import { defineSubgraph } from '@secondlayer/subgraphs';\n\nexport default defineSubgraph({\n name: '${name}',\n sources: [${sourceEntries.join(\", \")}],\n schema: {\n${schemaBlock}\n },\n handlers: {\n${handlersBlock}\n }\n});\n`;\n}\n\nexport type { AbiFunction, AbiMap };\n",
|
|
11
|
-
"import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getClient, apiRequest } from \"../lib/client.ts\";\nimport { formatStreamSummary, formatDeliverySummary, withCap } from \"../lib/format.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\n/** Filter schema — full 13-type discriminated union for MCP JSON Schema generation. */\nconst FilterSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"stx_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), minAmount: z.number().optional(), maxAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_mint\"), recipient: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_burn\"), sender: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_lock\"), lockedAddress: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_mint\"), recipient: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_burn\"), sender: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"nft_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"nft_mint\"), recipient: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"nft_burn\"), sender: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"contract_call\"), contractId: z.string().optional(), functionName: z.string().optional(), caller: z.string().optional() }),\n z.object({ type: z.literal(\"contract_deploy\"), deployer: z.string().optional(), contractName: z.string().optional() }),\n z.object({ type: z.literal(\"print_event\"), contractId: z.string().optional(), topic: z.string().optional(), contains: z.string().optional() }),\n]);\n\ntype Filter = z.infer<typeof FilterSchema>;\n\nexport function registerStreamTools(server: McpServer) {\n defineTool<{ status?: string }>(\n server,\n \"streams_list\",\n \"List all webhook streams. Returns summary fields only.\",\n { status: z.enum([\"active\", \"inactive\", \"paused\", \"failed\"]).optional().describe(\"Filter by status\") },\n async ({ status }) => {\n const { streams } = await getClient().streams.list(status ? { status } : undefined);\n return {\n content: [{ type: \"text\", text: JSON.stringify(streams.map(formatStreamSummary), null, 2) }],\n };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_get\",\n \"Get full details of a stream by ID (accepts UUID prefix).\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n const stream = await getClient().streams.get(id);\n return { content: [{ type: \"text\", text: JSON.stringify(stream, null, 2) }] };\n },\n );\n\n defineTool<{ name: string; endpointUrl: string; filters: Filter[] }>(\n server,\n \"streams_create\",\n \"Create a new webhook stream with filters.\",\n {\n name: z.string().describe(\"Stream name\"),\n endpointUrl: z.string().describe(\"Webhook endpoint URL\"),\n filters: z.array(FilterSchema).min(1).describe(\"Event filters (at least one required)\"),\n },\n async ({ name, endpointUrl, filters }) => {\n const result = await getClient().streams.create({ name, endpointUrl, filters });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ id: result.stream.id, signingSecret: result.signingSecret }, null, 2) }],\n };\n },\n );\n\n defineTool<{ id: string; name?: string; endpointUrl?: string; filters?: Filter[] }>(\n server,\n \"streams_update\",\n \"Update a stream's name, endpoint, or filters.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n name: z.string().optional().describe(\"New name\"),\n endpointUrl: z.string().optional().describe(\"New endpoint URL\"),\n filters: z.array(FilterSchema).min(1).optional().describe(\"New filters\"),\n },\n async ({ id, name, endpointUrl, filters }) => {\n const data: Record<string, unknown> = {};\n if (name !== undefined) data.name = name;\n if (endpointUrl !== undefined) data.endpointUrl = endpointUrl;\n if (filters !== undefined) data.filters = filters;\n const stream = await getClient().streams.update(id, data as any);\n return { content: [{ type: \"text\", text: JSON.stringify(formatStreamSummary(stream), null, 2) }] };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_delete\",\n \"Delete a stream permanently.\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n await getClient().streams.delete(id);\n return { content: [{ type: \"text\", text: `Stream ${id} deleted.` }] };\n },\n );\n\n defineTool<{ id: string; enabled: boolean }>(\n server,\n \"streams_toggle\",\n \"Enable or disable a stream.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n enabled: z.boolean().describe(\"true to enable, false to disable\"),\n },\n async ({ id, enabled }) => {\n const stream = enabled\n ? await getClient().streams.enable(id)\n : await getClient().streams.disable(id);\n return { content: [{ type: \"text\", text: JSON.stringify({ id: stream.id, status: stream.status }, null, 2) }] };\n },\n );\n\n defineTool<{ id: string; limit?: number; status?: string }>(\n server,\n \"streams_deliveries\",\n \"List recent deliveries for a stream (max 25).\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n limit: z.number().max(25).optional().describe(\"Max results (default 25)\"),\n status: z.string().optional().describe(\"Filter by delivery status\"),\n },\n async ({ id, limit, status }) => {\n const { deliveries } = await getClient().streams.listDeliveries(id, { limit: limit ?? 25, status });\n const result = withCap(deliveries.map(formatDeliverySummary), 25);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ confirm?: boolean }>(\n server,\n \"streams_pause_all\",\n \"Pause all active streams. Without confirm: true, returns a preview of streams that would be paused.\",\n {\n confirm: z.boolean().optional().describe(\"Set to true to execute. Omit or false for preview only.\"),\n },\n async ({ confirm }) => {\n if (!confirm) {\n const { streams } = await getClient().streams.list({ status: \"active\" });\n const names = streams.map((s) => s.name);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ preview: true, count: names.length, streams: names }, null, 2),\n }],\n };\n }\n const result = await getClient().streams.pauseAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ paused: result.paused, streams: result.streams.map(formatStreamSummary) }, null, 2),\n }],\n };\n },\n );\n\n defineTool<{ confirm?: boolean }>(\n server,\n \"streams_resume_all\",\n \"Resume all paused streams. Without confirm: true, returns a preview of streams that would be resumed.\",\n {\n confirm: z.boolean().optional().describe(\"Set to true to execute. Omit or false for preview only.\"),\n },\n async ({ confirm }) => {\n if (!confirm) {\n const { streams } = await getClient().streams.list({ status: \"paused\" });\n const names = streams.map((s) => s.name);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ preview: true, count: names.length, streams: names }, null, 2),\n }],\n };\n }\n const result = await getClient().streams.resumeAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ resumed: result.resumed, streams: result.streams.map(formatStreamSummary) }, null, 2),\n }],\n };\n },\n );\n\n defineTool<{ id: string; fromBlock: number; toBlock: number }>(\n server,\n \"streams_replay\",\n \"Replay blocks through a stream, re-delivering events for a block range.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n fromBlock: z.number().describe(\"Start block height (inclusive)\"),\n toBlock: z.number().describe(\"End block height (inclusive)\"),\n },\n async ({ id, fromBlock, toBlock }) => {\n const result = await apiRequest<{ streamId: string; fromBlock: number; toBlock: number; jobCount: number; message: string }>(\n \"POST\", `/api/streams/${id}/replay`, { fromBlock, toBlock },\n );\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_rotate_secret\",\n \"Rotate the signing secret for a stream. Returns the new secret.\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n const result = await getClient().streams.rotateSecret(id);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n}\n",
|
|
11
|
+
"import { z } from \"zod/v4\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getClient, apiRequest } from \"../lib/client.ts\";\nimport { formatStreamSummary, formatDeliverySummary, withCap } from \"../lib/format.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\n/** Filter schema — full 13-type discriminated union for MCP JSON Schema generation. */\nconst FilterSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"stx_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), minAmount: z.number().optional(), maxAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_mint\"), recipient: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_burn\"), sender: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_lock\"), lockedAddress: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_mint\"), recipient: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_burn\"), sender: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"nft_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"nft_mint\"), recipient: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"nft_burn\"), sender: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"contract_call\"), contractId: z.string().optional(), functionName: z.string().optional(), caller: z.string().optional() }),\n z.object({ type: z.literal(\"contract_deploy\"), deployer: z.string().optional(), contractName: z.string().optional() }),\n z.object({ type: z.literal(\"print_event\"), contractId: z.string().optional(), topic: z.string().optional(), contains: z.string().optional() }),\n]);\n\ntype Filter = z.infer<typeof FilterSchema>;\n\nexport function registerStreamTools(server: McpServer) {\n defineTool<{ status?: string }>(\n server,\n \"streams_list\",\n \"List all webhook streams. Returns summary fields only.\",\n { status: z.enum([\"active\", \"inactive\", \"paused\", \"failed\"]).optional().describe(\"Filter by status\") },\n async ({ status }) => {\n const { streams } = await getClient().streams.list(status ? { status } : undefined);\n return {\n content: [{ type: \"text\", text: JSON.stringify(streams.map(formatStreamSummary), null, 2) }],\n };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_get\",\n \"Get full details of a stream by ID (accepts UUID prefix).\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n const stream = await getClient().streams.get(id);\n return { content: [{ type: \"text\", text: JSON.stringify(stream, null, 2) }] };\n },\n );\n\n defineTool<{ name: string; endpointUrl: string; filters: Filter[] }>(\n server,\n \"streams_create\",\n \"Create a new webhook stream with filters.\",\n {\n name: z.string().describe(\"Stream name\"),\n endpointUrl: z.string().describe(\"Webhook endpoint URL\"),\n filters: z.array(FilterSchema).min(1).describe(\"Event filters (at least one required)\"),\n },\n async ({ name, endpointUrl, filters }) => {\n const result = await getClient().streams.create({ name, endpointUrl, filters });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ id: result.stream.id, signingSecret: result.signingSecret }, null, 2) }],\n };\n },\n );\n\n defineTool<{ id: string; name?: string; endpointUrl?: string; filters?: Filter[] }>(\n server,\n \"streams_update\",\n \"Update a stream's name, endpoint, or filters.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n name: z.string().optional().describe(\"New name\"),\n endpointUrl: z.string().optional().describe(\"New endpoint URL\"),\n filters: z.array(FilterSchema).min(1).optional().describe(\"New filters\"),\n },\n async ({ id, name, endpointUrl, filters }) => {\n const data: Record<string, unknown> = {};\n if (name !== undefined) data.name = name;\n if (endpointUrl !== undefined) data.endpointUrl = endpointUrl;\n if (filters !== undefined) data.filters = filters;\n const stream = await getClient().streams.update(id, data as any);\n return { content: [{ type: \"text\", text: JSON.stringify(formatStreamSummary(stream), null, 2) }] };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_delete\",\n \"Delete a stream permanently.\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n await getClient().streams.delete(id);\n return { content: [{ type: \"text\", text: `Stream ${id} deleted.` }] };\n },\n );\n\n defineTool<{ id: string; enabled: boolean }>(\n server,\n \"streams_toggle\",\n \"Enable or disable a stream.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n enabled: z.boolean().describe(\"true to enable, false to disable\"),\n },\n async ({ id, enabled }) => {\n const stream = enabled\n ? await getClient().streams.enable(id)\n : await getClient().streams.disable(id);\n return { content: [{ type: \"text\", text: JSON.stringify({ id: stream.id, status: stream.status }, null, 2) }] };\n },\n );\n\n defineTool<{ id: string; limit?: number; status?: string }>(\n server,\n \"streams_deliveries\",\n \"List recent deliveries for a stream (max 25).\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n limit: z.number().max(25).optional().describe(\"Max results (default 25)\"),\n status: z.string().optional().describe(\"Filter by delivery status\"),\n },\n async ({ id, limit, status }) => {\n const { deliveries } = await getClient().streams.listDeliveries(id, { limit: limit ?? 25, status });\n const result = withCap(deliveries.map(formatDeliverySummary), 25);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ confirm?: boolean }>(\n server,\n \"streams_pause_all\",\n \"Pause all active streams. Without confirm: true, returns a preview of streams that would be paused.\",\n {\n confirm: z.boolean().optional().describe(\"Set to true to execute. Omit or false for preview only.\"),\n },\n async ({ confirm }) => {\n if (!confirm) {\n const { streams } = await getClient().streams.list({ status: \"active\" });\n const names = streams.map((s) => s.name);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ preview: true, count: names.length, streams: names }, null, 2),\n }],\n };\n }\n const result = await getClient().streams.pauseAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ paused: result.paused, streams: result.streams.map(formatStreamSummary) }, null, 2),\n }],\n };\n },\n );\n\n defineTool<{ confirm?: boolean }>(\n server,\n \"streams_resume_all\",\n \"Resume all paused streams. Without confirm: true, returns a preview of streams that would be resumed.\",\n {\n confirm: z.boolean().optional().describe(\"Set to true to execute. Omit or false for preview only.\"),\n },\n async ({ confirm }) => {\n if (!confirm) {\n const { streams } = await getClient().streams.list({ status: \"paused\" });\n const names = streams.map((s) => s.name);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ preview: true, count: names.length, streams: names }, null, 2),\n }],\n };\n }\n const result = await getClient().streams.resumeAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ resumed: result.resumed, streams: result.streams.map(formatStreamSummary) }, null, 2),\n }],\n };\n },\n );\n\n defineTool<{ id: string; fromBlock: number; toBlock: number }>(\n server,\n \"streams_replay\",\n \"Replay blocks through a stream, re-delivering events for a block range.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n fromBlock: z.number().describe(\"Start block height (inclusive)\"),\n toBlock: z.number().describe(\"End block height (inclusive)\"),\n },\n async ({ id, fromBlock, toBlock }) => {\n const result = await apiRequest<{ streamId: string; fromBlock: number; toBlock: number; jobCount: number; message: string }>(\n \"POST\", `/api/streams/${id}/replay`, { fromBlock, toBlock },\n );\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_rotate_secret\",\n \"Rotate the signing secret for a stream. Returns the new secret.\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n const result = await getClient().streams.rotateSecret(id);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n}\n",
|
|
12
12
|
"import { SecondLayer } from \"@secondlayer/sdk\";\n\nlet instance: SecondLayer | null = null;\n\n/** Lazy SDK singleton from SECONDLAYER_API_KEY env var. */\nexport function getClient(): SecondLayer {\n if (!instance) {\n const apiKey = process.env.SECONDLAYER_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"SECONDLAYER_API_KEY environment variable is required. \" +\n \"Get your key at https://app.secondlayer.tools/settings/api-keys\"\n );\n }\n instance = new SecondLayer({ apiKey });\n }\n return instance;\n}\n\n/** Raw fetch helper for API endpoints not covered by the SDK. */\nexport async function apiRequest<T>(method: string, path: string, body?: unknown): Promise<T> {\n const apiKey = process.env.SECONDLAYER_API_KEY;\n if (!apiKey) throw new Error(\"SECONDLAYER_API_KEY required\");\n const baseUrl = process.env.SECONDLAYER_API_URL || \"https://api.secondlayer.tools\";\n const res = await fetch(`${baseUrl}${path}`, {\n method,\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` },\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw Object.assign(new Error(text || `HTTP ${res.status}`), { status: res.status });\n }\n if (res.status === 204) return undefined as T;\n return res.json() as Promise<T>;\n}\n",
|
|
13
13
|
"/** Summarize a stream for list responses. */\nexport function formatStreamSummary(s: {\n id: string;\n name: string;\n status: string;\n endpointUrl: string;\n totalDeliveries: number;\n failedDeliveries: number;\n}) {\n return {\n id: s.id,\n name: s.name,\n status: s.status,\n endpointUrl: s.endpointUrl,\n totalDeliveries: s.totalDeliveries,\n failedDeliveries: s.failedDeliveries,\n };\n}\n\n/** Summarize a subgraph for list responses. */\nexport function formatSubgraphSummary(s: {\n name: string;\n status: string;\n tables: string[] | Record<string, unknown>;\n lastProcessedBlock: number;\n}) {\n return {\n name: s.name,\n status: s.status,\n tables: Array.isArray(s.tables) ? s.tables : Object.keys(s.tables),\n lastProcessedBlock: s.lastProcessedBlock,\n };\n}\n\n/** Summarize delivery for list responses. */\nexport function formatDeliverySummary(d: {\n id: string;\n blockHeight: number;\n status: string;\n statusCode: number | null;\n attempts: number;\n createdAt: string;\n}) {\n return {\n id: d.id,\n blockHeight: d.blockHeight,\n status: d.status,\n statusCode: d.statusCode,\n attempts: d.attempts,\n createdAt: d.createdAt,\n };\n}\n\n/** Cap array length and return truncation metadata. */\nexport function withCap<T>(items: T[], cap: number): { items: T[]; truncated: boolean; total: number } {\n return {\n items: items.slice(0, cap),\n truncated: items.length > cap,\n total: items.length,\n };\n}\n",
|
|
14
|
-
"import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getClient } from \"../lib/client.ts\";\nimport { formatSubgraphSummary, withCap } from \"../lib/format.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\nimport { bundleSubgraphCode } from \"../lib/bundle.ts\";\n\nexport function registerSubgraphTools(server: McpServer) {\n defineTool<Record<string, never>>(\n server,\n \"subgraphs_list\",\n \"List all deployed subgraphs. Returns summary fields only.\",\n {},\n async () => {\n const { data } = await getClient().subgraphs.list();\n return {\n content: [{ type: \"text\", text: JSON.stringify(data.map(formatSubgraphSummary), null, 2) }],\n };\n },\n );\n\n defineTool<{ name: string }>(\n server,\n \"subgraphs_get\",\n \"Get full details of a subgraph including schema, health, and table columns.\",\n { name: z.string().describe(\"Subgraph name\") },\n async ({ name }) => {\n const detail = await getClient().subgraphs.get(name);\n return { content: [{ type: \"text\", text: JSON.stringify(detail, null, 2) }] };\n },\n );\n\n defineTool<{\n name: string; table: string; filters?: Record<string, string>;\n sort?: string; order?: string; limit?: number; offset?: number;\n fields?: string; count?: boolean;\n }>(\n server,\n \"subgraphs_query\",\n \"Query rows from a subgraph table (max 200 rows). Filters support operators: \\\"amount.gte\\\": \\\"1000\\\", \\\"sender.neq\\\": \\\"SP...\\\", \\\"name.like\\\": \\\"%token%\\\". Available operators: eq, neq, gt, gte, lt, lte, like.\",\n {\n name: z.string().describe(\"Subgraph name\"),\n table: z.string().describe(\"Table name\"),\n filters: z.record(z.string(), z.string()).optional().describe(\"Column filters — plain values or with operators (e.g. {\\\"amount.gte\\\": \\\"1000\\\", \\\"sender\\\": \\\"SP...\\\"})\"),\n sort: z.string().optional().describe(\"Column to sort by\"),\n order: z.enum([\"asc\", \"desc\"]).optional().describe(\"Sort order\"),\n limit: z.number().max(200).optional().describe(\"Max rows (default 50, max 200)\"),\n offset: z.number().optional().describe(\"Offset for pagination\"),\n fields: z.string().optional().describe(\"Comma-separated column list to return (e.g. \\\"sender,amount\\\")\"),\n count: z.boolean().optional().describe(\"If true, return row count instead of rows\"),\n },\n async ({ name, table, filters, sort, order, limit, offset, fields, count }) => {\n if (count) {\n const result = await getClient().subgraphs.queryTableCount(name, table, { filters, sort, order });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n }\n const rows = await getClient().subgraphs.queryTable(name, table, {\n filters,\n sort,\n order,\n limit: limit ?? 50,\n offset,\n fields,\n });\n const cap = limit ?? 50;\n const result = withCap(rows as Record<string, unknown>[], cap > 200 ? 200 : cap);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ name: string; fromBlock?: number; toBlock?: number }>(\n server,\n \"subgraphs_reindex\",\n \"Reindex a subgraph from a specific block range.\",\n {\n name: z.string().describe(\"Subgraph name\"),\n fromBlock: z.number().optional().describe(\"Start block (defaults to beginning)\"),\n toBlock: z.number().optional().describe(\"End block (defaults to latest)\"),\n },\n async ({ name, fromBlock, toBlock }) => {\n const result = await getClient().subgraphs.reindex(name, { fromBlock, toBlock });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ name: string }>(\n server,\n \"subgraphs_delete\",\n \"Delete a subgraph permanently.\",\n { name: z.string().describe(\"Subgraph name\") },\n async ({ name }) => {\n const result = await getClient().subgraphs.delete(name);\n return { content: [{ type: \"text\", text: result.message }] };\n },\n );\n\n defineTool<{ code: string; reindex?: boolean }>(\n server,\n \"subgraphs_deploy\",\n \"Deploy a subgraph from TypeScript code. Pass the full defineSubgraph() source — it will be bundled, validated, and deployed.\",\n {\n code: z.string().describe(\"TypeScript source code containing a defineSubgraph() call\"),\n reindex: z.boolean().optional().describe(\"Force reindex on breaking schema change (drops and rebuilds all data)\"),\n },\n async ({ code, reindex }) => {\n const bundled = await bundleSubgraphCode(code);\n const result = await getClient().subgraphs.deploy({\n name: bundled.name,\n version: bundled.version,\n description: bundled.description,\n sources: bundled.sources,\n schema: bundled.schema,\n handlerCode: bundled.handlerCode,\n reindex,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n },\n );\n}\n",
|
|
14
|
+
"import { z } from \"zod/v4\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getClient } from \"../lib/client.ts\";\nimport { formatSubgraphSummary, withCap } from \"../lib/format.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\nimport { bundleSubgraphCode } from \"../lib/bundle.ts\";\n\nexport function registerSubgraphTools(server: McpServer) {\n defineTool<Record<string, never>>(\n server,\n \"subgraphs_list\",\n \"List all deployed subgraphs. Returns summary fields only.\",\n {},\n async () => {\n const { data } = await getClient().subgraphs.list();\n return {\n content: [{ type: \"text\", text: JSON.stringify(data.map(formatSubgraphSummary), null, 2) }],\n };\n },\n );\n\n defineTool<{ name: string }>(\n server,\n \"subgraphs_get\",\n \"Get full details of a subgraph including schema, health, and table columns.\",\n { name: z.string().describe(\"Subgraph name\") },\n async ({ name }) => {\n const detail = await getClient().subgraphs.get(name);\n return { content: [{ type: \"text\", text: JSON.stringify(detail, null, 2) }] };\n },\n );\n\n defineTool<{\n name: string; table: string; filters?: Record<string, string>;\n sort?: string; order?: string; limit?: number; offset?: number;\n fields?: string; count?: boolean;\n }>(\n server,\n \"subgraphs_query\",\n \"Query rows from a subgraph table (max 200 rows). Filters support operators: \\\"amount.gte\\\": \\\"1000\\\", \\\"sender.neq\\\": \\\"SP...\\\", \\\"name.like\\\": \\\"%token%\\\". Available operators: eq, neq, gt, gte, lt, lte, like.\",\n {\n name: z.string().describe(\"Subgraph name\"),\n table: z.string().describe(\"Table name\"),\n filters: z.record(z.string(), z.string()).optional().describe(\"Column filters — plain values or with operators (e.g. {\\\"amount.gte\\\": \\\"1000\\\", \\\"sender\\\": \\\"SP...\\\"})\"),\n sort: z.string().optional().describe(\"Column to sort by\"),\n order: z.enum([\"asc\", \"desc\"]).optional().describe(\"Sort order\"),\n limit: z.number().max(200).optional().describe(\"Max rows (default 50, max 200)\"),\n offset: z.number().optional().describe(\"Offset for pagination\"),\n fields: z.string().optional().describe(\"Comma-separated column list to return (e.g. \\\"sender,amount\\\")\"),\n count: z.boolean().optional().describe(\"If true, return row count instead of rows\"),\n },\n async ({ name, table, filters, sort, order, limit, offset, fields, count }) => {\n if (count) {\n const result = await getClient().subgraphs.queryTableCount(name, table, { filters, sort, order });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n }\n const rows = await getClient().subgraphs.queryTable(name, table, {\n filters,\n sort,\n order,\n limit: limit ?? 50,\n offset,\n fields,\n });\n const cap = limit ?? 50;\n const result = withCap(rows as Record<string, unknown>[], cap > 200 ? 200 : cap);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ name: string; fromBlock?: number; toBlock?: number }>(\n server,\n \"subgraphs_reindex\",\n \"Reindex a subgraph from a specific block range.\",\n {\n name: z.string().describe(\"Subgraph name\"),\n fromBlock: z.number().optional().describe(\"Start block (defaults to beginning)\"),\n toBlock: z.number().optional().describe(\"End block (defaults to latest)\"),\n },\n async ({ name, fromBlock, toBlock }) => {\n const result = await getClient().subgraphs.reindex(name, { fromBlock, toBlock });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ name: string }>(\n server,\n \"subgraphs_delete\",\n \"Delete a subgraph permanently.\",\n { name: z.string().describe(\"Subgraph name\") },\n async ({ name }) => {\n const result = await getClient().subgraphs.delete(name);\n return { content: [{ type: \"text\", text: result.message }] };\n },\n );\n\n defineTool<{ code: string; reindex?: boolean }>(\n server,\n \"subgraphs_deploy\",\n \"Deploy a subgraph from TypeScript code. Pass the full defineSubgraph() source — it will be bundled, validated, and deployed.\",\n {\n code: z.string().describe(\"TypeScript source code containing a defineSubgraph() call\"),\n reindex: z.boolean().optional().describe(\"Force reindex on breaking schema change (drops and rebuilds all data)\"),\n },\n async ({ code, reindex }) => {\n const bundled = await bundleSubgraphCode(code);\n const result = await getClient().subgraphs.deploy({\n name: bundled.name,\n version: bundled.version,\n description: bundled.description,\n sources: bundled.sources,\n schema: bundled.schema,\n handlerCode: bundled.handlerCode,\n reindex,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n },\n );\n}\n",
|
|
15
15
|
"import esbuild from \"esbuild\";\nimport { validateSubgraphDefinition } from \"@secondlayer/subgraphs/validate\";\nimport { sourceKey } from \"@secondlayer/subgraphs\";\n\ninterface BundleResult {\n name: string;\n version?: string;\n description?: string;\n sources: string[];\n schema: Record<string, unknown>;\n handlerCode: string;\n}\n\nexport async function bundleSubgraphCode(code: string): Promise<BundleResult> {\n let result: esbuild.BuildResult;\n try {\n result = await esbuild.build({\n stdin: { contents: code, loader: \"ts\", resolveDir: process.cwd() },\n bundle: true,\n platform: \"node\",\n format: \"esm\",\n external: [\"@secondlayer/subgraphs\"],\n write: false,\n });\n } catch (err: unknown) {\n throw new Error(`Bundle failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n const handlerCode = new TextDecoder().decode(result.outputFiles![0]!.contents);\n\n let mod: Record<string, unknown>;\n try {\n const dataUri = `data:text/javascript;base64,${Buffer.from(handlerCode).toString(\"base64\")}`;\n mod = await import(dataUri);\n } catch (err: unknown) {\n throw new Error(`Module evaluation failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n const def = mod.default ?? mod;\n\n let validated: ReturnType<typeof validateSubgraphDefinition>;\n try {\n validated = validateSubgraphDefinition(def);\n } catch (err: unknown) {\n throw new Error(`Validation failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n return {\n name: validated.name,\n version: validated.version,\n description: validated.description,\n sources: validated.sources.map(sourceKey),\n schema: validated.schema,\n handlerCode,\n };\n}\n",
|
|
16
16
|
"import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { apiRequest } from \"../lib/client.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nexport function registerAccountTools(server: McpServer) {\n defineTool<Record<string, never>>(\n server,\n \"account_whoami\",\n \"Show the authenticated account's email and plan.\",\n {},\n async () => {\n const result = await apiRequest<{ email: string; plan: string }>(\"GET\", \"/api/accounts/me\");\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n}\n",
|
|
17
17
|
"import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { templates } from \"@secondlayer/subgraphs/templates\";\n\nconst FILTERS_REFERENCE = [\n { type: \"stx_transfer\", fields: [\"sender\", \"recipient\", \"minAmount\", \"maxAmount\"] },\n { type: \"stx_mint\", fields: [\"recipient\", \"minAmount\"] },\n { type: \"stx_burn\", fields: [\"sender\", \"minAmount\"] },\n { type: \"stx_lock\", fields: [\"lockedAddress\", \"minAmount\"] },\n { type: \"ft_transfer\", fields: [\"sender\", \"recipient\", \"assetIdentifier\", \"minAmount\"] },\n { type: \"ft_mint\", fields: [\"recipient\", \"assetIdentifier\", \"minAmount\"] },\n { type: \"ft_burn\", fields: [\"sender\", \"assetIdentifier\", \"minAmount\"] },\n { type: \"nft_transfer\", fields: [\"sender\", \"recipient\", \"assetIdentifier\", \"tokenId\"] },\n { type: \"nft_mint\", fields: [\"recipient\", \"assetIdentifier\", \"tokenId\"] },\n { type: \"nft_burn\", fields: [\"sender\", \"assetIdentifier\", \"tokenId\"] },\n { type: \"contract_call\", fields: [\"contractId\", \"functionName\", \"caller\"] },\n { type: \"contract_deploy\", fields: [\"deployer\", \"contractName\"] },\n { type: \"print_event\", fields: [\"contractId\", \"topic\", \"contains\"] },\n];\n\nconst COLUMN_TYPES = [\n { type: \"uint\", sqlType: \"bigint\", description: \"Unsigned integer (Clarity uint)\" },\n { type: \"int\", sqlType: \"bigint\", description: \"Signed integer (Clarity int)\" },\n { type: \"text\", sqlType: \"text\", description: \"UTF-8 string\" },\n { type: \"principal\", sqlType: \"text\", description: \"Stacks address (standard or contract)\" },\n { type: \"bool\", sqlType: \"boolean\", description: \"Boolean value\" },\n { type: \"json\", sqlType: \"jsonb\", description: \"Arbitrary JSON data\" },\n {\n options: [\"nullable\", \"indexed\", \"search\"],\n description: \"Column options: nullable allows NULL, indexed creates a B-tree index, search enables full-text search\",\n },\n];\n\nexport function registerResources(server: McpServer) {\n server.resource(\n \"filters\",\n \"secondlayer://filters\",\n { description: \"Stream filter types and their available fields\" },\n async () => ({\n contents: [{\n uri: \"secondlayer://filters\",\n mimeType: \"application/json\",\n text: JSON.stringify(FILTERS_REFERENCE, null, 2),\n }],\n }),\n );\n\n server.resource(\n \"column-types\",\n \"secondlayer://column-types\",\n { description: \"Subgraph column types, SQL mappings, and options\" },\n async () => ({\n contents: [{\n uri: \"secondlayer://column-types\",\n mimeType: \"application/json\",\n text: JSON.stringify(COLUMN_TYPES, null, 2),\n }],\n }),\n );\n\n server.resource(\n \"templates\",\n \"secondlayer://templates\",\n { description: \"Available subgraph templates with descriptions and categories\" },\n async () => ({\n contents: [{\n uri: \"secondlayer://templates\",\n mimeType: \"application/json\",\n text: JSON.stringify(\n templates.map(({ id, name, description, category }) => ({ id, name, description, category })),\n null,\n 2,\n ),\n }],\n }),\n );\n}\n"
|
|
18
18
|
],
|
|
19
19
|
"mappings": "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",
|
|
20
|
-
"debugId": "
|
|
20
|
+
"debugId": "F830DB7DED293A7D64756E2164756E21",
|
|
21
21
|
"names": []
|
|
22
22
|
}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { fileURLToPath } from "node:url";
|
|
|
5
5
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
6
|
|
|
7
7
|
// src/tools/templates.ts
|
|
8
|
-
import { z } from "zod";
|
|
8
|
+
import { z } from "zod/v4";
|
|
9
9
|
import { templates, getTemplateById, getTemplatesByCategory } from "@secondlayer/subgraphs/templates";
|
|
10
10
|
|
|
11
11
|
// src/lib/tool.ts
|
|
@@ -57,7 +57,7 @@ function registerTemplateTools(server) {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
// src/tools/scaffold.ts
|
|
60
|
-
import { z as z2 } from "zod";
|
|
60
|
+
import { z as z2 } from "zod/v4";
|
|
61
61
|
|
|
62
62
|
// src/lib/scaffold-generate.ts
|
|
63
63
|
function isAbiBuffer(t) {
|
|
@@ -278,7 +278,7 @@ function registerScaffoldTools(server) {
|
|
|
278
278
|
}
|
|
279
279
|
|
|
280
280
|
// src/tools/streams.ts
|
|
281
|
-
import { z as z3 } from "zod";
|
|
281
|
+
import { z as z3 } from "zod/v4";
|
|
282
282
|
|
|
283
283
|
// src/lib/client.ts
|
|
284
284
|
import { SecondLayer } from "@secondlayer/sdk";
|
|
@@ -479,7 +479,7 @@ function registerStreamTools(server) {
|
|
|
479
479
|
}
|
|
480
480
|
|
|
481
481
|
// src/tools/subgraphs.ts
|
|
482
|
-
import { z as z4 } from "zod";
|
|
482
|
+
import { z as z4 } from "zod/v4";
|
|
483
483
|
|
|
484
484
|
// src/lib/bundle.ts
|
|
485
485
|
import esbuild from "esbuild";
|
|
@@ -676,5 +676,5 @@ export {
|
|
|
676
676
|
createServer
|
|
677
677
|
};
|
|
678
678
|
|
|
679
|
-
//# debugId=
|
|
679
|
+
//# debugId=9CEB86507128BCBF64756E2164756E21
|
|
680
680
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -3,19 +3,19 @@
|
|
|
3
3
|
"sources": ["../src/server.ts", "../src/tools/templates.ts", "../src/lib/tool.ts", "../src/tools/scaffold.ts", "../src/lib/scaffold-generate.ts", "../src/tools/streams.ts", "../src/lib/client.ts", "../src/lib/format.ts", "../src/tools/subgraphs.ts", "../src/lib/bundle.ts", "../src/tools/account.ts", "../src/resources.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerTemplateTools } from \"./tools/templates.ts\";\nimport { registerScaffoldTools } from \"./tools/scaffold.ts\";\nimport { registerStreamTools } from \"./tools/streams.ts\";\nimport { registerSubgraphTools } from \"./tools/subgraphs.ts\";\nimport { registerAccountTools } from \"./tools/account.ts\";\nimport { registerResources } from \"./resources.ts\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, \"../package.json\"), \"utf-8\"));\n\nexport function createServer(): McpServer {\n const server = new McpServer({\n name: \"secondlayer\",\n version: pkg.version,\n });\n\n registerTemplateTools(server);\n registerScaffoldTools(server);\n registerStreamTools(server);\n registerSubgraphTools(server);\n registerAccountTools(server);\n registerResources(server);\n\n return server;\n}\n",
|
|
6
|
-
"import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { templates, getTemplateById, getTemplatesByCategory } from \"@secondlayer/subgraphs/templates\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nexport function registerTemplateTools(server: McpServer) {\n defineTool<{ category?: string }>(\n server,\n \"templates_list\",\n \"List available subgraph templates. Returns metadata only — use templates_get for full code.\",\n { category: z.enum([\"defi\", \"nft\", \"token\", \"infrastructure\"]).optional().describe(\"Filter by category\") },\n async ({ category }) => {\n const list = category ? getTemplatesByCategory(category) : templates;\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(list.map((t) => ({\n id: t.id,\n name: t.name,\n description: t.description,\n category: t.category,\n })), null, 2),\n }],\n };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"templates_get\",\n \"Get a template's full code and prompt by ID.\",\n { id: z.string().describe(\"Template ID (e.g. 'dex-swaps')\") },\n async ({ id }) => {\n const template = getTemplateById(id);\n if (!template) {\n return { content: [{ type: \"text\", text: `Template \"${id}\" not found. Use templates_list to see available templates.` }], isError: true };\n }\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ id: template.id, name: template.name, description: template.description, category: template.category, code: template.code, prompt: template.prompt }, null, 2),\n }],\n };\n },\n );\n}\n",
|
|
6
|
+
"import { z } from \"zod/v4\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { templates, getTemplateById, getTemplatesByCategory } from \"@secondlayer/subgraphs/templates\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nexport function registerTemplateTools(server: McpServer) {\n defineTool<{ category?: string }>(\n server,\n \"templates_list\",\n \"List available subgraph templates. Returns metadata only — use templates_get for full code.\",\n { category: z.enum([\"defi\", \"nft\", \"token\", \"infrastructure\"]).optional().describe(\"Filter by category\") },\n async ({ category }) => {\n const list = category ? getTemplatesByCategory(category) : templates;\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(list.map((t) => ({\n id: t.id,\n name: t.name,\n description: t.description,\n category: t.category,\n })), null, 2),\n }],\n };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"templates_get\",\n \"Get a template's full code and prompt by ID.\",\n { id: z.string().describe(\"Template ID (e.g. 'dex-swaps')\") },\n async ({ id }) => {\n const template = getTemplateById(id);\n if (!template) {\n return { content: [{ type: \"text\", text: `Template \"${id}\" not found. Use templates_list to see available templates.` }], isError: true };\n }\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ id: template.id, name: template.name, description: template.description, category: template.category, code: template.code, prompt: template.prompt }, null, 2),\n }],\n };\n },\n );\n}\n",
|
|
7
7
|
"import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\ninterface ToolResult {\n content: Array<{ type: \"text\"; text: string }>;\n isError?: boolean;\n}\n\n/**\n * Type-safe wrapper around McpServer.tool() that avoids TS2589.\n *\n * The MCP SDK's Zod-generic `tool()` signature recurses past TypeScript's\n * instantiation depth limit when schemas contain discriminated unions or\n * nested optionals. This helper isolates the boundary cast to one place\n * so tool files stay fully typed via the explicit `T` generic.\n *\n * Schema is typed as Record<string, unknown> to prevent TypeScript from\n * resolving the deeply recursive ZodRawShapeCompat constraint. Zod still\n * validates at runtime.\n */\nexport function defineTool<T>(\n server: McpServer,\n name: string,\n description: string,\n schema: Record<string, unknown>,\n handler: (args: T) => Promise<ToolResult> | ToolResult,\n): void {\n const wrappedHandler = async (args: T): Promise<ToolResult> => {\n try {\n return await handler(args);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const status = err instanceof Error && \"status\" in err ? (err as any).status : 0;\n const type =\n status === 401 ? \"unauthorized\" :\n status === 404 ? \"not_found\" :\n status === 429 ? \"rate_limited\" :\n status >= 500 ? \"server_error\" : \"error\";\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: { type, status, message } }) }],\n isError: true,\n };\n }\n };\n (server.tool as Function)(name, description, schema, wrappedHandler);\n}\n",
|
|
8
|
-
"import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { generateSubgraphCode } from \"../lib/scaffold-generate.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nconst API_BASE = process.env.SECONDLAYER_API_URL || \"https://api.secondlayer.tools\";\n\nasync function fetchAbi(contractId: string): Promise<{ functions: any[]; maps: any[] }> {\n const res = await fetch(`${API_BASE}/api/node/contracts/${contractId}/abi`, {\n signal: AbortSignal.timeout(10_000),\n });\n if (!res.ok) {\n if (res.status === 404) throw new Error(`Contract not found: ${contractId}`);\n throw new Error(`Failed to fetch ABI: HTTP ${res.status}`);\n }\n const abi = await res.json() as Record<string, any>;\n return {\n functions: abi.functions ?? [],\n maps: abi.maps ?? [],\n };\n}\n\nexport function registerScaffoldTools(server: McpServer) {\n defineTool<{ contractId: string; subgraphName?: string }>(\n server,\n \"scaffold_from_contract\",\n \"Generate a subgraph scaffold from a deployed Stacks contract. Fetches the ABI automatically.\",\n {\n contractId: z.string().describe(\"Fully qualified contract ID (e.g. SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01)\"),\n subgraphName: z.string().optional().describe(\"Override the subgraph name (defaults to contract name)\"),\n },\n async ({ contractId, subgraphName }) => {\n const { functions, maps } = await fetchAbi(contractId);\n const code = generateSubgraphCode(contractId, functions, subgraphName, maps);\n return { content: [{ type: \"text\", text: code }] };\n },\n );\n\n defineTool<{ abi: string; contractId: string; subgraphName?: string }>(\n server,\n \"scaffold_from_abi\",\n \"Generate a subgraph scaffold from a provided ABI JSON. Use when you already have the ABI.\",\n {\n abi: z.string().describe(\"ABI JSON string (the full contract ABI object)\"),\n contractId: z.string().describe(\"Fully qualified contract ID\"),\n subgraphName: z.string().optional().describe(\"Override the subgraph name\"),\n },\n async ({ abi, contractId, subgraphName }) => {\n let parsed: Record<string, any>;\n try {\n parsed = JSON.parse(abi);\n } catch {\n return { content: [{ type: \"text\", text: \"Invalid ABI JSON\" }], isError: true };\n }\n const code = generateSubgraphCode(\n contractId,\n parsed.functions ?? [],\n subgraphName,\n parsed.maps ?? [],\n );\n return { content: [{ type: \"text\", text: code }] };\n },\n );\n}\n",
|
|
8
|
+
"import { z } from \"zod/v4\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { generateSubgraphCode } from \"../lib/scaffold-generate.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nconst API_BASE = process.env.SECONDLAYER_API_URL || \"https://api.secondlayer.tools\";\n\nasync function fetchAbi(contractId: string): Promise<{ functions: any[]; maps: any[] }> {\n const res = await fetch(`${API_BASE}/api/node/contracts/${contractId}/abi`, {\n signal: AbortSignal.timeout(10_000),\n });\n if (!res.ok) {\n if (res.status === 404) throw new Error(`Contract not found: ${contractId}`);\n throw new Error(`Failed to fetch ABI: HTTP ${res.status}`);\n }\n const abi = await res.json() as Record<string, any>;\n return {\n functions: abi.functions ?? [],\n maps: abi.maps ?? [],\n };\n}\n\nexport function registerScaffoldTools(server: McpServer) {\n defineTool<{ contractId: string; subgraphName?: string }>(\n server,\n \"scaffold_from_contract\",\n \"Generate a subgraph scaffold from a deployed Stacks contract. Fetches the ABI automatically.\",\n {\n contractId: z.string().describe(\"Fully qualified contract ID (e.g. SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01)\"),\n subgraphName: z.string().optional().describe(\"Override the subgraph name (defaults to contract name)\"),\n },\n async ({ contractId, subgraphName }) => {\n const { functions, maps } = await fetchAbi(contractId);\n const code = generateSubgraphCode(contractId, functions, subgraphName, maps);\n return { content: [{ type: \"text\", text: code }] };\n },\n );\n\n defineTool<{ abi: string; contractId: string; subgraphName?: string }>(\n server,\n \"scaffold_from_abi\",\n \"Generate a subgraph scaffold from a provided ABI JSON. Use when you already have the ABI.\",\n {\n abi: z.string().describe(\"ABI JSON string (the full contract ABI object)\"),\n contractId: z.string().describe(\"Fully qualified contract ID\"),\n subgraphName: z.string().optional().describe(\"Override the subgraph name\"),\n },\n async ({ abi, contractId, subgraphName }) => {\n let parsed: Record<string, any>;\n try {\n parsed = JSON.parse(abi);\n } catch {\n return { content: [{ type: \"text\", text: \"Invalid ABI JSON\" }], isError: true };\n }\n const code = generateSubgraphCode(\n contractId,\n parsed.functions ?? [],\n subgraphName,\n parsed.maps ?? [],\n );\n return { content: [{ type: \"text\", text: code }] };\n },\n );\n}\n",
|
|
9
9
|
"/**\n * Subgraph scaffold generator — copied from apps/web/src/lib/scaffold/generate.ts.\n * Browser-safe, pure string templating, no deps.\n */\n\ntype AbiType = string | Record<string, unknown>;\n\ninterface AbiFunction {\n name: string;\n access: \"public\" | \"read-only\" | \"private\";\n args: ReadonlyArray<{ name: string; type: AbiType }>;\n outputs: AbiType;\n}\n\ninterface AbiMap {\n name: string;\n key: AbiType;\n value: AbiType;\n}\n\ntype ColumnType = \"uint\" | \"int\" | \"principal\" | \"boolean\" | \"text\" | \"jsonb\" | \"serial\";\n\ninterface MappedColumn {\n type: ColumnType;\n nullable: boolean;\n}\n\nfunction isAbiBuffer(t: AbiType): t is { buff: { length: number } } {\n return typeof t === \"object\" && t !== null && \"buff\" in t;\n}\nfunction isAbiStringAscii(t: AbiType): t is { \"string-ascii\": { length: number } } {\n return typeof t === \"object\" && t !== null && \"string-ascii\" in t;\n}\nfunction isAbiStringUtf8(t: AbiType): t is { \"string-utf8\": { length: number } } {\n return typeof t === \"object\" && t !== null && \"string-utf8\" in t;\n}\nfunction isAbiOptional(t: AbiType): t is { optional: AbiType } {\n return typeof t === \"object\" && t !== null && \"optional\" in t;\n}\nfunction isAbiTuple(t: AbiType): t is { tuple: ReadonlyArray<{ name: string; type: AbiType }> } {\n return typeof t === \"object\" && t !== null && \"tuple\" in t;\n}\nfunction isAbiList(t: AbiType): t is { list: { type: AbiType; length: number } } {\n return typeof t === \"object\" && t !== null && \"list\" in t;\n}\nfunction isAbiResponse(t: AbiType): t is { response: { ok: AbiType; error: AbiType } } {\n return typeof t === \"object\" && t !== null && \"response\" in t;\n}\n\nfunction mapType(abiType: AbiType, nullable: boolean): MappedColumn {\n if (typeof abiType === \"string\") {\n switch (abiType) {\n case \"uint128\":\n return { type: \"uint\", nullable };\n case \"int128\":\n return { type: \"int\", nullable };\n case \"principal\":\n case \"trait_reference\":\n return { type: \"principal\", nullable };\n case \"bool\":\n return { type: \"boolean\", nullable };\n default: {\n const s = abiType;\n if (s.includes(\"uint\")) return { type: \"uint\", nullable };\n if (s.includes(\"int\")) return { type: \"int\", nullable };\n if (s.includes(\"string\") || s.includes(\"ascii\") || s.includes(\"utf8\")) {\n return { type: \"text\", nullable };\n }\n if (s.includes(\"buff\")) return { type: \"text\", nullable };\n return { type: \"jsonb\", nullable };\n }\n }\n }\n\n if (isAbiBuffer(abiType)) return { type: \"text\", nullable };\n if (isAbiStringAscii(abiType) || isAbiStringUtf8(abiType)) {\n return { type: \"text\", nullable };\n }\n if (isAbiOptional(abiType)) return mapType((abiType as { optional: AbiType }).optional, true);\n if (isAbiList(abiType) || isAbiTuple(abiType)) return { type: \"jsonb\", nullable };\n if (isAbiResponse(abiType)) {\n return mapType((abiType as { response: { ok: AbiType } }).response.ok, nullable);\n }\n\n return { type: \"jsonb\", nullable };\n}\n\nfunction clarityTypeToSubgraphColumn(abiType: AbiType): MappedColumn {\n return mapType(abiType, false);\n}\n\nfunction toSnake(name: string): string {\n return name.replace(/-/g, \"_\");\n}\n\nfunction toCamel(name: string): string {\n return name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction buildColumns(args: ReadonlyArray<{ name: string; type: AbiType }>): string {\n if (args.length === 0) return \" _placeholder: { type: 'text' }\";\n return args\n .map((arg) => {\n const mapped = clarityTypeToSubgraphColumn(arg.type);\n const nullable = mapped.nullable ? \", nullable: true\" : \"\";\n return ` ${toSnake(arg.name)}: { type: '${mapped.type}'${nullable} }`;\n })\n .join(\",\\n\");\n}\n\nfunction buildInsertCall(tableName: string, args: ReadonlyArray<{ name: string; type: AbiType }>): string {\n if (args.length === 0) {\n return ` ctx.insert('${tableName}', {\\n sender: ctx.tx.sender,\\n });`;\n }\n\n const mappings = args.map((arg) => {\n return ` ${toSnake(arg.name)}: event.${toCamel(arg.name)}`;\n });\n\n return ` ctx.insert('${tableName}', {\\n${mappings.join(\",\\n\")},\\n });`;\n}\n\nexport function generateSubgraphCode(\n contractId: string,\n functions: readonly AbiFunction[],\n subgraphName?: string,\n events?: readonly AbiMap[],\n): string {\n const contractParts = contractId.split(\".\");\n const contractName = contractParts[contractParts.length - 1] ?? contractId;\n const name = subgraphName ?? contractName;\n\n const publicFunctions = functions.filter((f) => f.access === \"public\");\n const hasEvents = events && events.length > 0;\n\n if (publicFunctions.length === 0 && !hasEvents) {\n return `// No public functions or events selected for ${contractId}`;\n }\n\n const tableDefs: string[] = [];\n\n if (hasEvents) {\n for (const ev of events) {\n const tableName = toSnake(ev.name);\n let columns: string;\n if (isAbiTuple(ev.value)) {\n columns = buildColumns(ev.value.tuple);\n } else {\n columns = ` value: { type: '${clarityTypeToSubgraphColumn(ev.value).type}' }`;\n }\n tableDefs.push(` ${tableName}: {\\n columns: {\\n${columns}\\n }\\n }`);\n }\n }\n\n for (const fn of publicFunctions) {\n const tableName = toSnake(fn.name);\n const columns = buildColumns(fn.args);\n tableDefs.push(` ${tableName}: {\\n columns: {\\n${columns}\\n }\\n }`);\n }\n\n const schemaBlock = tableDefs.join(\",\\n\");\n\n const sourceEntries: string[] = [`{ contract: '${contractId}' }`];\n\n const handlerEntries: string[] = [];\n\n if (hasEvents) {\n for (const ev of events) {\n const tableName = toSnake(ev.name);\n let insertCall: string;\n if (isAbiTuple(ev.value)) {\n insertCall = buildInsertCall(tableName, ev.value.tuple);\n } else {\n insertCall = ` ctx.insert('${tableName}', {\\n value: event.value,\\n });`;\n }\n handlerEntries.push(` '${contractId}::${ev.name}': async (event, ctx) => {\\n${insertCall}\\n }`);\n }\n }\n\n for (const fn of publicFunctions) {\n const tableName = toSnake(fn.name);\n const insertCall = buildInsertCall(tableName, fn.args);\n handlerEntries.push(` '${contractId}::${fn.name}': async (event, ctx) => {\\n${insertCall}\\n }`);\n }\n\n const handlersBlock = handlerEntries.join(\",\\n\\n\");\n\n return `import { defineSubgraph } from '@secondlayer/subgraphs';\n\nexport default defineSubgraph({\n name: '${name}',\n sources: [${sourceEntries.join(\", \")}],\n schema: {\n${schemaBlock}\n },\n handlers: {\n${handlersBlock}\n }\n});\n`;\n}\n\nexport type { AbiFunction, AbiMap };\n",
|
|
10
|
-
"import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getClient, apiRequest } from \"../lib/client.ts\";\nimport { formatStreamSummary, formatDeliverySummary, withCap } from \"../lib/format.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\n/** Filter schema — full 13-type discriminated union for MCP JSON Schema generation. */\nconst FilterSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"stx_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), minAmount: z.number().optional(), maxAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_mint\"), recipient: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_burn\"), sender: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_lock\"), lockedAddress: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_mint\"), recipient: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_burn\"), sender: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"nft_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"nft_mint\"), recipient: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"nft_burn\"), sender: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"contract_call\"), contractId: z.string().optional(), functionName: z.string().optional(), caller: z.string().optional() }),\n z.object({ type: z.literal(\"contract_deploy\"), deployer: z.string().optional(), contractName: z.string().optional() }),\n z.object({ type: z.literal(\"print_event\"), contractId: z.string().optional(), topic: z.string().optional(), contains: z.string().optional() }),\n]);\n\ntype Filter = z.infer<typeof FilterSchema>;\n\nexport function registerStreamTools(server: McpServer) {\n defineTool<{ status?: string }>(\n server,\n \"streams_list\",\n \"List all webhook streams. Returns summary fields only.\",\n { status: z.enum([\"active\", \"inactive\", \"paused\", \"failed\"]).optional().describe(\"Filter by status\") },\n async ({ status }) => {\n const { streams } = await getClient().streams.list(status ? { status } : undefined);\n return {\n content: [{ type: \"text\", text: JSON.stringify(streams.map(formatStreamSummary), null, 2) }],\n };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_get\",\n \"Get full details of a stream by ID (accepts UUID prefix).\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n const stream = await getClient().streams.get(id);\n return { content: [{ type: \"text\", text: JSON.stringify(stream, null, 2) }] };\n },\n );\n\n defineTool<{ name: string; endpointUrl: string; filters: Filter[] }>(\n server,\n \"streams_create\",\n \"Create a new webhook stream with filters.\",\n {\n name: z.string().describe(\"Stream name\"),\n endpointUrl: z.string().describe(\"Webhook endpoint URL\"),\n filters: z.array(FilterSchema).min(1).describe(\"Event filters (at least one required)\"),\n },\n async ({ name, endpointUrl, filters }) => {\n const result = await getClient().streams.create({ name, endpointUrl, filters });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ id: result.stream.id, signingSecret: result.signingSecret }, null, 2) }],\n };\n },\n );\n\n defineTool<{ id: string; name?: string; endpointUrl?: string; filters?: Filter[] }>(\n server,\n \"streams_update\",\n \"Update a stream's name, endpoint, or filters.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n name: z.string().optional().describe(\"New name\"),\n endpointUrl: z.string().optional().describe(\"New endpoint URL\"),\n filters: z.array(FilterSchema).min(1).optional().describe(\"New filters\"),\n },\n async ({ id, name, endpointUrl, filters }) => {\n const data: Record<string, unknown> = {};\n if (name !== undefined) data.name = name;\n if (endpointUrl !== undefined) data.endpointUrl = endpointUrl;\n if (filters !== undefined) data.filters = filters;\n const stream = await getClient().streams.update(id, data as any);\n return { content: [{ type: \"text\", text: JSON.stringify(formatStreamSummary(stream), null, 2) }] };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_delete\",\n \"Delete a stream permanently.\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n await getClient().streams.delete(id);\n return { content: [{ type: \"text\", text: `Stream ${id} deleted.` }] };\n },\n );\n\n defineTool<{ id: string; enabled: boolean }>(\n server,\n \"streams_toggle\",\n \"Enable or disable a stream.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n enabled: z.boolean().describe(\"true to enable, false to disable\"),\n },\n async ({ id, enabled }) => {\n const stream = enabled\n ? await getClient().streams.enable(id)\n : await getClient().streams.disable(id);\n return { content: [{ type: \"text\", text: JSON.stringify({ id: stream.id, status: stream.status }, null, 2) }] };\n },\n );\n\n defineTool<{ id: string; limit?: number; status?: string }>(\n server,\n \"streams_deliveries\",\n \"List recent deliveries for a stream (max 25).\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n limit: z.number().max(25).optional().describe(\"Max results (default 25)\"),\n status: z.string().optional().describe(\"Filter by delivery status\"),\n },\n async ({ id, limit, status }) => {\n const { deliveries } = await getClient().streams.listDeliveries(id, { limit: limit ?? 25, status });\n const result = withCap(deliveries.map(formatDeliverySummary), 25);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ confirm?: boolean }>(\n server,\n \"streams_pause_all\",\n \"Pause all active streams. Without confirm: true, returns a preview of streams that would be paused.\",\n {\n confirm: z.boolean().optional().describe(\"Set to true to execute. Omit or false for preview only.\"),\n },\n async ({ confirm }) => {\n if (!confirm) {\n const { streams } = await getClient().streams.list({ status: \"active\" });\n const names = streams.map((s) => s.name);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ preview: true, count: names.length, streams: names }, null, 2),\n }],\n };\n }\n const result = await getClient().streams.pauseAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ paused: result.paused, streams: result.streams.map(formatStreamSummary) }, null, 2),\n }],\n };\n },\n );\n\n defineTool<{ confirm?: boolean }>(\n server,\n \"streams_resume_all\",\n \"Resume all paused streams. Without confirm: true, returns a preview of streams that would be resumed.\",\n {\n confirm: z.boolean().optional().describe(\"Set to true to execute. Omit or false for preview only.\"),\n },\n async ({ confirm }) => {\n if (!confirm) {\n const { streams } = await getClient().streams.list({ status: \"paused\" });\n const names = streams.map((s) => s.name);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ preview: true, count: names.length, streams: names }, null, 2),\n }],\n };\n }\n const result = await getClient().streams.resumeAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ resumed: result.resumed, streams: result.streams.map(formatStreamSummary) }, null, 2),\n }],\n };\n },\n );\n\n defineTool<{ id: string; fromBlock: number; toBlock: number }>(\n server,\n \"streams_replay\",\n \"Replay blocks through a stream, re-delivering events for a block range.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n fromBlock: z.number().describe(\"Start block height (inclusive)\"),\n toBlock: z.number().describe(\"End block height (inclusive)\"),\n },\n async ({ id, fromBlock, toBlock }) => {\n const result = await apiRequest<{ streamId: string; fromBlock: number; toBlock: number; jobCount: number; message: string }>(\n \"POST\", `/api/streams/${id}/replay`, { fromBlock, toBlock },\n );\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_rotate_secret\",\n \"Rotate the signing secret for a stream. Returns the new secret.\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n const result = await getClient().streams.rotateSecret(id);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n}\n",
|
|
10
|
+
"import { z } from \"zod/v4\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getClient, apiRequest } from \"../lib/client.ts\";\nimport { formatStreamSummary, formatDeliverySummary, withCap } from \"../lib/format.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\n/** Filter schema — full 13-type discriminated union for MCP JSON Schema generation. */\nconst FilterSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"stx_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), minAmount: z.number().optional(), maxAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_mint\"), recipient: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_burn\"), sender: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"stx_lock\"), lockedAddress: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_mint\"), recipient: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"ft_burn\"), sender: z.string().optional(), assetIdentifier: z.string().optional(), minAmount: z.number().optional() }),\n z.object({ type: z.literal(\"nft_transfer\"), sender: z.string().optional(), recipient: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"nft_mint\"), recipient: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"nft_burn\"), sender: z.string().optional(), assetIdentifier: z.string().optional(), tokenId: z.string().optional() }),\n z.object({ type: z.literal(\"contract_call\"), contractId: z.string().optional(), functionName: z.string().optional(), caller: z.string().optional() }),\n z.object({ type: z.literal(\"contract_deploy\"), deployer: z.string().optional(), contractName: z.string().optional() }),\n z.object({ type: z.literal(\"print_event\"), contractId: z.string().optional(), topic: z.string().optional(), contains: z.string().optional() }),\n]);\n\ntype Filter = z.infer<typeof FilterSchema>;\n\nexport function registerStreamTools(server: McpServer) {\n defineTool<{ status?: string }>(\n server,\n \"streams_list\",\n \"List all webhook streams. Returns summary fields only.\",\n { status: z.enum([\"active\", \"inactive\", \"paused\", \"failed\"]).optional().describe(\"Filter by status\") },\n async ({ status }) => {\n const { streams } = await getClient().streams.list(status ? { status } : undefined);\n return {\n content: [{ type: \"text\", text: JSON.stringify(streams.map(formatStreamSummary), null, 2) }],\n };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_get\",\n \"Get full details of a stream by ID (accepts UUID prefix).\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n const stream = await getClient().streams.get(id);\n return { content: [{ type: \"text\", text: JSON.stringify(stream, null, 2) }] };\n },\n );\n\n defineTool<{ name: string; endpointUrl: string; filters: Filter[] }>(\n server,\n \"streams_create\",\n \"Create a new webhook stream with filters.\",\n {\n name: z.string().describe(\"Stream name\"),\n endpointUrl: z.string().describe(\"Webhook endpoint URL\"),\n filters: z.array(FilterSchema).min(1).describe(\"Event filters (at least one required)\"),\n },\n async ({ name, endpointUrl, filters }) => {\n const result = await getClient().streams.create({ name, endpointUrl, filters });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ id: result.stream.id, signingSecret: result.signingSecret }, null, 2) }],\n };\n },\n );\n\n defineTool<{ id: string; name?: string; endpointUrl?: string; filters?: Filter[] }>(\n server,\n \"streams_update\",\n \"Update a stream's name, endpoint, or filters.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n name: z.string().optional().describe(\"New name\"),\n endpointUrl: z.string().optional().describe(\"New endpoint URL\"),\n filters: z.array(FilterSchema).min(1).optional().describe(\"New filters\"),\n },\n async ({ id, name, endpointUrl, filters }) => {\n const data: Record<string, unknown> = {};\n if (name !== undefined) data.name = name;\n if (endpointUrl !== undefined) data.endpointUrl = endpointUrl;\n if (filters !== undefined) data.filters = filters;\n const stream = await getClient().streams.update(id, data as any);\n return { content: [{ type: \"text\", text: JSON.stringify(formatStreamSummary(stream), null, 2) }] };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_delete\",\n \"Delete a stream permanently.\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n await getClient().streams.delete(id);\n return { content: [{ type: \"text\", text: `Stream ${id} deleted.` }] };\n },\n );\n\n defineTool<{ id: string; enabled: boolean }>(\n server,\n \"streams_toggle\",\n \"Enable or disable a stream.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n enabled: z.boolean().describe(\"true to enable, false to disable\"),\n },\n async ({ id, enabled }) => {\n const stream = enabled\n ? await getClient().streams.enable(id)\n : await getClient().streams.disable(id);\n return { content: [{ type: \"text\", text: JSON.stringify({ id: stream.id, status: stream.status }, null, 2) }] };\n },\n );\n\n defineTool<{ id: string; limit?: number; status?: string }>(\n server,\n \"streams_deliveries\",\n \"List recent deliveries for a stream (max 25).\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n limit: z.number().max(25).optional().describe(\"Max results (default 25)\"),\n status: z.string().optional().describe(\"Filter by delivery status\"),\n },\n async ({ id, limit, status }) => {\n const { deliveries } = await getClient().streams.listDeliveries(id, { limit: limit ?? 25, status });\n const result = withCap(deliveries.map(formatDeliverySummary), 25);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ confirm?: boolean }>(\n server,\n \"streams_pause_all\",\n \"Pause all active streams. Without confirm: true, returns a preview of streams that would be paused.\",\n {\n confirm: z.boolean().optional().describe(\"Set to true to execute. Omit or false for preview only.\"),\n },\n async ({ confirm }) => {\n if (!confirm) {\n const { streams } = await getClient().streams.list({ status: \"active\" });\n const names = streams.map((s) => s.name);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ preview: true, count: names.length, streams: names }, null, 2),\n }],\n };\n }\n const result = await getClient().streams.pauseAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ paused: result.paused, streams: result.streams.map(formatStreamSummary) }, null, 2),\n }],\n };\n },\n );\n\n defineTool<{ confirm?: boolean }>(\n server,\n \"streams_resume_all\",\n \"Resume all paused streams. Without confirm: true, returns a preview of streams that would be resumed.\",\n {\n confirm: z.boolean().optional().describe(\"Set to true to execute. Omit or false for preview only.\"),\n },\n async ({ confirm }) => {\n if (!confirm) {\n const { streams } = await getClient().streams.list({ status: \"paused\" });\n const names = streams.map((s) => s.name);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ preview: true, count: names.length, streams: names }, null, 2),\n }],\n };\n }\n const result = await getClient().streams.resumeAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ resumed: result.resumed, streams: result.streams.map(formatStreamSummary) }, null, 2),\n }],\n };\n },\n );\n\n defineTool<{ id: string; fromBlock: number; toBlock: number }>(\n server,\n \"streams_replay\",\n \"Replay blocks through a stream, re-delivering events for a block range.\",\n {\n id: z.string().describe(\"Stream UUID or prefix\"),\n fromBlock: z.number().describe(\"Start block height (inclusive)\"),\n toBlock: z.number().describe(\"End block height (inclusive)\"),\n },\n async ({ id, fromBlock, toBlock }) => {\n const result = await apiRequest<{ streamId: string; fromBlock: number; toBlock: number; jobCount: number; message: string }>(\n \"POST\", `/api/streams/${id}/replay`, { fromBlock, toBlock },\n );\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ id: string }>(\n server,\n \"streams_rotate_secret\",\n \"Rotate the signing secret for a stream. Returns the new secret.\",\n { id: z.string().describe(\"Stream UUID or prefix\") },\n async ({ id }) => {\n const result = await getClient().streams.rotateSecret(id);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n}\n",
|
|
11
11
|
"import { SecondLayer } from \"@secondlayer/sdk\";\n\nlet instance: SecondLayer | null = null;\n\n/** Lazy SDK singleton from SECONDLAYER_API_KEY env var. */\nexport function getClient(): SecondLayer {\n if (!instance) {\n const apiKey = process.env.SECONDLAYER_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"SECONDLAYER_API_KEY environment variable is required. \" +\n \"Get your key at https://app.secondlayer.tools/settings/api-keys\"\n );\n }\n instance = new SecondLayer({ apiKey });\n }\n return instance;\n}\n\n/** Raw fetch helper for API endpoints not covered by the SDK. */\nexport async function apiRequest<T>(method: string, path: string, body?: unknown): Promise<T> {\n const apiKey = process.env.SECONDLAYER_API_KEY;\n if (!apiKey) throw new Error(\"SECONDLAYER_API_KEY required\");\n const baseUrl = process.env.SECONDLAYER_API_URL || \"https://api.secondlayer.tools\";\n const res = await fetch(`${baseUrl}${path}`, {\n method,\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` },\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw Object.assign(new Error(text || `HTTP ${res.status}`), { status: res.status });\n }\n if (res.status === 204) return undefined as T;\n return res.json() as Promise<T>;\n}\n",
|
|
12
12
|
"/** Summarize a stream for list responses. */\nexport function formatStreamSummary(s: {\n id: string;\n name: string;\n status: string;\n endpointUrl: string;\n totalDeliveries: number;\n failedDeliveries: number;\n}) {\n return {\n id: s.id,\n name: s.name,\n status: s.status,\n endpointUrl: s.endpointUrl,\n totalDeliveries: s.totalDeliveries,\n failedDeliveries: s.failedDeliveries,\n };\n}\n\n/** Summarize a subgraph for list responses. */\nexport function formatSubgraphSummary(s: {\n name: string;\n status: string;\n tables: string[] | Record<string, unknown>;\n lastProcessedBlock: number;\n}) {\n return {\n name: s.name,\n status: s.status,\n tables: Array.isArray(s.tables) ? s.tables : Object.keys(s.tables),\n lastProcessedBlock: s.lastProcessedBlock,\n };\n}\n\n/** Summarize delivery for list responses. */\nexport function formatDeliverySummary(d: {\n id: string;\n blockHeight: number;\n status: string;\n statusCode: number | null;\n attempts: number;\n createdAt: string;\n}) {\n return {\n id: d.id,\n blockHeight: d.blockHeight,\n status: d.status,\n statusCode: d.statusCode,\n attempts: d.attempts,\n createdAt: d.createdAt,\n };\n}\n\n/** Cap array length and return truncation metadata. */\nexport function withCap<T>(items: T[], cap: number): { items: T[]; truncated: boolean; total: number } {\n return {\n items: items.slice(0, cap),\n truncated: items.length > cap,\n total: items.length,\n };\n}\n",
|
|
13
|
-
"import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getClient } from \"../lib/client.ts\";\nimport { formatSubgraphSummary, withCap } from \"../lib/format.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\nimport { bundleSubgraphCode } from \"../lib/bundle.ts\";\n\nexport function registerSubgraphTools(server: McpServer) {\n defineTool<Record<string, never>>(\n server,\n \"subgraphs_list\",\n \"List all deployed subgraphs. Returns summary fields only.\",\n {},\n async () => {\n const { data } = await getClient().subgraphs.list();\n return {\n content: [{ type: \"text\", text: JSON.stringify(data.map(formatSubgraphSummary), null, 2) }],\n };\n },\n );\n\n defineTool<{ name: string }>(\n server,\n \"subgraphs_get\",\n \"Get full details of a subgraph including schema, health, and table columns.\",\n { name: z.string().describe(\"Subgraph name\") },\n async ({ name }) => {\n const detail = await getClient().subgraphs.get(name);\n return { content: [{ type: \"text\", text: JSON.stringify(detail, null, 2) }] };\n },\n );\n\n defineTool<{\n name: string; table: string; filters?: Record<string, string>;\n sort?: string; order?: string; limit?: number; offset?: number;\n fields?: string; count?: boolean;\n }>(\n server,\n \"subgraphs_query\",\n \"Query rows from a subgraph table (max 200 rows). Filters support operators: \\\"amount.gte\\\": \\\"1000\\\", \\\"sender.neq\\\": \\\"SP...\\\", \\\"name.like\\\": \\\"%token%\\\". Available operators: eq, neq, gt, gte, lt, lte, like.\",\n {\n name: z.string().describe(\"Subgraph name\"),\n table: z.string().describe(\"Table name\"),\n filters: z.record(z.string(), z.string()).optional().describe(\"Column filters — plain values or with operators (e.g. {\\\"amount.gte\\\": \\\"1000\\\", \\\"sender\\\": \\\"SP...\\\"})\"),\n sort: z.string().optional().describe(\"Column to sort by\"),\n order: z.enum([\"asc\", \"desc\"]).optional().describe(\"Sort order\"),\n limit: z.number().max(200).optional().describe(\"Max rows (default 50, max 200)\"),\n offset: z.number().optional().describe(\"Offset for pagination\"),\n fields: z.string().optional().describe(\"Comma-separated column list to return (e.g. \\\"sender,amount\\\")\"),\n count: z.boolean().optional().describe(\"If true, return row count instead of rows\"),\n },\n async ({ name, table, filters, sort, order, limit, offset, fields, count }) => {\n if (count) {\n const result = await getClient().subgraphs.queryTableCount(name, table, { filters, sort, order });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n }\n const rows = await getClient().subgraphs.queryTable(name, table, {\n filters,\n sort,\n order,\n limit: limit ?? 50,\n offset,\n fields,\n });\n const cap = limit ?? 50;\n const result = withCap(rows as Record<string, unknown>[], cap > 200 ? 200 : cap);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ name: string; fromBlock?: number; toBlock?: number }>(\n server,\n \"subgraphs_reindex\",\n \"Reindex a subgraph from a specific block range.\",\n {\n name: z.string().describe(\"Subgraph name\"),\n fromBlock: z.number().optional().describe(\"Start block (defaults to beginning)\"),\n toBlock: z.number().optional().describe(\"End block (defaults to latest)\"),\n },\n async ({ name, fromBlock, toBlock }) => {\n const result = await getClient().subgraphs.reindex(name, { fromBlock, toBlock });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ name: string }>(\n server,\n \"subgraphs_delete\",\n \"Delete a subgraph permanently.\",\n { name: z.string().describe(\"Subgraph name\") },\n async ({ name }) => {\n const result = await getClient().subgraphs.delete(name);\n return { content: [{ type: \"text\", text: result.message }] };\n },\n );\n\n defineTool<{ code: string; reindex?: boolean }>(\n server,\n \"subgraphs_deploy\",\n \"Deploy a subgraph from TypeScript code. Pass the full defineSubgraph() source — it will be bundled, validated, and deployed.\",\n {\n code: z.string().describe(\"TypeScript source code containing a defineSubgraph() call\"),\n reindex: z.boolean().optional().describe(\"Force reindex on breaking schema change (drops and rebuilds all data)\"),\n },\n async ({ code, reindex }) => {\n const bundled = await bundleSubgraphCode(code);\n const result = await getClient().subgraphs.deploy({\n name: bundled.name,\n version: bundled.version,\n description: bundled.description,\n sources: bundled.sources,\n schema: bundled.schema,\n handlerCode: bundled.handlerCode,\n reindex,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n },\n );\n}\n",
|
|
13
|
+
"import { z } from \"zod/v4\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getClient } from \"../lib/client.ts\";\nimport { formatSubgraphSummary, withCap } from \"../lib/format.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\nimport { bundleSubgraphCode } from \"../lib/bundle.ts\";\n\nexport function registerSubgraphTools(server: McpServer) {\n defineTool<Record<string, never>>(\n server,\n \"subgraphs_list\",\n \"List all deployed subgraphs. Returns summary fields only.\",\n {},\n async () => {\n const { data } = await getClient().subgraphs.list();\n return {\n content: [{ type: \"text\", text: JSON.stringify(data.map(formatSubgraphSummary), null, 2) }],\n };\n },\n );\n\n defineTool<{ name: string }>(\n server,\n \"subgraphs_get\",\n \"Get full details of a subgraph including schema, health, and table columns.\",\n { name: z.string().describe(\"Subgraph name\") },\n async ({ name }) => {\n const detail = await getClient().subgraphs.get(name);\n return { content: [{ type: \"text\", text: JSON.stringify(detail, null, 2) }] };\n },\n );\n\n defineTool<{\n name: string; table: string; filters?: Record<string, string>;\n sort?: string; order?: string; limit?: number; offset?: number;\n fields?: string; count?: boolean;\n }>(\n server,\n \"subgraphs_query\",\n \"Query rows from a subgraph table (max 200 rows). Filters support operators: \\\"amount.gte\\\": \\\"1000\\\", \\\"sender.neq\\\": \\\"SP...\\\", \\\"name.like\\\": \\\"%token%\\\". Available operators: eq, neq, gt, gte, lt, lte, like.\",\n {\n name: z.string().describe(\"Subgraph name\"),\n table: z.string().describe(\"Table name\"),\n filters: z.record(z.string(), z.string()).optional().describe(\"Column filters — plain values or with operators (e.g. {\\\"amount.gte\\\": \\\"1000\\\", \\\"sender\\\": \\\"SP...\\\"})\"),\n sort: z.string().optional().describe(\"Column to sort by\"),\n order: z.enum([\"asc\", \"desc\"]).optional().describe(\"Sort order\"),\n limit: z.number().max(200).optional().describe(\"Max rows (default 50, max 200)\"),\n offset: z.number().optional().describe(\"Offset for pagination\"),\n fields: z.string().optional().describe(\"Comma-separated column list to return (e.g. \\\"sender,amount\\\")\"),\n count: z.boolean().optional().describe(\"If true, return row count instead of rows\"),\n },\n async ({ name, table, filters, sort, order, limit, offset, fields, count }) => {\n if (count) {\n const result = await getClient().subgraphs.queryTableCount(name, table, { filters, sort, order });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n }\n const rows = await getClient().subgraphs.queryTable(name, table, {\n filters,\n sort,\n order,\n limit: limit ?? 50,\n offset,\n fields,\n });\n const cap = limit ?? 50;\n const result = withCap(rows as Record<string, unknown>[], cap > 200 ? 200 : cap);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ name: string; fromBlock?: number; toBlock?: number }>(\n server,\n \"subgraphs_reindex\",\n \"Reindex a subgraph from a specific block range.\",\n {\n name: z.string().describe(\"Subgraph name\"),\n fromBlock: z.number().optional().describe(\"Start block (defaults to beginning)\"),\n toBlock: z.number().optional().describe(\"End block (defaults to latest)\"),\n },\n async ({ name, fromBlock, toBlock }) => {\n const result = await getClient().subgraphs.reindex(name, { fromBlock, toBlock });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n defineTool<{ name: string }>(\n server,\n \"subgraphs_delete\",\n \"Delete a subgraph permanently.\",\n { name: z.string().describe(\"Subgraph name\") },\n async ({ name }) => {\n const result = await getClient().subgraphs.delete(name);\n return { content: [{ type: \"text\", text: result.message }] };\n },\n );\n\n defineTool<{ code: string; reindex?: boolean }>(\n server,\n \"subgraphs_deploy\",\n \"Deploy a subgraph from TypeScript code. Pass the full defineSubgraph() source — it will be bundled, validated, and deployed.\",\n {\n code: z.string().describe(\"TypeScript source code containing a defineSubgraph() call\"),\n reindex: z.boolean().optional().describe(\"Force reindex on breaking schema change (drops and rebuilds all data)\"),\n },\n async ({ code, reindex }) => {\n const bundled = await bundleSubgraphCode(code);\n const result = await getClient().subgraphs.deploy({\n name: bundled.name,\n version: bundled.version,\n description: bundled.description,\n sources: bundled.sources,\n schema: bundled.schema,\n handlerCode: bundled.handlerCode,\n reindex,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n },\n );\n}\n",
|
|
14
14
|
"import esbuild from \"esbuild\";\nimport { validateSubgraphDefinition } from \"@secondlayer/subgraphs/validate\";\nimport { sourceKey } from \"@secondlayer/subgraphs\";\n\ninterface BundleResult {\n name: string;\n version?: string;\n description?: string;\n sources: string[];\n schema: Record<string, unknown>;\n handlerCode: string;\n}\n\nexport async function bundleSubgraphCode(code: string): Promise<BundleResult> {\n let result: esbuild.BuildResult;\n try {\n result = await esbuild.build({\n stdin: { contents: code, loader: \"ts\", resolveDir: process.cwd() },\n bundle: true,\n platform: \"node\",\n format: \"esm\",\n external: [\"@secondlayer/subgraphs\"],\n write: false,\n });\n } catch (err: unknown) {\n throw new Error(`Bundle failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n const handlerCode = new TextDecoder().decode(result.outputFiles![0]!.contents);\n\n let mod: Record<string, unknown>;\n try {\n const dataUri = `data:text/javascript;base64,${Buffer.from(handlerCode).toString(\"base64\")}`;\n mod = await import(dataUri);\n } catch (err: unknown) {\n throw new Error(`Module evaluation failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n const def = mod.default ?? mod;\n\n let validated: ReturnType<typeof validateSubgraphDefinition>;\n try {\n validated = validateSubgraphDefinition(def);\n } catch (err: unknown) {\n throw new Error(`Validation failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n return {\n name: validated.name,\n version: validated.version,\n description: validated.description,\n sources: validated.sources.map(sourceKey),\n schema: validated.schema,\n handlerCode,\n };\n}\n",
|
|
15
15
|
"import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { apiRequest } from \"../lib/client.ts\";\nimport { defineTool } from \"../lib/tool.ts\";\n\nexport function registerAccountTools(server: McpServer) {\n defineTool<Record<string, never>>(\n server,\n \"account_whoami\",\n \"Show the authenticated account's email and plan.\",\n {},\n async () => {\n const result = await apiRequest<{ email: string; plan: string }>(\"GET\", \"/api/accounts/me\");\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n}\n",
|
|
16
16
|
"import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { templates } from \"@secondlayer/subgraphs/templates\";\n\nconst FILTERS_REFERENCE = [\n { type: \"stx_transfer\", fields: [\"sender\", \"recipient\", \"minAmount\", \"maxAmount\"] },\n { type: \"stx_mint\", fields: [\"recipient\", \"minAmount\"] },\n { type: \"stx_burn\", fields: [\"sender\", \"minAmount\"] },\n { type: \"stx_lock\", fields: [\"lockedAddress\", \"minAmount\"] },\n { type: \"ft_transfer\", fields: [\"sender\", \"recipient\", \"assetIdentifier\", \"minAmount\"] },\n { type: \"ft_mint\", fields: [\"recipient\", \"assetIdentifier\", \"minAmount\"] },\n { type: \"ft_burn\", fields: [\"sender\", \"assetIdentifier\", \"minAmount\"] },\n { type: \"nft_transfer\", fields: [\"sender\", \"recipient\", \"assetIdentifier\", \"tokenId\"] },\n { type: \"nft_mint\", fields: [\"recipient\", \"assetIdentifier\", \"tokenId\"] },\n { type: \"nft_burn\", fields: [\"sender\", \"assetIdentifier\", \"tokenId\"] },\n { type: \"contract_call\", fields: [\"contractId\", \"functionName\", \"caller\"] },\n { type: \"contract_deploy\", fields: [\"deployer\", \"contractName\"] },\n { type: \"print_event\", fields: [\"contractId\", \"topic\", \"contains\"] },\n];\n\nconst COLUMN_TYPES = [\n { type: \"uint\", sqlType: \"bigint\", description: \"Unsigned integer (Clarity uint)\" },\n { type: \"int\", sqlType: \"bigint\", description: \"Signed integer (Clarity int)\" },\n { type: \"text\", sqlType: \"text\", description: \"UTF-8 string\" },\n { type: \"principal\", sqlType: \"text\", description: \"Stacks address (standard or contract)\" },\n { type: \"bool\", sqlType: \"boolean\", description: \"Boolean value\" },\n { type: \"json\", sqlType: \"jsonb\", description: \"Arbitrary JSON data\" },\n {\n options: [\"nullable\", \"indexed\", \"search\"],\n description: \"Column options: nullable allows NULL, indexed creates a B-tree index, search enables full-text search\",\n },\n];\n\nexport function registerResources(server: McpServer) {\n server.resource(\n \"filters\",\n \"secondlayer://filters\",\n { description: \"Stream filter types and their available fields\" },\n async () => ({\n contents: [{\n uri: \"secondlayer://filters\",\n mimeType: \"application/json\",\n text: JSON.stringify(FILTERS_REFERENCE, null, 2),\n }],\n }),\n );\n\n server.resource(\n \"column-types\",\n \"secondlayer://column-types\",\n { description: \"Subgraph column types, SQL mappings, and options\" },\n async () => ({\n contents: [{\n uri: \"secondlayer://column-types\",\n mimeType: \"application/json\",\n text: JSON.stringify(COLUMN_TYPES, null, 2),\n }],\n }),\n );\n\n server.resource(\n \"templates\",\n \"secondlayer://templates\",\n { description: \"Available subgraph templates with descriptions and categories\" },\n async () => ({\n contents: [{\n uri: \"secondlayer://templates\",\n mimeType: \"application/json\",\n text: JSON.stringify(\n templates.map(({ id, name, description, category }) => ({ id, name, description, category })),\n null,\n 2,\n ),\n }],\n }),\n );\n}\n"
|
|
17
17
|
],
|
|
18
18
|
"mappings": "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",
|
|
19
|
-
"debugId": "
|
|
19
|
+
"debugId": "9CEB86507128BCBF64756E2164756E21",
|
|
20
20
|
"names": []
|
|
21
21
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@secondlayer/mcp",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
31
31
|
"@secondlayer/sdk": "^0.6.2",
|
|
32
|
-
"@secondlayer/subgraphs": "^0.5.
|
|
32
|
+
"@secondlayer/subgraphs": "^0.5.5",
|
|
33
33
|
"esbuild": "^0.27.4",
|
|
34
34
|
"zod": "^4.3.6"
|
|
35
35
|
},
|