Machine-readable Web3 dApp directory for developers, researchers, internal products, and AI agents. This repo ships a generated catalog, a local web experience, a read-only HTTP API, and an MCP server for agent workflows.
The current generated snapshot includes:
- 4,232 dApps
- 430 chains
- 92 categories
- Read-only dApp catalog with stable
idandsluglookup - Free-text search across names, descriptions, categories, and chains
- Exact filtering by chain and category
- Aggregate chain and category summaries
- Local web UI for browsing the directory and documentation
- HTTP API with generated OpenAPI document
- MCP server with tools and resources for AI agents
- Localized catalog responses via the
langquery parameter - Catalog generation pipeline that writes reusable JSON artifacts
apps/web: Next.js web app and documentation sitesrc/http: Fastify HTTP APIsrc/mcp: FastMCP serversrc/cli: scrape and OpenAPI generation commandsdata/generated: generated catalog artifacts consumed by the app and APIdata/manual: overrides, taxonomy, and stable ID mappingopenapi/openapi.json: generated OpenAPI document
- Node.js
22+ pnpm10.15.0+
pnpm installRun the web app:
pnpm web:devRun the HTTP API:
pnpm dev:httpRun the MCP server over stdio:
pnpm dev:mcpRun the MCP server over HTTP:
MCP_TRANSPORT=http pnpm dev:mcpDefault local endpoints:
- Web app:
http://localhost:3000(or the next available port) - HTTP API:
http://localhost:8787 - OpenAPI:
http://localhost:8787/openapi.json - MCP HTTP endpoint:
http://localhost:8788/mcp
The web app is the easiest local entry point. It reads the generated JSON artifacts directly, so you can browse the catalog and the documentation experience without starting the HTTP API first.
pnpm web:devOpen the local URL shown by Next.js. The app redirects to a localized route such as /en.
The HTTP server exposes read-only endpoints for search, lookup, chains, categories, health, and the OpenAPI contract.
pnpm dev:httpFor local CLI-style clients, run MCP over stdio:
pnpm dev:mcpFor remote-capable clients or browser-based tooling, expose MCP over HTTP:
MCP_TRANSPORT=http MCP_HOST=0.0.0.0 MCP_PORT=8788 pnpm dev:mcpThe scrape pipeline fetches source records, builds the normalized catalog, writes generated artifacts, and refreshes openapi/openapi.json.
pnpm scrapeUseful variants:
pnpm scrape --limit=100
pnpm scrape --sources=defillama
pnpm scrape --sources=alchemy,rayo,moralis,defillama --concurrency=8Health check:
curl http://localhost:8787/healthSearch for DeFi dApps on Base:
curl "http://localhost:8787/v1/dapps?chain=Base&category=DeFi&limit=5"Search by free text:
curl "http://localhost:8787/v1/dapps?q=prediction%20market&limit=5"Fetch a single dApp by slug:
curl "http://localhost:8787/v1/dapps/uniswap"List supported chains:
curl "http://localhost:8787/v1/chains"List supported categories:
curl "http://localhost:8787/v1/categories"Fetch localized results:
curl "http://localhost:8787/v1/dapps?q=lending&lang=es&limit=3"JavaScript example:
const response = await fetch(
"http://localhost:8787/v1/dapps?chain=Base&category=DeFi&limit=5",
);
const payload = await response.json();
console.log(payload.data.items);
console.log(payload.meta);Available MCP tools:
dapps_searchdapps_getdapps_list_chainsdapps_list_categories
Sample dapps_search arguments:
{
"q": "lending",
"chain": "Base",
"category": "DeFi",
"limit": 5
}Sample dapps_get arguments:
{
"id": "uniswap"
}Available MCP resources:
catalog://dapps/indexcatalog://dapps/chainscatalog://dapps/categoriescatalog://dapps/{id}
- Power a web or mobile directory UI with a normalized dApp dataset
- Feed AI agents with structured search, exact lookup, and resource access via MCP
- Build internal discovery tools for research, BD, ecosystem mapping, or competitive analysis
- Enrich analytics workflows with chain and category summaries
- Provide a local documentation and playground environment for API and MCP integrations
- Generate a reusable JSON catalog for downstream services or scheduled jobs
http://localhost:8787
Most successful API responses follow this envelope:
{
"success": true,
"data": {},
"meta": {}
}Not-found responses use:
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "dApp not found"
}
}| Endpoint | Method | Description |
|---|---|---|
/health |
GET |
Service health check |
/openapi.json |
GET |
Generated OpenAPI 3.1 document |
/v1/dapps |
GET |
Search and paginate dApps |
/v1/dapps/:id |
GET |
Get one dApp by stable id or slug |
/v1/chains |
GET |
List chain counts |
/v1/categories |
GET |
List category counts |
| Parameter | Type | Description |
|---|---|---|
q |
string |
Free-text search across name, descriptions, categories, and chains |
chain |
string |
Exact chain filter, case-insensitive |
category |
string |
Exact category filter, case-insensitive |
page |
integer |
Page number, default 1 |
limit |
integer |
Page size, default 50, max 250 |
lang |
string |
Optional locale for translated human-readable fields |
Supported locales: en, es, zh, hi, pt, nl, de, ar, ja, id, fr, bn
{
"id": "dapp_000001",
"slug": "chainlink-requests",
"name": "Chainlink Requests",
"logoUrl": "https://icons.llama.fi/chainlink-requests.jpg",
"webUrl": "https://chain.link/",
"mobileUrl": null,
"socials": {
"twitter": "https://x.com/chainlink"
},
"categories": ["Oracle"],
"chains": [],
"shortDescription": "...",
"longDescription": "...",
"sourceUrls": [
"https://defillama.com/protocol/chainlink-keepers"
],
"updatedAt": "2026-03-10T23:58:17.953Z"
}| Command | Purpose |
|---|---|
pnpm web:dev |
Run the Next.js web app locally |
pnpm web:build |
Build the web app |
pnpm web:typecheck |
Type-check the web app |
pnpm dev:http |
Run the local HTTP API |
pnpm dev:mcp |
Run the local MCP server |
pnpm scrape |
Fetch source data and rebuild generated artifacts |
pnpm openapi:generate |
Regenerate openapi/openapi.json |
pnpm test |
Run Vitest |
- The web app can run on its own because it reads
data/generated/*.json. - The documentation playgrounds are most useful when the HTTP API and MCP HTTP server are also running.
- The HTTP API and MCP server are read-only by design.