Qgiv MCP by usefulapi
by usefulapi.io · remote · no sign-in to list tools · v1.3.4 · published by io.usefulapi
Read Qgiv (Bloomerang Fundraising) donations, refunds, recurring gifts, P2P registrations, events.
21 tools: 1 do something that can't be undone and 20 only read.
Scanned Oct 22, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone1Claude Code: ask: see these tools
- Changes things0Claude Code: ask
- Only reads20Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http qgiv https://qgiv.usefulapi.io/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "qgiv_list_refunds_by_date" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "qgiv_list_refunds_by_date" says "list": a word for reading.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
21 tools
Can't be undone 1Claude Code: ask
qgiv_list_refunds_by_dateRefunds between two dates (inclusive), at most 31 days per call, paged with offset/limit.Reads text others write1 finding
Why it is in this group
- The name "qgiv_list_refunds_by_date" says "list": a word for reading.
- The description's first verb is "refund": a word that usually means money moves, which cannot be taken back.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Findings
- Warn
The server marks "qgiv_list_refunds_by_date" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "qgiv_list_refunds_by_date" says "list": a word for reading.
Description, as the server wrote it Refunds between two dates (inclusive), at most 31 days per call, paged with offset/limit. POST /reporting/refunds/dates/{begin}:{end}.
Annotations the server declares
- title: List refunds by date range
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
Only reads 20Claude Code: allow
qgiv_get_latest_statementsThe latest statement(s) for the organization or form, with summary totals (per-transaction rows left out).Reads text others writeNo findings
Why it is in this group
- The name "qgiv_get_latest_statements" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it The latest statement(s) for the organization or form, with summary totals (per-transaction rows left out). POST /reporting/statements/latest.
Annotations the server declares
- title: Get latest statements
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_get_pledgeOne pledge option by id.Reads text others writeNo findings
Why it is in this group
- The name "qgiv_get_pledge" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it One pledge option by id. POST /pledges/{id} (no package is sent, so nothing is changed).
Annotations the server declares
- title: Get pledge option
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_get_recurring_scheduleOne recurring donation schedule by id (read-only; schedules cannot be changed here).Reads text others writeNo findings
Why it is in this group
- The name "qgiv_get_recurring_schedule" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it One recurring donation schedule by id (read-only; schedules cannot be changed here). POST /reporting/recurring/{id}.
Annotations the server declares
- title: Get recurring gift schedule
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_get_refundOne refund in full by id (read-only; this server never issues refunds).Reads text others writeNo findings
Why it is in this group
- The name "qgiv_get_refund" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- untrusted-inputThe description's first sentence says "issue": it reads issues, which other people can write.
Description, as the server wrote it One refund in full by id (read-only; this server never issues refunds). POST /reporting/refunds/{id}.
Annotations the server declares
- title: Get refund
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_get_registrationOne peer-to-peer registration in full (purchase history, team, totals, child registrations).Reads text others writeNo findings
Why it is in this group
- The name "qgiv_get_registration" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it One peer-to-peer registration in full (purchase history, team, totals, child registrations). Contact details only with include_contact. POST /reporting/registrations/{id}.
Annotations the server declares
- title: Get P2P registration
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_get_report_mappingOne report mapping by id.Reads text others writeNo findings
Why it is in this group
- The name "qgiv_get_report_mapping" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it One report mapping by id. POST /reporting/mappings/{id}.
Annotations the server declares
- title: Get report mapping
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_get_statementOne statement by id with its transaction rows (first 100 shown; donor names only).Reads text others writeNo findings
Why it is in this group
- The name "qgiv_get_statement" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it One statement by id with its transaction rows (first 100 shown; donor names only). POST /reporting/statements/{id}.
Annotations the server declares
- title: Get statement
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_get_transactionOne transaction in full: donation lines, fund/restriction, dedication, custom-field answers, event packages, registrations, refunds.Reads text others writeNo findings
Why it is in this group
- The name "qgiv_get_transaction" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it One transaction in full: donation lines, fund/restriction, dedication, custom-field answers, event packages, registrations, refunds. Contact details only with include_contact; card data is reduced to the last four digits. POST /reporting/transactions/{id}.
Annotations the server declares
- title: Get transaction
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_list_custom_fieldsCustom (additional-question) fields configured on the form(s): id, reference, title, input type, required flags, display flags.Reads text others writeNo findings
Why it is in this group
- The name "qgiv_list_custom_fields" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Custom (additional-question) fields configured on the form(s): id, reference, title, input type, required flags, display flags. POST /customFields/list.
Annotations the server declares
- title: List custom fields
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_list_eventsEvents (ticketed/auction events) on the forms the token covers: id, dates and the top-level settings.Reads text others writeNo findings
Why it is in this group
- The name "qgiv_list_events" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Events (ticketed/auction events) on the forms the token covers: id, dates and the top-level settings. Set include_details for packages, questions and promo codes. Notification e-mail addresses are never returned. POST /events/list.
Annotations the server declares
- title: List events
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_list_pledgesPledge options configured on the form(s) (title, value, frequency, begin date, iterations, state), not donors' pledge records.Reads text others writeNo findings
Why it is in this group
- The name "qgiv_list_pledges" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Pledge options configured on the form(s) (title, value, frequency, begin date, iterations, state), not donors' pledge records. POST /pledges/list.
Annotations the server declares
- title: List pledge options
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_list_recent_refundsThe most recent refunds (read-only): id, original transaction, refund and settle dates, amount, payment type, last four digits, fund.Reads text others writeNo findings
Why it is in this group
- The name "qgiv_list_recent_refunds" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it The most recent refunds (read-only): id, original transaction, refund and settle dates, amount, payment type, last four digits, fund. POST /reporting/refunds/last/{limit}.
Annotations the server declares
- title: List recent refunds
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_list_recent_registrationsThe most recent peer-to-peer (Hobnob) event registrations: id, category, registrant name, team, fundraising goal and amount raised.Reads text others writeNo findings
Why it is in this group
- The name "qgiv_list_recent_registrations" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it The most recent peer-to-peer (Hobnob) event registrations: id, category, registrant name, team, fundraising goal and amount raised. Contact details only with include_contact. POST /reporting/registrations/last/{limit}.
Annotations the server declares
- title: List recent P2P registrations
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_list_recent_transactionsThe most recent donations/transactions (newest first as Qgiv returns them): id, status, date, amount, fee, net, donor name and id, form, recurring link, payment type and last four …Reads text others writeNo findings
Why it is in this group
- The name "qgiv_list_recent_transactions" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it The most recent donations/transactions (newest first as Qgiv returns them): id, status, date, amount, fee, net, donor name and id, form, recurring link, payment type and last four card digits, fund. Donor contact details are left out unless include_contact is set; full card numbers are never returned. POST /reporting/transactions/last/{limit}.
Annotations the server declares
- title: List recent transactions
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_list_recurring_schedulesRecurring donation schedules (read-only): id, start/end date, next billing date, frequency, amount, state, donor name and id, plus Qgiv's 12-month forecast.Reads text others writeNo findings
Why it is in this group
- The name "qgiv_list_recurring_schedules" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Recurring donation schedules (read-only): id, start/end date, next billing date, frequency, amount, state, donor name and id, plus Qgiv's 12-month forecast. Filter by status active, paused, expired or deleted. Paged with offset/limit. POST /reporting/recurring/list or /reporting/recurring/{status}.
Annotations the server declares
- title: List recurring gift schedules
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_list_registrations_by_datePeer-to-peer registrations between two dates (inclusive), at most 31 days per call, paged with offset/limit.Reads text others writeNo findings
Why it is in this group
- The name "qgiv_list_registrations_by_date" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Peer-to-peer registrations between two dates (inclusive), at most 31 days per call, paged with offset/limit. POST /reporting/registrations/dates/{begin}:{end}.
Annotations the server declares
- title: List P2P registrations by date range
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_list_report_mappingsReport mappings (accounting export mappings) on the form(s): id, identifier, mapping data, export service, type.Reads text others writeNo findings
Why it is in this group
- The name "qgiv_list_report_mappings" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Report mappings (accounting export mappings) on the form(s): id, identifier, mapping data, export service, type. POST /reporting/mappings/list.
Annotations the server declares
- title: List report mappings
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_list_statementsMonthly fee/payout statements: id, date, amount contributed, fees, refunded, debited, credited and the summary totals (without the per-transaction rows; use qgiv_get_statement for …Reads text others writeNo findings
Why it is in this group
- The name "qgiv_list_statements" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Monthly fee/payout statements: id, date, amount contributed, fees, refunded, debited, credited and the summary totals (without the per-transaction rows; use qgiv_get_statement for those). Paged with offset/limit. POST /reporting/statements/list.
Annotations the server declares
- title: List statements
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_list_transactions_after_idTransactions with an id greater than the given one, sorted by id ascending and paged with limit; next_after_id is the cursor for the next call (use it as after_id).Reads text others writeNo findings
Why it is in this group
- The name "qgiv_list_transactions_after_id" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Transactions with an id greater than the given one, sorted by id ascending and paged with limit; next_after_id is the cursor for the next call (use it as after_id). Handy for syncing new gifts. POST /reporting/transactions/after/{id}.
Annotations the server declares
- title: List transactions after an id
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
qgiv_list_transactions_by_dateTransactions between two dates (inclusive), at most 31 days per call, paged with offset/limit.Reads text others writeNo findings
Why it is in this group
- The name "qgiv_list_transactions_by_date" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Transactions between two dates (inclusive), at most 31 days per call, paged with offset/limit. Same fields as qgiv_list_recent_transactions. Qgiv has no server-side paging, so a busy range is fetched whole and sliced; use a shorter range if it is too large. POST /reporting/transactions/dates/{begin}:{end}.
Annotations the server declares
- title: List transactions by date range
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
No private-data, untrusted-input, outbound path in this server alone: no tool is tagged private-data or outbound.
- Reads private data0
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write21
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out0
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Remote posture
What anyone on the internet sees at the remote endpoint: an anonymous initialize and tools/list, and the public OAuth metadata.
Looked at Oct 22, 2026, 15:30 UTC, unchanged since Oct 22, 2026. No credentials were sent and no tool was called. What is looked at.
- Reachable
- yes
- HTTP status of an anonymous initialize
- 200
- tools/list served without credentials
- yes
- Tools that change things, listed without credentials
- 1
- Protocol version
- 2025-06-18
- WWW-Authenticate on 401
- not observed
- resource_metadata in WWW-Authenticate
- none
- RFC 9728 protected resource metadata
- https://qgiv.usefulapi.io/.well-known/oauth-protected-resource/mcp
- Authorization servers
- https://qgiv.usefulapi.io
- Legacy HTTP+SSE transport
- no
- Dynamic client registration
- yes
- Client ID metadata documents
- no
- HighThe whole server
The endpoint served tools/list without credentials, and the list has 1 tool that changes things (1 irreversible). Whether a call also works without credentials was not tested: tools are never called.
What this check looks forMatched text
https://qgiv.usefulapi.io/mcp: tools/list returned 21 tools to an anonymous client, including qgiv_list_refunds_by_date (irreversible)
Install
Pinned to version 1.3.4. Values in angle brackets are yours to fill in.
claude mcp add --transport http qgiv https://qgiv.usefulapi.io/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__qgiv__qgiv_list_recent_transactions",
"mcp__qgiv__qgiv_list_transactions_by_date",
"mcp__qgiv__qgiv_list_transactions_after_id",
"mcp__qgiv__qgiv_get_transaction",
"mcp__qgiv__qgiv_list_recent_refunds",
"mcp__qgiv__qgiv_get_refund",
"mcp__qgiv__qgiv_list_recurring_schedules",
"mcp__qgiv__qgiv_get_recurring_schedule",
"mcp__qgiv__qgiv_list_statements",
"mcp__qgiv__qgiv_get_latest_statements",
"mcp__qgiv__qgiv_get_statement",
"mcp__qgiv__qgiv_list_recent_registrations",
"mcp__qgiv__qgiv_list_registrations_by_date",
"mcp__qgiv__qgiv_get_registration",
"mcp__qgiv__qgiv_list_events",
"mcp__qgiv__qgiv_list_pledges",
"mcp__qgiv__qgiv_get_pledge",
"mcp__qgiv__qgiv_list_custom_fields",
"mcp__qgiv__qgiv_list_report_mappings",
"mcp__qgiv__qgiv_get_report_mapping"
],
"ask": [
"mcp__qgiv__qgiv_list_refunds_by_date"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as qgiv. Review it before you use it.
Capability tags behind 21 rules
- mcp__qgiv__qgiv_list_recent_transactions untrusted-input
- mcp__qgiv__qgiv_list_transactions_by_date untrusted-input
- mcp__qgiv__qgiv_list_transactions_after_id untrusted-input
- mcp__qgiv__qgiv_get_transaction untrusted-input
- mcp__qgiv__qgiv_list_recent_refunds untrusted-input
- mcp__qgiv__qgiv_list_refunds_by_date untrusted-input
- mcp__qgiv__qgiv_get_refund untrusted-input
- mcp__qgiv__qgiv_list_recurring_schedules untrusted-input
- mcp__qgiv__qgiv_get_recurring_schedule untrusted-input
- mcp__qgiv__qgiv_list_statements untrusted-input
- mcp__qgiv__qgiv_get_latest_statements untrusted-input
- mcp__qgiv__qgiv_get_statement untrusted-input
- mcp__qgiv__qgiv_list_recent_registrations untrusted-input
- mcp__qgiv__qgiv_list_registrations_by_date untrusted-input
- mcp__qgiv__qgiv_get_registration untrusted-input
- mcp__qgiv__qgiv_list_events untrusted-input
- mcp__qgiv__qgiv_list_pledges untrusted-input
- mcp__qgiv__qgiv_get_pledge untrusted-input
- mcp__qgiv__qgiv_list_custom_fields untrusted-input
- mcp__qgiv__qgiv_list_report_mappings untrusted-input
- mcp__qgiv__qgiv_get_report_mapping untrusted-input