actual-mcp-server
MCP server for Actual Budget: 71 tools, HTTP + stdio, LibreChat & Claude Desktop ready
10K+
A production-ready Model Context Protocol (MCP) bridge that exposes Actual Budget APIs as conversational AI tools for LibreChat, LobeChat, Claude Desktop, and any MCP-compatible client.
✅ Verified: All 71 tools tested and working with LibreChat (HTTP/HTTPS + OIDC) and Claude Desktop (stdio native + mcp-remote).
--http), or as a direct local process for Claude Desktop (--stdio). No Docker or HTTP server is needed for local use.actual_budgets_switchdocker run -d \
--name actual-mcp-server \
-p 3600:3600 \
-e ACTUAL_SERVER_URL="http://your-actual-server:5006" \
-e ACTUAL_PASSWORD="your-password" \
-e ACTUAL_BUDGET_SYNC_ID="your-budget-id" \
-e MCP_SSE_AUTHORIZATION="$(openssl rand -hex 32)" \
-v actual-mcp-data:/app/data \
agigante80/actual-mcp-server:latest
# Also available on GHCR:
# ghcr.io/agigante80/actual-mcp-server:latest
# 1. Clone and build once
git clone https://github.com/agigante80/actual-mcp-server.git
cd actual-mcp-server && npm install && npm run build
# 2. Add to claude_desktop_config.json:
{
"mcpServers": {
"actual-budget": {
"command": "node",
"args": ["/absolute/path/to/actual-mcp-server/dist/src/index.js", "--stdio"],
"env": {
"ACTUAL_SERVER_URL": "http://localhost:5006",
"ACTUAL_PASSWORD": "your_actual_password",
"ACTUAL_BUDGET_SYNC_ID": "your-sync-id-here"
}
}
}
}
No auth token needed. All 71 tools available. Claude Desktop spawns the process and owns its lifecycle.
mkdir -p certs
openssl req -x509 -newkey rsa:4096 -nodes \
-keyout certs/key.pem -out certs/cert.pem \
-days 365 -subj "/CN=YOUR_SERVER_IP" \
-addext "subjectAltName=IP:YOUR_SERVER_IP"
docker run -d \
--name actual-mcp-server \
-p 3600:3600 \
-e ACTUAL_SERVER_URL="http://your-actual-server:5006" \
-e ACTUAL_PASSWORD="your-password" \
-e ACTUAL_BUDGET_SYNC_ID="your-budget-id" \
-e MCP_SSE_AUTHORIZATION="$(openssl rand -hex 32)" \
-e MCP_ENABLE_HTTPS=true \
-e MCP_HTTPS_CERT=/app/certs/cert.pem \
-e MCP_HTTPS_KEY=/app/certs/key.pem \
-v actual-mcp-data:/app/data \
-v $(pwd)/certs:/app/certs:ro \
agigante80/actual-mcp-server:latest
ACTUAL_SERVER_URL - Your Actual Budget server URLACTUAL_PASSWORD - Actual Budget passwordACTUAL_BUDGET_SYNC_ID - Budget sync ID (Settings → Show Advanced Settings → Sync ID)MCP_BRIDGE_PORT - Server port (default: 3600)MCP_TRANSPORT_MODE - Transport: --http or --stdioMCP_SSE_AUTHORIZATION - Bearer token for HTTP auth (generate with openssl rand -hex 32)MCP_ENABLE_HTTPS - Enable native TLS (true/false)MCP_HTTPS_CERT - Path to PEM certificateMCP_HTTPS_KEY - Path to PEM private keyConfigure multiple Actual Budget files so the AI can switch between them at runtime.
# Default budget
ACTUAL_SERVER_URL=http://actual:5006
ACTUAL_PASSWORD=my-password
ACTUAL_BUDGET_SYNC_ID=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
BUDGET_DEFAULT_NAME=Personal
# Budget 1 (same server)
BUDGET_1_NAME=Family
BUDGET_1_SYNC_ID=bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
# Budget 2 (separate server)
BUDGET_2_NAME=Business
BUDGET_2_SERVER_URL=https://actual-office.example.com
BUDGET_2_PASSWORD=office-password
BUDGET_2_SYNC_ID=cccccccc-cccc-cccc-cccc-cccccccccccc
create, list, update, delete, close, reopen, get balance
Basic Operations (6): create, get, update, delete, import, filter
⚡ Exclusive ActualQL Tools (6): search by month/amount/category/payee, spending summary by category, top vendors analysis
list available budgets, switch active budget, get all budgets, get months, get month, set amount, transfer between categories, set carryover, hold for next month, reset hold
create, list, update, delete (categories and category groups)
create, list, update, delete, merge, get payee-specific rules
create, list, update, delete
Batch multiple budget updates in a single call
Server status + transport info, Actual Budget server version, name-to-UUID resolver
List active MCP sessions, close sessions by ID
6 tools unique to this implementation using ActualQL's $transform, groupBy, $sum, and $count:
$month transformmcpServers:
actual-mcp:
type: "streamable-http"
url: "https://YOUR_SERVER_IP:3600/http"
headers:
Authorization: "Bearer YOUR_TOKEN"
serverInstructions: true
{
"mcpServers": {
"actual-budget": {
"command": "node",
"args": ["/path/to/actual-mcp-server/dist/src/index.js", "--stdio"],
"env": {
"ACTUAL_SERVER_URL": "http://localhost:5006",
"ACTUAL_PASSWORD": "your_password",
"ACTUAL_BUDGET_SYNC_ID": "your-sync-id"
}
}
}
}
{
"mcpServers": {
"actual-budget": {
"command": "npx",
"args": ["-y", "mcp-remote", "http://localhost:3600/http", "--header", "Authorization: Bearer YOUR_TOKEN"]
}
}
}
# HTTP health check
curl http://localhost:3600/health
# Expected: {"status":"ok","transport":"http","version":"..."}
# MCP handshake (verifies token)
curl -s -X POST http://localhost:3600/http \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
# Logs
docker logs actual-mcp-server
MIT License. See GitHub repository for details.
Content type
Image
Digest
sha256:ee73e4142…
Size
111.5 MB
Last updated
6 days ago
docker pull agigante80/actual-mcp-server