Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
Buy, sell and extend TRON Energy/Bandwidth on the TronSave market. Quotes need no login.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
Authorization비밀로 표시된 값은 내 계정의 열쇠예요. 절대 다른 사람과 공유하거나 채팅에 붙여 넣지 마세요.
필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
이 주소는 요청 header에 키가 필요한데, 커넥터 추가 메뉴에서는 넣을 수 없어요. 대신 Claude Code, Cursor, VS Code를 쓰세요.
터미널에서 이 명령어를 실행하세요
claude mcp add --transport http tronsave https://mcp.tronsave.io/mcp --header 'Authorization: your-value'실행하기 전에 빈 값을 채워 주세요.
프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"tronsave": {
"url": "https://mcp.tronsave.io/mcp",
"headers": {
"Authorization": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"tronsave": {
"type": "http",
"url": "https://mcp.tronsave.io/mcp",
"headers": {
"Authorization": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 주소는 요청 header에 키가 필요한데, 커넥터 추가 메뉴에서는 넣을 수 없어요. 대신 Claude Code, Cursor, VS Code를 쓰세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
Authorization 비밀 HTTP header이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
도구 이름과 설명은 서버가 2026년 11월 6일에 알려 준 그대로예요. 우리가 아니라 제작자가 쓴 글이고, 일반 텍스트로만 보여 드려요.
tronsave_get_internal_accountRetrieve the Tronsave internal account profile for the current logged-in session (wallet/represent address, balances, deposit address). Requires an internal API key: `tronsave_login` (api-key mode, or signature mode for a wallet with an internal account) or an `Authorization: Api
tronsave_get_deposit_addressFetches the specific deposit address for the TronSave internal account. Requires an internal API key: `tronsave_login` (api-key mode, or signature mode for a wallet with an internal account) or an `Authorization: ApiKey ` client header. Never pass API keys as tool arguments; the
tronsave_internal_order_historyList paginated order history for the internal account linked to the API key, newest first. Requires an internal API key: `tronsave_login` (api-key mode, or signature mode for a wallet with an internal account) or an `Authorization: ApiKey ` client header. Never pass API keys as t
tronsave_internal_order_detailsFetch full details for one internal-account order by order ID. Requires an internal API key: `tronsave_login` (api-key mode, or signature mode for a wallet with an internal account) or an `Authorization: ApiKey ` client header. Never pass API keys as tool arguments; the server fo
tronsave_internal_order_bookReturn the current TronSave market depth/price tiers for ENERGY or BANDWIDTH via the api-key REST endpoint. Requires an internal API key: `tronsave_login` (api-key mode, or signature mode for a wallet with an internal account) or an `Authorization: ApiKey ` client header. Never p
tronsave_internal_order_estimateEstimate the TRX cost and availability for a buy order before submitting it (api-key internal account). Requires an internal API key: `tronsave_login` (api-key mode, or signature mode for a wallet with an internal account) or an `Authorization: ApiKey ` client header. Never pass
tronsave_internal_order_createPlace a new buy order for ENERGY or BANDWIDTH on TronSave, paid from the internal account balance. Requires an internal API key: `tronsave_login` (api-key mode, or signature mode for a wallet with an internal account) or an `Authorization: ApiKey ` client header. Never pass API k
tronsave_internal_extend_delegatesReturn extendable delegations for a receiver plus an `extendData` payload for the extension flow. Requires an internal API key: `tronsave_login` (api-key mode, or signature mode for a wallet with an internal account) or an `Authorization: ApiKey ` client header. Never pass API ke
tronsave_internal_create_extend_requestSubmit an extension request for existing delegated resources on TronSave via authenticated REST `POST /v2/extend-request`. Requires an internal API key: `tronsave_login` (api-key mode, or signature mode for a wallet with an internal account) or an `Authorization: ApiKey ` client
tronsave_get_sign_messageStep 1 of wallet login. Returns `{ message, timestamp }`: ask the user to sign `message` with their TRON wallet (TronWeb `signMessageV2`, TronLink, etc.), then call `tronsave_login` with `signature: " _ "`. Signing the plain decimal `timestamp` text is also accepted. No auth need
tronsave_loginLog in to TronSave for the rest of this MCP connection. Provide EXACTLY ONE of: `signature` = ` _ ` produced by the user's wallet over the `message` from `tronsave_get_sign_message` (unlocks wallet tools; also loads the wallet's internal API key if it has one), or `apiKey` = raw
tronsave_logoutRemove the TronSave login bound to this MCP connection (api-key or signature). Returns `{ loggedOut: true }`; idempotent. Header credentials configured on the client are not affected.
tronsave_get_session_statusReport the current authentication state without calling TronSave: `authMode` (none | api-key | signature), `source` (login | header), `walletAddress`, `hasInternalApiKey`, `expiresAt`, network, and which tool groups are available now. Call this first when unsure whether to log in
tronsave_get_user_infoRead the current authenticated user's profile and linked TronSave internal account. For the internal balance alone use `tronsave_get_internal_account`; for referral data `tronsave_get_referral`. Returns `{ caller, address, balance (SUN string), info, internalAccount }` — `info` c
tronsave_get_user_auto_settingRead the current user's auto-sell configuration (`autoSettings`). Returns the full `autoSettings` object — call this before `tronsave_register_auto_sell` or `tronsave_update_auto_sell_setting` to avoid overwriting fields you do not intend to change. Requires a wallet signature id
tronsave_get_user_permissionsRead the enabled permission operations (`autoSettings.permitOperations`) for the authenticated user. Returns `{ permitOperations: string[] }` — use it before mutating auto-sell or auto-buy rules to confirm the action is allowed for the wallet. Requires a wallet signature identity
tronsave_estimate_buy_resourceQuote price and availability for buying ENERGY or BANDWIDTH for a receiver address before placing an order. This quote feeds `tronsave_create_order`; for `tronsave_internal_order_create` (API key) quote with `tronsave_internal_order_estimate`. Returns `{ unitPrice (SUN/unit), dur
tronsave_get_orderRead one order by `id` and return its full snapshot for NORMAL, FAST, or EXTEND order types. With only an API key, use `tronsave_internal_order_details` instead. Use this as the source of truth before `tronsave_update_order`, `tronsave_sell_order_manual`, or `tronsave_cancel_orde
tronsave_list_ordersQuery the market order list with paging (`offset`, `limit` ≤ 10). For an API-key account's own purchases use `tronsave_internal_order_history`. Returns `{ orders: [{ id, requester?.address, receiver.address, resourceType, resourceAmount, remainAmount, durationSec, unitPrice (SUN)
tronsave_list_order_booksRead market depth buckets for `ENERGY` or `BANDWIDTH`. Public view; with an API key, `tronsave_internal_order_book` adds SLOW/MEDIUM/FAST price tiers. Returns price buckets `{ min, max, value }` optionally scoped by viewer address, minimum delegate amount, and duration. No login
tronsave_get_min_priceQuote the minimum unit price for a buy. Use when only the floor price matters; for a full purchase quote use `tronsave_estimate_buy_resource`, for a grid across amounts and durations `tronsave_get_price_table`. Returns `{ minPrice }` (SUN per resource unit; per day when `duration
tronsave_list_extendable_delegatesList extendable delegate candidates for a `receiver` and `resourceType` (ENERGY|BANDWIDTH). Optional `suggestData` scores an extend-and-buy scenario for planning purposes. Read-only; does NOT create orders or change on-chain state. No login required. NOTE: this is GraphQL market
tronsave_create_orderCreate a buy order for ENERGY/BANDWIDTH delegated to `orderReceiver`. SPENDS FUNDS — confirm the plan with the user first. API-key integrations paying from the internal balance can instead use `tronsave_internal_order_create` (FAST/MEDIUM/SLOW pricing, fill guards). Inputs: `orde
tronsave_sell_order_manualManually execute seller-side fulfillment of an existing order with a wallet `signedTx`. Returns `{ success, message, code, delegatedId }`. Side effect: broadcasts a market/delegation transaction and may consume balances/resources; not idempotent — each call re-executes. Requires
tronsave_cancel_orderCancel an open order by `orderId`. Returns `{ success, message, code }`. Side effect: marks the order non-matchable and refunds locked balance per backend rules; effectively destructive on the live order. Idempotent — cancelling an already-cancelled order is a no-op success. Fail
tronsave_update_orderUpdate an open order by `orderId` with partial fields (`receiver`, `newPrice`). Returns `{ success, message, code }`. Side effect: overwrites live order parameters; not idempotent — each call with a different `newPrice` produces a new state. Requires a wallet signature identity (
tronsave_register_auto_sellCreate the initial auto-sell configuration for the authenticated user. Returns the persisted `autoSettings` payload. Side effect: persists automation settings that affect future delegation/sell behavior; not idempotent — calling twice may reset fields. Requires a wallet signature
tronsave_update_auto_sell_settingUpdate the existing auto-sell configuration with partial fields. Returns the updated `autoSettings` payload. Side effect: overwrites stored automation settings for the current user; not idempotent across different field sets. Requires a wallet signature identity. Use for INCREMEN
tronsave_generate_api_keyGenerate a new internal API key credential for the current user. Returns `data` containing the issued key — show it to the user once and tell them to store it securely; do not repeat it in later messages. Side effect: issues secret material; not idempotent — each call mints a fre
tronsave_revoke_api_keyRevoke the caller's current internal API key. Side effect: any future request using the previous key is rejected. Existing in-flight sessions cached by the server may continue serving until their TTL expires — treat the effect as 'best-effort immediate' rather than guaranteed ins
tronsave_delete_auto_buy_settingPermanently delete one auto-buy rule by `id` (`MObjectId`). Side effect: stops all future executions matching that rule; the rule cannot be restored. Idempotent — deleting a non-existent or already-removed id returns success. Requires a wallet signature identity. Use `tronsave_ge
tronsave_get_market_overviewRead the TronSave market summary: resource currently available and total listed for ENERGY and BANDWIDTH, number of pooled sellers, and seller APY (percent). Use for a quick 'how is the market' answer before pricing; for prices use `tronsave_get_price_table` (grid) or `tronsave_e
tronsave_get_price_tableRead the price grid for ENERGY or BANDWIDTH: `prices[i][j]` is the unit price in SUN for `amounts[i]` resource units rented for `durations[j]` (e.g. '15m', '1h', '1d'). Durations of 1 day or longer are priced per day: '30d' at 40 SUN costs 40 x 30 SUN per unit in total. Use to co
tronsave_get_system_infoRead TronSave and TRON protocol parameters: latest block, minimum buy amounts, TRX burn rates per unit, dynamic buy/lowest prices, the system deposit address, max lock period and the energy cost of a USDT transfer. Use to size purchases (minimums) and to compare renting with burn
tronsave_get_account_resourcesRead the on-chain staked and delegatable ENERGY/BANDWIDTH of a TRON address, plus its TRX balance (SUN string). Use to check whether a wallet can sell, or how much resource it holds. Public (any address), read-only; does not need a login.
tronsave_suggest_create_orderAsk the market how a buy would be filled: a plain new order, buying more only, or extending existing delegations (optionally plus extra). Returns each option with `readyToFill` (percent), `payout` (SUN) and the `extendData` rows. Use before `tronsave_create_order` when the receiv
tronsave_list_extendable_receiversList the receiver addresses that have delegations bought by `requester` which can still be extended, with expiry time (Unix seconds), delegation count and total amount. Use as the first step of an extension flow to find which receiver to extend, then `tronsave_list_extendable_del
tronsave_get_seller_statsRead the logged-in seller's lifetime totals (delegations, resource delegated, TRX earned, average price per resource) and a daily earnings chart split into auto, manual, exclusive and extend delegations. Use for 'how much did I earn' totals; for the individual delegations behind
tronsave_list_delegationsList the logged-in seller's delegations (resource sent to buyers): amount, TRX amount, duration, unit price, type (AUTO, MANUAL, EXTEND, FAST), status and payout. Newest first; page with `offset`/`limit`. Use for a seller's per-delegation history; for earnings totals use `tronsav
tronsave_list_auto_buy_settingsList the logged-in user's auto-buy rules: receiver, resource, unit price cap, threshold, budget/order limits, totals bought and active state. Use before `tronsave_update_auto_buy_setting` or `tronsave_delete_auto_buy_setting` to get rule ids. Requires a wallet signature identity.
tronsave_create_auto_buy_settingCreate a rule that automatically buys `resourceAmount` for `receiver` whenever its remaining resource falls below `thresholdResourceAmount`, paying up to `unitPrice` SUN per unit from the TronSave internal balance. Side effect: SPENDS internal TRX every time the rule fires until
tronsave_update_auto_buy_settingChange an auto-buy rule by id: pause or resume it with `isActive`, or change any of price cap, amount, duration, threshold and limits (only the fields you send change). Side effect: a resumed or loosened rule can start spending internal TRX again. Idempotent for the same argument
tronsave_list_notificationsList the logged-in user's notifications (order created / filled / cancelled / reclaimed, referral payouts) newest first, with the unread count. Use to follow up on an order after creating it; page with `offset`/`limit`, and mark items read with `tronsave_mark_notifications_read`.
tronsave_mark_notifications_readMark one notification (by `id`) or, when `id` is omitted, ALL of the user's notifications as read. Get ids from `tronsave_list_notifications`. Only changes the read flag; idempotent. Requires a wallet signature identity.
tronsave_get_referralRead the logged-in user's referral status: own referral code, sponsor, referral counts, bonus earned and remaining (SUN strings), rank, the referral list (PENDING/ACTIVE) and recent commission payouts. Use for referral questions only; account profile is `tronsave_get_user_info`.
tronsave_get_telegram_notify_settingRead the Telegram alert filters of the logged-in user: seller alerts (remaining amount, duration, price and APY ranges, unlocked-only) and buyer alerts (reclaim warning time, low energy / bandwidth thresholds). `setting` is null when Telegram is not linked. Read these before chan
tronsave_update_telegram_notify_settingReplace the Telegram alert filters. Send the COMPLETE `sellerFilter` and/or `buyerFilter` objects (read the current ones with `tronsave_get_telegram_notify_setting`, edit, send back); each range or value has `isEnabled` plus its numbers. Only changes which alerts are sent; no fun
tronsave_get_agency_botRead the logged-in user's Telegram agency bot (resale bot): name, username, status (PENDING, ACTIVE, INACTIVE, BLOCKED, REJECTED), rewards (total and unpaid) and order / resource statistics. `bot` is null when none is registered. The bot token is never returned. Requires a wallet
tronsave_list_internal_transactionsList the TRX ledger of the logged-in user's internal account (deposits, order payments, refunds), newest first, with the current balance and deposit address. Amounts are SUN strings. Use to reconcile spending after orders. For the orders themselves use `tronsave_internal_order_hi
tronsave_get_flash_unstake_requestRead the logged-in user's flash-unstake request (selling staked TRX early for an immediate payout): state, payout state, amounts and release progress. `request` is null when there is none. Use for the user's own request; to preview a payout before requesting use `tronsave_estimat
tronsave_list_flash_unstake_ordersBrowse the flash-unstake market: `available` (open orders buyers can take), `ongoing` (being paid out) or `completed`. Amounts are SUN-scaled numbers; `estimateCompletionTime` is seconds. Use to browse the whole market; the user's own request is `tronsave_get_flash_unstake_reques
tronsave_estimate_flash_unstakeEstimate what an address would receive by flash-unstaking all its staked TRX now: total staked, fee percentage, payout, delegations to reclaim and the minimum unstake amount. Nothing is submitted. Use before requesting a flash unstake; check an existing request with `tronsave_get
tronsave_bulk_create_internal_ordersBuy the SAME amount of ENERGY or BANDWIDTH for several receiver addresses in one call, paid from the TronSave internal balance; returns one order id per receiver. Side effect: SPENDS `paymentAmount` SUN of the internal balance; not idempotent (a repeat buys again). Estimate one r
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 6일 점검
레지스트리 이름이 GitHub 계정 tronsave 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
360ms 만에 응답(HTTP 200)
로그인 필요 없음
도구 설명 53개를 읽었고, AI에게 보내는 숨겨진 지시는 없었어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 3개 중 3개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
입력해야 할 값: Authorization
제작자의 클라우드에서 실행돼요. 설치 없이 인터넷으로 연결하지만, 보내는 내용은 제작자의 서버를 거쳐요.
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(1.5.1)은 그저께 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. URL로 연결되기 때문에, 원격 MCP 서버를 지원하는 앱(예: 개발자 모드의 ChatGPT)에서도 쓸 수 있어요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, SSTracker free youth training
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Free youth sports drills, practice plans and age-group answers for parents and coaches.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
An agent-native Model Context Protocol server for TronSave: AI agents can quote, buy and manage TRON ENERGY / BANDWIDTH and TronSave accounts through 53 typed tools.
| Mainnet endpoint | https://mcp.tronsave.io/mcp |
| Testnet (Nile) endpoint | https://mcp.tronsave.io/testnet/mcp |
| Transport | Streamable HTTP (POST, JSON responses); legacy SSE at /sse |
| Auth | none · OAuth 2.1 sign-in at /oauth/mcp (API key or TronLink) · Authorization: ApiKey header · tronsave_login tool |
Documentation
GET /connect).GET /quickstart).tronsave://guide/agent).initialize returns instructions (auth model, units, buy workflow, safety rules); every tool has an action-oriented description, strict inputSchema, an outputSchema and MCP annotations (readOnlyHint, destructiveHint, idempotentHint).Authorization: ApiKey header instead. tronsave_get_session_status tells the agent what it can do right now.isError results with {"error":{"code","message","retryable","hint"}}; the hint names the next tool to call.tronsave://guide/agent resource and buy_resource / account_overview prompts.53 tools in two payment paths. Market path: public quotes, plus orders paid on-chain or managed with a wallet signature. Internal-balance path (tronsave_internal_*): orders paid from a pre-funded TronSave balance with an API key, for bots and backends. Each tool description says when to use its counterpart on the other path.
| Group | Tools | Auth |
|---|---|---|
| Session | get_session_status, get_sign_message, login, logout | public |
| Market data | get_market_overview, get_price_table, get_system_info, get_min_price, list_order_books, get_account_resources | public |
| Quote and buy | estimate_buy_resource, suggest_create_order, create_order, list_orders | public (on-chain payment) |
| Extend | list_extendable_receivers, list_extendable_delegates | public |
| Flash unstake | list_flash_unstake_orders, estimate_flash_unstake, get_flash_unstake_request | public / wallet |
| Orders | get_order, update_order, cancel_order, sell_order_manual | wallet signature |
| Account | get_user_info, get_user_permissions, get_referral, generate_api_key, revoke_api_key | wallet signature |
| Auto-sell | get_user_auto_setting, register_auto_sell, update_auto_sell_setting, get_seller_stats, list_delegations | wallet signature |
| Auto-buy and bulk | list_auto_buy_settings, create_auto_buy_setting, update_auto_buy_setting, delete_auto_buy_setting, bulk_create_internal_orders | wallet signature |
| Alerts | list_notifications, mark_notifications_read, get_telegram_notify_setting, update_telegram_notify_setting, get_agency_bot | wallet signature |
| Internal balance | get_internal_account, get_deposit_address, list_internal_transactions, internal_order_book, internal_order_estimate, internal_order_create, internal_order_history, internal_order_details, internal_extend_delegates, internal_create_extend_request | API key (list_internal_transactions: wallet) |
All names carry the tronsave_ prefix. Full details: docs/TOOLS.md.
Claude Code:
claude mcp add --transport http tronsave https://mcp.tronsave.io/mcp \
--header "Authorization: ApiKey YOUR_TRONSAVE_API_KEY" # header optional
Any client that accepts a remote MCP URL:
{
"mcpServers": { "tronsave": { "url": "https://mcp.tronsave.io/mcp", "headers": { "Authorization": "ApiKey YOUR_TRONSAVE_API_KEY" } } } }
Apps that support OAuth (Claude, ChatGPT, Cursor, VS Code) can use https://mcp.tronsave.io/oauth/mcp instead: the user signs in on a TronSave page with an API key or TronLink. Without a header the agent can still use all public tools and log in with tronsave_login. More clients: quickstart.
Requirements: Node.js ≥ 22, Redis ≥ 6.2.
npm ci
cp .env.example .env npm run dev # or: npm run build && npm start
docker compose up --build
| Variable | Default | Purpose |
|---|---|---|
MCP_PORT | 3000 | HTTP port |
REDIS_URL | redis://localhost:6379 | Session store. memory keeps sessions in the process (single instance, lost on restart; for trials only) |
SESSION_TTL_SECONDS | 86400 | Login / MCP session lifetime (sliding for the transport) |
SIGNATURE_MAX_AGE_SECONDS | 86400 | Oldest signed timestamp accepted for wallet login / Signature header |
SIGN_MESSAGE_TTL_SECONDS | 300 | TTL of nonces issued by tronsave_get_sign_message |
AUTH_VERIFY_CACHE_TTL_SECONDS | 60 | Cache for verified ApiKey / Signature headers |
GRAPHQL_TIMEOUT_MS / REST_TIMEOUT_MS | 10000 | Per-attempt upstream timeout |
REST_RETRIES | 2 | Retries for idempotent reads only |
READINESS_UPSTREAM_TIMEOUT_MS | 2000 | Upstream probe in /readyz |
LOG_LEVEL | info | debug adds redacted tool input/output bodies |
MCP_SERVER_NAME / MCP_SERVER_VERSION | TronSave MCP Server / 1.5.1 | Reported in initialize |
PUBLIC_BASE_URL | unset | Public origin, e.g. https://mcp.tronsave.io. Enables the OAuth authorization server and /oauth/mcp |
OAUTH_ACCESS_TOKEN_TTL_SECONDS / OAUTH_REFRESH_TOKEN_TTL_SECONDS | 3600 / 2592000 | OAuth token lifetimes (wallet sign-ins are capped at SIGNATURE_MAX_AGE_SECONDS) |
TRUST_PROXY | 1 | Reverse-proxy hops in front of the server (client IP for OAuth rate limits) |
METRICS_TOKEN | — | When set, /metrics requires Authorization: Bearer (set it whenever /metrics is public) |
TRONSAVE_NETWORK | mainnet | stdio only: mainnet or testnet (HTTP takes the network from the URL) |
TRONSAVE_API_KEY | — | stdio only: sent as Authorization: ApiKey ; unset = public tools until tronsave_login |
HTTP endpoints: POST|DELETE /mcp, POST|DELETE /testnet/mcp, with PUBLIC_BASE_URL also POST|DELETE /oauth/mcp, /oauth/testnet/mcp and the OAuth endpoints (/.well-known/oauth-authorization-server, /.well-known/oauth-protected-resource/*, /authorize, /token, /register, /revoke, /oauth/signin), GET / (server info), GET /healthz, GET /readyz, GET /metrics (Prometheus), GET /quickstart, legacy GET /sse + POST /messages.
npm ci && npm run start:stdio (or node dist/stdio.js; npm ci builds dist/ through prepare) serves the same 53 tools over stdio for one local client, without Redis (REDIS_URL defaults to memory; logs go to stderr). For example in a client config:
{ "mcpServers": { "tronsave": { "command": "node", "args": ["/path/to/tronsave-mcp/dist/stdio.js"],
"env": { "TRONSAVE_NETWORK": "mainnet", "TRONSAVE_API_KEY": " " } } } }
The hosted endpoint needs no install and is the recommended way to connect; stdio is for self-hosting and testing.
The Streamable HTTP endpoint is stateless per request: session continuity (transport marker + login) lives in Redis, so any number of replicas can serve the same client without sticky sessions, and restarts are transparent. Only the legacy SSE endpoint needs sticky routing.
npm run typecheck
npm test # unit + HTTP session-flow tests (in-memory Redis stub) npm run test:cov # with coverage gate npm run docs:tools # regenerate docs/TOOLS.md and docs/AGENT_GUIDE.md after changing tools BASE=http://127.0.0.1:3000/mcp npm run smoke # end-to-end check against a running server (throwaway wallet)
Project layout:
src/
├── app/ composition root + shutdown registry ├── clients/ infra/http GraphQL/REST clients on a shared retry + circuit-breaker HttpClient ├── config/ env + constants (network endpoints) ├── handlers/ Express app, Streamable HTTP + legacy SSE, request auth context ├── mcp/agentGuide.ts server instructions, guide resource, prompts ├── services/ auth (headers/sessions), sessions, signature verification, Redis ├── tools/ definitions (schemas + descriptions), handlers, adapters, docs renderer ├── tools.ts registration: auth gate, error envelope, metrics, logging └── utils/ errors, responses, logging, redaction, metrics
Adding a tool: add the name in src/tools/toolNames.ts, the schemas in definitions/*/schema.ts, the definition (description, auth.mode, annotations) and a handler, update tests/tools/toolsCount.test.ts, then run npm run docs:tools.
Releasing: bump package.json, server.json and the CHANGELOG, merge, then run npm run publish:public from a clean checkout. It appends the release as one snapshot commit (no private history) to https://github.com/tronsave/tronsave-mcp, tags vX.Y.Z and creates the GitHub release; then mcp-publisher publish updates the MCP Registry.
mcp-session-id values of logged-in sessions are bearer credentials until they expire or DELETE /mcp / tronsave_logout is called.debug and never for tronsave_generate_api_key.MIT — see LICENSE.