/**
* Combined handler dispatcher for the MCP server.
* @module
*/
import type { LogseqOperations } from "@logseq-ai/core";
import { isLogseqError, formatError } from "@logseq-ai/core";
import type { ToolResult } from "../types.js";
import { isValidationError, formatValidationError } from "../validation/index.js";
import { handlePageTools } from "./page-handlers.js";
import { handleTaskTools } from "./task-handlers.js";
import { handleJournalTools } from "./journal-handlers.js";
// Template handlers disabled - see tools/index.ts for explanation
// import { handleTemplateTools } from "./template-handlers.js";
/**
* Handles a tool call by dispatching to the appropriate handler.
*/
export async function handleToolCall(
ops: LogseqOperations,
name: string,
args: Record<string, unknown> | undefined
): Promise<ToolResult> {
try {
// Try each handler in order
let result = await handlePageTools(ops, name, args);
if (result) return result;
result = await handleTaskTools(ops, name, args);
if (result) return result;
result = await handleJournalTools(ops, name, args);
if (result) return result;
// Template handlers disabled - see tools/index.ts for explanation
// result = await handleTemplateTools(ops, name, args);
// if (result) return result;
// Unknown tool
return {
content: [{ type: "text", text: `Unknown tool: ${name}` }],
isError: true,
};
} catch (error) {
// Handle validation errors with user-friendly formatting
if (isValidationError(error)) {
return {
content: [{ type: "text", text: formatValidationError(error) }],
isError: true,
};
}
// Use formatError for detailed error messages from Logseq errors
const message = isLogseqError(error)
? formatError(error)
: error instanceof Error
? error.message
: String(error);
return {
content: [{ type: "text", text: `Error: ${message}` }],
isError: true,
};
}
}