curator-mcp
Live DeFi lending yields, TVL, utilization and token prices on Base — as MCP tools.
An MCP server that answers the questions an agent actually asks about DeFi markets: where should this asset sit, what does it earn, and how deep is the liquidity? Data comes from The Graph — Messari standardized subgraphs for lending and DEX markets, and the Token API for spot prices.
Standalone and dependency-light. It knows nothing about any particular agent; it was extracted from one, which is the only relationship it has to the vault curator that first used it.
Install
Requires Python ≥ 3.10 and a free Graph API key from thegraph.com/studio → API Keys.
uvx curator-mcp # run without installing
# or
pip install curator-mcp
Published on PyPI — no clone required. Verified from a machine that has never seen this repo.
From a clone, if you want to modify it:
git clone <this-repo> && cd <this-repo>
uv pip install ./data/curator_mcp
Configure your MCP client
{
"mcpServers": {
"curator": {
"command": "uvx",
"args": ["curator-mcp"],
"env": { "GRAPH_API_KEY": "your-key-here" }
}
}
}
That is the whole setup. Claude Desktop, Claude Code, Cursor, Zed and anything else speaking MCP over stdio will pick the tools up.
Tools
| Tool | Arguments | Answers |
|---|---|---|
compare_protocols |
asset |
Where should this asset sit? Ranks every protocol, and names the best-APY and deepest-TVL ones separately because they are usually not the same. |
get_market_yields |
asset |
What does this asset earn, and where? Supply-side APYs across every protocol listing it. |
list_markets |
assets? |
Broad survey of lending markets and DEX pools. |
get_token_price |
symbol |
Spot USD price. |
Plus a curator://protocols resource listing which protocols are configured.
Response shape
Every tool returns the same three guarantees:
{
"asset": "USDC",
"protocols": [
{
"protocol": "aave-v3",
"supply_apy": 0.0432, // fraction — use this for arithmetic
"supply_apy_pct": 4.32, // percent — use this for display
"tvl_usd": 84200000.0,
"utilization": 0.91,
"fact_ids": ["messari:yield:aave-v3/usdc", "messari:tvl:aave-v3/usdc"],
"sources": ["messari"]
}
],
"best_apy": "aave-v3",
"deepest_tvl": "moonwell",
"taken_at": "2026-07-25T14:05:00+00:00",
"errors": [] // non-empty means your view is PARTIAL
}
fact_idsandsourceson every number. Provenance travels with the data, so a model can cite what it saw and a human can check it.errorson every response. If a protocol could not be reached it is named here. A non-emptyerrorsmeans the answer is partial and should be described that way — never silently treated as the whole market.- APY twice, in both units.
supply_apyis a fraction (0.0432);supply_apy_pctis a percentage (4.32). Mixing them up is a 100× error, so neither has to be inferred.
See SKILL.md for how an agent should use these tools well.
Configuration
| Variable | Required | Default | Purpose |
|---|---|---|---|
GRAPH_API_KEY |
yes | — | Subgraph gateway credential (thegraph.com/studio) |
TOKEN_API_KEY |
no | GRAPH_API_KEY |
Token API bearer token, if different |
TOKEN_API_URL |
no | https://api.pinax.network/v1 |
Token API host. Pinax operates it — token-api.thegraph.com does not resolve |
DATA_CHAIN |
no | base |
Chain to query |
DATA_REQUEST_TIMEOUT_S |
no | 15 |
Per-request timeout |
CURATOR_MCP_LOG_LEVEL |
no | WARNING |
Logs go to stderr; stdout is the MCP transport |
Values are read from the environment, or from a .env found by walking up from the package.
Extending it
Protocols are configuration, not code. Because Messari publishes one standardized schema per
protocol type, every lending market answers the same GraphQL query — so adding one is a single
line in curator_data/sources/protocols.py:
Protocol(key="moonwell", subgraph_id="33ex…sBrg", family="lending", label="Moonwell (Base)"),
Adding a whole new provider (Chainlink, Pyth, DefiLlama) is one file plus one registration line —
see the curator-data README. New sources appear in these tools automatically,
because tools resolve sources by capability (provides = ("price",)) rather than by name.
Verify it works
GRAPH_API_KEY=… curator-data verify-live # live gateway check, names any failing protocol
uv run pytest data/tests -q # offline test suite
License
MIT.
Metadata
Release files for curator-mcp 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| curator_mcp-0.4.0.tar.gz | 9.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| curator_mcp-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 17.3 kB
Release files / curator_mcp-0.4.0.tar.gz
| Download URL | curator_mcp-0.4.0.tar.gz |
|---|---|
| Size | 9.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
743bcb9275fe3aba8ff4fd1df40c43aa1086955a2e7d786000029ee6ad392ea9
|
|
BLAKE2b-256 checksum How to use checksums |
23e5aab0f28df3480c2f7236c92f63d0aff84a5a826aeddeb195e1c2ddad0c00
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / curator_mcp-0.4.0-py3-none-any.whl
| Download URL | curator_mcp-0.4.0-py3-none-any.whl |
|---|---|
| Size | 7.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6924b21aa25b4f1dddda94b86eee61d76e5d30e8fa84a8081d3877d8c7ddfb3a
|
|
BLAKE2b-256 checksum How to use checksums |
ae7a4c7ea23738ee97e2d59b409f95b930b49c48c3a155be42386c30a7acf049
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|