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/exportsGET /api/exports/{id}/downloadPOST /api/exports/runGET /api/exports/schedulesPOST /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/confirmPOST /api/auth/email-change/requestPOST /api/auth/loginPOST /api/auth/logoutPOST /api/auth/send-otpPOST /api/auth/signupPOST /api/donor/auth/request-otpPOST /api/donor/auth/verify-otpPOST /api/external/signupPOST /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/runPOST /webhooks/mercuryPOST /webhooks/printerPOST /webhooks/retellPOST /webhooks/stripePOST /webhooks/stripe/connectPOST /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/confirmPOST /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/impersonationPOST /api/impersonation/end
Every one of them is still in the REST reference.