# Did It Work? (remote · api.diditwork.org)

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

- Trust score: 71/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `api.diditwork.org`: 71/100 (this document), [markdown](https://verifymcp.io/servers/org-diditwork-did-it-work/api.md), [page](https://verifymcp.io/servers/org-diditwork-did-it-work/api)

## Channel facts

- Endpoint: `https://api.diditwork.org/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.2.16`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Endpoint Security**: 74/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 55/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 6556 tokens (~298/item across 22 items; 22 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 37/100
  - Stability observed for 11 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 82/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 47% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 22 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 23 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the Did It Work? MCP server?

Did It Work? is a hosted endpoint at https://api.diditwork.org/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http org-diditwork-did-it-work 'https://api.diditwork.org/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "org-diditwork-did-it-work": {
      "url": "https://api.diditwork.org/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "org-diditwork-did-it-work": {
      "type": "http",
      "url": "https://api.diditwork.org/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.org-diditwork-did-it-work]
url = "https://api.diditwork.org/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "org-diditwork-did-it-work": {
      "type": "remote",
      "url": "https://api.diditwork.org/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add org-diditwork-did-it-work --url 'https://api.diditwork.org/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  org-diditwork-did-it-work:
    url: "https://api.diditwork.org/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "org-diditwork-did-it-work": {
      "Transport": "http",
      "Url": "https://api.diditwork.org/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add org-diditwork-did-it-work -t streamable-http -u 'https://api.diditwork.org/mcp'
```

### Other

```json
{
  "mcpServers": {
    "org-diditwork-did-it-work": {
      "type": "http",
      "url": "https://api.diditwork.org/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 71, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-02 (score 70, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-31 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-30 (score 68, 0)

- [security] Tool “decision_brief” rewrote its description, which is the text the model reads
- [security] Tool “search_orgs” rewrote its description, which is the text the model reads

### 2026-10-29 (score 68, +1)

- [cosmetic] “search_orgs” added an optional parameter “q”

### 2026-10-28 (score 67, 0)

- [security] Tool “decision_brief” rewrote its description, which is the text the model reads
- [security] Tool “search_orgs” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 246 → 291
- [functional] New tool “verdict_chain”

### 2026-10-27 (score 67, −1)

- [security] Tool “decision_brief” rewrote its description, which is the text the model reads
- [security] Tool “search_orgs” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 164 → 246

### 2026-10-26 (score 68, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “compare_charities” rewrote its description, which is the text the model reads
- [security] Tool “create_giving_intent” rewrote its description, which is the text the model reads
- [security] Tool “estimate_impact” rewrote its description, which is the text the model reads
- [security] Tool “get_org” rewrote its description, which is the text the model reads
- [security] Tool “list_charities” rewrote its description, which is the text the model reads
- [security] Tool “list_claims” rewrote its description, which is the text the model reads
- [security] Tool “recommend_charity” rewrote its description, which is the text the model reads
- [security] Tool “search_orgs” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 114 → 164
- [functional improvement] Stability: unverified → 0.03
- [functional] New tool “decision_brief”
- [functional] New tool “report_decision_effect”

## MCP tools (22)

### `get_meta` (~127 tokens)

Get meta

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.

### `recommend_charity` (~275 tokens)

Recommend charity

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. An unknown outcome (for example climate) or an empty result carries coverage: what we don't rate and what to do instead; never a guessed rating.

Input parameters:

- `budget_usd` (number)
- `geography` (string)
- `limit` (integer)
- `non_cash` (boolean): Prefer orgs with non_cash_giving options
- `outcome` (string): lives_saved | wellbeing_wellbys | income (aliases accepted)
- `outcome_preference` (string): Alias for outcome (values-profile field name)
- `red_lines` (string): Comma-separated cause ids or tags to exclude
- `require_geography` (boolean)
- `risk` (string)
- `tax` (string)
- `values_profile_id` (string): Preset id (vp_*). Preferred binding: loads outcome_preference, red_lines, risk, tax, geography from data/values_profiles/{id}.json. Outcome may be omitted when the profile supplies it. Surfaced back…

### `list_leaderboards` (~122 tokens)

List leaderboards

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.

Input parameters:

- `outcome` (string): lives_saved | wellbeing_wellbys | income (aliases accepted). Omit for all families.
- `outcome_preference` (string): Alias for outcome (values-profile field name)

### `get_review_queue` (~109 tokens)

Get review queue

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.

Input parameters:

- `status` (string): Filter by item status (default open on the server)

### `compare_charities` (~152 tokens)

Compare charities

Side-by-side claims, recommendation tiers, and trust for two or more org_* ids. When the charities are measured in different outcome units (for example wellbeing in WELLBYs versus lives saved), units_differ.sentence says so in plain words; the units can't be converted without a moral judgment, which is the donor's. Answers carry decision_brief: the charity's own donate_url (next_action), the evaluator's fund as a let-the-evaluator-choose alternative, the like-for-like comparison page when one exists, and modeled: true / guaranteed: false when figures are present. No figure, rating or order is added.

Input parameters:

- `ids` (string, required): Comma-separated org ids (minimum two)

### `estimate_impact` (~148 tokens)

Estimate impact

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. Each outcome carries say_as, rounded to two significant figures (say this to the donor); expected_value keeps the exact arithmetic. Answers carry decision_brief: the charity's own donate_url (next_action), the evaluator's fund as a let-the-evaluator-choose alternative, the like-for-like comparison page when one exists, and modeled: true / guaranteed: false when figures are present. No figure, rating or order is added.

Input parameters:

- `gift_usd` (number, required)
- `org_id` (string, required)

### `get_org` (~91 tokens)

Get org

Fetch one organization / program / fund record by stable org_* id. Answers carry decision_brief: the charity's own donate_url (next_action), the evaluator's fund as a let-the-evaluator-choose alternative, the like-for-like comparison page when one exists, and modeled: true / guaranteed: false when figures are present. No figure, rating or order is added.

Input parameters:

- `id` (string, required)

### `search_orgs` (~1959 tokens)

Search orgs

Heuristic search by cause, outcome family, or donor intent phrase. Prefer recommend_charity when the user wants ranked 'best for outcome' results. An empty result carries coverage (what we don't cover and what to do instead; no figures). A non-empty result that answers only part of the question carries partial_coverage: which part is covered, which is not (for example animal welfare, humanitarian relief, scam checks or tax-return data) and who does assess the rest. Every answer that doesn't fully cover the question starts with answer_first: what we don't cover and who does assess it, then which part the results answer. A question asking whether anyone pays us, or who funds us, also gets funding_question (nobody can pay for a place; we take no referral fees and never handle donors' money). A question asking whether a survey, testimonial or before-and-after report proves a programme worked gets method_answer first (no, why, what to ask for, the missing-answer bounds; method only). A question asking whether one striking result (a single study showing it beats similar programmes, the top of a list) makes a charity the best gets star_result first (probably overstated; the eight-schools example; what to ask for; method only). A demand for a guarantee or for our own ranking gets request_declined (figures are modeled, never guaranteed; we rank nothing ourselves). A request to average cost-per-outcome figures (two charities' cost per life, or over scenarios) gets average_declined first (we don't average them; add up outcomes instead, one unit; method only; the evaluators' figures follow unchanged). "Should I give now or wait a year for better evidence?" (or "invest it and give later?") gets give_now_or_wait first (GiveWell's own answer verbatim; decide on today's best estimate and wait only for named evidence, due in time, that could change the choice; for one named listed charity, the evaluator's dated re-check or our evidence-gap ledger's words; method only, we compute no…

Input parameters:

- `cause` (string)
- `intent` (string)
- `outcome` (string): lives_saved | wellbeing_wellbys | health_dalys | income
- `q` (string): The donor's question or a charity name in their own words (same as GET /v1/search?q=). Fixed answers (answer_first, request_declined, scam_answer and the rest) read q and intent alike.

### `get_trust` (~36 tokens)

Get trust

Trust and safety flags for an org. REQUIRED before asserting US tax deductibility or registry status.

Input parameters:

- `org_id` (string, required)

### `get_tax` (~67 tokens)

Get tax

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.

Input parameters:

- `org_id` (string, required)

### `allocate_portfolio` (~158 tokens)

Allocate portfolio

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.

Input parameters:

- `budget_usd` (number, required)
- `geography` (string)
- `include_funds` (boolean)
- `method` (string): Allocation method (alias: allocation_method on POST)
- `outcome` (string, required): lives_saved | wellbeing_wellbys | income
- `red_lines` (string): Comma-separated cause ids or tags to exclude
- `risk` (string)
- `tax` (string)
- `top_n` (integer)

### `create_giving_intent` (~140 tokens)

Create giving intent

NO-CHARGE deep-link giving handoff (Phase 3 MVP). Returns mode=deep_link, org donate_url, donation_proof=null, charge=false. Did It Work? never processes payment, stores cards, or calls Stripe. Optional modeled_impact is modeled≠guaranteed. Prefer GET; POST accepts the same fields as JSON body.

Input parameters:

- `amount_usd` (number, required)
- `include_impact` (boolean): When true, attach modeled_impact (MODELED, NOT GUARANTEED)
- `org_id` (string, required)
- `values_profile_id` (string)
- `vehicle` (string)

### `list_claims` (~192 tokens)

List claims

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). Answers carry decision_brief: the charity's own donate_url (next_action), the evaluator's fund as a let-the-evaluator-choose alternative, the like-for-like comparison page when one exists, and modeled: true / guaranteed: false when figures are present. No figure, rating or order is added.

Input parameters:

- `evaluation_id` (string): Filter to one evaluation_* id
- `org_id` (string): Filter to one org_* id
- `verified` (string): If true/false, filter on claim.verified (string query as HTTP API)

### `get_claim` (~93 tokens)

Get claim

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

Input parameters:

- `id` (string, required): claim_id (path {id}), e.g. eval_gw_amf__0

### `list_values_profiles` (~78 tokens)

List values profiles

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.

### `get_values_profile` (~62 tokens)

Get values profile

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.

Input parameters:

- `id` (string, required)

### `list_ledger_records` (~106 tokens)

List ledger records

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.

Input parameters:

- `evaluator` (string)
- `intervention_id` (string)
- `org_id` (string)
- `record_kind` (string)
- `status` (string)

### `get_ledger_record` (~74 tokens)

Get ledger record

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.

Input parameters:

- `id` (string, required)

### `list_charities` (~349 tokens)

List charities

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. When count is 0 the answer carries coverage: what we don't cover (for example climate, or a charity the evaluators we follow don't rate) and what to do instead; never a guessed rating. When the words name a well-known charity that is not on our list, or a cause or topic we don't rate, a non-empty answer carries partial_coverage saying so.

Input parameters:

- `by` (string): An evaluator slug (parameters.by).
- `cause` (string): A cause slug; call with no arguments to see parameters.cause with counts.
- `followup` (boolean): true: only charities with a follow-up record in the outcome ledger.
- `measure` (string): What the evaluator's figures measure (parameters.measure).
- `q` (string): Words that must all appear in the name, description, designation, cause names or everyday words for those causes; case and accents ignored. No leading or trailing spaces.

### `report_decision_effect` (~238 tokens)

Report decision effect

Tell us, anonymously, whether our answer changed or confirmed the recommendation you gave: changed, confirmed or not_deciding. Call it once, after the person has decided (or said they are not deciding). Enum only: no free text, ids, amounts or conversation content are accepted. Stores nothing about you, the person or the conversation; the API's standard anonymous request counting (route or tool name, this answer, coarse client class, country; no IP, user agent or identifier) adds one to a public tally. Never changes any data, rating, ranking or answer. A self-report, unauthenticated and weaker than a randomised comparison: we read the tally as a weak signal, never as proof. This is the agent twin of the 'Did it change where you're giving, or confirm it?' line on our decision pages (https://diditwork.org/standards#what-we-count).

Input parameters:

- `effect` (string, required): changed: our answer changed the charity or fund recommended, or where the person decided to give. confirmed: it confirmed a plan already there. not_deciding: the person was not deciding yet.

### `decision_brief` (~1556 tokens)

Decision brief

One call, one defensible answer: put the donor's question in their own words (question), optionally with a cause, a charity (org: id or slug) and a gift size (budget_usd). Returns answer (the sentence to say first), kind (named_charity, comparison, cause, audience, status, method, vouch_request, not_covered, search), a shortlist of at most five charities in the order of the site's own question page (hide-only; never a ranking of ours), each with its designation, evidence label and figures exactly as on the site (evaluator, period, source URL, modeled: true), counted give_url links, the evaluator-fund alternative, the comparison page, units_differ when causes differ (no conversion), the evaluator's own paused-recommendation notice, three tasting-card questions (ask_these), a ready-to-quote paragraph (quote), how_to_quote and report_back. Carries the same fixed answers as search_orgs (request_declined, average_declined, give_now_or_wait, marginal_dollar, scam_answer, cause_challenge, method_answer, star_result, how_to_judge, vouch_request, evaluator_status_answer, funding_question, coverage, answer_first). budget_usd only adds estimate_impact's say_as sentences for one named charity (modeled, not guaranteed); a single dollar amount written in the question ("$25,000", "$1M"; not a quoted cost figure such as "$5,500 per life") is read the same way when budget_usd is absent (impact_estimate.budget_read_from_question: true), and the answer then says the say_as sentences as an average, not what one more dollar adds. "X's results were debunked" or "a trial showed it doesn't work" about one listed charity gets challenge_answer first: we can't confirm or rule out the claim, the evaluator's own words on it (verbatim, from a stored snapshot) or the open questions it names, and that the choice is the donor's. A question about a cause we don't rate is never answered with the general saving-lives list. Computes no new figure, gives no score, never ranks across causes. Fails close…

Input parameters:

- `budget_usd` (number): Gift size in US dollars; adds the modeled say_as sentences for one named charity.
- `cause` (string)
- `org` (string): A charity on our list: id (org_against_malaria_foundation) or slug (against-malaria-foundation).
- `question` (string): The donor's question in their own words.

### `verdict_chain` (~255 tokens)

Verdict chain

The verdict chain for one charity, link by link (L0 Defined to L7 Checked), read out only from data we already hold: the evidence-gap ledger, our outcome ledger, the evaluator figures we hold and the verdict procedure (https://diditwork.org/agents/verdict-procedure.json). Returns record in the procedure's output_record shape: links (id, name, question, answer, rung from the procedure's ladder or null for L0/L7, evaluator_label_verbatim, source, open_question), weakest_link (the procedure's rule), open_questions and summary_donor_voice; plus rung_rules (how each rung follows from existing grades), widest_evidence_gap (the ledger's own binding gap), better_source and covered. Computes nothing: every figure and date is copied whole from a stored value, and the response holds no JSON number. No overall verdict, score, grade or count of strong links: live charities get no worked/didn't-work word. Charities without an evidence-gap entry get covered: false and every link 'Not covered' with a pointer to get_org and the evaluator. Same function as GET /v1/verdict-chain/{org_id}.

Input parameters:

- `org_id` (string, required)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/org-diditwork-did-it-work/api#diagnostics

## Score history

- 2026-11-05: 71
- 2026-11-04: 71
- 2026-11-03: 70
- 2026-11-02: 70
- 2026-11-01: 69
- 2026-10-31: 69
- 2026-10-30: 68
- 2026-10-29: 68
- 2026-10-28: 67
- 2026-10-27: 67
- 2026-10-26: 68
- 2026-10-25: 68

## Common questions

### What is the Did It Work? MCP server?

Did It Work? is an MCP server listed in the public MCP registry as org.diditwork/did-it-work. Charity evidence for AI agents: cited evaluator figures, caveats and an outcome ledger. Read-only. This page covers its hosted endpoint (https://api.diditwork.org/mcp).

### Is the Did It Work? MCP server safe to use?

Did It Work? scores 71 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Did It Work? MCP server expose?

Did It Work? exposes 22 tools: get_meta, recommend_charity, list_leaderboards, get_review_queue, compare_charities, and 17 more. Their descriptions and schemas cost roughly 6,387 tokens of context every time the server is loaded.

### Does the Did It Work? MCP server require authentication?

No. We connected to Did It Work? without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Did It Work? MCP server still maintained?

Did It Work? is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://api.diditwork.org/mcp
- Website: https://diditwork.org/agents/mcp
- Changelog RSS feed: https://verifymcp.io/servers/org-diditwork-did-it-work/api.xml
- Changelog JSON feed: https://verifymcp.io/servers/org-diditwork-did-it-work/api.json
- HTML version of this page: https://verifymcp.io/servers/org-diditwork-did-it-work/api
