{"name":"ai.traderouter/trade-router-mcp","slug":"traderouter-trade-router-mcp","title":null,"description":"Non-custodial Solana swap & limit order engine for AI agents.","url":"https://mcp.market/server/traderouter-trade-router-mcp","rating":null,"grade":"B","score":71,"certified":false,"status":"active","category":"ecommerce","tags":["ecommerce"],"presence":{"score":21,"stars":3,"forks":1,"downloads_week":74,"last_push_at":"2026-04-28T10:20:35.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/TradeRouter/trade-router-mcp","website":null,"version":"1.0.13","remotes":[],"packages":[{"registryType":"npm","identifier":"@traderouter/trade-router-mcp","version":"1.0.13","transport":{"type":"stdio"},"environmentVariables":[{"description":"Solana base58-encoded private key. Local signing only, never transmitted. See SECURITY.md.","isRequired":true,"isSecret":true,"name":"TRADEROUTER_PRIVATE_KEY"},{"description":"Optional RPC endpoint override (default https://api.mainnet-beta.solana.com).","name":"SOLANA_RPC_URL"},{"description":"Optional override for the server public key used to verify order_filled ed25519 signatures.","name":"TRADEROUTER_SERVER_PUBKEY"},{"description":"Optional second server public key accepted during key rotation.","name":"TRADEROUTER_SERVER_PUBKEY_NEXT"},{"description":"Default 'true'. Verify server signatures on order_filled / twap_execution.","name":"TRADEROUTER_REQUIRE_SERVER_SIGNATURE"},{"description":"Default 'true'. Verify server signatures on order_created.","name":"TRADEROUTER_REQUIRE_ORDER_CREATED_SIGNATURE"},{"description":"Default 'false'. When 'true', write-action tools (submit_signed_swap, auto_swap, place_*_order, cancel_order, extend_order) short-circuit and return { dry_run: true, ... } instead of calling the API. Read-only tools execute normally.","name":"TRADEROUTER_DRY_RUN"}]}],"tools":[{"name":"auto_swap","description":"Builds, signs, and submits a Solana swap in a single call. Equivalent to build_swap → local sign → submit_signed_swap, but the MCP server handles the encoding conversion (base58 → base64) for you. WHEN TO USE: For most swaps. This is the simplest path. Use build_swap + submit_signed_swap separately only when you need to inspect or modify the transaction before signing (e.g. agent-layer validation ","write_action":false,"price_micros":0,"input_schema":null},{"name":"build_swap","description":"Builds an unsigned Solana swap transaction via POST /swap. Returns the transaction as base58 — the caller must decode, sign locally, re-encode as base64, and submit via submit_signed_swap. WHEN TO USE: When you want to inspect or modify the transaction before signing (e.g. agent-layer validation), or when you want to control the sign+submit flow yourself. For a one-step swap, use auto_swap instead","write_action":false,"price_micros":0,"input_schema":null},{"name":"cancel_order","description":"Cancels an active limit, trailing, TWAP, or combo order. Once cancelled, the order is removed server-side and no further fills will arrive. WHEN TO USE: To kill an order before it triggers (e.g. you no longer want to take that position) or to halt remaining TWAP slices. WHAT IT DOES: Sends { action: \"cancel_order\", order_id } over the WebSocket. Server removes the order from its scheduler and conf","write_action":true,"price_micros":0,"input_schema":null},{"name":"check_order","description":"Returns the current status of a specific order by order_id. More targeted than list_orders. WHEN TO USE: To check whether a known order has triggered, expired, or been cancelled. Useful when polling for a specific order's outcome rather than scanning the full list. WHAT IT DOES: Sends { action: \"check_order\", order_id } over the WebSocket. Server returns { type: \"order_status\", order_id, status, .","write_action":true,"price_micros":0,"input_schema":null},{"name":"connect_websocket","description":"Opens (or reuses) the persistent WebSocket connection to wss://api.traderouter.ai/ws for a wallet, performs the Ed25519 challenge-response handshake, and waits up to 25 seconds for the \"registered\" confirmation. WHEN TO USE: Before placing limit / trailing / TWAP / combo orders. get_wallet_address calls this implicitly, so you only need this tool to FORCE-reconnect or to register a wallet other th","write_action":false,"price_micros":0,"input_schema":null},{"name":"connection_status","description":"Returns the current state of the persistent WebSocket connection for a wallet (connected, registered, last heartbeat time, queued message count). WHEN TO USE: For debugging. If place_*_order calls are failing or hanging, check this first to see whether the WebSocket is actually authenticated. WHAT IT DOES: Inspects the in-memory ConnectionManager for the given wallet — no network call. RETURNS: { ","write_action":false,"price_micros":0,"input_schema":null},{"name":"extend_order","description":"Extends the expiry time of an active limit or trailing order. expiry_hours sets the NEW total lifetime (counted from order creation, not from now). WHEN TO USE: When you want to keep a pending order alive longer than the original expiry_hours allowed (max 336 = 14 days). WHAT IT DOES: Sends { action: \"extend_order\", order_id, expiry_hours } over the WebSocket. Server updates the order's expires_at","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_fill_log","description":"Returns the in-memory log of all order_filled events received over the WebSocket since the MCP server process started (capped at 200 entries). WHEN TO USE: Audit which orders have triggered, with their on-chain signatures. Useful for end-of-session reporting or debugging \"did my order fill?\" WHAT IT DOES: Reads from the ConnectionManager's circular buffer. Does not query the API. RETURNS: { wallet","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_flex_card","description":"Returns the URL of a flex trade-card PNG that visualizes a wallet's position in a token (entry price, current PnL, etc.). Used for sharing trades on social media. WHEN TO USE: After a notable swap, to generate a shareable image for X / Discord / Telegram. WHAT IT DOES: Constructs the URL https://api.traderouter.ai/flex?wallet_address=W&token_address=T. Does NOT fetch the image — it returns the URL","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_holdings","description":"Scans every SPL token account on a wallet and returns the holdings list. Most accurate Solana wallet scanner available — catches tokens that standard RPC token-account scans miss. WHEN TO USE: When you need the full token balance for a wallet, including obscure or newly-launched tokens, before deciding what to sell or display in a portfolio view. WHAT IT DOES: Calls POST /holdings with the wallet ","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_mcap","description":"Returns market-cap and price data for one or more SPL tokens. Used by limit-order strategies to compute target market caps relative to current. WHEN TO USE: Before placing a limit_order with a market-cap target (so you know what current mcap is), or for portfolio valuation. WHAT IT DOES: Calls GET /mcap with comma-delimited mint addresses. Server queries its market-cap index (computed from liquid ","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_wallet_address","description":"Returns the public Solana wallet address derived from the TRADEROUTER_PRIVATE_KEY environment variable, and triggers the persistent WebSocket connection to api.traderouter.ai for that wallet. WHEN TO USE: Call this once at session start, before any other Trade Router tool. The returned wallet address is the identity used by every other tool. WHAT IT DOES: Reads the base58 private key from env, der","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_orders","description":"Returns all currently active orders (limit, trailing, TWAP, combo) for a wallet. Used to audit pending orders and find order_ids for cancel_order or extend_order. WHEN TO USE: Periodically, to detect expired orders (the server does NOT push an expiry event — orders silently disappear from results when expiry_hours is reached). Also to confirm that a place_*_order call actually registered. WHAT IT ","write_action":false,"price_micros":0,"input_schema":null},{"name":"place_limit_order","description":"Places a market-cap-triggered limit order over the WebSocket. The server polls market cap ~every 5 seconds and fires the swap when the target is crossed. WHEN TO USE: When you want to enter or exit at a specific market-cap level, not at current price. Examples: \"buy BONK when its mcap drops to $500M\", \"sell BONK when its mcap doubles\". WHAT IT DOES: Sends { action: \"sell\"|\"buy\", token_address, tar","write_action":true,"price_micros":0,"input_schema":null},{"name":"place_limit_trailing_order","description":"COMBO ORDER: Wait for a limit target, then activate a trailing stop. When the trail triggers, execute as a SINGLE swap (not TWAP). WHEN TO USE: To enter at a specific mcap, then ride the trend with a trailing stop. Example: \"Buy BONK if mcap drops to $500M, then sell with a 15% trailing stop after entry.\" WHAT IT DOES: Server waits for limit target. When crossed, sends limit_trailing_activated and","write_action":true,"price_micros":0,"input_schema":null},{"name":"place_limit_trailing_twap_order","description":"COMBO ORDER (the full chain): Wait for a market-cap limit target → activate trailing stop → on trail trigger, execute exit/entry as TWAP slices. WHEN TO USE: For the most sophisticated single-tool strategy. Example: \"Buy BONK at mcap $500M, then sell with a 15% trailing stop, and when the trail fires distribute the exit over 30 minutes via TWAP.\" WHAT IT DOES: Server orchestrates all three phases.","write_action":true,"price_micros":0,"input_schema":null},{"name":"place_limit_twap_order","description":"COMBO ORDER: Wait for a market-cap target to be crossed, then execute the entry/exit as a TWAP rather than a single swap. Server-orchestrated; no client-side state machine needed. WHEN TO USE: When you want a trigger-then-distribute pattern. Example: \"If BONK's mcap hits $500M, ladder out of my position over 30 minutes via TWAP.\" WHAT IT DOES: Server waits for limit target. When crossed, sends lim","write_action":true,"price_micros":0,"input_schema":null},{"name":"place_trailing_order","description":"Places a trailing-stop sell or trailing buy order over the WebSocket. The server tracks the high-water mark (or low-water mark for buy) of mcap and fires when it retraces by trail BPS. WHEN TO USE: To ride a trend without picking a fixed exit. \"Sell BONK when mcap drops 10% from its peak\" — sell trail-stop. \"Buy DOGE when mcap rebounds 5% from its low\" — buy trail. WHAT IT DOES: Sends { action: \"t","write_action":true,"price_micros":0,"input_schema":null},{"name":"place_trailing_twap_order","description":"COMBO ORDER: Wait for a trailing-stop trigger, then execute the exit as a TWAP rather than a single swap. WHEN TO USE: To ride a trend with a trailing stop, but exit gradually via TWAP when the trail fires (minimizing market impact on a low-liquidity exit). Example: \"Sell BONK if mcap drops 15% from peak, but spread the exit over 30 min.\" WHAT IT DOES: Server tracks high-water (sell) or low-water ","write_action":true,"price_micros":0,"input_schema":null},{"name":"place_twap_order","description":"Places a Time-Weighted Average Price (TWAP) buy or sell order. The total amount is split into N equal slices executed every (duration / frequency) seconds. WHEN TO USE: For DCA, large entries/exits where minimizing market impact matters more than getting a single price. Example: \"DCA 1 SOL into JUP over 6 hours in 12 slices\" → twap_buy with amount=1e9, frequency=12, duration=21600. WHAT IT DOES: S","write_action":true,"price_micros":0,"input_schema":null},{"name":"submit_signed_swap","description":"Submits a fully-signed, base64-encoded Solana transaction via POST /protect (Jito MEV-protected lane). Blocks until the transaction confirms on-chain. WHEN TO USE: Pair with build_swap when you want to inspect/modify the transaction before signing. For a single-call swap, prefer auto_swap. WHAT IT DOES: POSTs the signed transaction to api.traderouter.ai/protect, which submits via Jito bundles + a ","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":71,"grade":"B","scanned_at":"2026-09-27T21:51:13.563Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-27T21:51:13.511Z","components":{"code":{"score":25,"max":25,"notes":["2 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":8,"max":15,"notes":["last push 152 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@traderouter/trade-router-mcp","version":"1.0.13","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":5,"publishedAt":"2026-04-27T08:24:16.201Z","repositoryUrl":"git+https://github.com/TradeRouter/trade-router-mcp.git","weeklyDownloads":74}],"repo":{"found":true,"owner":"TradeRouter","repo":"trade-router-mcp","archived":false,"pushedAt":"2026-04-28T10:20:35Z","stars":3,"forks":1,"openIssues":2,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/266610582?v=4","ownerCreatedAt":"2026-03-09T02:33:28Z","license":"MIT"},"icon":{"url":"https://traderouter.ai/apple-touch-icon.png","source":"site","width":180,"height":180},"presence":{"stars":3,"forks":1,"downloadsWeek":74,"license":"MIT","lastPushAt":"2026-04-28T10:20:35.000Z","score":21}}}},"grade_history":[],"reviews":[]}