Prototype · Preview: every server in the official registry, synced every 30 minutes. Sign in with Google to write reviews.
PopNx MCPMCP servers for people who use AI · explained in plain words

Beancount.io

by bex-coversion 1.0.0i★ 334iRuns in the cloud
Registry nameio.beancount/beancount

How to install

Overview

Description from the maker (original English)

Query, edit, and reconcile a hosted Beancount ledger: BQL, reports, files, and bank imports.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs in the cloud
  • Transport: Streamable HTTP
  • Category: Accounting, finance & tax

Install

Pick the AI app you use, then copy the settings.

Passed 5/5 checks · What you ask goes through the maker’s server (beancount.io)

First: which AI do you use?

Pick your app and the steps appear below.

Works with Claude · about 2 min

No key, nothing to install · Set it up once on claude.ai or the desktop app, then use it in chat · free accounts can add 1

  1. Open Claude’s Connectors page

    CustomizeConnectors

    CustomizeConnectors1+ Add2https://…3Add4
  2. Click “+ Add” → “Add custom connector” and fill in these 2 fields

    Copy each value into the field with the same name in Claude, then click Continue

    Name · NameBeancount.io
    Remote MCP server URL · Addresshttps://beancount.io/api-gateway/mcp

    Leave Authentication as Claude detected it, then click Add

  3. Turn it on in a chat

    +ConnectorsBeancount.io

  4. Try it

    Use Beancount.io and tell me what you can do for me, then show me one thing

    ✓ If Claude says it is using Beancount.io or shows a Beancount.io tool in the answer, you are connected

Menu names checked against Anthropic’s help page on Nov 11, 2026 · your screen may differ slightly by app version

Works with ChatGPT on business plans only

ChatGPT Business, Enterprise or Edu on the web, added by a workspace admin or owner · On Free, Plus or Pro: your ChatGPT plan cannot connect MCP yet

  1. Open ChatGPT’s add-MCP page on the web

    Plugins+Add custom MCP server

    ChatGPTPlugins1+2https://…3Create4
  2. Fill in the name and address

    Enter a name, paste the address under Connection, tick the risk warning and click Create as a plugin

    Name · NameBeancount.io
    Connection · Addresshttps://beancount.io/api-gateway/mcp
  3. Pick Beancount.io in a chat

    Start a new chat and pick Beancount.io from your plugins before typing

  4. Try it

    Use Beancount.io and tell me what you can do for me, then show me one thing

    ✓ If ChatGPT says it is using Beancount.io or shows a Beancount.io tool in the answer, you are connected

Menu names checked against OpenAI’s help page on Nov 11, 2026 · your screen may differ slightly by app version

Works with Claude Code · about 2 min

No key, nothing to install

  1. Open Terminal

    Mac: press Command+Space and type Terminal · Windows: open PowerShell

  2. Paste this command and press Enter

    claude mcp add --transport http beancount https://beancount.io/api-gateway/mcp
  3. Type /mcp in Claude Code

    You should see Beancount.io listed as connected

  4. Try it

    Use Beancount.io and tell me what you can do for me, then show me one thing

    ✓ If Claude Code says it is using Beancount.io or shows a Beancount.io tool in the answer, you are connected

Menu names checked against Anthropic’s help page on Nov 11, 2026 · your screen may differ slightly by app version

Works with Cursor · about 2 min

No key, nothing to install

  1. Click this button to open Cursor

    Open in Cursor

    Cursor asks you to confirm; click Install

  2. Open the AI chat in Cursor in Agent mode

  3. Try it

    Use Beancount.io and tell me what you can do for me, then show me one thing

    ✓ If Cursor says it is using Beancount.io or shows a Beancount.io tool in the answer, you are connected

Menu names checked against Cursor’s help page on Nov 11, 2026 · your screen may differ slightly by app version

Works with VS Code · about 2 min

No key, nothing to install

  1. Click this button to open VS Code

    Open in VS Code

    VS Code asks you to confirm; click Install

  2. Open the AI chat in VS Code in Agent mode

  3. Try it

    Use Beancount.io and tell me what you can do for me, then show me one thing

    ✓ If VS Code says it is using Beancount.io or shows a Beancount.io tool in the answer, you are connected

Menu names checked against VS Code’s help page on Nov 11, 2026 · your screen may differ slightly by app version

Other apps that use MCP, such as Windsurf, Zed or Gemini CLI, each add servers differently. See how in the app list.

See every app that uses MCP →

Address for apps that connect over the web

Addresshttps://beancount.io/api-gateway/mcp

JSON settings are under “For developers” below

Stuck? Ask people who use Beancount.io💬 Discussion →
For developers: Terminal commands and JSON settings

