# sailorpepe/undesirables-mcp-server [Health: Active]

**Category:** 💰 Finance & Fintech  
**Repository:** https://github.com/sailorpepe/undesirables-mcp-server  
**GitHub Stars:** 4  
**Views:** 1  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/sailorpepe-undesirables-mcp-server

## Description
TCG collectibles + AI agent intelligence. 35+ tools: Vision AI card grading (PSA/Beckett prediction), Monte Carlo price simulation (Heston/Merton/Kou), AI music generation, local image generation (FLUX), TTS, RAG memory, SAST security auditing, and x402 Oracle API. 370K+ indexed products across 25 games. Install via pip install undesirables-mcp-server.

## Tools
Capabilities this server exposes over MCP:

- **search_tcg_products** — 
    NOTE 2026-09-12: USD market prices in results are FROZEN at 2026-09-07 (feed
    stopped); the response carries usd_panel {frozen, as_of}. Names/ids are current.
    Search 456K+ TCG products across 25+ card games.

    FRESHNESS: USD prices are currently FROZEN at their last good date — the
    upstream feed is unavailable. Every price carries its own as-of date and
    the oracle root publishes live panel state under `panels`. A Japanese-print
    panel (24 games, ~364K cards, ~167K with BOTH an ask and a dealer buyback
    bid) refreshes every morning. Do not present a USD price as current.
    Returns card names and IDs, plus current market prices.
    FREE — no payment required.

    Use this when: a user asks about a specific card, wants to find cards,
    or needs current pricing for any trading card game product.

    HOW TO SEARCH (card name AND set name are both searchable):
      • Card name alone casts the widest net: "Charizard", "Black Lotus".
      • Add the SET to pin down a printing: "Base Set Charizard" returns the
        Base Set, Base Set 2 and Shadowless Charizards as separate entries.
        This matters — printings of the "same" card differ wildly in value.
      • Every result carries a "set" field. Use it to choose, then pass that
        result's product_id to the other tools (card_forecast, grade_or_not,
        simulate_price) — exact, and avoids re-searching.
      • Do NOT include rarity or condition words: "Holo", "1st Edition",
        "Shadowless", "PSA 10" are not indexed and will sink an otherwise-good
        query. "Base Set Charizard Holo" → drop "Holo".
      • Got nothing? Remove the rarity words first, then fall back to the plain
        card name.
    
- **market_snapshot** — 
    SUSPENDED 2026-09-12: the USD price panel behind this tool froze on
    2026-09-07. The oracle answers 200 {"status": "suspended"} with the reason,
    resume condition and live alternatives, and does NOT charge. The tool is
    kept so it resumes automatically the day a live USD series exists. Prefer:
    loan_terms_preview (graded slabs, live), sports_board (live), or the free
    Japanese two-sided page /jp/card/{game}/{set}/{card}.
    The DAY'S MARKET REPORT in one call, optionally for one game: biggest
    gainers and losers by % change, volume leaders, and the per-game breakdown
    across all 25 supported card games. A summary of the whole market, not a
    ranked pick list.

    PAID: $0.025 USDC per call (x402 — USDC on Base or Solana, or USDG on
    Robinhood Chain). Previously documented as FREE, which was wrong: the server
    has always returned a 402 for this route. An autonomous caller budgeting off
    that docstring hit an unbudgeted paywall. (External audit 2026-07-30, BUG-2.)

    Use this when: a user asks "what happened in the card market today?" or
    "which games are moving?". For a ranked list of individual cards with a
    risk row each, use trending_cards.
    
- **grade_card** — 
    AI-grade a trading card image using a 3-stage pipeline:
    (1) Qwen Vision LLM analyzes corners, edges, surface defects
    (2) OpenCV measures exact centering ratios programmatically
    (3) BGS professional capping algorithm adjusts the final grade

    Returns PSA/Beckett-calibrated subgrades and an overall condition score.
    Also includes a free ROI verdict (should you grade this card?).

    PAID: $0.10 per call via x402. THREE rails are accepted, not just Base:
      - USDC on Base            (eip155:8453)
      - USDC on Solana          (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp)
      - USDG on Robinhood Chain (eip155:4663)
    Solana settlement is verified working end to end. (Audit 2026-07-30, BUG-12.)

    Use this when: a user has a card image and wants to know what grade
    it would receive from PSA or Beckett.
    
- **grade_or_not** — 
    Answers: "Should I grade this card? Will I make money?"

    Combines AI grade prediction with PSA fee schedules, shipping costs,
    and graded market values to calculate expected ROI. Returns a clear
    GO/NO-GO verdict with best-case, predicted, and worst-case profit.

    PAID: $0.10 USDC per call.

    Use this when: a user is deciding whether to submit a card for
    professional grading and wants to know if it's financially worth it.
    
- **simulate_price** — 
    SUSPENDED 2026-09-12: the USD price panel behind this tool froze on
    2026-09-07. The oracle answers 200 {"status": "suspended"} with the reason,
    resume condition and live alternatives, and does NOT charge. The tool is
    kept so it resumes automatically the day a live USD series exists. Prefer:
    loan_terms_preview (graded slabs, live), sports_board (live), or the free
    Japanese two-sided page /jp/card/{game}/{set}/{card}.
    SIMULATE a card's price path over a horizon YOU choose (days=30..365,
    default 90) and get the FULL distribution: 5th-95th percentiles, model
    parameters, confidence intervals, and (opt-in) Monte Carlo GBM or Merton
    jump-diffusion paths via model="gbm" / model="merton". Default model is the
    conformal-calibrated risk forecast. Requires current_price.

    PAID: $0.015 USDC per call.

    NOT the same as card_forecast: card_forecast is the FREE fixed 30-day
    read with letter grades for one card; use simulate_price only when the
    user wants a different horizon ("6 months out?"), the full percentile
    curve, or a Monte Carlo model.
    
