Skip to main content
Glama
spiritcards

spirit-cards-mcp

Official
by spiritcards
README.md
# spirit-cards-mcp

A **read-only** [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server for
**Spirit Cards (Proof of Card)** — a proof-of-work minted collectible card game on
**Robinhood Chain** — mainnet `chainId 4663`, live since 2026-10-05.

It runs over **stdio**, so [Claude Desktop](https://claude.ai/download) and Cursor can launch it
with `npx`. It fetches live game data from the hosted web API and computes the proof-of-work
**locally** with [viem](https://viem.sh) — so an agent can inspect the collection, verify a
nonce, or even **grind a valid nonce**, without a wallet, a private key, or a single transaction.

> **Read-only.** No keys, no secrets, no signing, no sending. Every network call is a plain GET.

---

## Quick start

### Run with npx (after publishing)

```bash
npx spirit-cards-mcp
```

### Run from source

```bash
npm install
node src/index.mjs      # starts the stdio server (logs to stderr)
```

The server speaks MCP over stdin/stdout and logs only to **stderr** — it is normally launched by
an MCP client, not by hand.

---

## Use in Claude Desktop

Add this to `claude_desktop_config.json`
(`~/Library/Application Support/Claude/` on macOS, `%APPDATA%\Claude\` on Windows):

```json
{
  "mcpServers": {
    "spirit-cards": {
      "command": "npx",
      "args": ["-y", "spirit-cards-mcp"],
      "env": { "SPIRIT_CARDS_API": "https://spiritcards.fun" }
    }
  }
}
```

## Use in Cursor

Add this to `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global):

```json
{
  "mcpServers": {
    "spirit-cards": {
      "command": "npx",
      "args": ["-y", "spirit-cards-mcp"],
      "env": { "SPIRIT_CARDS_API": "https://spiritcards.fun" }
    }
  }
}
```

---

## Configuration

| Env var             | Default                              | Meaning                         |
| ------------------- | ------------------------------------ | ------------------------------- |
| `SPIRIT_CARDS_API`  | `https://spiritcards.fun` | Base URL of the hosted site/API |

All data endpoints are read-only GETs:

- `/.well-known/ai.json` — project descriptor (chain id, core contract, mechanics, links)
- `/stats/current.json` — live supply, price, required difficulty (`baseBits`), cooldown
- `/api/meta/{tokenId}` — card metadata
- `/api/points` — points leaderboard
- `/api/pool` — staking pool / emissions snapshot (accrued pool, split shares, vault weight)
- `/api/recent` — recent on-chain activity

---

## Tools

| Tool                  | Args                            | Description                                                             |
| --------------------- | ------------------------------- | ----------------------------------------------------------------------- |
| `get_project_info`    | —                               | `/.well-known/ai.json` + a composed human `summary`                     |
| `get_collection_stats`| —                               | Live stats: supply, price, `baseBits`, cooldown, paused flag            |
| `get_card`            | `tokenId`                       | Card metadata (`/api/meta/{tokenId}`)                                   |
| `get_leaderboard`     | `limit?` (default 25)           | Points leaderboard, trimmed to `limit`                                  |
| `get_pool`            | —                               | Staking pool: accrued pool, split shares, vault weight (undistributed)  |
| `get_recent_activity` | `limit?` (default 10)           | Recent events, trimmed to `limit`                                       |
| `verify_nonce`        | `miner`, `nonce`                | Verify a nonce's work locally (no tx): `{work, leadingZeroBits, valid}` |
| `find_nonce`          | `miner`, `maxAttempts?` (≤5M)   | Grind nonce 0.. until valid (~20 s wall cap)                            |
| `get_mining_guide`    | —                               | Step-by-step mint guide with live price/difficulty/cooldown             |

### Proof-of-work

A nonce is valid when:

```
work = keccak256(abi.encodePacked(uint256 chainId, address core, address miner, uint256 nonce))
leadingZeroBits(work) >= baseBits
```

Both `verify_nonce` and `find_nonce` compute this locally with viem's `keccak256` over
`concatHex([chainId, core, miner, nonce])` — byte-for-byte identical to Solidity's
`abi.encodePacked`.

## Prompts

| Prompt             | Args        | Description                                                    |
| ------------------ | ----------- | -------------------------------------------------------------- |
| `project_overview` | —           | Introduce the game to a newcomer (calls the info + stats tools) |
| `start_mining`     | `wallet?`   | Walk through finding a nonce and the exact mint transaction      |

---

## Hosted HTTP MCP

Prefer HTTP over stdio? The same server is also hosted at:

```
https://spiritcards.fun/api/mcp
```

---

## License

MIT © 2026 Spirit Cards (Proof of Card). See [LICENSE](./LICENSE).

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation4/5

Each tool targets a distinct endpoint or action: info, stats, card metadata, leaderboard, activity, pool, and PoW helpers. verify_nonce and find_nonce are closely related but clearly differentiated (check a given nonce vs. grind for one), and the read-only guide is distinct from all data fetches. Minor potential overlap between get_collection_stats and get_pool, but descriptions keep them separable.

Naming Consistency5/5

Eight of nine tools follow a predictable verb_noun snake_case pattern (get_*, verify_*, find_*), using get_ for data retrieval and action verbs for computations. Fully consistent and readable throughout.

Tool Count5/5

Nine tools is well-scoped for a read/query plus PoW-helper server. Each tool maps to a discrete endpoint or computation, with no redundant fillers.

Completeness4/5

Covers the read surface thoroughly (project, stats, card, leaderboard, activity, pool) plus the full PoW workflow (verify, find, guide). The notable gap is a submit/mint operation to actually send the mined nonce to mine(), though the read-only design is stated deliberately and the guide explains the external call.

Maintenance

ActivityMaintained
ResponsivenessNo issues