Over the web

Claude Code

claude mcp add --transport http beancount https://beancount.io/api-gateway/mcp

Cursor (~/.cursor/mcp.json)

{
  "mcpServers": {
    "beancount": {
      "url": "https://beancount.io/api-gateway/mcp"
    }
  }
}

VS Code (mcp.json)

{
  "servers": {
    "beancount": {
      "type": "http",
      "url": "https://beancount.io/api-gateway/mcp"
    }
  }
}

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

At a glance

Downloads per weeki
Not on npm/PyPI
Verified domain
✓ beancount.io
Connection
Runs in the cloud
Transport
streamable-http
Latest versioni
1.0.0
Published to registryi
Oct 6, 2026
Code last changedi
Nov 11, 2026
Maker
bex-co
Website
github.com
Registry status
Active

Which apps can use it

Based on how this server connects and on each app’s own docs, checked Nov 10, 2026.

Connect over the internet in

ClaudeChatGPTGooseLM StudioMsty StudioCherry StudioCursorVS Code + GitHub CopilotVisual StudioWindsurf (Devin Desktop)ZedKiroClineContinueJetBrains AI AssistantClaude CodeCodex CLIGemini CLIOpenCodenodecodeWarpLibreChatOpen WebUIRaycast

All apps, with pros and cons →

Related guides

What it can do

The server asks you to sign in before it lists its tools.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 11, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified against the domain beancount.io (the registry checks domain ownership)

  • ✓ Pass

    Still maintained

    Code last changed today

  • ✓ Pass

    Has a licence

    Uses MIT

  • ✓ Pass

    Endpoint responds

    Responded in 197 ms (HTTP 401)

  • ✓ Pass

    Sign-in with OAuth

    Declares OAuth sign-in, so your AI app can take you to log in

  • … Not checked yet

    No hidden instructions in tool descriptions

    Not checked yet; we read the tool list when we check the endpoint

Discussion

Ask, share a tip or report that it does not work. Sorted by what people marked helpful.

No posts yet. Be the first to ask or share.

Posts here are written by users, not the PopNx team.

Sign in with Google to post

User reviews

No reviews yet

Sign in with Google to write a review

Compared with others in Accounting, finance & taxi

  • More stars than 100% of the other 3119 servers in this category
  • Published to the registry more recently than 46% of the other 3119 servers in this category
  • Basic checks equal to or better than 100% of the other 3119 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is Beancount.io safe?

It passed 5 of 5 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

The registry does not list a required key, though some servers ask you to sign in on first use.

Does it run on my computer or in the cloud?

It runs in the maker’s cloud. Connect over the internet with nothing to install, but what you send passes through the maker’s servers.

Is it still maintained?

The GitHub repo last changed today, and the latest version (1.0.0) reached the registry 36 days ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. It connects by URL, so apps that accept remote MCP servers work too, such as ChatGPT Business and above.

What can I use instead?

In the same category: CCXT, Finance Toolkit, AKQuant

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:↓ Downloads per weeki★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

CCXT

Official CCXT MCP server - Market data and trading across 100+ exchanges and prediction markets

by ccxtWidely used↓ 667/wk★ 44.8KUpdated 2 months ago

Runs on your computer

Finance Toolkit

500+ transparent financial methods calculated from raw statements, not third-party endpoints.

by JerBoumaWidely used↓ 15.6K/wk★ 5.5KUpdated 2 days ago

Computer or cloud

AKQuant

Write and backtest trading strategies with AKQuant: API lookup, strategy checks, backtest runs

by akfamilyWidely used↓ 3.3K/wk★ 2.6KUpdated 2 days ago

Runs on your computer

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

Beancount.io Backend

Backend for Beancount.io, the hosted plain-text accounting service.

Overview

The backend is built with Node.js and TypeScript using Koa and GraphQL. It powers the API and background jobs for Beancount.io. Key features include:

  • GraphQL APIs served via Apollo Server and Koa
  • TypeScript for a type-safe codebase
  • PostgreSQL with Drizzle ORM for database operations
  • Redis for caching
  • Background jobs for data processing

For password admission, API quotas, email recovery and deployment requirements, see Authentication and rate limits. Signup's explicit account-existence response remains a deliberate product choice. Frequent Git automation should use SSH keys rather than repeatedly present an account password over HTTP.

Billing

The supported application client is beancount-web-prod, configured by STRIPE_PRIVATE_KEY, STRIPE_PUBLIC_KEY, and STRIPE_WEBHOOK_SECRET. Every billing-portal session uses the configuration pinned in SUBSCRIPTION_CONFIG, which allows payment methods, invoices and billing details only; plan changes go through changePlan. Billing uses live subscriptions and recognized current/legacy prices; an old cached period or unknown price cannot identify a purchased plan. Only verified live webhooks may refresh a customer's cache. Stripe failures do not clear stored periods.