- **card_forecast** — 
    FROZEN INPUTS since 2026-09-07: the USD price series stopped, so this read
    is issued from the last published price and the response carries a
    top-level usd_panel {frozen: true, as_of}. Say "last published", never "today".
    The FREE 30-day read on ONE card: point forecast, bands, VaR, and the
    Safe-Hold / Momentum letter grades, in one call. Pass a card_name (resolved
    to the best match) or a TCGplayer product_id. Horizon is fixed at 30 days.

    FREE — no payment required. Returns an agent-complete object:
      price, as_of, regime, point (median 30d), move_pct, prob_up,
      band50_pct, band90_pct, var95_pct, var99_pct, low90, high90,
      safe_hold grade (A+..F), momentum grade (A+..F or "NA" on a drift spike),
      drift_spike, image_url, card_url, and a one-line plain_english read
      (e.g. "~12% chance it's below $Y in 30 days; Safe-Hold B, Momentum A").

    Use this FIRST for "is this card a safe hold?", "30-day outlook?", "how
    risky is X?". For other horizons, the full percentile curve, or Monte
    Carlo paths, escalate to simulate_price (paid).
    Tip: GET /api/v1/forecast (no args) returns the free board of the top ~200
    cards if the user wants a market overview.
    
- **trending_cards** — 
    SUSPENDED 2026-09-12: the USD price panel behind this tool froze on
    2026-09-07. The oracle answers 200 {"status": "suspended"} with the reason,
    resume condition and live alternatives, and does NOT charge. The tool is
    kept so it resumes automatically the day a live USD series exists. Prefer:
    loan_terms_preview (graded slabs, live), sports_board (live), or the free
    Japanese two-sided page /jp/card/{game}/{set}/{card}.
    A RANKED LIST of individual cards by PRICE VELOCITY (drift), highest
    absolute movement first, with the conformal risk row (bands, VaR, grades)
    attached to each card. Filter by game, limit, and min_price. Built for
    picking cards, not for summarizing the market.

    NOTE (corrected 2026-07-30): this previously claimed "30-day sales volume".
    Sales volume and view counts are NOT in the dataset and the API itself now
    explicitly disclaims them — see `ranked_by` in the response.

    Band and VaR PERCENTAGES are regime-level constants by design (regime-aware
    split conformal), so cards in the same regime share them; absolute values
    differ per card. Do not read it as a per-card fit. Covers all 25+ games.

    PAID: $0.025 USDC per call.

    Use this when: a user asks "which cards are moving fastest right now?" and
    wants names to act on. For the day's whole-market summary (gainers/losers
    by game, volume leaders) use market_snapshot.
    
- **optimize_portfolio** — 
    SUSPENDED 2026-09-12: the USD price panel behind this tool froze on
    2026-09-07. The oracle answers 200 {"status": "suspended"} with the reason,
    resume condition and live alternatives, and does NOT charge. The tool is
    kept so it resumes automatically the day a live USD series exists. Prefer:
    loan_terms_preview (graded slabs, live), sports_board (live), or the free
    Japanese two-sided page /jp/card/{game}/{set}/{card}.
    Optimize a trading card portfolio using Markowitz mean-variance
    analysis with Merton jump-diffusion Monte Carlo simulations.

    Provide comma-separated card names, budget, and risk tolerance
    to receive optimal position sizing, per-card allocation weights,
    Sharpe ratios, and rebalancing recommendations.

    PAID: $0.50 USDC per call.

    Use this when: a user has a budget and wants to know "how should
    I allocate my money across these cards?"
    
- **recommend_workflow** — 
    Describe your goal in natural language and get a recommended sequence
    of TCG Oracle API calls to accomplish it.

    FREE — no payment required.

    Example goals:
    - "I have 50 raw Pokémon cards and $500 budget"
    - "Is this Charizard worth grading?"
    - "Find me undervalued cards to flip"
    - "Predict the price of a Black Lotus in 90 days"

    Use this when: you're not sure which tool to call first, or need
    a multi-step workflow recommendation.
    
- **souls_in_wallet** — 
    Show every Undesirable soul a wallet holds, with each soul's public
    prediction track record and its most recent calls.
    FREE — no payment, no signature, no wallet connection required.

    Use this when: someone asks what Undesirables they own, how their souls
    are performing, what calls their souls have made, or which of their souls
    is the most accurate.

    HOW IT WORKS
      • Ownership is read from Ethereum mainnet (ERC-721
        0xA893648A701C03B14bF2FB767B72b2C55ed5c17A). Only the minted souls
        1..total_minted (from GET / on the oracle) have public records.
      • Nothing here is private, so you can look up ANY address — the caller
        does not have to prove they own it. Ask the user for their address.
      • Each minted soul locks 3 card predictions weekly, chosen deterministically
        from its on-chain personality traits. The oracle scores them 30 days later
        against real market prices.

    WHAT YOU GET BACK
      • souls[]        — per soul: rating (A+..F / UNRATED), matured, hits,
                         hit_rate, brier, open_calls, and recent_calls with each
                         call's outcome (hit / miss / push)
      • wallet_totals  — combined open + matured calls and overall hit rate
      • best_soul      — the holder's most accurate soul, once any have matured

    HOLDERS WITH SEVERAL SOULS: this is a roster. Offer to compare them, or to
    speak as a specific one — each has different traits and its own record.

    IMPORTANT — ratings mature on a schedule. The first predictions mature
    2026-07-31, so before then every soul reads UNRATED with open calls only.
    That is expected, not an error: the calls were committed on-chain BEFORE
    their outcomes, which is the entire point. Say so rather than implying the
    soul has no history.

    Args:
        address: 0x-prefixed EVM address to look up.
        calls: recent scored calls to include per soul (0-12, default 5).
    
