@baruchiro/actual-mcp
Version:
Actual Budget MCP server exposing API functionality
61 lines (60 loc) • 2.33 kB
JavaScript
// ----------------------------
// TOOLS
// ----------------------------
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
import { initActualApi, shutdownActualApi } from "../actual-api.js";
import { schema as getTransactionsSchema, handler as getTransactionsHandler, } from "./get-transactions/index.js";
import { schema as spendingByCategorySchema, handler as spendingByCategoryHandler, } from "./spending-by-category/index.js";
import { schema as monthlySummarySchema, handler as monthlySummaryHandler, } from "./monthly-summary/index.js";
import { schema as balanceHistorySchema, handler as balanceHistoryHandler, } from "./balance-history/index.js";
import { error, errorFromCatch } from "../utils/response.js";
export const setupTools = (server) => {
/**
* Handler for listing available tools
*/
server.setRequestHandler(ListToolsRequestSchema, toolsSchema);
/**
* Handler for calling tools
*/
server.setRequestHandler(CallToolRequestSchema, async (request) => {
try {
await initActualApi();
const { name, arguments: args } = request.params;
// Execute the requested tool
switch (name) {
case "get-transactions": {
// TODO: Validate against schema
return getTransactionsHandler(args);
}
case "spending-by-category": {
return spendingByCategoryHandler(args);
}
case "monthly-summary": {
return monthlySummaryHandler(args);
}
case "balance-history": {
return balanceHistoryHandler(args);
}
default:
return error(`Unknown tool ${name}`);
}
}
catch (error) {
console.error(`Error executing tool ${request.params.name}:`, error);
return errorFromCatch(error);
}
finally {
await shutdownActualApi();
}
});
};
function toolsSchema() {
return {
tools: [
getTransactionsSchema,
spendingByCategorySchema,
monthlySummarySchema,
balanceHistorySchema,
],
};
}