{"name":"io.github.SKalinin909/tradingcalc","slug":"skalinin909-tradingcalc","title":"TradingCalc MCP: Crypto Trading, On-Chain & Prediction Markets","description":"Deterministic crypto futures, on-chain risk, and prediction-market math. 32 tools. Not AI estimates.","url":"https://mcp.market/server/skalinin909-tradingcalc","rating":null,"grade":"B","score":81,"certified":false,"status":"active","category":"finance","tags":["finance"],"presence":{"score":23,"stars":1,"forks":0,"downloads_week":null,"last_push_at":"2026-09-19T09:02:09.000Z","license":"MIT"},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/SKalinin909/tradingcalc-mcp","website":null,"version":"2.9.2","remotes":[{"type":"streamable-http","url":"https://tradingcalc.io/api/mcp"}],"packages":[],"tools":[{"name":"primitive.average_entry","description":"Calculate the weighted average entry price from multiple buy/sell fills (DCA) — the bare number only, no breakeven or per-fill breakdown. Use when user asks only \"what's my average entry?\" and wants just that figure. For breakeven and a per-level summary too, use workflow.run_dca_entry instead. Returns: averagePrice, totalSize, totalCost.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"symbol":{"type":"string","description":"Trading pair symbol, e.g. BTCUSDT"},"exchangeCode":{"type":"string","description":"Exchange identifier (optional)"},"input":{"type":"object","properties":{"fills":{"type":"array","items":{"type":"object","properties":{"price":{"type":"number","description":"Fill price"},"quantity":{"type":"number","description":"Fill quantity"}},"required":["price","quantity"]},"minItems":1}},"required":["fills"]},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined, average is the arithmetic mean (default). inverse = coin-margined, average is the harmonic mean (fill quantity is USD notional)."}},"required":["symbol","input"]}},{"name":"primitive.hedge_ratio","description":"Calculate the short perpetual futures position size needed to hedge a spot holding. Use when user asks \"how much should I short to hedge my BTC?\" or \"what margin do I need for a 100% hedge?\". Returns: hedgeNotional, requiredMargin, estimatedFundingCost.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"spotSize":{"type":"number","description":"Spot position value in USDT"},"hedgeRatio":{"type":"number","description":"Percentage of spot to hedge, e.g. 100 for full hedge, 50 for half. Default 100."},"leverage":{"type":"number","description":"Leverage on the perp short. Default 1."},"fundingRatePct":{"type":"number","description":"Current 8h funding rate as percentage, e.g. 0.01. Used for cost estimate."}},"required":["spotSize"]}},{"name":"system.pubkey","description":"Return the ECDSA P-256 public key (PEM + JWK) and canonical signing format used to sign tool responses, so results can be verified offline without calling back to TradingCalc. Every tools/call result includes a signed second content block when signing is configured; also available at GET /api/mcp/pubkey.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"required":[]}},{"name":"system.verify","description":"Run the full regression suite — 35 canonical test vectors (linear and inverse/coin-margined) across all 12 calculators — and return a pass/fail report with counts and timestamp. Call this before using results in production workflows to confirm the computation layer is operating correctly.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{},"required":[]}},{"name":"workflow.run_bonding_curve","description":"Pump.fun-style bonding curve calculator: exact tokens received for a buy, price impact, and graduation progress. Pure constant-product math (Uniswap V2 style) using pump.fun's official virtual-reserve constants — no live lookup needed, works for any token still on the curve (not yet graduated to a real AMM pool). Use when user asks \"how many tokens do I get buying X SOL on this curve?\" or \"will this buy graduate the token?\". Returns: tokensOut, priceImpactPct, progressPctBefore/After, willGraduate, partialFill (true if the buy exceeds remaining curve capacity).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"solRaisedSoFar":{"type":"number","description":"SOL already raised on the curve so far (0 for a brand-new token)"},"solToSpend":{"type":"number","description":"SOL amount for this buy"}},"required":["solRaisedSoFar","solToSpend"]}},{"name":"workflow.run_breakeven_planning","description":"Calculate the break-even exit price that covers all trading fees — this alone, nothing else. Use when user asks only \"what price do I need to just break even?\" and nothing more. If the user also gave a stop/target or wants a full trade-safety check, use workflow.run_risk_reward or workflow.run_pre_trade_check instead — both already include this breakeven figure plus more. Returns: breakevenPrice, totalFees.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"side":{"type":"string","enum":["long","short"]},"entryPrice":{"type":"number","description":"Entry price (positive)"},"sizeBase":{"type":"number","description":"Position size — base asset qty for linear, USD contracts for inverse"},"feeOpenPct":{"type":"number","description":"Opening fee fraction, default 0.0002"},"feeClosePct":{"type":"number","description":"Closing fee fraction, default 0.0005"},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined (default), inverse = coin-margined. For inverse, totalFees is returned in the base coin."}},"required":["side","entryPrice","sizeBase"]}},{"name":"workflow.run_breakout_acceptance","description":"Market Profile breakout acceptance — did price accept (hold) beyond the value area / range, or reject back inside (fakeout)? Optional buy/sell delta. Use for \"did the break above VAH get accepted?\". Returns: state, accepted (boolean), direction, confidence, key_levels (VAH/VAL/VPOC), scenario_framing, invalidation level.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"instrument":{"type":"string","description":"Symbol, e.g. BTCUSDT"},"venue":{"type":"string","enum":["binance","bybit"],"description":"Exchange to fetch candles from when candles[] not supplied"},"session_date":{"type":"string","description":"Session date YYYY-MM-DD (UTC)"},"timeframe":{"type":"string","enum":["1m","5m","15m","30m"],"description":"Candle timeframe (default 15m)"},"value_area_rule":{"type":"number","description":"Value-area fraction 0.5–0.9 (default 0.70)"},"candles":{"type":"array","description":"Optional OHLCV for the session — omit to fetch from venue (reproducible + 0 COGS when supplied)","items":{"type":"object"}},"prev_candles":{"type":"array","description":"Optional OHLCV for the previous session","items":{"type":"object"}},"include_delta":{"type":"boolean","description":"Include buy/sell delta analysis (default true)"}},"required":["instrument","venue","session_date"]}},{"name":"workflow.run_carry_trade","description":"Delta-neutral carry trade (funding arbitrage) analysis, with a profitable/marginal/loss verdict on top of the same math primitive.funding_arb uses. Prefer this over primitive.funding_arb whenever a plain-English verdict is wanted, not just the raw numbers. Use when user asks \"is this carry trade worth it?\" — long on exchange A, short on exchange B, collect the funding rate spread. Returns: netYieldPct, grossProfit, netProfit, breakevenDays, verdict (profitable/marginal/loss).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"notional":{"type":"number","description":"Position notional in USDT"},"funding_rate_long":{"type":"number","description":"Funding rate on long exchange per interval (decimal)"},"funding_rate_short":{"type":"number","description":"Funding rate on short exchange per interval (decimal)"},"transfer_fee_pct":{"type":"number","description":"One-way transfer fee % (default 0.1)"},"hold_days":{"type":"number","description":"Hold duration in days"},"interval_hours":{"type":"number","enum":[1,8],"description":"Funding interval: 1 or 8 hours (default 8)"}},"required":["notional","funding_rate_long","funding_rate_short","hold_days"]}},{"name":"workflow.run_compound_funding","description":"Project capital growth from reinvesting perpetual futures funding income (compounding carry). Use when user asks \"how much will I make compounding 0.01% funding for 90 days?\" or \"what's my APY on this carry position?\". Returns: finalCapital, totalEarned, apy, growthTable.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"initialCapital":{"type":"number","description":"Starting capital in USDT"},"fundingRatePct":{"type":"number","description":"Funding rate per interval as percentage, e.g. 0.01 for 0.01%"},"intervalHours":{"type":"number","enum":[8,1],"description":"Funding interval: 8 (standard) or 1 (Hyperliquid)"},"durationDays":{"type":"number","description":"Number of days to project"},"reinvestPct":{"type":"number","description":"Percentage of earnings reinvested each interval. 100 = full compounding, 0 = no reinvestment. Default 100."}},"required":["initialCapital","fundingRatePct","durationDays"]}},{"name":"workflow.run_dca_entry","description":"DCA entry planner: weighted average entry price, breakeven, and per-level contribution from multiple fill prices and sizes. Prefer this over primitive.average_entry whenever breakeven or the per-level breakdown is also wanted, not just the bare average. Use when user bought at several prices and asks \"what's my average entry?\" or \"where is my DCA breakeven?\". Returns: averageEntry, breakeven, per-level summary.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"side":{"type":"string","enum":["long","short"]},"entries":{"type":"array","items":{"type":"object","properties":{"price":{"type":"number"},"size":{"type":"number"}},"required":["price","size"]},"minItems":2,"maxItems":20},"fee_open_pct":{"type":"number","description":"Open fee rate (default 0.0002)"},"fee_close_pct":{"type":"number","description":"Close fee rate (default 0.0005)"},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined (default), inverse = coin-margined. Each fill's size is USD notional (contracts) for inverse; averageEntry is then the harmonic mean of fill prices, not the arithmetic mean."}},"required":["side","entries"]}},{"name":"workflow.run_exit_target","description":"Calculate the exact exit price needed to hit a target PnL or ROE percentage. Use when user asks \"at what price do I take profit to make $500?\" or \"where should I set TP for 20% ROE?\". Returns: targetExitPrice.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"side":{"type":"string","enum":["long","short"]},"entryPrice":{"type":"number","description":"Entry price"},"leverage":{"type":"number","description":"Leverage multiplier"},"sizeBase":{"type":"number","description":"Position size in base asset"},"targetMode":{"type":"string","enum":["pnl","roe"],"description":"\"pnl\" = target in USDT, \"roe\" = target in %"},"targetValue":{"type":"number","description":"Target value (USDT/coin for pnl mode, or %)"},"feeOpenPct":{"type":"number","description":"Opening fee fraction, default 0.0002"},"feeClosePct":{"type":"number","description":"Closing fee fraction, default 0.0005"},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined (default), inverse = coin-margined. For inverse, pnl-mode targetValue and outputs are in the base coin."}},"required":["side","entryPrice","leverage","sizeBase","targetMode","targetValue"]}},{"name":"workflow.run_funding_arbitrage","description":"Calculate funding rate arbitrage profit: annualized yield, net profit, and breakeven days for a long/short basis trade across two exchanges — the bare numbers only, no plain-English verdict. For the same math plus a profitable/marginal/loss verdict, use workflow.run_carry_trade instead. Use when user asks \"is this funding arb worth it?\" or \"how many days to break even on transfer fees?\". Returns: netProfitUsdt, annualizedYieldPct, breakevenDays.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"positionSize":{"type":"number","description":"Position size in USDT"},"longFundingRate":{"type":"number","description":"Funding rate on long side (% per interval, positive = you pay)"},"shortFundingRate":{"type":"number","description":"Funding rate on short side (% per interval, positive = you receive)"},"transferFeePct":{"type":"number","description":"One-time transfer/setup fee as percentage, e.g. 0.1 for 0.1%"},"durationDays":{"type":"number","description":"Holding period in days"},"intervalHours":{"type":"number","enum":[8,1],"description":"Funding interval: 8 (standard) or 1 (Hyperliquid)"}},"required":["positionSize","longFundingRate","shortFundingRate","durationDays"]}},{"name":"workflow.run_funding_breakeven","description":"Price move needed to cover funding cost + fees over a holding period. Use when user asks \"how much does BTC need to move for me to profit after funding?\" or \"is funding killing my edge on this trade?\". Returns: breakevenWithFunding, breakevenWithoutFunding, requiredMovePct.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"side":{"type":"string","enum":["long","short"]},"entry_price":{"type":"number","description":"Entry price"},"size":{"type":"number","description":"Position size in base currency"},"funding_rate":{"type":"number","description":"Funding rate per 8h period (decimal, e.g. 0.0001)"},"hold_hours":{"type":"number","description":"Hold duration in hours"},"fee_open_pct":{"type":"number","description":"Open fee rate (default 0.0002)"},"fee_close_pct":{"type":"number","description":"Close fee rate (default 0.0005)"},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined (default), inverse = coin-margined. size is USD notional (contracts) for inverse; notional/funding_cost/fee_total/total_carry_cost come back denominated in the base coin."}},"required":["side","entry_price","size","funding_rate","hold_hours"]}},{"name":"workflow.run_funding_cost","description":"Calculate the total funding cost (or income) for holding a perpetual futures position. Use when user asks \"how much funding will I pay holding X days?\" or \"is funding eating my profit?\". Returns: totalFundingUsdt (negative = you pay, positive = you receive), perIntervalUsdt.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"side":{"type":"string","enum":["long","short"]},"sizeBase":{"type":"number","description":"Position size in base asset"},"entryPrice":{"type":"number","description":"Entry price"},"fundingRate":{"type":"number","description":"Funding rate per 8h period as fraction, e.g. 0.0001"},"days":{"type":"number","description":"Number of days to hold"},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined (default), inverse = coin-margined. For inverse, sizeBase is USD contracts and cost figures come out in the base coin."}},"required":["side","sizeBase","entryPrice","fundingRate","days"]}},{"name":"workflow.run_liquidation_safety","description":"Calculate the liquidation price for an isolated-margin futures position. Use when user asks \"where will I get liquidated?\" or \"how close is my liq price?\". Returns: liquidationPrice, distancePct (how far from entry).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"side":{"type":"string","enum":["long","short"]},"entryPrice":{"type":"number","description":"Entry price (positive)"},"leverage":{"type":"number","description":"Leverage multiplier, e.g. 10 for 10x"},"mmr":{"type":"number","description":"Maintenance margin rate, default 0.005 (0.5%)"},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined (default), inverse = coin-margined (e.g. Deribit/Bybit/MEXC BTC-settled perps)."}},"required":["side","entryPrice","leverage"]}},{"name":"workflow.run_market_cap_comparison","description":"Compares two tokens' live market caps (Solana or any of 5 EVM chains — the two tokens can be on different chains) and projects what an investment would be worth if the first token's market cap matched the second's. Narrative-agnostic (\"if X reaches Y's market cap\") — works for any token pair, not tied to one hype cycle or one chain. A snapshot ratio, not a forecast: assumes fixed supply on both sides. Use when user asks \"what if this token reaches [other token]'s market cap?\". Returns: multiplier, projectedValueUsd, projectedPriceUsd, profitUsd, comparable (false + error if either market cap can't be resolved).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"tokenChain":{"type":"string","enum":["solana","ethereum","base","bsc","arbitrum","polygon"],"description":"Chain of the token you hold. Default solana."},"tokenMint":{"type":"string","description":"Address of the token you hold or are evaluating (base58 for Solana, 0x... for EVM chains)"},"compareToChain":{"type":"string","enum":["solana","ethereum","base","bsc","arbitrum","polygon"],"description":"Chain of the comparison token. Default solana. Can differ from tokenChain."},"compareToMint":{"type":"string","description":"Address of the token whose market cap to compare against"},"investmentUsd":{"type":"number","description":"Investment amount in USD"}},"required":["tokenMint","compareToMint","investmentUsd"]}},{"name":"workflow.run_market_implied_odds","description":"Reads Kalshi's full live BTC or ETH year-end price ladder (a set of mutually-exclusive prediction markets covering the whole price range) and reports what the market itself implies: the median (50th-percentile) price bucket, the single most-likely (mode) bucket, and the probability of ending the year at or above any real bucket boundary. Deliberately does not compute an expected value or interpolate inside a bucket — the top/bottom buckets are open-ended, so any point estimate there would need an invented assumption; every number this tool returns traces back to one live, sourced price. Use when user asks \"what does the market think BTC will be worth by year end?\" or \"what are the odds ETH ends the year above $X?\". Returns: buckets[] (label, floor, cap, probabilityPct), medianBucketLabel, modeBucketLabel, vigPct, probabilityAtOrAbovePct + snappedThresholdUsd (only when thresholdUsd is supplied).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"coin":{"type":"string","enum":["BTC","ETH"],"description":"Which coin's year-end ladder to read. Default BTC."},"thresholdUsd":{"type":"number","description":"Optional price threshold — returns the probability of ending the year at or above the nearest real bucket boundary at or below this value."}},"required":[]}},{"name":"workflow.run_max_leverage","description":"Calculate the maximum safe leverage based on account size, max acceptable drawdown, and asset daily volatility. Use when user asks \"what's the max leverage I should use on BTC?\" or \"how much leverage is safe given 3% daily volatility?\". Returns: maxLeverage, marginAtRisk.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"accountSize":{"type":"number","description":"Total account size in USDT"},"maxDrawdownPct":{"type":"number","description":"Maximum acceptable drawdown as percentage, e.g. 10 for 10%"},"volatilityPct":{"type":"number","description":"Expected daily price volatility as percentage, e.g. 3 for 3%"},"mmr":{"type":"number","description":"Maintenance margin rate, default 0.005 (0.5%)"}},"required":["accountSize","maxDrawdownPct","volatilityPct"]}},{"name":"workflow.run_odds_converter","description":"Converts a probability into decimal odds, American odds, and breakeven win rate — either from a manually supplied probability, or fetched live from a Kalshi crypto-price prediction market (a CFTC-regulated exchange with a public, keyless market-data API). When a live ticker is supplied, also returns the vig (the exchange's built-in edge), computed from the market's own YES+NO prices, not estimated. Use when user asks \"what odds does a 35% probability work out to?\" or \"what's the vig on this Kalshi market?\". Returns: probability, decimalOdds, americanOdds, breakevenWinRatePct, vigPct (null unless a live ticker was used), source (manual/kalshi).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"probability":{"type":"number","description":"Probability as a decimal 0-1 (e.g. 0.35). Use this OR kalshiTicker, not both."},"kalshiTicker":{"type":"string","description":"A Kalshi market ticker (e.g. KXBTCY-27JAN0100-T149999.99) to fetch a live price from instead of a manual probability."}},"required":[]}},{"name":"workflow.run_open_analysis","description":"Market Profile open analysis — where and how price opened vs the prior session value area. Use for \"how did BTC open today?\" / \"what does the open imply for the session?\". Returns: open_location, open_type (OD/OTD/ORR/OAIR) with description/implication, confidence, key_levels (VAH/VAL/VPOC/IB), scenario_framing (bullish/bearish/neutral), invalidation level.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"instrument":{"type":"string","description":"Symbol, e.g. BTCUSDT"},"venue":{"type":"string","enum":["binance","bybit"],"description":"Exchange to fetch candles from when candles[] not supplied"},"session_date":{"type":"string","description":"Session date YYYY-MM-DD (UTC)"},"timeframe":{"type":"string","enum":["1m","5m","15m","30m"],"description":"Candle timeframe (default 15m)"},"value_area_rule":{"type":"number","description":"Value-area fraction 0.5–0.9 (default 0.70)"},"candles":{"type":"array","description":"Optional OHLCV for the session — omit to fetch from venue (reproducible + 0 COGS when supplied)","items":{"type":"object"}},"prev_candles":{"type":"array","description":"Optional OHLCV for the previous session","items":{"type":"object"}}},"required":["instrument","venue","session_date"]}},{"name":"workflow.run_pnl_planning","description":"Calculate net PnL, ROE, fees and gross profit/loss for a futures trade. Use when user asks \"what's my profit/loss on this trade?\" Returns: grossPnl, fees, netPnl, netPnlUsdt, roe (%).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"side":{"type":"string","enum":["long","short"],"description":"Trade direction"},"entryPrice":{"type":"number","description":"Entry price (positive)"},"exitPrice":{"type":"number","description":"Exit price (positive)"},"size":{"type":"number","description":"Position size — base asset qty for linear, USD contracts for inverse"},"feeOpenPct":{"type":"number","description":"Opening fee as fraction, e.g. 0.0002 = 0.02%"},"feeClosePct":{"type":"number","description":"Closing fee as fraction"},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined (default), inverse = coin-margined. For inverse, pnl/fees are returned in the base coin, not USDT."}},"required":["side","entryPrice","exitPrice","size"]}},{"name":"workflow.run_position_sizing","description":"Calculate the correct position size given a maximum risk in USDT and a stop-loss price. Use when user asks \"how many coins should I buy?\" or \"size my position so I risk exactly $X\". Returns: positionSize (base), positionUsdt, marginRequired.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"side":{"type":"string","enum":["long","short"]},"entryPrice":{"type":"number","description":"Entry price"},"stopLoss":{"type":"number","description":"Stop-loss price"},"riskUsdt":{"type":"number","description":"Maximum acceptable loss in USDT"},"leverage":{"type":"number","description":"Leverage, default 1"},"feeOpenPct":{"type":"number","description":"Opening fee fraction, default 0.0002"},"feeClosePct":{"type":"number","description":"Closing fee fraction, default 0.0005"},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined (default), inverse = coin-margined. For inverse, sizeQuote is USD contracts and margin is returned in the base coin."}},"required":["side","entryPrice","stopLoss","riskUsdt"]}},{"name":"workflow.run_pre_trade_check","description":"Full pre-trade decision card: orchestrates position sizing, breakeven, liquidation, and funding cost in one call — the preferred tool whenever a full setup check is wanted, not just one metric. Use when user describes a full trade setup and asks \"should I take this trade?\" or \"run the numbers on this setup\". Provide exchange+symbol to fetch live funding rate automatically. If the user specifically gave an entry/stop/target and wants an R:R-graded verdict, use workflow.run_risk_reward instead. Returns: positionSize, breakeven, liquidationPrice, fundingCost, overnightBreakevenShift, verdict.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"exchange":{"type":"string","description":"Exchange code, e.g. \"binance\" or \"bybit\". Used to fetch live funding rate if funding_rate is omitted."},"symbol":{"type":"string","description":"Perpetual symbol, e.g. \"BTCUSDT\"."},"side":{"type":"string","enum":["long","short"]},"entry_price":{"type":"number","description":"Entry price (positive)"},"stop_loss":{"type":"number","description":"Stop-loss price (positive)"},"account_balance":{"type":"number","description":"Total account balance in USDT"},"risk_pct":{"type":"number","description":"Risk as % of balance, e.g. 1.0 = 1%"},"leverage":{"type":"number","description":"Leverage multiplier"},"funding_rate":{"type":"number","description":"Funding rate per 8h as decimal, e.g. 0.0001. If omitted, fetched live from exchange."},"hold_hours":{"type":"number","description":"Expected hold time in hours for overnight shift calc. Default 8."},"fee_open_pct":{"type":"number","description":"Opening fee fraction, default 0.0002"},"fee_close_pct":{"type":"number","description":"Closing fee fraction, default 0.0005"},"mmr":{"type":"number","description":"Maintenance margin rate, default 0.005"},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined (default), inverse = coin-margined (e.g. Bybit BTCUSD). All returned figures (notional, margin, risk_amount, funding_cost_*) stay USD-denominated either way; recommended_size is USD notional (contracts) for inverse."}},"required":["side","entry_price","stop_loss","account_balance","risk_pct","leverage"]}},{"name":"workflow.run_prediction_market_edge","description":"Compares your own probability estimate for an event against a prediction market's price (manual entry or a live Kalshi ticker) and sizes a bet using fractional Kelly criterion bet sizing (default: quarter-Kelly, a standard conservative haircut on full Kelly, stated explicitly as a convention). Returns zero recommended stake whenever your probability doesn't exceed the market's price — no edge, no bet. Use when user asks \"does this bet have edge?\" or \"how much should I stake given my probability estimate vs the market's?\". Returns: edgePct, evPerDollarStaked, fullKellyFraction, cappedKellyFraction, recommendedStakeUsd, verdict (skip_this_one/think_twice/worth_the_risk/take_it).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"yourProbabilityPct":{"type":"number","description":"Your own probability estimate, 0.01-99.99"},"marketProbabilityPct":{"type":"number","description":"The market's probability (price), 0.01-99.99. Use this OR kalshiTicker, not both."},"kalshiTicker":{"type":"string","description":"A Kalshi market ticker to fetch the market probability from live instead of supplying it manually."},"bankrollUsd":{"type":"number","description":"Bankroll available for this bet, in USD"},"kellyFractionCap":{"type":"number","description":"Fraction of full Kelly to actually stake, 0.01-1. Default 0.25 (quarter-Kelly)."}},"required":["yourProbabilityPct","bankrollUsd"]}},{"name":"workflow.run_risk_reward","description":"Full risk:reward analysis — the single best tool when user describes a trade with entry, stop, AND target (all three). Calculates R:R ratio, position size, liquidation price, breakeven, and P&L at both stop and target. Returns a verdict: strong (3:1+) / good (2:1+) / marginal / poor, specifically graded on the R:R ratio. If the user instead wants a full setup check tied to a live exchange/symbol (including funding cost), use workflow.run_pre_trade_check instead — its verdict covers overall setup safety, not just R:R. Use when user asks \"is this trade worth taking?\" or \"what's my risk reward on this setup?\".","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"side":{"type":"string","enum":["long","short"]},"entry_price":{"type":"number","description":"Entry price"},"stop_loss":{"type":"number","description":"Stop-loss price"},"take_profit":{"type":"number","description":"Take-profit price"},"account_balance":{"type":"number","description":"Account balance in USDT"},"risk_pct":{"type":"number","description":"Max risk as % of account"},"leverage":{"type":"number","description":"Leverage multiplier"},"fee_open_pct":{"type":"number","description":"Open fee rate (default 0.0002)"},"fee_close_pct":{"type":"number","description":"Close fee rate (default 0.0005)"},"mmr":{"type":"number","description":"Maintenance margin rate (default 0.005)"},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined (default), inverse = coin-margined (e.g. Bybit BTCUSD). position_size/notional are USD notional (contracts) for inverse; pnl_at_stop/pnl_at_target come back denominated in the base coin."}},"required":["side","entry_price","stop_loss","take_profit","account_balance","risk_pct","leverage"]}},{"name":"workflow.run_scale_out","description":"Scale-out planner: P&L, ROI, and cumulative P&L for each partial exit level. Use when user wants to take profit at multiple targets — \"close 30% at $90k, 30% at $95k, 40% at $100k — what's my total P&L?\". Returns: per-level pnl, weightedAvgExitPrice, totalRoi.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"side":{"type":"string","enum":["long","short"]},"entry_price":{"type":"number","description":"Entry price"},"total_size":{"type":"number","description":"Total position size in base currency"},"exits":{"type":"array","items":{"type":"object","properties":{"price":{"type":"number"},"pct":{"type":"number","description":"% of total_size to exit here"}},"required":["price","pct"]},"minItems":2,"maxItems":10},"fee_open_pct":{"type":"number","description":"Open fee rate (default 0.0002)"},"fee_close_pct":{"type":"number","description":"Close fee rate (default 0.0005)"},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined (default), inverse = coin-margined. total_size is USD notional (contracts) for inverse, and per-level pnl comes back denominated in the base coin."}},"required":["side","entry_price","total_size","exits"]}},{"name":"workflow.run_scenario_planning","description":"Run a scenario analysis: compute PnL for multiple price-change percentages at once. Use when user asks \"show me my P&L if BTC moves -10%, -5%, +5%, +10%\". Returns: array of { deltaPct, exitPrice, netPnl, roe }.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"side":{"type":"string","enum":["long","short"]},"entryPrice":{"type":"number","description":"Entry price"},"size":{"type":"number","description":"Position size in base asset"},"deltasPct":{"type":"array","items":{"type":"number"},"description":"List of price change percentages, e.g. [-10, -5, 0, 5, 10]"},"feeOpenPct":{"type":"number","description":"Opening fee fraction"},"feeClosePct":{"type":"number","description":"Closing fee fraction"},"contractType":{"type":"string","enum":["linear","inverse"],"description":"linear = USDT-margined (default), inverse = coin-margined. For inverse, size is USD contracts and pnl/fees come out in the base coin."}},"required":["side","entryPrice","size","deltasPct"]}},{"name":"workflow.run_session_structure","description":"Market Profile day-type classifier — trend / balance / neutral_trend / normal / normal_var, from TPO, initial balance, range extension and value migration. Use for \"is this a trend day or a balance day?\". Returns: structure (the day-type label), description, bias, key_signals, key_levels (VAH/VAL/VPOC/IB/session high-low), scenario_framing, invalidation level.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"instrument":{"type":"string","description":"Symbol, e.g. BTCUSDT"},"venue":{"type":"string","enum":["binance","bybit"],"description":"Exchange to fetch candles from when candles[] not supplied"},"session_date":{"type":"string","description":"Session date YYYY-MM-DD (UTC)"},"timeframe":{"type":"string","enum":["1m","5m","15m","30m"],"description":"Candle timeframe (default 15m)"},"value_area_rule":{"type":"number","description":"Value-area fraction 0.5–0.9 (default 0.70)"},"candles":{"type":"array","description":"Optional OHLCV for the session — omit to fetch from venue (reproducible + 0 COGS when supplied)","items":{"type":"object"}},"prev_candles":{"type":"array","description":"Optional OHLCV for the previous session","items":{"type":"object"}}},"required":["instrument","venue","session_date"]}},{"name":"workflow.run_swap_price_impact","description":"Live price-impact quote for a Solana token swap — routed through Jupiter (the same aggregator real swaps use) across every pool it knows about, not a single-pool estimate. Use when user asks \"how much slippage will I eat swapping X tokens?\" or \"what will I actually get if I sell N tokens?\". Returns: outputAmount, priceImpactPct, effectivePrice, marketPriceUsd, liquidityUsd, routable (false + error if the size can't be routed at all).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"mint":{"type":"string","description":"Solana mint address of the token being sold (base58)"},"amount":{"type":"number","description":"Amount of the token to swap, in human units (not raw base units)"},"outputAsset":{"type":"string","enum":["USDC","SOL"],"description":"Asset to receive. Default USDC."}},"required":["mint","amount"]}},{"name":"workflow.run_token_risk_check","description":"Token rug-pull MECHANISM check for a Solana token (mint address) — can the deployer still mint supply, freeze wallets, pull liquidity, swap metadata, or has RugCheck flagged a known scam pattern (e.g. copycat token)? Fetches live facts from RugCheck (GoPlus as fallback) and returns a transparently-weighted composite score. Deliberately does NOT score holder concentration or \"whale dump\" impact — those are properties of any liquid market (a legit protocol's top holders are routinely treasury/vesting/exchange wallets), not rug signals; they are returned separately as informational market_context. Use when user asks \"is this token a rug pull?\" or \"is [token] safe to buy?\". This is a sourced, timestamped read of public facts, not a safety guarantee. Returns: score (0-100), verdict (clean/caution/high_risk/red_flags), verdict_summary, components breakdown, facts, market_context, sources.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"mint":{"type":"string","description":"Solana token mint address (base58)"}},"required":["mint"]}},{"name":"workflow.run_value_migration","description":"Market Profile value-area migration across sessions — is value migrating up, down, or overlapping (directional conviction vs balance)? Use for \"is value moving higher day over day?\". Returns: state, direction, migration_pct, key_levels (current vs. prior session VAH/VAL/VPOC), scenario_framing, invalidation level.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"instrument":{"type":"string","description":"Symbol, e.g. BTCUSDT"},"venue":{"type":"string","enum":["binance","bybit"],"description":"Exchange to fetch candles from when candles[] not supplied"},"session_date":{"type":"string","description":"Session date YYYY-MM-DD (UTC)"},"timeframe":{"type":"string","enum":["1m","5m","15m","30m"],"description":"Candle timeframe (default 15m)"},"value_area_rule":{"type":"number","description":"Value-area fraction 0.5–0.9 (default 0.70)"},"candles":{"type":"array","description":"Optional OHLCV for the session — omit to fetch from venue (reproducible + 0 COGS when supplied)","items":{"type":"object"}},"prev_candles":{"type":"array","description":"Optional OHLCV for the previous session","items":{"type":"object"}},"lookback_sessions":{"type":"number","description":"Sessions to compare, 1–5 (default 1)"}},"required":["instrument","venue","session_date"]}},{"name":"workflow.run_wallet_flag_check","description":"Checks a wallet address (Solana or any of 5 EVM chains) against independent flag databases — GoPlus (malicious-address categories, all chains), Webacy (address analysis + sanctions check, all chains), and ScamSniffer (public phishing/drainer blacklist, EVM chains only) — and returns each source's own facts separately, never merged into one invented score. Use when user asks \"is this wallet address flagged?\" or \"is it safe to send to this address?\". A clean result means \"nothing found in these databases,\" not a certified-safe verdict. Returns: goplus (flags[], categoriesChecked), webacyGeneral (overallRisk, dprk/hack/ofacSanctioned, exchangeLabel), webacySanctions (status), scamSniffer (flagged; not applicable on Solana). Each source has an `available` flag — false + error if that source failed independently.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"chain":{"type":"string","enum":["solana","ethereum","base","bsc","arbitrum","polygon"],"description":"Chain of the wallet address. Default solana."},"walletAddress":{"type":"string","description":"Wallet address (base58 for Solana, 0x... for EVM chains)"}},"required":["walletAddress"]}}],"scan":{"score":81,"grade":"B","scanned_at":"2026-09-19T09:52:27.797Z","report":{"scannerVersion":"0.1.3","scannedAt":"2026-09-19T09:52:27.744Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1085ms"]},"poisoning":{"score":15,"max":15,"notes":["32 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 30 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://tradingcalc.io/api/mcp","reachable":true,"authRequired":false,"latencyMs":1085,"serverInfo":{"name":"tradingcalc-mcp","version":"1.6.0"}}],"packages":[],"repo":{"found":true,"owner":"SKalinin909","repo":"tradingcalc-mcp","archived":false,"pushedAt":"2026-09-19T09:02:09Z","stars":1,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/51710734?v=4","ownerCreatedAt":"2019-06-11T14:17:44Z","license":"MIT"},"icon":{"url":"https://tradingcalc.io/apple-icon.png?apple-icon.ab1923aa.png","source":"site","width":747,"height":749},"presence":{"stars":1,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-19T09:02:09.000Z","score":23}}}},"grade_history":[],"reviews":[]}