{"serverId":"mcp-registry/io.github.gigshow/decker","tools":[{"name":"decker.close_position","fixed":{"name":"decker_close_position","description":"Axis③ (Order/Execution) — closes (or partially reduces) an existing position through DECKER'S OWN execution engine (see decker.place_order for what that means — same account-linkage requirement applies here for real positions). Unlike place_order, there is no crypto-6 restriction — this reduces risk, not adds it, so any symbol you actually hold (including HL-synthetic/KRX paper positions) can be closed. Mode is NOT chosen by the caller — this looks up whatever position(s) actually exist for the ","inputSchema":{"type":"object","required":["symbol"],"properties":{"symbol":{"type":"string","description":"e.g. BTCUSDT, XYZ_GOLDUSD — whatever symbol you hold. Aliases resolve like other tools."},"close_fraction":{"type":"number","default":1,"maximum":1,"description":"Fraction of the current position to close, 0 < x <= 1. Default 1.0 = full close. E.g. 0.5 closes half.","exclusiveMinimum":0}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.close_position\" → \"decker_close_position\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":264,"tokensAfter":264},{"name":"decker.get_assembly","fixed":{"name":"decker_get_assembly","description":"THE answer for 'what is the situation and what do I do on this symbol now' — one verdict per symbol, built from the per-timeframe judgment state (CR1); no scores or weights. READ IN THIS ORDER: (1) verdict = state (direction · phase) + action: 진입 enter now (a new signal) | 유지 hold the existing stance, NOT a new entry | 청산 exit | 대기 wait; `reason` says why, `until` names the close that would change it. (2) summary_ko = ready-to-show Korean lines. (3) entry / stop / target / rr = the prices (entry","inputSchema":{"type":"object","properties":{"detail":{"type":"boolean","description":"Include path / watch / story / ladders / matrix_summary (about 20KB per symbol). Default false: the answer only."},"symbol":{"type":"string","description":"Optional symbol or alias (BTC, 비트코인, GOLD, 테슬라...). Omit for all 14 symbols."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.get_assembly\" → \"decker_get_assembly\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":242,"tokensAfter":242},{"name":"decker.get_episodes","fixed":{"name":"decker_get_episodes","description":"Price-axis EPISODE history — answers 'where did I buy/sell last time, what was the target value and the event chain then, and where did price move WITHOUT a signal (and which target values it passed = missing points)'. Read-only from the persisted event ledger (no recompute). `episodes` (newest first) = one target selection until the next: target {price, from_price, reason}, chain (primary-unit judgment events), signals {ts, side, entry, targets, resolved{status, close, bar_low, bar_high}}, left","inputSchema":{"type":"object","required":["symbol","timeframe"],"properties":{"limit":{"type":"integer","default":5,"maximum":20,"minimum":1,"description":"number of episodes"},"symbol":{"type":"string","description":"e.g. BTCUSDT"},"timeframe":{"enum":["30m","1h","4h","8h","1d","1w"],"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.get_episodes\" → \"decker_get_episodes\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":237,"tokensAfter":237},{"name":"decker.get_market_state","fixed":{"name":"decker_get_market_state","description":"PER-TIMEFRAME judgment state of a symbol, structured (consumer contract CR1) — the evidence behind decker.get_assembly's single verdict. For 'what is the situation and what do I do' call decker.get_assembly first; use this when you need one timeframe's exact state. Per timeframe (top→short): stage = target_selected (대상선정) | pending (판정보류: the close is still inside the signal bar) | confirmed (확인) | failed (실패) | none; side = buy/sell (a failed signal asserts nothing about the opposite side); sig","inputSchema":{"type":"object","required":["symbol"],"properties":{"symbol":{"type":"string","description":"e.g. BTCUSDT, XYZ_GOLDUSD"},"timeframe":{"enum":["30m","1h","4h","8h","1d","1w"],"type":"string","description":"Alias for a single-element `timeframes` (backward compatible)."},"timeframes":{"type":"array","items":{"enum":["30m","1h","4h","8h","1d","1w"],"type":"string"},"description":"Subset to return. Omit for all timeframes."},"events_limit":{"type":"integer","default":10,"maximum":50,"minimum":0}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.get_market_state\" → \"decker_get_market_state\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":296,"tokensAfter":296},{"name":"decker.get_positions","fixed":{"name":"decker_get_positions","description":"Axis③ (Order/Execution) — this user's actual exposure (each open row carries vs_verdict: does the held side match the current symbol verdict, plus `knots` = the decision prices nearest to the price above and below, with which timeframes sit on each — the ORDER in which transactions would be reached, not a probability; `exit_levels` only when the held side matches): real open futures positions (execution_mode=real, with live sl_price/tp_price), virtual (paper) open positions, and the last 10 clos","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.get_positions\" → \"decker_get_positions\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":166,"tokensAfter":166},{"name":"decker.get_reading","fixed":{"name":"decker_get_reading","description":"How ONE timeframe looks right now, in plain language: state (phase, this timeframe's key direction, posture GO/WATCH/HOLD — a stance, not an order), mtf.by_tf (the same for other timeframes), narrative, plus `assembly` = the symbol's single verdict (the same one decker.get_assembly returns: direction, action 진입/유지/청산/대기, entry/stop/target). ⚠ `state.direction` is only this timeframe's direction and can differ from `assembly.direction` — for the decision use `assembly` (direction_basis says which","inputSchema":{"type":"object","required":["symbol"],"properties":{"tf":{"enum":["15m","30m","1h","4h","8h","1d","1w"],"type":"string","default":"4h"},"symbol":{"type":"string","description":"e.g. BTCUSDT"},"include_tfs":{"type":"string","description":"Comma-separated additional TFs (e.g. '1h,4h,1d')."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.get_reading\" → \"decker_get_reading\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":237,"tokensAfter":237},{"name":"decker.get_signals","fixed":{"name":"decker_get_signals","description":"Active trading signals for the current user (with Skill Overlay applied), in customer-facing shape: coordinates (entry/target/stop), decision (ENTER/WAIT/SKIP — is_actual_trigger=true only for ENTER; WAIT/SKIP are standing candidates, not executed triggers), action_gate posture (GO/WATCH/HOLD — a stance, not an order command), progress, MTF verdict, and a plain-language summary_ko line. risk_reward_ratio is computed on the DISPLAYED coordinates (after overlay). Signals are retained rather than c","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":20,"maximum":100,"minimum":1},"symbols":{"type":"array","items":{"type":"string"},"description":"Symbol filter (e.g. ['BTCUSDT','ETHUSDT']). Omit for all."},"timeframe":{"enum":["30m","1h","4h","8h","1d"],"type":"string","description":"Signal horizon filter (30m=scalp, 1h=swing, 4h/8h/1d=position). The same symbol can hold OPPOSITE directions on different horizons — omit to get the latest active signal regardless of horizon (its timeframe field says which one you got; when a specific symbols[] was requested, a row's other_horizon_conflict field flags it if another horizon is ACTIVE with the opposite direction). Prefer decker.get_assembly for the composed cross-horizon judgment instead of guessing which horizon to pass here."},"action_gate":{"enum":["GO","WATCH","HOLD"],"type":"string","description":"Engine action gate filter (3-layer grammar: gate = transition posture, not an order command). Rows where the engine emitted no gate for this bar (effective_action_gate null, e.g. KRX daily) are excluded when this filter is set."},"min_progress":{"type":"number","maximum":100,"minimum":0,"description":"Minimum progress_pct (0-100)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.get_signals\" → \"decker_get_signals\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":494,"tokensAfter":494},{"name":"decker.get_trigger_history","fixed":{"name":"decker_get_trigger_history","description":"ACTION axis — actual historical GO triggers (not standing WATCH/HOLD candidates) for a symbol, with entry/target/stop coordinates and realized performance (mfe_pct/mae_pct/exit_reason/exit_price from trigger_performance, null = still open). Distinct from decker.get_signals (which reflects only the current-moment state, not a searchable history — its action_gate filter answers 'what does symbol×tf look like right now', not 'when did this last fire'). Use this to answer 'what did the engine actual","inputSchema":{"type":"object","required":["symbol"],"properties":{"limit":{"type":"integer","default":20,"maximum":50,"minimum":1},"since":{"type":"string","description":"ISO8601 lower bound on trigger time (exclusive). Optional."},"symbol":{"type":"string","description":"e.g. BTCUSDT"},"timeframe":{"enum":["30m","1h","4h","8h","1d"],"type":"string","description":"Optional — omit for all timeframes."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.get_trigger_history\" → \"decker_get_trigger_history\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":268,"tokensAfter":268},{"name":"decker.get_user_skills","fixed":{"name":"decker_get_user_skills","description":"Trading skill catalog + currently active overlay for this user. Returns 8 published skills (conservative_v0/standard_v0/aggressive_v0/default_v0/scalp_v0/tight_v0/wide_v0/swing_v0) and the user's selected one. Also returns symbol_skills: the symbols where this user's paper account turns the symbol verdict's entry event into an order (read-only here; turn on/off via REST /auto-order-rules/symbol-skills).","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.get_user_skills\" → \"decker_get_user_skills\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":140,"tokensAfter":140},{"name":"decker.get_view","fixed":{"name":"decker_get_view","description":"Ready-to-show Korean status card for a symbol — the same card the daily briefing sends, built from the same consumer contract (CR1) as decker.get_market_state, so direction and prices always agree with it. Shows the timeframes grouped 상위/중간/단기 with one line each (direction + stage + the price that decided it), the nearby prices to watch, and a short explanation of the chosen timeframe (tf, default 4h): what closed beyond what, whether the signal flips the previous one, entry/target/stop. Also re","inputSchema":{"type":"object","required":["symbol"],"properties":{"tf":{"enum":["30m","1h","4h","8h","1d"],"type":"string","description":"Optional view timeframe — the grounded narrative is composed on this TF's bar (e.g. '1h' when the user asks about the 1-hour picture). Omit for the engine's default action TF (usually 4h, same as the daily briefing card)."},"symbol":{"type":"string","description":"e.g. BTCUSDT, XYZ_GOLDUSD (crypto + HL TradFi synthetics; KRX daily lineage not yet covered by view v1)"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.get_view\" → \"decker_get_view\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":294,"tokensAfter":294},{"name":"decker.place_order","fixed":{"name":"decker_place_order","description":"Axis③ (Order/Execution) — unlike every other tool here, this one moves money. It places a market order through DECKER'S OWN execution engine (same path as the decker-ai.com chat trading UI, source='mcp') — it does NOT hand off to your own broker connection or exchange account; Decker executes using whatever exchange credentials this user has separately linked to their Decker account on the website. execution_mode (virtual|real) is NOT chosen by the caller — it is resolved server-side from this u","inputSchema":{"type":"object","required":["symbol","side","notional_usd"],"properties":{"side":{"enum":["buy","long","sell","short"],"type":"string","description":"Order direction (buy/long or sell/short)."},"symbol":{"enum":["BTCUSDT","ETHUSDT","SOLUSDT","BNBUSDT","XRPUSDT","DOGEUSDT"],"type":"string","description":"Crypto-6 only for this MCP write path."},"notional_usd":{"type":"number","description":"Order size in USD (quantity = notional_usd / current price). This is the value checked against the account's tier notional cap.","exclusiveMinimum":0}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"decker.place_order\" → \"decker_place_order\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":308,"tokensAfter":308},{"name":"decker.set_skill_overlay","fixed":{"name":"decker_set_skill_overlay","description":"Change active trading skill overlay for this user. Immediately affects all subsequent get_signals calls and downstream channels.","inputSchema":{"type":"object","required":["skill_id"],"properties":{"skill_id":{"type":"string","description":"trading_skills.id (e.g. 'aggressive_v0')."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.set_skill_overlay\" → \"decker_set_skill_overlay\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":94,"tokensAfter":94},{"name":"decker.update_protective_stops","fixed":{"name":"decker_update_protective_stops","description":"Axis③ (Order/Execution) — modifies the stop-loss and/or take-profit on an EXISTING open position. There is no cancel_order tool because Decker only places market orders (there is no resting order to cancel) — the actual gap this fills is modifying protective stops on a position you already hold. real: cancels the old exchange stop/take-profit order(s) and places new ones at the given price(s) (new order placed first, old one canceled only after — no unprotected window). virtual: updates the pape","inputSchema":{"type":"object","required":["symbol"],"properties":{"mode":{"enum":["real","virtual"],"type":"string","description":"Only required when both a real and a virtual position are open for this symbol — says which one to modify."},"symbol":{"type":"string","description":"e.g. BTCUSDT — must be a symbol you currently hold."},"sl_price":{"type":"number","description":"New stop-loss price. Omit to leave the current stop unchanged.","exclusiveMinimum":0},"tp_price":{"type":"number","description":"New take-profit price. Omit to leave the current target unchanged.","exclusiveMinimum":0}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.update_protective_stops\" → \"decker_update_protective_stops\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":322,"tokensAfter":322},{"name":"decker.validate_intent","fixed":{"name":"decker_validate_intent","description":"Pre-trade gate check for a proposed order intent. Call this BEFORE placing any order through any execution tool (e.g. a broker MCP's review→place flow). Checks the intent (symbol + side) against Decker's deterministic market state: engine action_gate (GO/WATCH/HOLD — a transition posture, not an order command), current structural state, and the active signal's direction / invalidation (stop) coordinates. Returns a stance reading, NOT an approval or rejection: the vocabulary is the engine gate as","inputSchema":{"type":"object","required":["symbol","side"],"properties":{"side":{"enum":["buy","long","sell","short"],"type":"string","description":"Proposed order direction (buy/long = +, sell/short = -)."},"symbol":{"type":"string","description":"e.g. BTCUSDT, SILVER, 테슬라 — aliases resolve to the engine symbol (XYZ_SILVERUSD, XYZ_TSLAUSD, …)."},"timeframe":{"enum":["30m","1h","4h","8h","1d"],"type":"string","description":"Gate horizon. Omit = your open position's entry TF if you hold one on this symbol, else decker.get_assembly's entry TF (the single judgment authority's current best-path TF), else the engine's default action TF (4h)."},"order_type":{"type":"string","description":"Optional, informational (market/limit/…) — recorded in the ledger, does not change the state verdict."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"decker.validate_intent\" → \"decker_validate_intent\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":375,"tokensAfter":375}],"toolsChanged":14,"tokensSaved":0,"todo":[{"tool":"decker_get_episodes","params":["timeframe"]},{"tool":"decker_get_market_state","params":["events_limit"]},{"tool":"decker_get_reading","params":["tf"]},{"tool":"decker_get_signals","params":["limit"]},{"tool":"decker_get_trigger_history","params":["limit"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}