Code Context MCP Server
by fkesheh
Verified
#!/usr/bin/env node
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ErrorCode,
ListToolsRequestSchema,
McpError,
} from "@modelcontextprotocol/sdk/types.js";
import { QueryRepoSchema, queryRepo, ProgressNotifier } from "./tools/queryRepo.js";
import { zodToJsonSchema } from "zod-to-json-schema";
import { z } from "zod";
enum ToolName {
QUERY_REPO = "query_repo",
}
class CodeContextServer {
private server: Server;
constructor() {
this.server = new Server(
{
name: "code-context-mcp",
version: "0.1.0",
},
{
capabilities: {
tools: {},
},
}
);
this.setupToolHandlers();
// Error handling
this.server.onerror = (error) => console.error("[MCP Error]", error);
process.on("SIGINT", async () => {
await this.server.close();
process.exit(0);
});
}
private setupToolHandlers() {
this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
{
name: ToolName.QUERY_REPO,
description: "Queries a git repository",
inputSchema: zodToJsonSchema(QueryRepoSchema),
},
],
}));
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: input } = request.params;
const progressToken = request.params._meta?.progressToken;
switch (name) {
case ToolName.QUERY_REPO:
try {
// Create a progress notifier if we have a progress token
let progressNotifier: ProgressNotifier | undefined;
if (progressToken !== undefined) {
progressNotifier = {
sendProgress: async (progress: number, total: number) => {
await this.server.notification({
method: "notifications/progress",
params: {
progress: Math.floor(progress * 100),
total: total * 100,
progressToken,
},
});
},
};
}
// Get the raw result from queryRepo with progress notifications
const result = await queryRepo(
input as z.infer<typeof QueryRepoSchema>,
progressNotifier
);
// Format the response in Claude's expected structure
return {
content: [
{
type: "text",
text: JSON.stringify(result),
},
],
};
} catch (error) {
console.error("Error in query_repo:", error);
return {
content: [
{
type: "text",
text: `Error executing query: ${error instanceof Error ? error.message : String(error)}`,
},
],
};
}
default:
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
}
});
}
async run() {
const transport = new StdioServerTransport();
await this.server.connect(transport);
console.error("Jira MCP server running on stdio");
}
}
const server = new CodeContextServer();
server.run().catch(console.error);