Outsider Stage 0.5
Replay and verify a real, sealed Outsider Stage 0.5 intervention chain.
Translation pending
An open standard letting a nonprofit publish, from its own domain, a machine-readable declaration of the giving destinations it authorizes. Consumed by AI agents through W3C WebMCP.
SecurityPython · JavaScriptGitHub @WholeWhaleOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Verified Giving Protocol (VGP) - an open standard letting nonprofits declare their authorized giving pathways, with WebMCP tools and the VGPify skill.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Nonprofits get a machine-readable way to declare where they authorize donations to go. WebMCP lets AI agents discover and use those declarations.
The web has standards for discovering pages and for buying products. Agentic giving needs a standard for discovering who is actually authorized to receive a nonprofit's money.
License: MIT
AI agents can already find nonprofits, recommend where to give, and navigate donation flows. What they cannot do is answer the one question that matters before money moves:
Does this nonprofit actually authorize this donation pathway?Read the full README ↗Nonprofits get a machine-readable way to declare where they authorize donations to go. WebMCP lets AI agents discover and use those declarations.
The web has standards for discovering pages and for buying products. Agentic giving needs a standard for discovering who is actually authorized to receive a nonprofit's money.
AI agents can already find nonprofits, recommend where to give, and navigate donation flows. What they cannot do is answer the one question that matters before money moves:
Does this nonprofit actually authorize this donation pathway?
Today an agent infers legitimacy from web pages, search results, and intermediary claims. Any third party can assert that a donation "benefits" a nonprofit without that nonprofit controlling, endorsing, or even knowing about the pathway. Inference is not infrastructure.
| Statement | Who makes it | Authorizes? | |
|---|---|---|---|
| benefits | "Proceeds from this go to Organization X." | Anyone | No |
| confirmed | "Public evidence consistently identifies this destination." | A discovery process | No |
| authorized | "We declare this an approved giving destination." | The organization | Yes |
These are not equivalent, and nothing in this repository is permitted to collapse them. An automated process may propose; only a nonprofit administrator may authorize.
Nonprofit domain VGP is the trust layer
| /giving.json
v identity, EIN, authorized destinations, designations
VGP
| WebMCP is the agent interaction layer
v giving_verify / giving_options
WebMCP giving_designations / giving_prepare
|
v Existing processors are the transaction layer
Payment provider Stripe, PayPal, DAF, ACH, check
|
v
Human authorization VGP never moves money
VGP is payment-rail neutral, AI-platform neutral, and has no blockchain dependency. It remains useful without WebMCP — the JSON document stands on its own.
| Path | What it is |
|---|---|
vgp/specification.md | VGP 0.1. §3 is the protocol; everything else is encoding. |
vgp/schema.json | JSON Schema for giving.json. |
vgp/examples/ | A valid approved document and a valid unapproved draft. |
skill/ | VGPify — an installable agent skill that turns a nonprofit website into a reviewable draft. |
webmcp/giving-tools.js | The four WebMCP tools. Generated from the skill template. |
powerpoetry/ | Reference implementation #1. Currently an honest, unapproved draft — see UNRESOLVED.md. |
demo/third-party-example/ | A labeled fixture for the trust scenario. Fictional service, no payment fields. |
tests/run_tests.py | 33 checks. The negatives are the interesting ones. |
No dependencies. Python 3.9+ for the tooling; Node only for a syntax check.
git clone https://github.com/WholeWhale/verified-giving-protocol
cd verified-giving-protocol
python tests/run_tests.py
Expected: 33 passed, 0 failed.
python skill/scripts/validate_vgp.py vgp/examples/approved.giving.json
python skill/scripts/validate_vgp.py vgp/examples/approved.giving.json --check-urls
Copy or symlink skill/ into your agent's skills directory, then ask an agent to "vgpify https://some-nonprofit.org". It crawls, extracts identity and giving pathways, records an evidence ledger, flags conflicts, and emits a draft — never an authorization.
Discovery cannot do this. A human does:
python skill/scripts/approve_destination.py \
--review vgp-review.json \
--vgp giving.json \
--candidate-id direct-card \
--approver-role "Executive Director" \
--statement "Our organization authorizes donations through this destination."
--statement is compared as a constant. A paraphrase is refused, and unresolved organization identity blocks approval outright. Both behaviors are tested.
See powerpoetry/integration/README.md.
VGP alone gives an agent a file it must know to look for, fetch cross-origin, parse, and interpret correctly — including all six conformance rules in §5, which most agents will get subtly wrong.
WebMCP moves that burden to the party that should carry it: the nonprofit's own site. The site fetches its own declaration same-origin, checks its own approval flag, filters to genuinely authorized destinations, and exposes the result as named, described, schema-typed tools the agent discovers automatically.
Concretely, that changes three things:
giving_options rather than guessing which button on the page is the real donate button.giving_options cannot return an unauthorized destination — it filters on authorization.status and the exact affirmation constant before the agent ever sees the list. Third-party claims cannot become nonprofit authorization, because the code path that would do it does not exist.webmcp/giving-tools.js registers four tools via document.modelContext.registerTool().
| Tool | Returns | Mode |
|---|---|---|
giving_verify | Legal name, display name, EIN, canonical domain, VGP version, approval status, last updated | read-only |
giving_options | Only destinations the organization authorized, including instructions pages and offline methods: method, interaction, provider, authorized URL, recipient, currency, restrictions, designation support, and the declared prefill, checkout disclosures and payment capability | read-only |
giving_designations | Funds or programs a gift may be designated to | read-only |
giving_prepare | A prepared, authorized donation URL for a validated amount, on a destination declared as a checkout; a designation is carried only where prefill declares it | non-transactional |
giving_prepare deliberately does not charge anything. It returns payment_completed: false and requires_human_payment_authorization: true, validates the amount range, and refuses any designation not present in the approved declaration. The donor authorizes the payment. Always.
Registration is refused entirely if the document is missing, is the wrong version, is not organization-approved, or contains no properly-affirmed destination.
The machine handles bureaucracy. Humans keep the two decisions that carry consequences.
| Actor | Owns |
|---|---|
| AI | Discovery, extraction, structuring, conflict detection, tool execution, preparation |
| Nonprofit administrator | Where may money legitimately go? — authorization, and nothing else |
| Donor | Do I actually want to send it? — intent, selection, payment approval |
This split is enforced mechanically rather than asked for politely. approve_destination.py compares the affirmation as a constant and refuses to proceed on unresolved identity. The schema makes an unapproved document structurally incapable of carrying an authorized destination. The WebMCP tools filter on the affirmation before returning anything.
The most useful demonstration of that is our own reference implementation: powerpoetry/giving.json ships unapproved, with legal_name and ein as null. The relationship between Power Poetry and To Be Heard Foundation is unresolved, so we did not resolve it. A project that guessed its own EIN would refute the standard it ships with.
python tests/run_tests.py
The suite asserts that each of the following is rejected:
authorization.status of confirmed rather than authorizedcanonical_domain given as a URL rather than a hostIt also asserts no drift between artifacts that exist at two paths: vgp/schema.json must be byte-identical to the skill's copy, and webmcp/giving-tools.js must match a fresh generation. A standard whose own repository contradicts itself is worse than no standard.
Authorized giving. "I want to donate $100 to Power Poetry. What are my options?" The agent calls giving_verify, giving_options, giving_designations, presents what the nonprofit actually authorized, and calls giving_prepare on the donor's choice. The donor authorizes payment.
Not listed. Viewing demo/third-party-example/, a donor asks "Can I donate to Power Poetry through this?" The agent checks the declaration, finds no match, and answers:
Power Poetry has not listed this destination in its published giving declaration. That is not a finding about this service — it means the organization has not declared it. To give through a pathway Power Poetry has authorized, use one of the options it publishes, or contact the organization directly to confirm.
Not "this is fraudulent." VGP establishes authorization, not universal truth — a destination can be absent because it is unauthorized, because it is new, or because the document is stale, and an agent cannot tell those apart. The wording is normative and each of its four clauses is load-bearing; see §3.3 and §3.4. Tests assert the clauses stay present in both the specification and the demo.
VGP 0.1 is a draft, deliberately small.
Explicitly not built here: a payment processor, a cryptocurrency protocol, a blockchain registry, a universal nonprofit database, a tax-deductibility engine, a DAF transaction system, donor accounts, identity/KYC infrastructure, autonomous money movement, or production-grade cryptographic signing.
VGP 0.1 has no signing. It inherits the security of HTTPS and DNS and adds nothing to it. A compromised domain publishes compromised authorizations. See §6.
MIT. See LICENSE.