#!/usr/bin/env node
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
SetLevelRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import { config as dotenvConfig } from "dotenv";
import { YApiClient } from "./services/yapiClient.js";
import { YApiTools } from "./tools/yapiTools.js";
dotenvConfig();
const YAPI_BASE_URL = process.env.YAPI_BASE_URL;
const YAPI_TOKEN = process.env.YAPI_TOKEN;
if (!YAPI_BASE_URL) {
console.error("YAPI_BASE_URL environment variable is required");
process.exit(1);
}
if (!YAPI_TOKEN) {
console.error("YAPI_TOKEN environment variable is required");
process.exit(1);
}
const yapiConfig = {
baseUrl: YAPI_BASE_URL,
token: YAPI_TOKEN,
};
const yapiClient = new YApiClient(yapiConfig);
const yapiTools = new YApiTools(yapiClient);
const server = new Server({
name: "yapi-mcp-server",
version: "1.0.0",
capabilities: {
tools: {},
logging: {},
},
});
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: Object.values(yapiTools.getToolDefinitions()),
};
});
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
if (!name) {
throw new Error("Tool name is required");
}
try {
return await yapiTools.handleToolCall(name, args);
} catch (error) {
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : "Unknown error"}`,
},
],
isError: true,
};
}
});
server.setRequestHandler(SetLevelRequestSchema, async (request) => {
const { level } = request.params;
console.log(`Log level set to: ${level}`);
return {};
});
async function initializeServer() {
try {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("YApi MCP Server running on stdio");
} catch (error) {
console.error("Failed to initialize server:", error);
process.exit(1);
}
}
initializeServer().catch((error) => {
console.error("Server initialization failed:", error);
process.exit(1);
});