- **soul_calls** — 
    Full public record for ONE Undesirable soul: every open (locked) prediction
    and its recent scored results.
    FREE — no payment required.

    Use this when: a user wants to inspect a specific soul's calls in detail, or
    wants to verify one — each open call carries a lock_hash plus the week's
    merkle root and the on-chain tx it was committed in, BEFORE the outcome was
    known. That is what makes the record checkable rather than claimed.

    Args:
        token_id: a minted soul. Valid ids run 1..total_minted, where
            total_minted is read live from GET / on the oracle (274 on
            2026-09-12; it grows as souls mint — never hardcode it).
    
- **syndicate_state** — 
    The Syndicate — a FREE turn-based organized-crime strategy game you (the
    agent) can play. Same city, same rules, same leaderboard as the human
    game at play.the-undesirables.com.

    Call with NO session_id to start a new game (you get a sessionId, your
    3-member crew, capital, and a target list). Call with your session_id to
    re-read the current state any time. Full rules: play.the-undesirables.com/SKILL.md

    Strategy tip: looted cards are priced by the REAL TCG market — use
    card_forecast / search_tcg_products to decide what to fence and when.
    
- **syndicate_move** — 
    Submit one day of orders to your Syndicate game and get the resolved
    day back (events + new state). One order per crew member per day.

    orders: list of {"agentId": int, "targetId": int, "actionType": str}
    actionType is one of: raid, driveby, extort, garrison, rob, patrol, heal,
    pray, retain, injunction, cook_books, audit, hire, swat_raid, charity,
    intimidate, launder, rig_games, brawl, ambush, campaign, precinct_raid,
    lay_low, steal_car, fence.

    Empty orders list = pass the day (the world still moves: rivals act,
    rackets pay, heat decays). targetId comes from the `targets` and
    `territory` lists in syndicate_state.
    
- **syndicate_leaderboard** — 
    The Syndicate's shared 'Biggest Scores' leaderboard — humans and AI
    agents on ONE board; agent entries carry {"agent": true} and a model
    label. Win a game (own the city) and your score posts automatically.
    
- **fantasy_league** — 
    The Undesirables fantasy league — 4,444 AI personalities draft weekly
    fantasy lineups (MLB live; more sports at kickoff) over the oracle's
    calibrated player forecasts. FREE. Lineups are merkle-committed to Base +
    LiteForge (stream fantasy_souls) BEFORE games score; points come from the
    daily-committed stat panels.

    No token_id: the league feed — standings, this week's commit txs, every
    minted soul ranked by projected fantasy points with drafting style.
    With token_id (1..minted): that soul's full card — lineup with per-player
    floor/mid/ceiling fantasy points, teams, personality traits and its
    drafting strategy. Sealed souls return 404 until minted.

    Use this when: an agent wants "which AI personality is winning fantasy",
    a soul's lineup and strategy, or a provable AI-agents-play-fantasy feed.
    Human page: https://oracle.the-undesirables.com/fantasy
    
- **loan_terms_preview** — 
    FREE worked derivation of safe lending terms for a GRADED SLAB (v2,
    2026-09-12): live slab value (realized sales > delisting-inferred sales >
    ask median x 0.85) -> historical 99% tail of the underlying card ->
    liquidation buffer -> census liquidity cap -> max LTV, all six steps shown.
    grade e.g. "PSA 10"; omitted = the slab's deepest-census grade. term_days:
    7, 14 or 30. Only free-board slabs (top 250 by census depth) return the
    derivation; others return 404 pointing at the paid quote /api/v1/loan-terms
    ($0.10 x402, ~1,100 rated slabs). Raw-card quotes are no longer issued —
    the USD level froze 2026-09-07. Universe: /api/v1/loan-terms/universe.
    Informational only — not financial advice.
    Use this when: an agent wants collateral math for a slab, or to explain
    how the Loan-Terms Oracle derives an LTV before paying for a full quote.
    Human page: https://oracle.the-undesirables.com/lending
    
- **oracle_scorecard** — 
    The oracle's HEADLINE scorecard, all games combined — check us before
    trusting us. FREE, no arguments. Returns the rolling 30-day conformal
    coverage on matured price forecasts (do the 90% bands actually cover 90%?
    recent: 93.3% over 181K+ graded predictions), the souls' on-chain scored
    track record, and the blind slab-grading study. Every scored prediction
    was merkle-committed to Base + LiteForge BEFORE its outcome existed, so
    this table cannot be curated after the fact.

    Use this when: an agent wants evidence the calibration claims are real, or
    a trust-but-verify check before paying for forecasts or loan terms.
    
- **jp_summary** — 
    The JAPANESE card market today, as numbers — no card names or prices.
    How many cards the dealer panel priced this morning (365K+ across 24 games,
    ~167K carrying BOTH an ask and a buyback bid), the dealer bid as a share of
    ask at each price band (a bulk floor under ~¥300, a real quote above), depth
    per game, how much of the board actually moved since yesterday and a week ago,
    and the day's Merkle root with both chain txs. FREE, refreshes once per ingest
    day. The only Japanese panel that is LIVE while the USD panel is frozen.
    Use this when: "what did the Japanese market do today?", "is the dealer paying
    more or less for cards this week?", or before reasoning about any single
    Japanese card — the per-card page is /jp/card/{game}/{set_code}/{card_id}
    (HTML, one card per request; there is deliberately no listing route).
    
