Skip to main content
Glama
README.md
# mcp-infinifi

Read-only stdio MCP server for infiniFi public Ethereum mainnet contracts and documentation index. No wallet, key, transaction signing, authentication, or write tools. This is an independent local prototype, not an infiniFi release.

The [API documentation](https://docs.infinifi.xyz/dev-docs/api-documentation) names protocol state and historical data but publishes no HTTP paths, parameters, or base URL. It points to an `infinifi-backend` repository that returned HTTP 404 when checked on 2026-10-20. This server does not invent an HTTP API, historical metric, or product endpoint. Instead it uses `eth_call` against [published Ethereum contract addresses](https://docs.infinifi.xyz/dev-docs/contracts), the [public contract interfaces](https://github.com/InfiniFi-Labs/infinifi-protocol), and the [published llms.txt index](https://docs.infinifi.xyz/llms.txt).

## Install

Node.js 20+ and pnpm are required. From this folder:

```sh
pnpm install
pnpm build
node dist/index.js
```

The last command runs the stdio server; an MCP client supplies messages on stdin. Set `INFINIFI_RPC_URL` to another trusted Ethereum mainnet JSON-RPC URL if the default public endpoint is unavailable. The default is `https://ethereum-rpc.publicnode.com`.

For Claude Desktop on macOS, add this to `~/Library/Application Support/Claude/claude_desktop_config.json` under `mcpServers` and restart Claude:

```json
{
  "mcpServers": {
    "infinifi": {
      "command": "node",
      "args": [
        "/Users/0xmarvel/superconductor/projects/value-drops/infinifi-mcp/dist/index.js"
      ]
    }
  }
}
```

For Cursor, use the same `mcpServers` entry in `~/.cursor/mcp.json` (or the project `.cursor/mcp.json`) and reload Cursor. Replace the path if you moved this folder.

## Tool to source mapping

| Tool | Exact read | Public source |
| --- | --- | --- |
| `get_token_supplies` | JSON-RPC `eth_call`: `totalSupply()`, `decimals()` on iUSD and siUSD | [Token addresses](https://docs.infinifi.xyz/dev-docs/contracts), [ReceiptToken](https://github.com/InfiniFi-Labs/infinifi-protocol/blob/master/src/tokens/ReceiptToken.sol), [StakedToken](https://github.com/InfiniFi-Labs/infinifi-protocol/blob/master/src/tokens/StakedToken.sol) |
| `list_registered_farms` | JSON-RPC `eth_call`: `getFarms()`, `getEnabledAssets()` on FarmRegistry | [Registry address](https://docs.infinifi.xyz/dev-docs/integrations/farm-registry), [source](https://github.com/InfiniFi-Labs/infinifi-protocol/blob/master/src/integrations/FarmRegistry.sol) |
| `get_farm_state` | JSON-RPC `eth_call`: `isFarm(address)`, then `assetToken()`, `assets()`, `cap()`, asset `decimals()` | [Registry](https://docs.infinifi.xyz/dev-docs/integrations/farm-registry), [Farm source](https://github.com/InfiniFi-Labs/infinifi-protocol/blob/master/src/integrations/Farm.sol) |
| `get_docs_index` | HTTP `GET https://docs.infinifi.xyz/llms.txt` | [Documentation index](https://docs.infinifi.xyz/llms.txt) |

Each onchain result reads a single block. `retrievedAt` is local request completion time, not the block time. Amounts remain decimal strings, with raw integer values included. A `capUnlimited` flag marks the contract `uint256.max` sentinel, with `cap: null`. Token supply is not TVL; farm accounting assets are not a promise of immediate liquidity.

## Real MCP calls

I started `node dist/index.js` over stdio, initialized MCP, and sent the following `tools/call` requests on 2026-10-20 UTC. The JSON below is the exact text returned by each tool at that time. Values will change.

### get_token_supplies

Request: `tools/call` with `{"name":"get_token_supplies","arguments":{}}`.

Recorded tool text (live response):

```json
{
  "readOnly": true,
  "retrievedAt": "2026-10-20T20:32:25.412Z",
  "source": {
    "endpoint": "https://ethereum-rpc.publicnode.com eth_call",
    "methods": "iUSD.totalSupply(), iUSD.decimals(), siUSD.totalSupply(), siUSD.decimals()",
    "contracts": [
      "0x48f9e38f3070AD8945DFEae3FA70987722E3D89c",
      "0xDBDC1Ef57537E34680B898E1FEBD3D68c7389bCB"
    ],
    "documentation": "https://docs.infinifi.xyz/dev-docs/contracts",
    "interfaces": [
      "https://github.com/InfiniFi-Labs/infinifi-protocol/blob/master/src/tokens/ReceiptToken.sol",
      "https://github.com/InfiniFi-Labs/infinifi-protocol/blob/master/src/tokens/StakedToken.sol"
    ]
  },
  "data": {
    "block": "26236205",
    "tokens": [
      {
        "symbol": "iUSD",
        "address": "0x48f9e38f3070AD8945DFEae3FA70987722E3D89c",
        "supplyRaw": "68302862178713469460186700",
        "decimals": 18,
        "supply": "68302862.1787134694601867"
      },
      {
        "symbol": "siUSD",
        "address": "0xDBDC1Ef57537E34680B898E1FEBD3D68c7389bCB",
        "supplyRaw": "48068711238339140960628049",
        "decimals": 18,
        "supply": "48068711.238339140960628049"
      }
    ]
  }
}
```

### list_registered_farms

Request: `tools/call` with `{"name":"list_registered_farms","arguments":{}}`.

Recorded tool text (live response):

```json
{
  "readOnly": true,
  "retrievedAt": "2026-10-20T20:32:26.018Z",
  "source": {
    "endpoint": "https://ethereum-rpc.publicnode.com eth_call",
    "contract": "0xF5f2718708f471e43968271956CC01aaA8c46119",
    "methods": "getFarms(), getEnabledAssets()",
    "documentation": "https://docs.infinifi.xyz/dev-docs/integrations/farm-registry",
    "interface": "https://github.com/InfiniFi-Labs/infinifi-protocol/blob/master/src/integrations/FarmRegistry.sol"
  },
  "data": {
    "block": "26236205",
    "count": 17,
    "farms": [
      "0x49877d937B9a00d50557bdC3D87287b5c3a4C256",
      "0xCb1747E89a43DEdcF4A2b831a0D94859EFeC7601",
      "0xda40ce7DdDBE7D54A106D32575b2CCF41dDb1A11",
      "0xAc21B22B5aEb11bc32De4ecF59E4538fCa48b694",
      "0x90787c1b99F47EFfEE0db0aB9D4e33CdC3e6bFa7",
      "0x79e1B8e45932A7C802eA3dAb3844e5DEa68d971f",
      "0x277FdF6Dc5c53C5c2828188Da84B9593A50884C1",
      "0xe919C66475f2F30d285c768853E6B5b23ef181Cf",
      "0xbFd5FC8DecA3C6128bfCE0FE46c25616811c3580",
      "0xfD1Ea12d29B90630b265DBbc6Af88266d1a83dE4",
      "0xd880D7C5CaFdbE2AEc281250995abF612235e563",
      "0xA7c1DAEAA5D97e1319B4Ff6Cdf658F5C4582A27E",
      "0x9E5efC5F387D8661C1AFB2469B7EeF6972451852",
      "0x2fa5E6C5549BEdF98A935Cac3BB4337459c74897",
      "0x78A31bD6cAca12BdF83F8A608076006C1F58F363",
      "0xbD6c2d1C4809a5D8847FbA3a3cf7d6BDf6b6C3bA",
      "0xe9E44C0A68C49aDe51CdA5e027909C5996B5c71a"
    ],
    "enabledAssets": [
      "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
      "0x8292Bb45bf1Ee4d140127049757C2E0fF06317eD"
    ]
  }
}
```

### get_farm_state

Request: `tools/call` with `{"name":"get_farm_state","arguments":{"address":"0xbFd5FC8DecA3C6128bfCE0FE46c25616811c3580"}}`.

Recorded tool text (live response):

```json
{
  "readOnly": true,
  "retrievedAt": "2026-10-20T20:32:32.937Z",
  "source": {
    "endpoint": "https://ethereum-rpc.publicnode.com eth_call",
    "contract": "0xbFd5FC8DecA3C6128bfCE0FE46c25616811c3580",
    "methods": "FarmRegistry.isFarm(address), Farm.assetToken(), Farm.assets(), Farm.cap(), assetToken.decimals()",
    "registry": "0xF5f2718708f471e43968271956CC01aaA8c46119",
    "documentation": "https://docs.infinifi.xyz/dev-docs/integrations/farm-registry",
    "interface": "https://github.com/InfiniFi-Labs/infinifi-protocol/blob/master/src/integrations/Farm.sol"
  },
  "data": {
    "block": "26236205",
    "address": "0xbFd5FC8DecA3C6128bfCE0FE46c25616811c3580",
    "assetToken": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
    "decimals": 6,
    "assetsRaw": "3508611028172",
    "assets": "3508611.028172",
    "capRaw": "115792089237316195423570985008687907853269984665640564039457584007913129639935",
    "cap": null,
    "capUnlimited": true
  }
}
```

### get_docs_index

Request: `tools/call` with `{"name":"get_docs_index","arguments":{}}`.

Recorded tool text (live response):

```json
{
  "readOnly": true,
  "retrievedAt": "2026-10-20T20:32:33.223Z",
  "source": {
    "endpoint": "GET https://docs.infinifi.xyz/llms.txt",
    "documentation": "https://docs.infinifi.xyz/dev-docs/api-documentation"
  },
  "data": {
    "pages": [
      {
        "title": "infiniFi Docs Hub",
        "url": "https://docs.infinifi.xyz/index.md"
      },
      {
        "title": "Whitepaper",
        "url": "https://docs.infinifi.xyz/whitepaper/index.md"
      },
      {
        "title": "Oracles",
        "url": "https://docs.infinifi.xyz/oracles.md"
      },
      {
        "title": "Vaults",
        "url": "https://docs.infinifi.xyz/vaults.md"
      },
      {
        "title": "Deposit Quickstart",
        "url": "https://docs.infinifi.xyz/deposit-quickstart.md"
      },
      {
        "title": "Pendle Liquidity Transfer",
        "url": "https://docs.infinifi.xyz/pendle-liquidity-transfer/index.md"
      },
      {
        "title": "Security",
        "url": "https://docs.infinifi.xyz/audits.md"
      },
      {
        "title": "Risk Disclosures",
        "url": "https://docs.infinifi.xyz/risk-disclosures.md"
      },
      {
        "title": "Slashing mechanics",
        "url": "https://docs.infinifi.xyz/slashing-mechanics.md"
      },
      {
        "title": "Developer Summary",
        "url": "https://docs.infinifi.xyz/dev-docs/summary.md"
      },
      {
        "title": "Contract Addresses",
        "url": "https://docs.infinifi.xyz/dev-docs/contracts.md"
      },
      {
        "title": "Changelog",
        "url": "https://docs.infinifi.xyz/dev-docs/changelog.md"
      },
      {
        "title": "Core",
        "url": "https://docs.infinifi.xyz/dev-docs/core/index.md"
      },
      {
        "title": "InfiniFiCore.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/core/infini-fi-core.md"
      },
      {
        "title": "CoreControlled.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/core/core-controlled.md"
      },
      {
        "title": "Gateway",
        "url": "https://docs.infinifi.xyz/dev-docs/gateway/index.md"
      },
      {
        "title": "InfiniFiGatewayV1.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/gateway/infini-fi-gateway-v1.md"
      },
      {
        "title": "Tokens",
        "url": "https://docs.infinifi.xyz/dev-docs/tokens/index.md"
      },
      {
        "title": "ReceiptToken.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/tokens/receipt-token.md"
      },
      {
        "title": "StakedToken.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/tokens/staked-token.md"
      },
      {
        "title": "LockedPositionToken.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/tokens/locked-position-token.md"
      },
      {
        "title": "Funding",
        "url": "https://docs.infinifi.xyz/dev-docs/funding/index.md"
      },
      {
        "title": "MintController.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/funding/mint-controller.md"
      },
      {
        "title": "RedeemController.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/funding/redeem-controller.md"
      },
      {
        "title": "RedemptionPool.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/funding/redemption-pool.md"
      },
      {
        "title": "Locking",
        "url": "https://docs.infinifi.xyz/dev-docs/locking/index.md"
      },
      {
        "title": "LockingController.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/locking/locking-controller.md"
      },
      {
        "title": "UnwindingModule.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/locking/unwinding-module.md"
      },
      {
        "title": "Finance",
        "url": "https://docs.infinifi.xyz/dev-docs/finance/index.md"
      },
      {
        "title": "Accounting.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/finance/accounting.md"
      },
      {
        "title": "YieldSharing.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/finance/yield-sharing.md"
      },
      {
        "title": "Governance",
        "url": "https://docs.infinifi.xyz/dev-docs/governance/index.md"
      },
      {
        "title": "AllocationVoting.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/governance/allocation-voting.md"
      },
      {
        "title": "Timelock.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/governance/timelock.md"
      },
      {
        "title": "MinorRolesManager.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/governance/minor-roles-manager.md"
      },
      {
        "title": "Integrations",
        "url": "https://docs.infinifi.xyz/dev-docs/integrations/index.md"
      },
      {
        "title": "Farm.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/integrations/farm.md"
      },
      {
        "title": "FarmRegistry.sol",
        "url": "https://docs.infinifi.xyz/dev-docs/integrations/farm-registry.md"
      },
      {
        "title": "Farms",
        "url": "https://docs.infinifi.xyz/dev-docs/integrations/farms.md"
      },
      {
        "title": "API Documentation",
        "url": "https://docs.infinifi.xyz/dev-docs/api-documentation.md"
      },
      {
        "title": "Roles Documentation",
        "url": "https://docs.infinifi.xyz/dev-docs/roles-documentation.md"
      },
      {
        "title": "Research Overview",
        "url": "https://docs.infinifi.xyz/research.md"
      },
      {
        "title": "Liquid keeper reserve",
        "url": "https://docs.infinifi.xyz/liquid-keeper-reserve.md"
      },
      {
        "title": "Risk Assessment Framework",
        "url": "https://docs.infinifi.xyz/risk-assessment-framework.md"
      }
    ]
  }
}
```

## What I would add next

Once infiniFi publishes concrete public HTTP paths and schemas, add protocol-state and historical-metric tools against those documented endpoints. Cross-check farm valuations against a published accounting contract address before calling any aggregate figure TVL.

TDQS

A4/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a distinct resource and action: token supplies, farm enumeration, single-farm state, and documentation index. The descriptions explicitly delineate boundaries (e.g. list_registered_farms vs get_farm_state) so an agent can select reliably.

Naming Consistency5/5

All four tools follow a consistent verb_noun snake_case pattern: get_token_supplies, list_registered_farms, get_farm_state, get_docs_index. Verb choice (get/list) maps predictably to retrieval vs enumeration.

Tool Count4/5

Four tools is slightly thin but well-scoped for a read-only protocol data reader, with each tool earning its place. No redundant or filler tools, though the surface is minimal.

Completeness3/5

The read surface covers token supplies, farms, farm state, and docs, but lacks user-position/balance queries and yield or historical metrics that a protocol reader would typically need. These notable gaps limit deeper agent workflows without external calls.

Maintenance

ActivityMaintained
ResponsivenessNo issues