@21st-dev/magic
Version:
Magic MCP UI builder by 21st.dev
67 lines (66 loc) • 2.27 kB
JavaScript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { setupJsonConsole } from "./utils/console.js";
import { CreateUiTool } from "./tools/create-ui.js";
import { LogoSearchTool } from "./tools/logo-search.js";
import { FetchUiTool } from "./tools/fetch-ui.js";
import { RefineUiTool } from "./tools/refine-ui.js";
setupJsonConsole();
const VERSION = "0.0.41";
const server = new McpServer({
name: "21st-magic",
version: VERSION,
});
// Register tools
new CreateUiTool().register(server);
new LogoSearchTool().register(server);
new FetchUiTool().register(server);
new RefineUiTool().register(server);
async function runServer() {
const transport = new StdioServerTransport();
console.log(`Starting server v${VERSION} (PID: ${process.pid})`);
let isShuttingDown = false;
const cleanup = () => {
if (isShuttingDown)
return;
isShuttingDown = true;
console.log(`Shutting down server (PID: ${process.pid})...`);
try {
transport.close();
}
catch (error) {
console.error(`Error closing transport (PID: ${process.pid}):`, error);
}
console.log(`Server closed (PID: ${process.pid})`);
process.exit(0);
};
transport.onerror = (error) => {
console.error(`Transport error (PID: ${process.pid}):`, error);
cleanup();
};
transport.onclose = () => {
console.log(`Transport closed unexpectedly (PID: ${process.pid})`);
cleanup();
};
process.on("SIGTERM", () => {
console.log(`Received SIGTERM (PID: ${process.pid})`);
cleanup();
});
process.on("SIGINT", () => {
console.log(`Received SIGINT (PID: ${process.pid})`);
cleanup();
});
process.on("beforeExit", () => {
console.log(`Received beforeExit (PID: ${process.pid})`);
cleanup();
});
await server.connect(transport);
console.log(`Server started (PID: ${process.pid})`);
}
runServer().catch((error) => {
console.error(`Fatal error running server (PID: ${process.pid}):`, error);
if (!process.exitCode) {
process.exit(1);
}
});