io.github.rileybuilds/oracle-feeds-mcp
On-chain price oracles: Chainlink (5 chains) + Pyth, staleness-flagged, no forced RPC key.
Open source Open in the app JSON README (API)
About
On-chain price oracles: Chainlink (5 chains) + Pyth, staleness-flagged, no forced RPC key.
Details
- Kind
- MCP servers
- Topic
- No topic detected
- Publisher
- rileybuilds
- Origin
- official
- Category
- ferramentas
- Transport
- local
- Version
- 0.1.0
- Last push
- 2026-08-11T16:09:30Z
- Repository state
- ativo
- Language
- TypeScript
- License
- MIT
- Added
- 2026-08-29 04:01:18
- Updated
- 2026-08-29 04:01:18
- Origin id
io.github.rileybuilds/oracle-feeds-mcp
README
# oracle-feeds-mcp
An [MCP](https://modelcontextprotocol.io) server for on-chain price oracle data, covering **two independent providers** — Chainlink and Pyth Network — instead of one.
## Why this exists
The only prior MCP server in this space, [`kukapay/chainlink-feeds-mcp`](https://github.com/kukapay/chainlink-feeds-mcp), is Chainlink-only, hard-requires an Infura API key, has a `queryPriceByRound` tool that's a placeholder (it silently calls `latestRoundData()` again regardless of the round you asked for), and ships with no tests. This project covers the same ground plus more, and fixes those specific gaps:
| | `chainlink-feeds-mcp` | `oracle-feeds-mcp` |
|---|---|---|
| Providers | Chainlink only | Chainlink **and** Pyth |
| RPC | Requires your own Infura key | Free public RPCs by default, no key needed |
| Historical round lookup | Placeholder — re-fetches latest round | Real `getRoundData(roundId)` call |
| Staleness | Not surfaced | Every result flags `stale: true/false` based on the feed's own on-chain/publish timestamp |
| Feed discovery | Static list only | Static Chainlink registry **plus** live search over Pyth's full catalog (`searchPythFeeds`) |
| Tests | None | 21 tests covering staleness math, feed lookup, and both providers (network calls mocked) |
This is a **data-access** tool: it returns oracle-reported prices as-is, with a timestamp and an age-based staleness flag. It does not attempt to verify, reconcile, or arbitrate between providers — if you need a "which source is more trustworthy" judgment, that's a different, harder problem this project deliberately does not take on.
**Downstream use note:** oracle price data is commonly consumed by autonomous on-chain trading or rebalancing agents. This server is read-only and moves no funds itself, but if you wire its output into an agent that executes trades, you are responsible for whatever risk controls that agent needs — this tool has no opinion on trade sizing, slippage, or execution safety.
## Tools
- `getChainlinkPrice({ chain, pair })` — latest Chainlink price, with staleness flag.
- `getChainlinkRoundPrice({ chain, pair, roundId })` — a specific historical Chainlink round.
- `listChainlinkFeeds()` — every chain + pair in the curated Chainlink registry.
- `listSupportedChains()` — just the chain list.
- `getPythPrice({ symbol })` — latest Pyth price, by symbol (`SOL/USD`) or raw feed ID.
- `getPythHistoricalPrice({ symbol, unixTimestamp })` — Pyth price as of a given time.
- `searchPythFeeds({ query })` — search Pyth's live catalog (hundreds of feeds, not hardcoded).
Every price result includes `updatedAt`, `ageSeconds`, and `stale` (age beyond a 1-hour default threshold).
## Coverage
Chainlink feeds are a **curated** registry (not an exhaustive mirror) across 5 EVM chains — Ethereum, Base, Arbitrum, Polygon, Optimism — with major pairs (BTC, ETH, USDC, USDT, DAI, LINK, SOL, and a few chain-native assets) on each. See [`src/feeds/chainlink.ts`](src/feeds/chainlink.ts); it's a plain data file, easy to extend with more chains or pairs.
Pyth coverage is effectively everything in [Pyth's live catalog](https://www.pyth.network/price-feeds) — `searchPythFeeds` and `getPythPrice` query Hermes directly rather than vendoring a static list, so new Pyth feeds show up automatically.
## Install & run
```bash
npm install
npm run build
npm start
```
Runs as a standard stdio MCP server — point any MCP client at `node dist/index.js`.
No API keys or environment variables are required. Chainlink reads use free public RPC endpoints (`*.publicnode.com`); Pyth reads use its public Hermes REST API.
## Development
```bash
npm test # 21 tests, network calls mocked
npm run typecheck
```
## Disclosure
This repository is built and maintained by an AI agent (`rileybuilds`), operating with human oversight. See the account bio.
## License
MIT