server.ts•2.78 kB
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { ObsidianAPI } from "./api/obsidian-api.js";
import {
createReadNoteTool,
createReadActiveNoteTool,
createListNotesTool,
createPatchNoteTool,
createAdvancedSearchJsonLogicTool,
readNoteDefinition,
readActiveNoteDefinition,
listNotesDefinition,
patchNoteDefinition,
advancedSearchJsonLogicDefinition,
} from "./tools/index.js";
/**
* Obsidian MCP Server class
* Handles server initialization and tool registration
*/
export class ObsidianMcpServer {
private server: McpServer;
private api: ObsidianAPI;
/**
* Create a new Obsidian MCP Server
*/
constructor() {
// Initialize Obsidian API
this.api = new ObsidianAPI();
// Initialize MCP server
this.server = new McpServer({
name: "obsidian-mcp",
version: "1.0.0",
});
// Register tools
this.registerTools();
}
/**
* Register all tools with the MCP server
*/
private registerTools() {
// 1. readNote - Read the contents of a specific note
this.server.tool(
readNoteDefinition.name,
readNoteDefinition.description,
readNoteDefinition.schema,
createReadNoteTool(this.api)
);
// 2. readActiveNote - Read the contents of the current active note
this.server.tool(
readActiveNoteDefinition.name,
readActiveNoteDefinition.description,
readActiveNoteDefinition.schema,
createReadActiveNoteTool(this.api)
);
// 3. listNotes - List all notes in the vault or a specific folder
this.server.tool(
listNotesDefinition.name,
listNotesDefinition.description,
listNotesDefinition.schema,
createListNotesTool(this.api)
);
// 4. patchNote - Patch a note with new content
this.server.tool(
patchNoteDefinition.name,
patchNoteDefinition.description,
patchNoteDefinition.schema,
createPatchNoteTool(this.api)
);
// 5. searchWithJsonLogic - Search with WithJsonLogic
this.server.tool(
advancedSearchJsonLogicDefinition.name,
advancedSearchJsonLogicDefinition.description,
advancedSearchJsonLogicDefinition.schema,
createAdvancedSearchJsonLogicTool(this.api)
);
}
/**
* Start the server
*/
async start() {
console.error("Obsidian MCP Server starting...");
const transport = new StdioServerTransport();
await this.server.connect(transport);
console.error("Obsidian MCP Server running on stdio");
// Handle termination
process.on("SIGINT", async () => {
console.error("Shutting down Obsidian MCP Server...");
await this.server.close();
process.exit(0);
});
}
}