MCP server
Together exposes a remote MCP (Model Context Protocol) server so an AI assistant like Claude can work with your organisation's data directly - reading donors, donations and revenue, and taking safe actions on your behalf.
Endpoint
The server speaks Streamable HTTP at a single endpoint:
https://alltogether.giving/api/mcp
It authenticates with the same API key you use for the REST API - create one in Settings > API. A READ key can use the read tools; a WRITE key additionally unlocks the action tools. The key identifies both the caller and the organisation; all data is scoped to that organisation.
Connecting a client
Most MCP clients accept a server URL plus an Authorization: Bearer header. For example, to add the server to Claude Code:
claude mcp add --transport http together \ https://alltogether.giving/api/mcp \ --header "Authorization: Bearer pc_your_key_here"
In Claude.ai or Claude Desktop, add a custom connector with the endpoint URL and supply the API key as a request header. Treat the key like a password - anyone holding it can read your organisation's data.
Connecting with sign-in (OAuth, beta)
Enrolled organisations can also connect Claude with a sign-in flow instead of a pasted key. Add the same endpoint URL as a custom connector without a header; Claude registers itself, sends you to sign in to Together, and asks you to approve access. The connection then acts as you - it can do what your role allows (viewers get read-only), and the actions are attributed to your account.
No key to copy or store, and you can disconnect at any time. The sign-in flow needs a public address, so it works from Claude.ai and Claude Desktop - not against a local development server.
Tools
| Tool | What it does |
|---|---|
together_donors_list | Find a donor by name with search, or list donors filtered by exact email, donor type, or a created-at range. Cursor-paginated. A search needs at least three characters, matches each word across first name, last name, email and organisation name, and returns live donors only - so it is broader than the search on the in-app donors page, and its counts will not reconcile against an unfiltered list. To answer "my top donors by lifetime spend" pass segment (a slug from together_segments_list, needs the Grow plan) and sort (lifetime_given, last_90_days, last_donation, name or email; prefix - for descending). Sorted or segment-filtered results are a single page - the value sorts return a top-100 and need a segment or a 3+ character search. |
together_donor_get | Fetch one donor by id, with profile and giving summary. |
together_donations_list | List donations (confirmed by default). Filter by donor, source, revenue code, or date range. Amounts are gross, in the currency the response reports. Returns a summarywith a DB-computed total over the whole filter (not just the page), so totals aren't hand-summed. |
together_donation_get | Fetch one donation by id. |
together_revenue_codes_list | List revenue (attribution) codes. |
together_campaigns_list | List personalised-ask campaigns - the way to find the campaign id that campaign stats needs. Requires the Raise plan. |
together_campaign_stats | Realised-revenue stats for a personalised-ask campaign. Requires the Raise plan. |
together_revenue_summary | Total confirmed donations received in a date range, net of refunds, before platform fees, in your organisation's currency. Filter by donor, revenue code, source or status, and optionally group_by revenue code or source for a breakdown. |
together_worklist | The donors worth acting on today, ranked by the dollar opportunity in reaching them, with a suggested ask and a plain-English reason for each. Read-only. Requires the Grow plan. |
together_donor_intelligence | One donor's giving band, suggested ask and the reasons behind it. For a Compliance-add-on organisation it also returns how much room the donor has left under each donation cap - report it as given and link to the authoritative record; never treat it as a target. Read-only. Requires the Grow plan. |
together_segments_list | List the organisation's computed segments with their member counts - the way to find the segment slug that together_donors_list's segment filter needs. Read-only. Requires the Grow plan. |
together_contact_logs_list | List logged contacts with donors - calls, meetings, emails - filtered by donor, method, or outstanding follow-up. Note bodies are deliberately left out of the list; each entry says whether it has one. |
together_contact_log_get | Fetch one contact log entry by id, including its note. Use it for the entries whose notes you actually need, and to read back one you just recorded. |
together_org_get | Your organisation's name, timezone and default currency, so the assistant reports dates and money the way you do. |
together_compliance_overview | Donors approaching a cap and upcoming or overdue disclosure obligations, per jurisdiction. Requires the Compliance add-on. |
together_donor_compliance | One donor's cap status per jurisdiction and open disclosure obligations. Requires the Compliance add-on. |
together_generate_ask_link | Mint a personalised, donor-locked donation link for a form (WRITE). The returned URL is credential-bearing. |
together_contact_log_add | Record a contact with a donor - a call, meeting or email - with an optional follow-up (WRITE). |
How it relates to the REST API
Most tools are backed by the same /api/v1 endpoints (the compliance tools and the revenue summary are MCP-only), so they apply the identical plan gating, validation, rate limiting and audit logging. The MCP server is a natural-language front door, not a separate set of permissions. Tools with a plan requirement (for example campaign stats on Raise) return a plan error rather than silently degrading.
Errors differ, though. A tool backed by /api/v1passes the API's error envelope through, so its code reaches you unchanged. The three MCP-only tools (the two compliance tools and the revenue summary) have no REST sibling to inherit an envelope from: they return plain text with no error code - the reason your input was rejected where the fix is yours to make, and an unspecific "failed unexpectedly" otherwise, with the detail reported to Together rather than returned.
Related
- API reference - the endpoints every tool is backed by.
- Rate limits - tool calls share the same limiter model.
- Errors - the error codes an API-backed tool surfaces on failure (MCP-only tools return plain text with no code).