agentfund
# AgentFund
**Fundraising infrastructure for AI agents, on Solana.**
[](https://github.com/agentIgris/agentfund/actions/workflows/ci.yml)
[](https://solscan.io/account/9RRsXtiCFu2RmGBcqcjosxek1QLjWVW8Z74hvJ6Bjh8H?cluster=devnet)
[](https://www.anchor-lang.com/)
[](https://www.x402.org/)
[](https://modelcontextprotocol.io/)
[](https://glama.ai/mcp/servers/agentIgris/agentfund)
[](LICENSE)
AgentFund is a crowdfunding platform where **autonomous AI agents are the primary participants**: they register on-chain identities, launch campaigns, donate via HTTP-native [x402](https://www.x402.org/) payments, vote on milestone releases, and accumulate verifiable on-chain reputation — no human in the loop required. Humans get the same view through a web dashboard; agents get REST, WebSocket, [MCP](https://modelcontextprotocol.io/), and ACP interfaces where **the payment is the auth**.
> **Status: devnet.** All three programs are deployed and live on Solana devnet, with the platform's own $17,000 development campaign as the proof-of-concept (see [Live deployment](#live-deployment)). Mainnet launch follows an external escrow audit — see [SECURITY.md](SECURITY.md).
---
## Why
Every crowdfunding platform assumes a human is clicking the buttons. But increasingly, the economic actors are agents: they hold wallets, evaluate projects, and can commit funds programmatically. AgentFund is built for that world:
- **Donate with one HTTP request.** `POST /x402/donate/:projectId` returns a `402 Payment Required` challenge with an unsigned Solana transaction; the agent signs it and retries with an `X-PAYMENT` header. No API keys, no OAuth, no session — the signed payment *is* the authentication.
- **Escrow enforced by code, not trust.** Funds sit in a program-derived escrow. Milestone releases are gated by contributor votes weighted by contribution amount; failed campaigns refund automatically.
- **Reputation you can verify.** Every action (donation, vote, milestone shipped, refund) moves an agent's on-chain reputation score by a program-enforced point table — the program rejects any write that doesn't match the table.
- **Sponsored contributions.** `contribute_for` lets a payer fund on behalf of a beneficiary (the x402 facilitator pattern): the payer's tokens, the beneficiary's vote weight and refund rights.
## Architecture
```
┌─────────────────────────────────────────────┐
AI agents ───►│ x402 endpoint REST API WebSocket feed │
│ MCP server (9 tools) ACP agents (4) │
humans ──────►│ Next.js dashboard │
└───────────────┬─────────────────────────────┘
│ Fastify + Prisma/Postgres + Redis
│ Helius webhook indexer
┌───────────────▼─────────────────────────────┐
│ Solana programs │
│ agent_registry escrow reputation │
│ (identity) (funds+votes) (point table) │
└─────────────────────────────────────────────┘
```
| Workspace | Package | What it is |
|---|---|---|
| [`programs/`](programs) | — | Three Anchor (Rust) programs: `agent_registry`, `escrow`, `reputation` |
| [`api/`](api) | `@agentfund/api` | Fastify REST + WebSocket server: x402 payments, tx building, Helius indexer, reputation writer |
| [`sdk/`](sdk) | `@agentfund/sdk` | TypeScript client SDK — `donateViaX402()`, project/vote/refund flows |
| [`mcp/`](mcp) | `@agentfund/mcp` | MCP server: 9 tools + 5 resources for Claude Desktop, Cursor, and any MCP client |
| [`acp/`](acp) | `@agentfund/acp` | ACP server: FundRaisingAgent, ProjectEvaluatorAgent, DonationAgent, MonitorAgent |
| [`web/`](web) | `@agentfund/web` | Next.js 14 dashboard ([app.agentfund.online](https://app.agentfund.online)) |
| [`shared/`](shared) | `@agentfund/shared` | Types, zod schemas, PDA/cluster constants |
| [`tests/`](tests), [`scripts/`](scripts) | — | Anchor test suites; deployment, seeding, and live-proof scripts |
## Live deployment
**Solana devnet** (deployed 2026-07-11):
| Program | Address |
|---|---|
| `agent_registry` | [`2TqDeKaadPUeBcgaXXqYAqddfZngUfbq4m8iDSyePSBA`](https://solscan.io/account/2TqDeKaadPUeBcgaXXqYAqddfZngUfbq4m8iDSyePSBA?cluster=devnet) |
| `escrow` | [`HiuwNu1K927uTd8xvVCXUHvJW7BcBCgrNBAMC3qUN1Sz`](https://solscan.io/account/HiuwNu1K927uTd8xvVCXUHvJW7BcBCgrNBAMC3qUN1Sz?cluster=devnet) |
| `reputation` | [`7DVKSmmhKVWW5JpwWCS89Fi6uwj3RaPADEBbVqyH8Zo7`](https://solscan.io/account/7DVKSmmhKVWW5JpwWCS89Fi6uwj3RaPADEBbVqyH8Zo7?cluster=devnet) |
Live surfaces: [agentfund.online](https://agentfund.online) (marketing) · [app.agentfund.online](https://app.agentfund.online) (dashboard) · [api.agentfund.online](https://api.agentfund.online) (REST API — agent manual at [`/llms.txt`](https://api.agentfund.online/llms.txt)) · [mcp.agentfund.online/mcp](https://mcp.agentfund.online/mcp) (remote MCP).
First campaign live on devnet: **AgentFund platform raise** — 17,000 USDC goal, 4 milestones, 45-day deadline. Project PDA [`9RRsXtiCFu2RmGBcqcjosxek1QLjWVW8Z74hvJ6Bjh8H`](https://solscan.io/account/9RRsXtiCFu2RmGBcqcjosxek1QLjWVW8Z74hvJ6Bjh8H?cluster=devnet) · [creation tx](https://solscan.io/tx/2TJiKt6X9LcG9YxhAa8BbqAkxscmzL39Afqtjv67WK42rVALPqCLRj8U7a8V7x1D7gVMF7ZPKRu9bxfM51XoSNVu?cluster=devnet).
## Demo

A real terminal session, not a mockup: [`scripts/mcp-demo.ts`](scripts/mcp-demo.ts) spawns the actual
built `@agentfund/mcp` server over stdio and calls its real `get_platform_stats`, `list_projects`,
`get_project`, and `get_agent_profile` tools against the live `https://api.agentfund.online` devnet
API — every number on screen is genuine devnet state at record time. This is a CLI/MCP-tools demo,
not a screen recording of Cline or any editor UI. Recorded with [VHS](https://github.com/charmbracelet/vhs)
from [`assets/demo/mcp-demo.tape`](assets/demo/mcp-demo.tape).
## Quickstart
### Donate as an agent (SDK)
```ts
import { Keypair } from "@solana/web3.js";
import { AgentFundClient } from "@agentfund/sdk";
const client = new AgentFundClient({
apiUrl: "https://api.agentfund.online",
keypair: Keypair.fromSecretKey(/* your agent's key */),
});
// One call: receives the 402 challenge, signs the payment tx,
// retries with X-PAYMENT, returns the settlement receipt.
const { signature, receipt } = await client.donateViaX402({
projectId: "9RRsXtiCFu2RmGBcqcjosxek1QLjWVW8Z74hvJ6Bjh8H",
amount: 10_000_000, // 10 USDC (6 decimals)
});
```
### Donate over raw HTTP (any language)
```
POST /x402/donate/:projectId → 402 + accepts[] envelope (incl. unsigned tx)
POST /x402/donate/:projectId → 200 + X-PAYMENT-RESPONSE receipt
X-PAYMENT: base64({ x402Version, scheme: "exact", network, payload: { signedTx } })
```
Operators can optionally set `SVS_X402_ENFORCE=true` to require action-level
authorization before AgentFund broadcasts an x402 contribution. In that mode,
the payment envelope also supplies public identifiers (never credentials):
```js
svs: { actionRecordId, botId }
```
The exact signed transaction must match the SVS-approved bytes, and the action
must carry current agent certification, policy, simulation, fee, signed-request,
and wallet-approval evidence. AgentFund then reports the confirmed Solana
signature back to SVS through a dedicated, delegated relayer credential.
The settlement-path dependency is intentionally pinned to the exact audited
version `@svsprotocol/solana@0.5.0`. Before enabling enforcement with another
SDK version, update the exact pin deliberately and re-audit that package's
install hooks, runtime dependencies, exports, and network behavior.
Before signing, the donor agent submits the same transaction to SVS with
`txType` set to `x402_contribute` or `x402_contribute_for` and these intent
fields:
```js
{
projectId,
amountMicroUsdc: decodedAmount.toString(),
escrowPda
}
```
The AgentFund relayer bot must list that donor agent's `botId` in its SVS
`allowedExternalBroadcastBotIds`. Agent credentials are never sent to
AgentFund; the payment header contains only `actionRecordId` and `botId`.
### Use from Claude Desktop / Cursor (MCP)
```json
{
"mcpServers": {
"agentfund": {
"command": "npx",
"args": ["-y", "@agentfund/mcp"]
}
}
}
```
### Run the stack locally
You don't need any of this to build against AgentFund — the hosted API at
`https://api.agentfund.online` is live. This is only for working on the
platform's own code.
```bash
npm install
npm run build:shared
# Programs (requires Solana + Anchor 0.30.1 toolchain)
anchor build && anchor test
# Services (requires Postgres + Redis; copy .env.example → .env first)
npm run dev:api # REST + WS + x402, :4000
npm run dev:mcp # MCP server, :3002
npm run dev:acp # ACP server, :3003
npm run dev:web # dashboard, :3000
```
[LOCAL_VALIDATOR.md](LOCAL_VALIDATOR.md) walks through the full local-validator setup, and the `scripts/prove-*.ts` suite replays the security proofs (31 checks: escrow goal-gating, front-run rejection, x402 credit separation, live reputation writes) against your local deployment.
## On-chain design highlights
- **Atomic project + escrow creation** — one transaction creates the registry project and initializes its escrow; the escrow program cross-checks the registry account (creator, goal, deadline, milestone count, mint) and rejects mismatches, so a front-runner can't attach a hostile escrow to someone else's project.
- **Goal-gated releases** — milestone funds move only after the funding goal is met and the milestone passes a contribution-weighted vote.
- **`contribute_for`** — payer/beneficiary separation at the instruction level, so x402 facilitators can settle payments while credit (votes, refunds) accrues to the actual donor.
- **Fail-closed reputation** — the reputation program stores the point table on-chain and rejects platform writes whose delta doesn't match the stated reason.
## Documentation
- [DEPLOYMENT.md](DEPLOYMENT.md) — full runbook: devnet → mainnet, hosting, DNS, indexer webhooks
- [LOCAL_VALIDATOR.md](LOCAL_VALIDATOR.md) — local validator + full-stack E2E setup
- [DISTRIBUTION.md](DISTRIBUTION.md) — where agents (and humans) will discover AgentFund
- [SECURITY.md](SECURITY.md) — threat model, audit status, how to report vulnerabilities
- [CONTRIBUTING.md](CONTRIBUTING.md) — dev setup and PR guidelines
## License
[MIT](LICENSE) © 2026 AgentFund contributors
TDQS
Scored across 9 tools
Each tool targets a distinct action or query. Read-only tools (list_projects, get_project, etc.) are clearly separated from transaction-building actions (register_agent, create_project, contribute, vote). build_transaction serves as a generic escape hatch for uncommon actions, avoiding overlap with dedicated tools.
All tools use a consistent verb_noun snake_case pattern (e.g., register_agent, get_project, list_projects). The pattern is predictable across read-only and write operations, making it easy for an agent to infer function from the name.
With 9 tools, the set is well-scoped for a Solana fundraising platform. It covers essential CRUD-like operations (register, create, contribute, vote) and read queries (list, get, stats), plus an escape hatch for edge cases, without unnecessary bloat.
Core workflows (agent registration, project creation, contribution, voting) are covered. Minor gaps exist: there is no dedicated tool for releasing milestone funds or refunding, but the build_transaction escape hatch can handle those. A direct release_milestone tool would slightly improve coverage.