GA4 purchase events are recorded by the dashboard, in the browser, once the payment is confirmed; the backend sends no analytics. A paid Checkout returns to the dashboard confirmation (/settings/billing?checkout=success&session_id=…), and changePlan reports the invoice an immediate change charged (invoiceId, amountPaid, currency) so the dashboard counts it once.

The retired beancount-web-dev tenant and STRIPE_DEV_* variables are ignored; no fake-paid script replaces them. Keep isolated Stripe testing outside live application billing.

Project Structure

backend-v2/

├── docs/ # API and operator guides ├── scripts/ # Deployment migrations and developer tools ├── src/ │ ├── config/ # Environment-backed application configuration │ ├── drizzle/ # PostgreSQL setup and tracked migrations │ ├── features/ # Domain adapters, workflows, services and models │ ├── foundation/ # Composition, external clients and Redis │ ├── scheduler/ # Scheduled jobs, including authentication mail │ ├── server/ # Koa, GraphQL, REST and MCP transport setup │ └── shared/ # Errors, caching, logging and utilities ├── server.ts # Application entry point └── package.json

Getting Started

This guide assumes a Unix-like environment. If you are on Windows, see Run on Windows.

Prerequisites
  • Node.js 20+
  • PostgreSQL
  • Redis
  • Git
Setup
  1. Clone the repository:
git clone git@github.com:bex-co/beancount-io.git

cd beancount-io/backend-cluster/backend-v2

  1. Install dependencies:
yarn install
  1. Set up environment variables:

Create a .env file in the backend directory with the necessary environment variables. Required variables include:

POSTGRES_BACKEND_URI=postgresql://user:password@localhost:5432/beancount

REDIS_URI=redis://localhost:6379 FAVA_API_URL=http://localhost:8000 FAVA_API_ADMIN_USER=admin FAVA_API_ADMIN_PASSWORD=your_password AUTH_SECRET=replace_with_a_strong_shared_deployment_secret SERVER_URL=http://localhost:4104 DASHBOARD_URL=http://localhost:5173

Optional: login/register JWT lifetime in minutes (default 525600 = 365 days)

AUTH_JWT_EXP_MINUTES=5

Optional: reverse proxies in front of this server that append to

X-Forwarded-For (default 1; 0 when clients connect directly)

TRUSTED_PROXY_HOPS=1

Keep AUTH_SECRET non-empty and consistent across API/worker processes and restarts: it signs sessions and derives authentication-mail encryption and recovery-proof keys. Never commit its real value.

  1. Apply the database migrations before starting the server:
node --env-file=.env scripts/migrate-deploy.js

yarn start

The deployment equivalent is yarn migrate:deploy with environment variables already injected. This includes the auth_mail outbox migration; starting the API without it cannot enqueue recovery mail. The normal server starts its authentication-mail worker automatically, every five seconds.

Development/test ConsoleSendGrid suppresses delivery and never prints email contents, addresses, links or OTPs. Human email/signup/recovery verification requires a fully configured mail deployment: the production client uses SEND_GRID_API_KEY and its configured sender. Automated tests capture synthetic mail without contacting a provider. See the operator guide for the worker, Redis and recovery prerequisites.

Production OAuth requires OAUTH_JWKS, a complete private P-256/ES256 signing JWKS provided by the deployment secret manager. It must never be committed or copied into .env.example. When it is absent or malformed, OAuth endpoints return 503 oauth_not_configured; the existing API and legacy JWT login remain available. Development and tests generate an ephemeral process-local key.

Rotate an OAuth signing key by installing the replacement secret, deploying it, and removing the replaced public key from the served JWKS. Deleting a historical private key from Git without replacing the accepted live key does not invalidate tokens signed with it.

REST API quickstart

Personal access tokens are available to paid plans. Sign in, open Personal access tokens, create a token with the least privilege your integration needs, and copy it when it is shown. The plaintext cannot be recovered later; keep it in a secret manager and never commit it.

Start with the safe ledger-listing endpoint:

export BEANCOUNT_API_KEY="bcio_your_token_here"

curl --fail-with-body \ --header "x-api-key: $BEANCOUNT_API_KEY" \ https://api.v3.beancount.io/api-gateway/v1/ledgers

The interactive API reference shows the available endpoints, request schemas, and required permissions.

OAuth deployment contract

