Skip to content

Repository files navigation

csfloat-mcp wordmark on a dark gunmetal background, the letters float in burnt orange, with the tagline: CS2 deal math for your AI assistant

Ask your AI assistant whether a CS2 skin listing is worth buying, and get the float, the gap against predicted price, and the sticker premium already worked out.

MIT license GitHub stars last commit

Why · Install · Configuration · Tools · How SP works

Install

Requires Python 3.11 or newer and a CSFloat API key from your profile settings.

Run it with uv, straight from the repository:

uvx --from git+https://github.com/badmuriss/csfloat-mcp csfloat-mcp

PyPI publication is pending, so the git+ source above is the only uvx form that works today.

Manual install:

git clone https://github.com/badmuriss/csfloat-mcp
cd csfloat-mcp
pip install -e .
csfloat-mcp

Why

The CSFloat API answers "how much does it cost". The question you actually have is "is this a good buy", and that depends on three things the raw JSON does not tell you: how the float sits inside the wear bracket, how far the price is from CSFloat's predicted price, and how much of the overpay is sticker value rather than the skin itself.

This server computes those before the model sees the listing. It also refuses to guess: an auction with no bids does not render as a 100% discount, a heavily scraped sticker is not counted at full price, and a pattern-driven skin (Case Hardened, Fade, Doppler) gets the raw numbers with no verdict attached, because predicted price does not model patterns.

Configuration

The API key goes in the env block of your MCP client config. A shell export CSFLOAT_API_KEY=... does not reach GUI clients like Claude Desktop or Cursor, which are launched by the OS and never read your shell profile.

Claude Code

claude mcp add csfloat \
  --env CSFLOAT_API_KEY=your_key_here \
  -- uvx --from git+https://github.com/badmuriss/csfloat-mcp csfloat-mcp

Claude Desktop

Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):

{
  "mcpServers": {
    "csfloat": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/badmuriss/csfloat-mcp",
        "csfloat-mcp"
      ],
      "env": {
        "CSFLOAT_API_KEY": "your_key_here"
      }
    }
  }
}

Cursor

Same shape, in ~/.cursor/mcp.json for every project or .cursor/mcp.json for one:

{
  "mcpServers": {
    "csfloat": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/badmuriss/csfloat-mcp",
        "csfloat-mcp"
      ],
      "env": {
        "CSFLOAT_API_KEY": "your_key_here"
      }
    }
  }
}

If you cloned the repo instead of using uvx, replace command and args with your interpreter and the absolute path to csfloat_mcp_server.py:

{
  "command": "python",
  "args": ["/absolute/path/to/csfloat-mcp/csfloat_mcp_server.py"],
  "env": { "CSFLOAT_API_KEY": "your_key_here" }
}

Example conversation

Illustrative. The numbers are invented, but they are consistent with the formulas below.

You: is this AK-47 Vulcan Field-Tested with stickers at $340 a good deal?

The assistant calls search_skins(skin_name="AK-47 | Vulcan (Field-Tested)", sort_by="best_deal"):

2 listings shown for 'AK-47 | Vulcan (Field-Tested)' | sorted by best deal | buy-now only | page 0:

• AK-47 | Vulcan (Field-Tested) - $248.00 (BUY NOW) -8.5% vs predicted $271.00 [DEAL] (Float: 0.2688) - https://csfloat.com/item/890602542927580928
• AK-47 | Vulcan (Field-Tested) - $340.00 (BUY NOW) +9.0% vs predicted $312.00 SP:75% (Float: 0.2413) - https://csfloat.com/item/890602542927580927

Then get_listing_details(listing_id="890602542927580927") on the one you asked about:

Item: AK-47 | Vulcan (Field-Tested)
Price: $340.00 (BUY NOW)
Float: 0.2413 (Field-Tested)
Pattern: seed 412 / paint index 302
Seller: skinflipper
Listing ID: 890602542927580927
URL: https://csfloat.com/item/890602542927580927
+9.0% vs predicted $312.00
SP: 75% ($96.00 sticker value vs $268.00 baseline)
Stickers: Sticker | Reason Gaming (Holo) | Katowice 2015 ($71.00), Sticker | Vox Eminor | Katowice 2014 ($25.00)
Note: price here depends on pattern/stickers/charm, which predicted_price does not model

Assistant: Not really. The float is 0.2413, mid Field-Tested, nothing special. You are paying $340 against a predicted $312, so 9% over, and the reason is the craft: $72 of that sits on top of a $268 clean baseline for $96 of stickers, an SP of 75%. You only get that back if a buyer wants those two stickers as much as you do. A clean one is listed at $248, which is 8.5% under predicted.

Notice what is missing from both blocks: no verdict on the crafted one. It has stickers, so its price is not something predicted price can judge, and the server says so instead of stamping it.

Tools

Tool What it does Main parameter
search_skins Find one specific item by its exact market_hash_name skin_name ("AK-47 | Redline (Field-Tested)")
search_by_weapon Every skin of one weapon, resolved to a def_index weapon_name ("AWP", "ST M4A1-S MW")
browse_market The market with no item filter sort_by
get_listing_details Full detail for one listing: float, pattern, stickers, charms listing_id
get_wear_conditions_help Wear brackets and the exact name format none
ask_clarifying_questions Turns a vague ask ("best cheap knife") into the questions worth answering query

The search tools share limit (1 to 50), page, sort_by, min_price / max_price in USD, and include_auctions (off by default, so buy-now only). search_skins and search_by_weapon also take min_float / max_float. sort_by accepts best_deal, lowest_price, highest_price, lowest_float, highest_float, most_recent, highest_discount, expires_soon, float_rank, num_bids.

A wear condition written anywhere in the query becomes a float filter, in full or abbreviated, in any case. StatTrak, ST, Souvenir and become a category filter.

Wear Float range
Factory New (FN) 0.00 to 0.07
Minimal Wear (MW) 0.07 to 0.15
Field-Tested (FT) 0.15 to 0.38
Well-Worn (WW) 0.38 to 0.45
Battle-Scarred (BS) 0.45 to 1.00

Lower bound inclusive, upper bound exclusive: a float of exactly 0.07 is Minimal Wear, never Factory New.

How SP works

SP is the sticker premium: the share of the sticker value you are actually paying for.

overpay = price - base_price - charm value
SP      = overpay / sticker value, floored at 0

base_price is the baseline, not predicted_price, because predicted price already prices the stickers in and would hide most of the premium. Scraped stickers (wear > 0) are left out of the sticker value, since they are close to worthless on resale and would otherwise make an expensive craft look fair. SP 0% means the stickers came free. SP 100% means you paid full sticker price on top of a clean skin.

Development

The logic that can be wrong without a network lives in csfloat_domain.py: wear brackets, weapon resolution, name shaping, deal math. It is pure, so it tests with no key and no requests.

The tests import the server module, so the runtime dependencies have to be there too:

pip install -e . -r requirements-dev.txt
pytest

csfloat_domain.py also carries an assert based self-check that runs on its own and exits non-zero on the first failure, which is the fastest way to see whether a change to the domain rules broke a boundary:

python csfloat_domain.py

Two things to know if you patch the server. Nothing may write to stdout, because the stdio transport uses it as the JSON-RPC channel and one stray print kills the session with an unrelated-looking parse error. Diagnostics go to stderr, at the level set by CSFLOAT_MCP_LOG_LEVEL (default INFO).

License

MIT.

About

MCP Server for searching on CSFloat database

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages