pypi carrydeskstdioupdated 1mo ago
Cross-sectional funding-carry rankings for Hyperliquid perpetuals, sold per call in USDC.
What can you do with carrydesk?
carrydesk
Cross-sectional funding-carry rankings for Hyperliquid perpetuals, sold per call in USDC.
Every hour, rank the liquid Hyperliquid perp universe by trailing 14-day mean funding. The most negative names pay you to hold them long; the most positive pay you to short them. The spread between those two legs is the carry ā a structural risk premium, not a prediction.
This is the same signal a live market-neutral book trades, published as an API.
Endpoints
| Endpoint | Price | |
|---|---|---|
| free | GET /v1/free/carry ā top 5 each leg, delayed 24h |
ā |
| free | GET /v1/method ā how it is computed, and the caveats |
ā |
| free | GET /health |
ā |
| paid | GET /v1/carry/rankings ā full live ranking, tunable k |
$0.05 |
| paid | GET /v1/carry/history/{coin} ā archived rank + funding |
$0.02 |
| paid | GET /v1/universe ā liquid perps by volume, OI, funding |
$0.01 |
Paid endpoints are metered with x402: the server answers
402 with payment requirements, your client pays USDC on Base, retries, and gets
the data. No account, no API key, no invoice.
Quick start
curl -s https://carry.pelazas.com/v1/free/carry | jq
{
"carry_spread_annualized": 0.3901,
"carry_spread_annualized_trimmed": 0.2231,
"carry_spread_annualized_median": 0.0955,
"headline_vs_typical": 4.09,
"outlier_dominated": true,
"longs": [{"coin": "PENGU", "mean_funding_annualized": -0.0636}, ...],
"shorts": [{"coin": "SAGA", "mean_funding_annualized": 1.9886}, ...]
}
Three spread numbers, always, plus two that say how far apart they are. The
headline mean is what an equal-weighted book earns; the median is what a typical
coin pays. headline_vs_typical is the multiple between them ā about 4 in the
sample above, and around 4 in practice ā and outlier_dominated fires when the
median drops below half the mean. On the reading above, SAGA alone accounts for most of the gap ā that
is exactly the kind of thing a single number would hide.
MCP
claude mcp add carrydesk -- uvx --from carrydesk carrydesk-mcp
No clone, no virtualenv ā uvx fetches and runs it.
Six tools: carry_snapshot, carry_method, carry_health (free) and
carry_rankings, carry_history, carry_universe (paid). It talks to
https://carry.pelazas.com by default ā override with CARRYDESK_API_BASE.
Set CARRYDESK_PRIVATE_KEY to let the agent pay automatically. Without it the
free tools work and paid tools return the price instead of failing, so a
wallet-less install is still useful.
Local development
uv venv --python 3.12 && uv pip install -e ".[dev]"
.venv/bin/python -m uvicorn carrydesk.api:app --reload # open, no paywall
.venv/bin/python -m pytest -q # full suite, no network
With X402_PAY_TO unset the service runs fully open ā that is the dev default.
Set it to turn the paywall on. See .env.example.
For agents and crawlers
/llms.txt describes the whole service in plain text. /openapi.json is the
full spec, /archive is every snapshot ever published, and the public page
carries schema.org Dataset markup. Crawlers are explicitly welcome ā the free
tier exists to be read, indexed and quoted.
Honest limitations
- The carry spread can and does go negative. This is compensation for absorbing crowded leverage, not a forecast.
- All figures are gross of fees, slippage and borrow. Taker fees alone can erase the edge; the reference book is maker-only for that reason.
- Funding is Hyperliquid's own, with no cross-venue reconciliation yet.
- Illiquid names dominate the headline spread more often than not. Read the trimmed and median variants before sizing anything.
- Informational only. Not investment advice.
Repo docs
| File | What |
|---|---|
BACKLOG.md |
Deliberately deferred work, with the reason for each |
AGENTS.md |
Onboarding for an AI agent picking this up cold ā gotchas, rules, what is unverified |
STATUS.md |
Current state, what is blocked, what is next |
DECISIONS.md |
Why each significant choice was made |
Install
Add carrydesk to your client. Pick the one you use.
claude mcp add carrydesk -- uvx carrydeskcodex mcp add carrydesk -- uvx carrydeskamp mcp add carrydesk -- uvx carrydesk{
"mcpServers": {
"carrydesk": {
"command": "uvx",
"args": [
"carrydesk"
]
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"carrydesk": {
"command": "uvx",
"args": [
"carrydesk"
]
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
code --add-mcp '{"name":"carrydesk","command":"uvx","args":["carrydesk"]}'Or add the block manually to `.vscode/mcp.json` under `servers`.
{
"mcpServers": {
"carrydesk": {
"command": "uvx",
"args": [
"carrydesk"
]
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
{
"mcpServers": {
"carrydesk": {
"command": "uvx",
"args": [
"carrydesk"
]
}
}
}Add to `cline_mcp_settings.json` via the MCP Servers panel.
{
"mcpServers": {
"carrydesk": {
"command": "uvx",
"args": [
"carrydesk"
]
}
}
}Add to `~/.gemini/settings.json`.
{
"mcpServers": {
"carrydesk": {
"type": "local",
"command": "uvx",
"args": [
"carrydesk"
],
"tools": [
"*"
]
}
}
}Add to `~/.copilot/mcp-config.json`, or run `/mcp add` inside the CLI.
{
"context_servers": {
"carrydesk": {
"command": {
"path": "uvx",
"args": [
"carrydesk"
]
}
}
}
}Add to your Zed `settings.json`.
uvx carrydeskRun `goose configure`, choose **Add Extension ā Command-line Extension**, and paste this command.
Score
39 / 100
Incomplete
- Documentation25/25
- Maintenance19/25
- Trust6/20
- Capability0/15
- Install experience12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 30 days ago
- Has a release history
- Repository is not archived
- No licence detected
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 0 tool(s) documented
- Provides prompt templates
- Provides resources
- 12 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint ā no local install
Version history
| Versions | Published |
|---|---|
| 0.1.2Latest | Aug 2, 2026 |