DASHBOARD_URL is the public authorization-server and consent front door in production. SERVER_URL is the direct backend URL used by the local development stack. They are normal public deployment configuration, not OAuth secrets. Both default to the official service in production; development defaults to the local backend and dashboard. HTTPS is mandatory except for localhost, 127.0.0.1, or ::1 outside production. If a production reverse proxy publishes Beancount under a path prefix, include that prefix in DASHBOARD_URL without a trailing slash.

The localhost stack uses different ports but the same hostname. Production deployments should normally expose both through one HTTPS front door.

Discovery starts at the RFC 9728 URL derived from the API resource. For an issuer https://books.example.test/beancount, the API resource and discovery chain are:

resource: https://books.example.test/beancount/v1

protected resource metadata: https://books.example.test/.well-known/oauth-protected-resource/beancount/v1 authorization server metadata: https://books.example.test/.well-known/oauth-authorization-server/beancount

The proxy must route those well-known paths, the issuer-prefixed /api-gateway/oauth/* endpoints, and the interaction pages to this backend and dashboard respectively. On the dashboard host (APP_DOMAIN), /.well-known/* must reach this backend so Apple and Google can fetch the native app-link vouchers from the same origin as /ledger/... links.

Validating a credential from outside

There are two ways to check a credential Beancount.io issued, and they answer different questions. Pick deliberately.

Offline, against the published keys. OAuth access tokens are ES256 JWTs carrying iss, aud, and kid. Their public keys are served at /api-gateway/oauth/jwks and discoverable through the RFC 8414 document above, so any standard validator (jose's createRemoteJWKSet, an API gateway's JWT filter) can verify one with no call to us.

This proves the token _was issued_ and has not expired. It cannot tell you the grant was revoked five minutes ago, and it does not work at all for the other two credential kinds: session tokens are HS256 (publishing the key would publish the ability to mint them), and bcio_ API keys are not JWTs and have no signature to check.

Online, by asking. POST /api-gateway/v1/token/introspect (RFC 7662) answers for all three kinds, including whether the credential is live _right now_:

curl -sS https://beancount.io/api-gateway/v1/token/introspect \

-H 'x-api-key: bcio_your_own_key' \ -H 'content-type: application/json' \ -d '{"token":"bcio_the_key_you_are_checking"}'

{

"active": true, "sub": "usr_7wXzK9mN", "scope": "ledger.read ledger.write", "jti": "akey_7wXzK9mN", "iat": 1767225600, "exp": 1798761600, "bio_credential_kind": "apikey", "bio_assurance": "delegated", "bio_ledger_scope": "alice/main-ledger" }

A credential that is not usable returns exactly this, and nothing more:

{ "active": false }

Expired, malformed, revoked, never-issued, and belonging to another user all produce that identical body on purpose — a response that distinguished them would let a caller enumerate which credentials were once real and when each was revoked.

Three things to know before you build against it:

  • It is never anonymous. The endpoint requires its own credential. Without that rule it would turn any stolen token into "valid, user X, may write ledger Y". A caller that cannot authenticate gets 401/403, never {"active": false}.
  • You may introspect your own credentials, and only your own. A token belonging to someone else reads as inactive. So this serves a gateway or agent runtime acting for the same user; it is not a multi-tenant validation service.
  • `scope` is effective capability, not the raw grant. A session token is not scope-constrained and reports all three ledger scopes. Do not read an empty-looking grant as "no permissions".

Fields prefixed bio_ are ours rather than RFC 7662; everything else is the standard document. The same operation is on GraphQL as Query.introspectToken. It is deliberately not an MCP tool, and not advertised as introspection_endpoint in the RFC 8414 metadata — both reasons are in ADR 0017.

Introspection works on a deployment that has never configured OAuth: API keys and session tokens still resolve, and an OAuth token reports active: false, which is true there.

Native app links

This server always answers:

  • GET /.well-known/apple-app-site-association — Apple Universal Links for io.beancount.ios (team PTLM7BZQMM) on /ledger/*
  • GET /.well-known/assetlinks.json — Android App Links for io.beancount.android, with the Play App Signing certificate's SHA-256

Both identify Beancount.io's official apps and are hard-coded in src/features/well-known/api/well-known-route.ts; there is nothing to configure. The apps only claim beancount.io, so serving the same files on a self-hosted domain associates nothing.

OpenAI apps domain proof

GET /.well-known/openai-apps-challenge answers with the token the OpenAI Plugins dashboard issued for Beancount.io's app submission, as text/plain. The token is not a secret, so it is a constant in well-known-route.ts, not an environment variable. Only a deployment whose DASHBOARD_URL is https://beancount.io serves it; every other deployment answers 404.

MCP Registry domain proof

Optional. MCP_REGISTRY_AUTH_PROOF holds the public half of the key that signs Beancoun

Only the beginning is shown; read the rest in the repo