Back to the catalog

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

More