import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { WordGenerator } from "./word-generator.js";
import * as path from "path";
import dotenv from "dotenv";
dotenv.config();
// Define output directory from env or default
const OUTPUT_DIR = process.env.OUTPUT_DIR || path.join(process.cwd(), "output");
// Create the server instance
const server = new McpServer({
name: "word-mcp",
version: "1.0.0",
});
// Create WordGenerator instance
const wordGenerator = new WordGenerator(OUTPUT_DIR);
// Define the input schema
const GenerateReportSchema = z.object({
filename: z.string().describe("Filename for the generated report (e.g. 'audit_report')"),
title: z.string().describe("Title of the document"),
sections: z.array(
z.object({
heading: z.string(),
content: z.string().optional().describe("Markdown-supported text content for this section"),
table: z.object({
headers: z.array(z.string()),
rows: z.array(z.array(z.string())),
}).optional(),
})
).describe("List of sections to include in the report"),
}).describe("Generates a complete Word document based on a structured content payload.");
// Register the tool
server.tool(
"generate_report",
"Generates a complete Word document based on a structured content payload.",
GenerateReportSchema.shape,
async (args) => {
try {
console.error(`Generating report: ${args.filename}`); // Log to stderr for debugging
const filePath = await wordGenerator.generateReport(args);
return {
content: [
{
type: "text",
text: `Report generated successfully at ${filePath}`
}
],
};
} catch (error) {
console.error("Error generating report:", error);
return {
content: [
{
type: "text",
text: `Error generating report: ${error instanceof Error ? error.message : String(error)}`
}
],
isError: true,
};
}
}
);
// Start the server
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Word MCP Server running on stdio");
}
main().catch((error) => {
console.error("Fatal error in main():", error);
process.exit(1);
});