Skip to content

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.

Final · 1

21 tools: 1 do something that can't be undone and 20 only read.

Scanned Oct 22, 2026

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/mcp

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "qgiv_list_refunds_by_date" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "qgiv_list_refunds_by_date" says "list": a word for reading.

    What this check looks for

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".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "qgiv_list_refunds_by_date" says "list": a word for reading.

      What this check looks for
    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.
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.

    Matched text

    https://qgiv.usefulapi.io/mcp: tools/list returned 21 tools to an anonymous client, including qgiv_list_refunds_by_date (irreversible)

    What this check looks for

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/mcp

Run 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.

.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