What isn't a tool

31 of the API's 216 operations are deliberately left out of the MCP server. Everything else is a tool automatically — a new endpoint becomes one the next time the API deploys.

A change is never left out for being consequential: every tool that changes data asks the person first. These are left out because they make no sense to drive from a conversation, each for the reason given.

Names every $5,000 contributor with an address, fully-anonymous donors included — their identity read from Stripe because Schedule B reports it to the IRS

Names every $5,000 contributor with an address, fully-anonymous donors included — their identity read from Stripe because Schedule B reports it to the IRS. Those donors chose to be unknown to everyone else; the Finance Tax tab hands the report to the preparer without a model context.

  • GET /api/tax-reports/{year}
  • GET /api/tax-reports/{year}/csv/{section}

Not implemented yet

backend/src/routes/exports.ts throws 501 NOT_IMPLEMENTED for every caller — nothing to wrap yet. Add a tool once exports.ts gets a real DAL-backed implementation.

  • GET /api/exports
  • GET /api/exports/{id}/download
  • POST /api/exports/run
  • GET /api/exports/schedules
  • POST /api/exports/schedules

Sign-in and account flows

Mints, spends or ends a credential. The MCP caller is already signed in through OAuth; signing in, signing up, resetting a password or changing the sign-in address from inside that session is a different account flow with its own emailed codes, and ending the session from a tool would cut off the connection making the call.

  • POST /api/auth/email-change/confirm
  • POST /api/auth/email-change/request
  • POST /api/auth/login
  • POST /api/auth/logout
  • POST /api/auth/send-otp
  • POST /api/auth/signup
  • POST /api/donor/auth/request-otp
  • POST /api/donor/auth/verify-otp
  • POST /api/external/signup
  • POST /api/orgs/verify-email

Donor portal only

Donor realm only (requireDonor). /mcp authenticates platform accounts and refuses donor tokens, so this tool could never be called.

  • POST /api/me/recurring/{donationId}/{action}

Machine to machine

Authenticated by a provider signature or a shared secret, not a person. A person has no reason to call it and no credential it would accept.

  • POST /api/recurring/run
  • POST /webhooks/mercury
  • POST /webhooks/printer
  • POST /webhooks/retell
  • POST /webhooks/stripe
  • POST /webhooks/stripe/connect
  • POST /webhooks/xeon

File uploads

Takes a multipart file upload (the invoice PDF). A tool call carries JSON arguments and has no way to attach a file.

  • POST /api/vouchers/{id}/receipt

Wipes an environment

Wipes and reseeds the whole graph, behind its own emailed one-time token. Not something to start from a conversation, and the confirmation this needs is the emailed token, not a dialog.

  • POST /api/admin/factory-reset/confirm
  • POST /api/admin/factory-reset/request

Identity and bank details

Submits an organization's legal identity and bank details — tax id, a representative's date of birth and SSN digits, account and routing numbers. Those must not pass through a model context; the portal's Payout tab is where they are entered.

  • POST /api/payout-accounts/{orgId}/eft-setup

Impersonation

Impersonation is adopted by the portal client, which then acts as the target. An MCP client cannot adopt it, so opening one here would leave a live impersonation session nobody is using.

  • POST /api/impersonation
  • POST /api/impersonation/end

Every one of them is still in the REST reference.