{"server":{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","name":"io.github.henfrydls/actual-budget-mcp","description":"Actual Budget, carefully: deletes preview first, and new transactions check for duplicates.","title":"Actual Budget","repository":{"url":"https://github.com/henfrydls/actual-budget-mcp.git","source":"github","id":"henfrydls/actual-budget-mcp"},"version":"0.12.0","websiteUrl":"https://actual-mcp.henfrydls.com","icons":[{"src":"https://raw.githubusercontent.com/henfrydls/actual-budget-mcp/master/assets/icon.png","mimeType":"image/png","sizes":["512x512"]}],"packages":[{"registryType":"npm","identifier":"actual-budget-mcp","version":"0.12.0","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"URL of your Actual Budget server, for example http://localhost:5006","isRequired":true,"name":"ACTUAL_SERVER_URL"},{"description":"Password for your Actual Budget server. Not needed if you set ACTUAL_SESSION_TOKEN","isSecret":true,"name":"ACTUAL_PASSWORD"},{"description":"Session token for servers behind OIDC, which have no password. Use instead of ACTUAL_PASSWORD; if both are set, the token wins","isSecret":true,"name":"ACTUAL_SESSION_TOKEN"},{"description":"Your budget's Sync ID, found under Settings > Show advanced settings","isRequired":true,"name":"ACTUAL_BUDGET_ID"},{"description":"Only needed if your budget file is end-to-end encrypted","isSecret":true,"name":"ACTUAL_ENCRYPTION_PASSWORD"},{"description":"Every budget this server serves, comma separated, when it is more than one. Each tool then takes a budget_id, and each budget is opened in a process of its own","name":"ACTUAL_BUDGET_IDS"},{"description":"A JSON object of budget sync id to encryption password, for when more than one of the budgets is encrypted. Each worker is given its own and never the map","isSecret":true,"name":"ACTUAL_ENCRYPTION_PASSWORDS"},{"description":"How many budgets stay open at once. Defaults to 3. A fourth budget closes the one that went longest without a call","name":"ACTUAL_BUDGET_WORKERS"},{"description":"How long an open budget with nothing to do stays open. Defaults to 15","name":"ACTUAL_WORKER_IDLE_MINUTES"},{"description":"How long a call waits for a budget that is still opening before it answers that it is still opening. Defaults to 45","name":"ACTUAL_WORKER_READY_SECONDS"},{"description":"Set to 1 to hide every write tool from the model, exposing only reads and analysis","name":"ACTUAL_READ_ONLY"},{"description":"Set to chat to offer the 18 everyday tools instead of all 44, which is 17.4 KiB of tool descriptions instead of 39.7 KiB on every connection. Defaults to full","name":"ACTUAL_TOOLSET"},{"description":"Directory for the local budget cache","name":"ACTUAL_DATA_DIR"},{"description":"How long to wait for your server to start replying, in milliseconds. Defaults to 60000; raise it if a GoCardless bank sync is being cut off","name":"ACTUAL_HTTP_TIMEOUT_MS"},{"description":"Serve MCP over HTTP on this port instead of stdio. Only for a server you run yourself and point clients at: a client that starts this package itself speaks stdio and cannot reach it once this is set","name":"ACTUAL_HTTP_PORT"},{"description":"The credential for the read path, /mcp. Required once ACTUAL_HTTP_PORT is set, and at least 32 characters","isSecret":true,"name":"ACTUAL_HTTP_TOKEN"},{"description":"A second credential, for the write path, /mcp-write. Without it the server serves no write path at all","isSecret":true,"name":"ACTUAL_HTTP_WRITE_TOKEN"},{"description":"What to bind to. Defaults to 127.0.0.1; inside a container that is unreachable, so 0.0.0.0 together with ACTUAL_HTTP_ALLOW_REMOTE","name":"ACTUAL_HTTP_HOST"},{"description":"Set to 1 to bind somewhere other than loopback. Nothing here terminates TLS, so put something in front of it that does","name":"ACTUAL_HTTP_ALLOW_REMOTE"},{"description":"Hostnames to accept in the Host header, comma separated and without ports, for a server that is not on loopback. Anything else is answered 403","name":"ACTUAL_HTTP_ALLOWED_HOSTS"}]},{"registryType":"oci","identifier":"ghcr.io/henfrydls/actual-budget-mcp:0.12.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"URL of your Actual Budget server. Inside the container localhost is the container, so use host.docker.internal","isRequired":true,"name":"ACTUAL_SERVER_URL"},{"description":"Password for your Actual Budget server. Not needed if you set ACTUAL_SESSION_TOKEN","isSecret":true,"name":"ACTUAL_PASSWORD"},{"description":"Session token for servers behind OIDC, which have no password. Use instead of ACTUAL_PASSWORD; if both are set, the token wins","isSecret":true,"name":"ACTUAL_SESSION_TOKEN"},{"description":"Your budget's Sync ID, found under Settings > Show advanced settings","isRequired":true,"name":"ACTUAL_BUDGET_ID"},{"description":"Every budget this server serves, comma separated, when it is more than one. Each tool then takes a budget_id, and each budget is opened in a process of its own","name":"ACTUAL_BUDGET_IDS"},{"description":"A JSON object of budget sync id to encryption password, for when more than one of the budgets is encrypted. Each worker is given its own and never the map","isSecret":true,"name":"ACTUAL_ENCRYPTION_PASSWORDS"},{"description":"How many budgets stay open at once. Defaults to 3. A fourth budget closes the one that went longest without a call","name":"ACTUAL_BUDGET_WORKERS"},{"description":"How long an open budget with nothing to do stays open. Defaults to 15","name":"ACTUAL_WORKER_IDLE_MINUTES"},{"description":"How long a call waits for a budget that is still opening before it answers that it is still opening. Defaults to 45","name":"ACTUAL_WORKER_READY_SECONDS"},{"description":"Set to 1 to hide every write tool from the model, exposing only reads and analysis","name":"ACTUAL_READ_ONLY"},{"description":"Set to chat to offer the 18 everyday tools instead of all 44, which is 17.4 KiB of tool descriptions instead of 39.7 KiB on every connection. Defaults to full","name":"ACTUAL_TOOLSET"},{"description":"How long to wait for your server to start replying, in milliseconds. Defaults to 60000; raise it if a GoCardless bank sync is being cut off","name":"ACTUAL_HTTP_TIMEOUT_MS"},{"description":"Serve MCP over HTTP on this port instead of stdio. Only for a server you run yourself and point clients at: a client that starts this package itself speaks stdio and cannot reach it once this is set","name":"ACTUAL_HTTP_PORT"},{"description":"The credential for the read path, /mcp. Required once ACTUAL_HTTP_PORT is set, and at least 32 characters","isSecret":true,"name":"ACTUAL_HTTP_TOKEN"},{"description":"A second credential, for the write path, /mcp-write. Without it the server serves no write path at all","isSecret":true,"name":"ACTUAL_HTTP_WRITE_TOKEN"},{"description":"What to bind to. Defaults to 127.0.0.1; inside a container that is unreachable, so 0.0.0.0 together with ACTUAL_HTTP_ALLOW_REMOTE","name":"ACTUAL_HTTP_HOST"},{"description":"Set to 1 to bind somewhere other than loopback. Nothing here terminates TLS, so put something in front of it that does","name":"ACTUAL_HTTP_ALLOW_REMOTE"},{"description":"Hostnames to accept in the Host header, comma separated and without ports, for a server that is not on loopback. Anything else is answered 403","name":"ACTUAL_HTTP_ALLOWED_HOSTS"}]}]},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","statusChangedAt":"2026-11-04T11:49:45.717439Z","publishedAt":"2026-11-04T11:49:45.717439Z","updatedAt":"2026-11-04T11:49:45.717439Z","isLatest":true}}}
