#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import fs from "fs/promises";
// Constants
const docsPath = process.argv[2];
// Create server instance
const server = new McpServer({
name: "mcp-docs-provider",
version: "1.0.2"
});
/**
* Reads and validates the documentation file content
* @returns Promise<string> The documentation content
*/
async function readDocumentation() {
try {
await fs.access(docsPath);
const content = await fs.readFile(docsPath, 'utf-8');
if (!content.trim()) {
throw new Error('Documentation file is empty');
}
return content;
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
console.error(`Documentation error: ${errorMessage}`);
console.error('Current working directory:', process.cwd());
return `Error: Unable to access documentation - ${errorMessage}`;
}
}
// Register documentation query tool
server.tool("query-docs", {
question: z.string().describe("The question to answer using the documentation")
}, async ({ question }) => {
const documentation = await readDocumentation();
return {
content: [
{
type: "text",
text: `Please answer this question using the following documentation:\n\n${documentation}\n\nQuestion: ${question}`
}
]
};
});
// Start the server
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Documentation MCP Server running on stdio");
}
main().catch((error) => {
console.error("Fatal error in main():", error);
process.exit(1);
});