@sigyl-dev/cli
Version:
Official Sigyl CLI for installing and managing MCP packages. Zero-config installation for public packages, secure API-based authentication.
237 lines (227 loc) ⢠8.85 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.initTemplate = initTemplate;
const chalk_1 = __importDefault(require("chalk"));
const node_fs_1 = require("node:fs");
const node_path_1 = require("node:path");
const yaml = __importStar(require("yaml"));
const ora_1 = __importDefault(require("ora"));
async function initTemplate(options) {
const spinner = (0, ora_1.default)("Creating template MCP server...").start();
try {
// Ensure output directory exists
if (!(0, node_fs_1.existsSync)(options.outDir)) {
(0, node_fs_1.mkdirSync)(options.outDir, { recursive: true });
}
// Generate MCP configuration
spinner.text = "Generating MCP configuration...";
await generateMCPConfig(options);
// Generate server code
spinner.text = "Generating server code...";
if (options.serverLanguage === "typescript") {
await generateTypeScriptServer(options);
}
else {
await generateJavaScriptServer(options);
}
spinner.succeed("Template MCP server created successfully!");
console.log(chalk_1.default.green("\nš Generated files:"));
console.log(chalk_1.default.gray(` ${(0, node_path_1.join)(options.outDir, "sigyl.yaml")} - MCP configuration`));
console.log(chalk_1.default.gray(` ${(0, node_path_1.join)(options.outDir, "server.ts")} - MCP server`));
console.log(chalk_1.default.gray(` ${(0, node_path_1.join)(options.outDir, "package.json")} - Node.js package`));
console.log(chalk_1.default.blue("\nš Next steps:"));
console.log(chalk_1.default.gray(` cd ${options.outDir}`));
console.log(chalk_1.default.gray(" npm install"));
console.log(chalk_1.default.gray(" npm run build"));
console.log(chalk_1.default.gray(" sigyl inspect server.js"));
}
catch (error) {
spinner.fail("Template creation failed");
throw error;
}
}
async function generateMCPConfig(options) {
// Use the MCP config schema and header as in the old working sigyl.yaml
const config = {
runtime: "node",
language: options.serverLanguage || "typescript",
startCommand: {
type: "http"
}
};
const yamlHeader = `# MCP-compatible server configuration\n# This template demonstrates all major JSON Schema features for configSchema.\n# - apiKey: Secret string field\n# - serviceName: Arbitrary string field\n# - logLevel: Enum string field\n# - timeout: Number field with min/max\n# - enableMetrics: Boolean field\n# - allowedClients: Array of strings\n# - customSettings: Object field\n# - environment: Enum for environment\n# Add/remove fields as needed for your server.\n`;
const yamlContent = yamlHeader + yaml.stringify(config, { indent: 2 });
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(options.outDir, "sigyl.yaml"), yamlContent);
}
async function generateTypeScriptServer(options) {
const serverCode = `/**
* Auto-generated MCP Server (template)
*
* This server provides a template tool for you to customize.
* To add a new tool, use the template at the bottom of this file.
*/
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"
import { z } from "zod"
// ============================================================================
// SERVER CONFIGURATION
// ============================================================================
export default function createStatelessServer({
config,
}: {
config: any;
}) {
const server = new McpServer({
name: "generated-mcp-server",
version: "1.0.0",
});
// ============================================================================
// TEMPLATE TOOL
// ============================================================================
// Replace or add more tools as needed.
server.tool(
"reverseString",
"Reverse a string value",
{
value: z.string().describe("String to reverse"),
},
async ({ value }) => {
return {
content: [
{ type: "text", text: value.split("").reverse().join("") }
]
};
}
);
return server.server;
}
`;
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(options.outDir, "server.ts"), serverCode);
// Generate package.json for the server
const packageJson = {
name: options.name,
version: "1.0.0",
type: "module",
main: "server.js",
description: "Template MCP server with a sample tool",
scripts: {
build: "tsc",
start: "node server.js"
},
dependencies: {
"@modelcontextprotocol/sdk": "^1.10.1",
"zod": "^3.22.0",
},
devDependencies: {
"typescript": "^5.0.0",
"@types/node": "^20.0.0"
}
};
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(options.outDir, "package.json"), JSON.stringify(packageJson, null, 2));
// Always generate a valid tsconfig.json for TypeScript/ESM compatibility
const tsConfig = {
compilerOptions: {
target: "ES2020",
module: "ESNext",
moduleResolution: "node",
outDir: "./",
rootDir: "./",
strict: true,
esModuleInterop: true,
skipLibCheck: true
},
include: ["*.ts"],
exclude: ["node_modules", "*.js"]
};
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(options.outDir, "tsconfig.json"), JSON.stringify(tsConfig, null, 2));
}
async function generateJavaScriptServer(options) {
const serverCode = `/**
* Auto-generated MCP Server (template, JavaScript)
*
* This server provides a template tool for you to customize.
* To add a new tool, use the template at the bottom of this file.
*/
const { McpServer } = require("@modelcontextprotocol/sdk/server/mcp.js");
const { z } = require("zod");
// ============================================================================
// SERVER CONFIGURATION
// ============================================================================
function createStatelessServer({ config }) {
const server = new McpServer({
name: "generated-mcp-server",
version: "1.0.0",
});
// ============================================================================
// TEMPLATE TOOL
// ============================================================================
// Replace or add more tools as needed.
server.tool(
"reverseString",
"Reverse a string value",
{
value: z.string().describe("String to reverse"),
},
async ({ value }) => {
return {
content: [
{ type: "text", text: value.split("").reverse().join("") }
]
};
}
);
return server.server;
}
`;
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(options.outDir, "server.js"), serverCode);
// Generate package.json for the server
const packageJson = {
name: options.name,
version: "1.0.0",
main: "server.js",
scripts: {
start: "node server.js"
},
dependencies: {
"@modelcontextprotocol/sdk": "^1.10.1",
"zod": "^3.22.0"
}
};
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(options.outDir, "package.json"), JSON.stringify(packageJson, null, 2));
}
//# sourceMappingURL=init.js.map