Skip to content

Did It Work?

org.diditwork/did-it-workdiditwork.orgstreamable-httpv0.2.16Scanned

Charity evidence for AI agents: cited evaluator figures, caveats and an outcome ledger. Read-only.

19 tools: 4 change things and 15 only read.

Tools: 0 delete, 0 irreversible, 4 write, 15 read.
  • Reads private data · 0
  • Reads text others write · 1
  • Can send data out · 0
  • 1 finding

Anlyon alternative

4 of these tools change something. Run those as governed actions.

Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.

Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.

Import an OpenAPI spec →

Tools

Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.

19 tools

Changes things 4Claude Code: ask
  • allocate_portfolioSuggest a donor portfolio: split budget_usd across top-ranked orgs (conviction_weighted / equal_split / top_only).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Suggest a donor portfolio: split budget_usd across top-ranked orgs (conviction_weighted / equal_split / top_only). Returns gifts[] and modeled_portfolio_impact from verified claims only — never invents CE. Always modeled≠guaranteed.

    Annotations the server declares

    • title: Allocate portfolio
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • create_giving_intentNO-CHARGE deep-link giving handoff (Phase 3 MVP).1 finding

    Why it is in this group

    • The name "create_giving_intent" says "create": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "create_giving_intent" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "create_giving_intent" says "create": a word for a change.

      What this check looks for
    Description, as the server wrote it
    NO-CHARGE deep-link giving handoff (Phase 3 MVP). Returns mode=deep_link, org donate_url, donation_proof=null, charge=false. Better World never processes payment, stores cards, or calls Stripe. Optional modeled_impact is modeled≠guaranteed. Prefer GET; POST accepts the same fields as JSON body.

    Annotations the server declares

    • title: Create giving intent
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • estimate_impactModeled expected outcomes from verified org claims scaled by gift_usd.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Modeled expected outcomes from verified org claims scaled by gift_usd. Always modeled:true and guaranteed:false. Never invents CE; returns insufficient_data when no usable verified unit.

    Annotations the server declares

    • title: Estimate impact
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • recommend_charityConviction-ranked orgs for one outcome family.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Conviction-ranked orgs for one outcome family. Pass values_profile_id (preferred) and/or outcome. Returns values_filtering + exclusions[] with why-filtered reasons (never silent red-line drops). Does not mix units (ADR 0007 Proposed). Never invents CE.

    Annotations the server declares

    • title: Recommend charity
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
Only reads 15Show 15 read-only tools
  • compare_charitiesSide-by-side claims, recommendation tiers, and trust for two or more org_* ids.No findings

    Why it is in this group

    • The name "compare_charities" says "compare": a word for reading.
    Description, as the server wrote it
    Side-by-side claims, recommendation tiers, and trust for two or more org_* ids.

    Annotations the server declares

    • title: Compare charities
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_claimFetch one claim row by claim_id from data/claims_index.json (e.g.No findings

    Why it is in this group

    • The name "get_claim" says "get": a word for reading.
    Description, as the server wrote it
    Fetch one claim row by claim_id from data/claims_index.json (e.g. eval_gw_amf__0). Index-only — never invents values. Prefer list_claims with filters when browsing. Wave BI provenance on the response. Org narrative fields remain untrusted (ADR 0008).

    Annotations the server declares

    • title: Get claim
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_ledger_recordFetch one outcome-ledger record by record_id (e.g.No findings

    Why it is in this group

    • The name "get_ledger_record" says "get": a word for reading.
    Description, as the server wrote it
    Fetch one outcome-ledger record by record_id (e.g. ldg_eval_gw_amf__0) plus any follow-up results. Read-only; 404 for unknown ids; modeled, not guaranteed. Read-only API, live at https://api.diditwork.org.

    Annotations the server declares

    • title: Get ledger record
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_metaAPI version, discovery links, Wave BI provenance, and Wave CE/DD reproducibility audit snapshot fields so agents can prove which product_version + data_snapshot_id + claims_index_f…No findings

    Why it is in this group

    • The name "get_meta" says "get": a word for reading.
    Description, as the server wrote it
    API version, discovery links, Wave BI provenance, and Wave CE/DD reproducibility audit snapshot fields so agents can prove which product_version + data_snapshot_id + claims_index_fingerprint they ranked against. Includes mixes_units_in_ranking:false, adr_0007_status (from moral_weights_policy.json — Proposed until Ho Hum Accept; never invent Accepted), claims_index_fingerprint (short sha256 of data/claims_index.json), and counts {orgs, interventions, causes, sources_files}. Focused twin: GET /v1/meta/snapshot (same audit_snapshot object). Never invents CE.

    Annotations the server declares

    • title: Get meta
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_orgFetch one organization / program / fund record by stable org_* id.No findings

    Why it is in this group

    • The name "get_org" says "get": a word for reading.
    Description, as the server wrote it
    Fetch one organization / program / fund record by stable org_* id.

    Annotations the server declares

    • title: Get org
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_review_queueHuman exception-review queue (read-only).Reads text others writeNo findings

    Why it is in this group

    • The name "get_review_queue" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe name "get_review_queue" says "get" and "review": it reads comments, which other people can write.
    • untrusted-inputThe description's first sentence says "review": it reads comments, which other people can write.
    Description, as the server wrote it
    Human exception-review queue (read-only). Returns items from data/review/queue.json for Ho Hum (sole human operator). Default status=open; pass status=all for history. Approve/reject is offline file edit only — write_api is always false; there is no unauthenticated write/approve API. Agents must never auto-clear trust flags or invent CE/EINs/donate URLs to close tickets.

    Annotations the server declares

    • title: Get review queue
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_taxSanitized trust/tax-status summary for an org with always-on not-tax-advice disclaimer.No findings

    Why it is in this group

    • The name "get_tax" says "get": a word for reading.
    Description, as the server wrote it
    Sanitized trust/tax-status summary for an org with always-on not-tax-advice disclaimer. Prefer before asserting US deductibility. deductibility.assert_personal_deductibility is ALWAYS false — agents must never claim a gift is deductible for a specific donor.

    Annotations the server declares

    • title: Get tax
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_trustTrust and safety flags for an org.No findings

    Why it is in this group

    • The name "get_trust" says "get": a word for reading.
    Description, as the server wrote it
    Trust and safety flags for an org. REQUIRED before asserting US tax deductibility or registry status.

    Annotations the server declares

    • title: Get trust
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_values_profileFetch one values-profile preset by id (vp_*).No findings

    Why it is in this group

    • The name "get_values_profile" says "get": a word for reading.
    Description, as the server wrote it
    Fetch one values-profile preset by id (vp_*). Use after list_values_profiles or when the donor picked a named preset. Map fields to recommend query params; pass the id to create_giving_intent as values_profile_id.

    Annotations the server declares

    • title: Get values profile
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_charitiesThe Did it work?No findings

    Why it is in this group

    • The name "list_charities" says "list": a word for reading.
    Description, as the server wrote it
    The Did it work? charity list, filtered: the charities https://diditwork.org/charities/ shows for cause, evaluator (by), measure, follow-up and a word search, in the page's own order. Hide-only: filters never re-order, score or rank, and there are no figures here (each row links to its claims file and API record). Same JSON as https://diditwork.org/charities/index.json for the same filter. Unknown, empty or misspelled values return isError with invalid_filter, the allowed values and a cleaned address, never a guess. Call with no arguments to get the full list and every allowed value with its count. Read-only API, live at https://api.diditwork.org.

    Annotations the server declares

    • title: List charities
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_claimsRead-only flat claims index (data/claims_index.json).No findings

    Why it is in this group

    • The name "list_claims" says "list": a word for reading.
    Description, as the server wrote it
    Read-only flat claims index (data/claims_index.json). Optional filters: org_id, evaluation_id, verified. Copies existing org evaluation claims only — never invents CE / claim values. Prefer verified:true + non-null value when quoting cost-effectiveness. Wave BI provenance on the response. Org narrative fields remain untrusted (ADR 0008).

    Annotations the server declares

    • title: List claims
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_leaderboardsPer-outcome-family leaderboards from data/ranking/leaderboards.json.No findings

    Why it is in this group

    • The name "list_leaderboards" says "list": a word for reading.
    Description, as the server wrote it
    Per-outcome-family leaderboards from data/ranking/leaderboards.json. Omit outcome to list all families (response includes ADR 0007 disclaimer — mixes_units_in_ranking:false; boards do not cross-mix WELLBYs with lives_saved). Pass outcome= to fetch one family's frozen ranked board. Never invents cross-unit moral weights.

    Annotations the server declares

    • title: List leaderboards
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_ledger_recordsList outcome-ledger ("Did it work?") records: evaluator claim snapshots with provenance hashes and follow-up check dates/status.No findings

    Why it is in this group

    • The name "list_ledger_records" says "list": a word for reading.
    Description, as the server wrote it
    List outcome-ledger ("Did it work?") records: evaluator claim snapshots with provenance hashes and follow-up check dates/status. Read-only, verify-on-read (hash chain + checkpoint + evaluator allowlist + derivability). Read-only API, live at https://api.diditwork.org.

    Annotations the server declares

    • title: List ledger records
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_values_profilesList static values-profile presets (same catalog as the demo).No findings

    Why it is in this group

    • The name "list_values_profiles" says "list": a word for reading.
    Description, as the server wrote it
    List static values-profile presets (same catalog as the demo). Load before recommend when the donor stated preferences. Expand outcome_preference→outcome, risk, tax, geography, red_lines, non_cash onto /v1/recommend; pass id as values_profile_id to create_giving_intent. Read-only; never mutates ranking CE.

    Annotations the server declares

    • title: List values profiles
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • search_orgsHeuristic search by cause, outcome family, or donor intent phrase.No findings

    Why it is in this group

    • The name "search_orgs" says "search": a word for reading.
    Description, as the server wrote it
    Heuristic search by cause, outcome family, or donor intent phrase. Prefer recommend_charity when the user wants ranked 'best for outcome' results.

    Annotations the server declares

    • title: Search orgs
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

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

Findings

Matches of fixed checks, with the text they matched.

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

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "create_giving_intent" says "create": a word for a change.

    What this check looks for

History

Changes to its tool definitions and to its remote endpoint, newest first.

No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.

Install

Pinned to version 0.2.16. Values in angle brackets are yours to fill in.

claude mcp add --transport http did-it-work https://api.diditwork.org/mcp
claude mcp add --transport http did-it-work https://api.diditwork.org/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__did-it-work__get_meta",
      "mcp__did-it-work__list_leaderboards",
      "mcp__did-it-work__get_review_queue",
      "mcp__did-it-work__compare_charities",
      "mcp__did-it-work__get_org",
      "mcp__did-it-work__search_orgs",
      "mcp__did-it-work__get_trust",
      "mcp__did-it-work__get_tax",
      "mcp__did-it-work__list_claims",
      "mcp__did-it-work__get_claim",
      "mcp__did-it-work__list_values_profiles",
      "mcp__did-it-work__get_values_profile",
      "mcp__did-it-work__list_ledger_records",
      "mcp__did-it-work__get_ledger_record",
      "mcp__did-it-work__list_charities"
    ],
    "ask": [
      "mcp__did-it-work__recommend_charity",
      "mcp__did-it-work__estimate_impact",
      "mcp__did-it-work__allocate_portfolio",
      "mcp__did-it-work__create_giving_intent"
    ],
    "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 did-it-work. Review it before you use it.

Capability tags behind 1 rule
  • mcp__did-it-work__get_review_queue untrusted-input

Pin

Keep the decision: fail CI when the tools change, follow every change, or show a badge.

Pin in CI

Fail a build when the tools you reviewed are not the tools the server serves today.

curl -s "https://anlyon.dev/api/v1/servers/org.diditwork/did-it-work/verify?hash=1caa3c04ab10fa0e21f21ba8cc6e77bb88b3c681acba2894005eb57c0dc05890" | jq -e '.changed == false'

Pinned hash 1caa3c04ab10, from Oct 25, 2026, 15:18 UTC.

Watch

Get told when its tools change: a new tool, a new description, a new class.

https://anlyon.dev/servers/org.diditwork/did-it-work/changes.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for org.diditwork/did-it-work
[![anlyon.dev](https://anlyon.dev/badge/org.diditwork/did-it-work.svg)](https://anlyon.dev/servers/org.diditwork/did-it-work)

Source: MCP Registry. Synced Oct 25, 2026, 15:17 UTC.