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.
Why · Install · Configuration · Tools · How SP works
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-mcpPyPI 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-mcpThe 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.
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-mcpClaude 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" }
}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.
| 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.
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.
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
pytestcsfloat_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.pyTwo 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).
MIT.
