#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"
import { z } from "zod"
import { ChainlinkApiClient } from "./utils/api-client.js"
import { registerFeedTools } from "./tools/feeds.js"
import { registerFunctionTools } from "./tools/functions.js"
import { registerAutomationTools } from "./tools/automation.js"
import { registerVrfTools } from "./tools/vrf.js"
import { registerCcipTools } from "./tools/ccip.js"
import { registerProofOfReserveTools } from "./tools/proof-of-reserve.js"
export const configSchema = z.object({
// Optional: For premium data access
chainlinkApiKey: z.string().optional().describe("Chainlink API key for premium features"),
// Network configurations
networks: z.record(z.object({
rpcUrl: z.string(),
chainId: z.number(),
})).optional().describe("Custom network configurations"),
// Default network
defaultNetwork: z.string().default("ethereum").describe("Default network for operations"),
})
export default function ({ config }: { config: z.infer<typeof configSchema> }) {
try {
console.log("Starting Chainlink MCP Server...")
// Create a new MCP server
const server = new McpServer({
name: "Chainlink MCP Server",
version: "1.0.0",
})
// Initialize Chainlink API client
const apiClient = new ChainlinkApiClient(config)
// Register tool groups
registerFeedTools(server, apiClient)
registerFunctionTools(server, apiClient)
registerAutomationTools(server, apiClient)
registerVrfTools(server, apiClient)
registerCcipTools(server, apiClient)
registerProofOfReserveTools(server, apiClient)
return server.server
} catch (e) {
console.error("Error starting Chainlink MCP Server:", e)
throw e
}
}