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.
From a clone — works today:
git clone <this-repo> && cd <this-repo>
uv pip install ./data/curator_mcp
The two sibling packages (curator-data, curator-schema) resolve from the repo automatically.
From PyPI — once published (see PUBLISHING.md; the packages are built and verified, the upload needs a token):
uvx curator-mcp # run without installing
Configure your MCP client
{
"mcpServers": {
"curator": {
"command": "uv",
"args": ["run", "--directory", "/abs/path/to/repo", "curator-mcp"],
"env": { "GRAPH_API_KEY": "your-key-here" }
}
}
}
Once published, that becomes simply "command": "uvx", "args": ["curator-mcp"].
Either way, 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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file curator_mcp-0.2.0.tar.gz.
File metadata
- Download URL: curator_mcp-0.2.0.tar.gz
- Upload date:
- Size: 9.4 kB
- Tags: Source
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cdca91fcf8a7bd880b10ebd6d1f8012a741e253b1da2c623f597078a264cb71e
|
|
| MD5 |
7994cf49f53ecf774359feb77afd8c14
|
|
| BLAKE2b-256 |
59ae914fda45b66d9c1e2d08780475334509987e1a0430e4faecd613acbaa371
|
File details
Details for the file curator_mcp-0.2.0-py3-none-any.whl.
File metadata
- Download URL: curator_mcp-0.2.0-py3-none-any.whl
- Upload date:
- Size: 7.5 kB
- Tags: Python 3
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf4cba8a7e55e0952906c5c1ca471d281f997d1e503ca470014d2b658ffd5520
|
|
| MD5 |
24e91f13476222de0c2885a87d788b42
|
|
| BLAKE2b-256 |
dfdae9647cb4cae667cb06d486824560c6558f805e02b8321d6a2c18e181c9cf
|