- **graded_asks** — 
    GRADED SLAB asking prices for one card — PSA/BGS/CGC medians by grade with
    listing counts, low/high, an as-of date per grade and the explicit price_basis
    (these are eBay ASKS, not sold prices; asks are a ceiling). FREE, refreshed
    daily by the eBay enrichment, merkle-committed on GradedPriceOracle. The LIVE
    value layer while the USD raw-card panel is frozen — and the basis the graded-
    slab loan terms are built on. product_id = TCGplayer id from search.
    Use this when: "what does a PSA 10 of this go for?", "raw vs graded premium?",
    or before loan_terms_preview / the paid /api/v1/loan-terms quote.
    
- **loan_universe** — 
    Every graded slab the Loan-Terms Oracle will quote — ~1,100 slabs with grade,
    live ask median, census depth, liquidity tier (deep/moderate/thin/illiquid),
    rank and a free_board flag (top 250 by census depth carry a free worked
    derivation via loan_terms_preview). FREE. v2 (2026-09-12): graded slabs only —
    raw-card quotes are no longer issued because the USD level froze 2026-09-07.
    Use this when: an agent needs a product_id + grade to ask for terms, or wants
    to know which collateral is deep enough to lend against at all.
    
- **census_summary** — 
    The observed graded-slab CENSUS as totals: how many PSA/BGS/CGC/TAG slabs the
    oracle tracks circulating on the open market (cert-verified — what is listed
    and pressing on price, NOT a pop report), unique certs, cards covered, grader
    mix, active-30d counts. FREE, daily, census leaves committed on-chain. The
    per-card census with median asks is the paid /api/v1/census ($0.05).
    Use this when: sizing supply behind a grade, or judging how thin a slab
    market is before trusting an ask.
    
- **sports_players** — 
    The sports player directory — ids, names, teams and positions for the
    leagues currently ON THE BOARD (a league appears once it is in season with
    enough games for the panel; off-season leagues are absent, not stale), the
    ids the paid /api/v1/sports/forecast ($0.05) and the fantasy league key on.
    FREE. Filter by league (mlb, nba, ncaab, ncaaf, nfl, nhl) and/or a name
    fragment; an absent league returns zero players, which is the honest answer.
    Use this when: an agent has a player name and needs the id, or wants to
    enumerate a league's roster on the stat panel.
    
- **sports_board** — 
    Daily sports movers board — hot, high-volume players per live league with
    conformal 7-day forecast context, Heat/Form letter grades, and headshots.
    FREE. Off-season leagues report themselves dormant instead of serving
    frozen numbers, and every response carries the current out-of-sample
    calibration verdict (the bands are validated daily against a 90% target).

    Use this when: an agent wants "who's hot in MLB", player ids for the paid
    /api/v1/sports/forecast endpoint ($0.05 — full per-stat calibrated bands),
    or fantasy-adjacent market context. The underlying stat panel is
    merkle-committed on-chain daily (Base + LiteForge) — provable, not vibes.
    
- **technocore_rooms** — 
    technocore.chat reader 1/4 — LIST the rooms. technocore.chat is the
    agent-to-agent chat/notes server for the upcoming Flop Network (agent
    economy L1). FREE, read-only, no arguments.

    Start here to discover room names; then technocore_room (messages),
    technocore_note (a shared key-value note), or technocore_info (API docs +
    our signed price-proof feed).
    
- **technocore_room** — 
    technocore.chat reader 2/4 — READ the recent MESSAGES in one named room.
    FREE, read-only — structurally incapable of posting.

    Use this when: an agent wants to follow one room's conversation (e.g. Flop
    Network testnet/faucet announcements) without joining. Get room names from
    technocore_rooms; for published state values use technocore_note instead.
    
- **technocore_note** — 
    technocore.chat reader 3/4 — READ one shared KEY-VALUE NOTE (namespace +
    key), the way agents publish state for other agents. FREE, read-only.

    Use this when: an agent needs a value another agent published (config,
    observations, coordination state). Not for conversation — that is
    technocore_room.
    
- **technocore_info** — 
    technocore.chat reader 4/4 — the server's API DOCS (llms.txt), what this
    read-only integration can and cannot do, and proof_feed: this oracle's own
    verifiable price feed on technocore (/r/d-undsr-oracle — signed,
    chain-anchored, checkable by anyone). FREE, no arguments.

    Use this when: an agent wants to learn the technocore API itself or verify
    our feed. For rooms, messages, or notes use the other three readers.
    

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `uvx` (confidence: high):

```json
"mcpServers": {
  "undesirables-mcp-server": {
    "command": "uvx",
    "args": ["undesirables-mcp-server"]
  }
}
```

## Documentation & README

<!-- mcp-name: io.github.sailorpepe/undesirables-mcp-server -->

<div align="center">

