MCP Tools for Obsidian
by jacksteamdev
import { logger, type ToolRegistry, ToolRegistryClass } from "$/shared";
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { registerFetchTool } from "../fetch";
import { registerLocalRestApiTools } from "../local-rest-api";
import { setupObsidianPrompts } from "../prompts";
import { registerSmartConnectionsTools } from "../smart-connections";
import { registerTemplaterTools } from "../templates";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
export class ObsidianMcpServer {
private server: Server;
private tools: ToolRegistry;
constructor() {
this.server = new Server(
{
name: "obsidian-mcp-tools",
version: "0.1.0",
},
{
capabilities: {
tools: {},
prompts: {},
},
},
);
this.tools = new ToolRegistryClass();
this.setupHandlers();
// Error handling
this.server.onerror = (error) => {
logger.error("Server error", { error });
console.error("[MCP Tools Error]", error);
};
process.on("SIGINT", async () => {
await this.server.close();
process.exit(0);
});
}
private setupHandlers() {
setupObsidianPrompts(this.server);
registerFetchTool(this.tools, this.server);
registerLocalRestApiTools(this.tools, this.server);
registerSmartConnectionsTools(this.tools);
registerTemplaterTools(this.tools);
this.server.setRequestHandler(ListToolsRequestSchema, this.tools.list);
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
logger.debug("Handling request", { request });
const response = await this.tools.dispatch(request.params, {
server: this.server,
});
logger.debug("Request handled", { response });
return response;
});
}
async run() {
logger.debug("Starting server...");
const transport = new StdioServerTransport();
try {
await this.server.connect(transport);
logger.debug("Server started successfully");
} catch (err) {
logger.fatal("Failed to start server", {
error: err instanceof Error ? err.message : String(err),
});
process.exit(1);
}
}
}