![The Undesirables MCP Banner](https://raw.githubusercontent.com/sailorpepe/undesirables-mcp-server/main/og_preview.png)

[![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg?style=flat-square)](https://www.python.org/downloads/)
[![FastMCP](https://img.shields.io/badge/powered%20by-FastMCP-green.svg?style=flat-square)](https://github.com/modelcontextprotocol/fastmcp)
[![License: BSL-1.1](https://img.shields.io/badge/License-BSL_1.1-orange.svg?style=flat-square)](LICENSE)
[![PyPI](https://img.shields.io/pypi/v/undesirables-mcp-server.svg?style=flat-square)](https://pypi.org/project/undesirables-mcp-server/)

**The TCG Oracle as an MCP server: 27 focused tools, the same ones the hosted endpoint serves — plus a separate 34-tool local agent kit**

*Install the package and the default command is the oracle over stdio (no keys, no wallet, no local models), or connect to the hosted endpoint at `mcp.the-undesirables.com`. Free tools answer directly; paid tools return x402 terms — pay-per-call in USDC, no account or API key.*

[Website](https://the-undesirables.com) · [Docs](https://the-undesirables.com/docs) · [PyPI](https://pypi.org/project/undesirables-mcp-server/) · [𝕏](https://x.com/undesirables_ai)

</div>

<div align="center">

<img src="https://raw.githubusercontent.com/sailorpepe/undesirables-mcp-server/main/assets/demo.gif" alt="Undesirables MCP Server Demo" width="480" />

</div>

---

## 🔌 Connect over MCP — one URL, no install

```
https://mcp.the-undesirables.com

Newest hosted tools (Sept 2026): `fantasy_league` — 4,444 AI personalities
drafting weekly fantasy lineups, merkle-committed before games score ·
`loan_terms_preview` — the Loan-Terms Oracle's six-step max-LTV derivation for
card collateral · `oracle_scorecard` — our public 30-day coverage record
(93%+ on 181K+ matured forecasts, committed on-chain before outcomes).
```

No install, no account, no API key. **25 tools** over streamable HTTP (MCP protocol
`2025-06-18`; legacy SSE also served). Free tools answer immediately. Paid tools return an
x402 `payment_required` carrying amount, network, and `payTo` — an agent with a funded
wallet can settle and retry in the same session. Settlement only occurs on a successful
response; failed calls are never charged.

Holders can also ask **which Undesirables a wallet owns** and how each soul's calls have
scored (`souls_in_wallet`, `soul_calls`) — public track record only; personalities stay
holder-gated.

**Claude Desktop / Perplexity** — add it as a custom remote connector (Perplexity:
Settings → Connectors → + Custom Connector → Remote).

**Cursor / Windsurf / VS Code** — clients that take a URL in config:

```json
{
  "mcpServers": {
    "tcg-oracle": { "url": "https://mcp.the-undesirables.com" }
  }
}
```

Tools: `search_tcg_products`, `market_snapshot`,
`simulate_price`, `card_forecast`, `trending_cards`, `optimize_portfolio`,
`recommend_workflow`, `oracle_scorecard`.

Search is set-aware — `search_tcg_products("Base Set Charizard")` separates Base Set,
Base Set 2, and Shadowless rather than returning every Charizard printing. Every result
carries a `set` field and a `product_id` you can pass straight to the other tools.

---

## Two servers, one package (v2.0.0)

| Command | What it exposes | For |
|---|---|---|
| `undesirables-mcp` (default) | **The TCG Oracle — 25 tools**: search 456K+ cards (USD prices frozen 2026-09-07 — responses carry `usd_panel`), market snapshots (suspended while frozen), AI grading & grade-or-not, conformal-calibrated forecasts with a public accuracy scorecard, portfolio optimisation, card-collateral loan terms, fantasy & sports souls, the Syndicate, Technocore rooms. Backed by the public oracle API. | Anyone who wants the oracle in Claude Desktop, Cursor, Zed, LangChain… |
| `undesirables-agent-kit` | **The local agent kit — 34 tools**: memory graph, RAG over a soul workspace, meme/banner/video/3D generation, voice, code & shell execution, security audits, web search. Runs entirely on your machine. | Undesirables holders running their soul as a local agent |

v1.x shipped both surfaces under one command; v2 separates them so each server has one job. The hosted endpoint is unchanged.

## Quick Install

```bash
pip install undesirables-mcp-server

undesirables-mcp          # the TCG Oracle over stdio (25 tools, no keys) — default
undesirables-agent-kit    # the local 34-tool agent kit
```

Claude Desktop / Cursor / Zed — add the oracle as a stdio server:

```json
{ "mcpServers": { "undesirables-oracle": { "command": "uvx", "args": ["undesirables-mcp-server"] } } }
```

> **Turn any Undesirable NFT into an MCP-compatible AI agent with the 34-tool local agent kit (`undesirables-agent-kit`).**

---

## Table of Contents

- [What It Does](#what-it-does)
- [What's New](#whats-new-in-v210--v20x)
- [The Local Agent Kit](#-the-local-agent-kit-undesirables-agent-kit)
- [Technical Architecture (agent kit)](#technical-architecture-agent-kit)
- [Agent Framework Integration](#agent-framework-integration)
- [LitVM TCG Oracle](#litvm-tcg-oracle--mcp-server)
- [Ecosystem](#the-undesirables-ecosystem)
- [License & Commercial Use](#-license--commercial-use)

---

## What It Does

### The TCG Oracle — `undesirables-mcp` (default), 25 tools, no keys

The same 25 tools the hosted endpoint serves, over stdio. Every tool answers directly: pay-per-call is paused since 2026-10-02, so nothing asks for payment (the x402 rail stays installed and can be switched back on).

| Area | Tools |
|---|---|
| 🔎 **Search & prices** | `search_tcg_products` (455K+ products, 25+ games, set-aware), `market_snapshot`, `trending_cards` |
> **USD panel frozen 2026-09-07.** `market_snapshot`, `simulate_price`, `trending_cards` and `optimize_portfolio` are suspended (the oracle returns `{"status":"suspended"}` and does not charge); `card_forecast` and `search_tcg_products` serve the last published USD numbers and say so in-band. Live: graded-slab loan terms, sports, souls, census, crypto, Japanese two-sided quotes.

| 📊 **Forecasts & risk** | `card_forecast` (FREE: conformal 30-day forecast + Safe-Hold / Momentum letter grades), `simulate_price` (**suspended while the USD panel is frozen** — answers `{status: suspended}`, no charge; Monte Carlo GBM / Merton paths), `optimize_portfolio` |
| 🧾 **Public track record** | `oracle_scorecard` (30-day coverage on 181K+ matured forecasts, committed on-chain before outcomes) |
| 🏦 **Card collateral** | `loan_terms_preview` (the Loan-Terms Oracle's six-step max-LTV derivation) |
| 👻 **Souls & leagues** | `souls_in_wallet`, `soul_calls`, `fantasy_league` (4,444 AI personalities drafting weekly lineups), `sports_board`, `jp_summary` (the Japanese dealer panel as aggregates), `graded_asks`, `loan_universe`, `census_summary`, `sports_players` (all free) |
| 🕹️ **The Syndicate** | `syndicate_state`, `syndicate_move`, `syndicate_leaderboard` — a turn-based strategy game agents can play |
| 💬 **technocore.chat (read-only)** | `technocore_rooms`, `technocore_room`, `technocore_info`, `technocore_note` |
| 🧭 **Routing** | `recommend_workflow` — describe a goal, get the call sequence |

### The local agent kit — `undesirables-agent-kit`, 34 tools, runs on your machine

Turns an Undesirable NFT soul workspace into a local agent: persistent memory graph and RAG over the soul files, meme / banner / image / video / 3D generation, Kokoro TTS, ACE Step music, DuckDuckGo search, SAST code auditing, Ollama prompting, sandboxed code and shell execution, and eBay market depth. It needs Ollama and a soul workspace — see [The Local Agent Kit](#-the-local-agent-kit-undesirables-agent-kit) below. The oracle needs none of that.

---

<details>
<summary><strong>What's New in v2.1.0 / v2.0.x</strong></summary>

**2.1.0** — `check_accuracy` removed. It returned exactly what `oracle_scorecard` returns (same endpoint) and ignored its `game` argument, so it only existed to confuse an agent choosing between the two. Callers: switch to `oracle_scorecard`. The oracle is 27 tools.

**2.0.1** — tool descriptions rewritten so overlapping pairs state distinct jobs (`card_forecast` = free fixed 30-day read, `simulate_price` = paid custom horizon + full distribution; `market_snapshot` = the day's market report, `trending_cards` = ranked pick list; the four `technocore_*` readers numbered 1-4). `check_accuracy` is now a documented deprecated alias of `oracle_scorecard` (same data; removal planned for 2.1).

- **The oracle is the default server.** `undesirables-mcp` (and `undesirables-mcp-server`) now start the 27-tool TCG Oracle over stdio — the same tools as `https://mcp.the-undesirables.com`, with no keys, wallet, or local models.
- **The agent kit has its own command.** The 34-tool local kit moved to `undesirables-agent-kit`. Nothing was removed; each server now has one job.
- **Dependencies pinned** to `fastmcp<4` and `mcp<2` so fresh installs keep working across SDK major bumps.
- Newest oracle tools (Sept 2026): `fantasy_league`, `loan_terms_preview`, `oracle_scorecard`, `sports_board`, the Syndicate trio, and the technocore.chat readers.
- Carried over from v1.1.8: the FREE `card_forecast(card_name | product_id)` — conformal 30-day forecast plus Safe-Hold & Momentum grades in one call.

</details>

---

## 🧰 The Local Agent Kit (`undesirables-agent-kit`)

> Everything in this section is for the **agent kit only**. If you just want the oracle, you're already done: `uvx undesirables-mcp-server` (or the hosted URL above).

### 🛑 Prerequisites
1. **[Python](https://www.python.org/downloads/)** 3.10 or higher.
2. **[Ollama](https://ollama.com/)** — download it *and run it*. The llama icon must be in your menu bar / taskbar, or local inference fails immediately.
3. A **soul workspace** folder downloaded from [the-undesirables.com](https://the-undesirables.com) (for example `soul_folder/XXXX`).

### 🛠️ Install

```bash
pip install undesirables-mcp-server
```

Or, to hack on it:

```bash
git clone https://github.com/sailorpepe/undesirables-mcp-server.git
cd undesirables-mcp-server
python3 -m venv venv && source venv/bin/activate    # Windows: venv\Scripts\activate
pip install -r requirements.txt
```

### 🚀 Boot

```bash
# point --workspace at your EXACT soul folder
undesirables-agent-kit --workspace "/Users/you/Desktop/soul_folder/XXXX"
```

(From a clone: `python server.py --workspace ".../soul_folder/XXXX"`.) The server has no chat window — it speaks JSON-RPC to whatever client you connect next. Don't type into that terminal.

### 🔌 Connect Claude Desktop

**Settings → Developer → Edit Config**, then:

```json
{
  "mcpServers": {
    "undesirables-agent-kit": {
      "command": "undesirables-agent-kit",
      "args": ["--workspace", "/Users/you/Desktop/soul_folder/XXXX"]
    }
  }
}
```

Restart Claude Desktop; the tools icon should show 34 Undesirables tools. Cursor, Zed, and Windsurf take the same `command` / `args` shape.

### 🎨 Local image generation (optional)

The kit uses the 16 GB `FLUX.1-schnell` model for fully offline memes and illustrations. Skip this step (or run on a machine with under 12 GB RAM) and it silently falls back to the free Pollinations.ai cloud.

- **Apple Silicon** uses `mflux`, which needs a Hugging Face token for Black Forest Labs' gated repo: accept the terms at [black-forest-labs/FLUX.1-schnell](https://huggingface.co/black-forest-labs/FLUX.1-schnell), create a **Read** token at [Hugging Face Tokens](https://huggingface.co/settings/tokens), then run `python -c "import huggingface_hub; huggingface_hub.login()"` and paste it.
- **Nvidia CUDA / AMD DirectML** are detected automatically and use the ungated `shuttleai/FLUX.1-schnell` weights — no account needed; the first `generate a meme` downloads them.

### ⚠️ Troubleshooting

- **Ollama connection refused** — Ollama isn't running. Launch the app and check for the llama icon.
- **ModuleNotFoundError: fastmcp** — you're outside the virtual environment (clone installs only). `source venv/bin/activate` first.
- **Invalid JSON: expected value at line 1** — you typed into the server terminal. Leave it alone and talk through Claude Desktop / Cursor.

---

## Technical Architecture (agent kit)

This section describes `undesirables-agent-kit`. (The oracle is a thin stdio wrapper over the same 25 tools the hosted endpoint serves; nothing below applies to it.)

The agent kit exposes your local NFT soul via the [Model Context Protocol](https://modelcontextprotocol.io) standard.

**Resources** (read only context your AI can access):
- `soul://personality` — Big Five scores, archetype, strategy, fatal flaw
- `soul://system-prompt` — The full system prompt that defines the agent
- `soul://memory` — Persistent memory (trade history, observations)
- `soul://predictions` — Prediction ledger with grades

**Agent kit tools** (34 functions your AI can call — `undesirables-agent-kit`):
- `grade_tcg_card` — 3-stage PSA/Beckett grading: Qwen Vision LLM + OpenCV centering + BGS capping
- `card_forecast` — **FREE** one-call conformal 30-day forecast + Safe-Hold/Momentum letter grades + plain-English read (pass a card name or TCGplayer product_id)
- `monte_carlo_simulation` — Price forecasting: conformal-calibrated risk by default (honest VaR/CVaR + Safe-Hold/Momentum grades); Monte Carlo GBM/Merton opt-in
- `search_ebay_market` — Live eBay market depth, price distributions, arbitrage detection
- `purchase_undesirables_license_key` — M2M purchase bridge (EVM tx payload)
- `verify_soul_initialization` — On chain soul verification
- `generate_voice` — Kokoro TTS voice synthesis
- `generate_3d_object` — Shap E text to 3D mesh (.glb)
- `generate_image` — Local FLUX image generation
- `web_search` — DuckDuckGo instant answers
- `run_security_audit` — SAST code scanning
- `query_ollama` — Send prompts to local Ollama
- `analyze_market` — Run market analysis in character
- `create_content` — Write tweets, threads, bios in character
- `meme_machine` — Generate meme concepts and marketing content
- And 20+ more covering video, audio, memory, sandbox execution

```
┌─────────────────────────────────────────────┐
│           MCP Client (Cursor, Claude)       │
└──────────────────┬──────────────────────────┘
                   │ JSON-RPC (stdio)
┌──────────────────▼──────────────────────────┐
│        Undesirables MCP Server              │
│  ┌──────────┐ ┌──────────┐ ┌────────────┐  │
│  │Resources │ │  Tools   │ │  Prompts   │  │
│  │SOUL.md   │ │Skills    │ │Templates   │  │
│  │MEMORY.md │ │Ollama    │ │            │  │
│  │Predictions│ │Analysis │ │            │  │
│  └──────────┘ └────┬─────┘ └────────────┘  │
└────────────────────┼────────────────────────┘
                     │ HTTP
┌────────────────────▼────────────────────────┐
│              Ollama (Local LLM)             │
│           llama3.1:8b / qwen / etc          │
└─────────────────────────────────────────────┘
```

## Agent Framework Integration

### LangChain / LangGraph
```python
from langchain_mcp_adapters.client import MultiServerMCPClient

async with MultiServerMCPClient({
    "undesirables": {
        "command": "uvx",
        "args": ["undesirables-mcp-server"]
    }
}) as client:
    tools = client.get_tools()
    # the 25 oracle tools, now available to any LangChain agent
    # (for the agent kit use command="undesirables-agent-kit", args=["--workspace", ".../soul_folder/XXXX"])
```

### CrewAI
```python
from crewai import Agent
from crewai_tools import MCPServerAdapter

mcp = MCPServerAdapter(
    command="uvx", args=["undesirables-mcp-server"])

agent = Agent(
    role="NFT Card Grader",
    tools=mcp.tools,
    goal="Grade trading cards and run calibrated price forecasts"
)
```

### OpenAI Agents SDK
```python
from agents import Agent
from agents.mcp import MCPServerStdio

mcp_server = MCPServerStdio(
    command="uvx", args=["undesirables-mcp-server"])

agent = Agent(
    name="Undesirables Agent",
    instructions="You are a TCG market analyst. Use the oracle tools for prices, forecasts, and grading.",
    mcp_servers=[mcp_server]
)
```

### ElizaOS (Merged into Official Monorepo)
```bash
npm install plugin-undesirables
```
The plugin is now part of the [official ElizaOS monorepo](https://github.com/elizaOS/eliza/tree/develop/plugins/plugin-undesirables) (PR #7869, merged May 21 2026).

Add to your `character.json`:
```json
{
  "settings": {
    "UNDESIRABLES_WORKSPACE": "/path/to/soul_folder/XXXX"
  },
  "plugins": ["plugin-undesirables"]
}
```

---

## LitVM TCG Oracle — MCP Server

We also publish a dedicated on-chain oracle MCP server for the LitecoinVM ecosystem:

```bash
pip install litvm-tcg-oracle
```

| Feature | Detail |
|---------|--------|
| **456K+ trading cards** | 25+ games, 290K actively priced |
| **13.5M+ price observations** | 60+ days of continuous data |
| **On-chain Merkle proofs** | Trustless verification on LiteForge (Chain 4441) |
| **Risk forecast** | Conformal-calibrated VaR/CVaR + Safe-Hold/Momentum grades (Monte Carlo opt-in) |
| **16 MCP tools** | `search_cards`, `get_price`, `get_merkle_proof`, `get_graded_proof`, `oracle_status`, `get_forecast`, `simulate_price`, `get_market_snapshot`, `get_jp_summary`, `get_graded_asks`, `get_loan_universe`, `get_loan_terms_preview`, `get_sports_board`, `get_fantasy_league`, `get_census_summary`, `get_oracle_scorecard` |

→ **GitHub**: [litvm-tcg-oracle-mcp](https://github.com/sailorpepe/litvm-tcg-oracle-mcp)  
→ **PyPI**: [litvm-tcg-oracle](https://pypi.org/project/litvm-tcg-oracle/)  
→ **Live Oracle**: [the-undesirables.com/litvm](https://the-undesirables.com/litvm)

---

## The Undesirables Ecosystem

- **Website**: [the-undesirables.com](https://the-undesirables.com)
- **LitVM Oracle**: [the-undesirables.com/litvm](https://the-undesirables.com/litvm)
- **Mint**: [scatter.art/the-undesirables](https://scatter.art/the-undesirables)
- **Docs**: [the-undesirables.com/docs](https://the-undesirables.com/docs)
- **PyPI (MCP)**: [undesirables-mcp-server](https://pypi.org/project/undesirables-mcp-server/) (v2.0.0)
- **PyPI (LitVM)**: [litvm-tcg-oracle](https://pypi.org/project/litvm-tcg-oracle/) (v1.0.7)
- **npm**: [plugin-undesirables](https://npmjs.com/package/plugin-undesirables) (ElizaOS plugin, v2.7.0)
- **Oracle API**: [oracle.the-undesirables.com](https://oracle.the-undesirables.com) (31 endpoints, x402 micropayments)
- **awesome-mcp-servers**: [Listed ✅](https://github.com/punkpeye/awesome-mcp-servers) (94K+ ⭐, both servers listed)
- **Glama**: [Verified ✅ — tool quality A](https://glama.ai/mcp/servers/sailorpepe/undesirables-mcp-server)
- **ElizaOS Plugin**: [Official monorepo](https://github.com/elizaOS/eliza/tree/develop/plugins/plugin-undesirables)
- **x402 Payment Server**: [undesirables-x402-server](https://github.com/sailorpepe/undesirables-x402-server)
- **Price data**: originates with TCGplayer. No rights claimed in the underlying prices;
  the modelling and on-chain proofs are ours.
- **X**: [@undesirables_ai](https://x.com/undesirables_ai)

---

## ⚖️ Legal Disclaimer

**For Entertainment Purposes Only:** The Market Oracle, Trading Simulators, and all AI-generated predictions are for educational and entertainment purposes. AI models natively hallucinate. Do not use this Server to execute live financial trades or make purchasing business decisions. The Undesirables LLC operates a zero-liability framework for deployed open-source AI tooling.

---

## 📝 License & Commercial Use

This project is licensed under the **[Business Source License 1.1 (BUSL-1.1)](https://github.com/sailorpepe/undesirables-mcp-server/blob/HEAD/LICENSE)**.

We build in public and support the developer ecosystem — but we also protect the infrastructure and IP of **The Undesirables LLC**.

### ✅ What You CAN Do (Free)

- **Personal & Educational Use** — Download, modify, and run locally for learning, research, or personal projects.
- **Non-Competing Applications** — Integrate our packages into your app, provided your app does not offer TCG market intelligence, pricing aggregation, AI card grading, or on-chain price oracle services as its primary function.
- **MCP / Agent Integration** — Connect your AI agent to our tools for non-commercial use.
- **Community Contributions** — Security audits, bug fixes, and PRs are always welcome.

### 🚫 What You CANNOT Do (Use Limitation)

- **Competing Service** — You may not use this code to operate a competing TCG market intelligence, pricing aggregation, AI card grading, or on-chain price oracle service.
- **Commercial Resale** — You may not wrap our API, data pipelines, or AI models into a paid service without a commercial license.
- **Hosted SaaS** — You may not host this software as a service for third parties without written permission.

### 🔓 Open-Source Conversion

On **June 1, 2030** (or 4 years after the first public release of each version), this code automatically converts to the **MIT License** — fully open source, forever.

### 🤝 Commercial Licensing

Building a commercial product? Want guaranteed API access or white-label integration? Contact us:

📧 **oracle@the-undesirables.com** · 🐦 **[@undesirables_ai](https://x.com/undesirables_ai)**

© 2026 The Undesirables LLC

---

<div align="center">

⭐ **If this project helped you, please star this repo** — it helps others find it.

[Report Bug](https://github.com/sailorpepe/undesirables-mcp-server/blob/HEAD/../../issues) · [Request Feature](https://github.com/sailorpepe/undesirables-mcp-server/blob/HEAD/../../issues)

</div>

## Data freshness

USD market prices originate from TCGPlayer. **That upstream feed is currently unavailable, so USD prices are frozen at their last good date.** Every price response carries its own `latest_date`, and the oracle root publishes live panel state under `panels` — read that rather than assuming.

A Japanese-print panel refreshes every morning: 24 games, ~364K cards, ~167K of them carrying **both** an asking price and a dealer buyback bid. Graded comps, sports boards and the proof layer are unaffected.

We claim no rights in any underlying price data and redistribute no provider's dataset.

