TRON energy rental prices and market activity from TronRelic. Free account unlocks more tools.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Needs a free TronRelic account: calling it makes your app ask the user to sign in, then the call runs. Fetch one PUBLISHED blog post by its id, including the full markdown body. Use after list-blog-posts to read a specific post in full (e.g. to summarise or quote it). The "id" is the value list-blog-posts returns on each row (a UUID). Read-only; never mutates. Returns { success: true, post: { id, slug, title, tags, bodyMarkdown, publishedAt, updatedAt } }, or { success: true, post: null } when no PUBLISHED post owns that id (an unpublished draft or unknown id both return null — this is a normal result, not an error). Never returns unpublished drafts.
The post id (a UUID) from a list-blog-posts row.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http mcp https://tronrelic.com/mcp
Needs a free TronRelic account: calling it makes your app ask the user to sign in, then the call runs. Fetch one PUBLISHED blog post by its id, including the full markdown body. Use after list-blog-posts to read a specific post in full (e.g. to summarise or quote it). The "id" is the value list-blog-posts returns on each row (a UUID). Read-only; never mutates. Returns { success: true, post: { id, slug, title, tags, bodyMarkdown, publishedAt, updatedAt } }, or { success: true, post: null } when no PUBLISHED post owns that id (an unpublished draft or unknown id both return null — this is a normal result, not an error). Never returns unpublished drafts.
| Argument | Type | Description |
|---|---|---|
| id* | string | The post id (a UUID) from a list-blog-posts row. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The post id (a UUID) from a list-blog-posts row."
}
},
"description": "The id of the published post to fetch.",
"additionalProperties": false
}Needs a free TronRelic account: calling it makes your app ask the user to sign in, then the call runs. List PUBLISHED blog posts, newest first, as lightweight summaries (no body). Use to discover what posts exist, find a recent post, or gather posts to summarise (each row carries "publishedAt", so you can select posts within a time window such as the last 48 hours yourself). Read-only; never mutates. Parameters: "page" (optional, 1-based, default 1) and "limit" (optional, default 20, clamped to 50). Returns { success, posts: [{ id, slug, title, tags, excerpt, publishedAt }], total, page, limit }, where "total" is the full published count for paging, "excerpt" is a short plain-text opening of the body you can read to pick the relevant post without fetching it, and each "id" can be passed to get-blog-post to read the full markdown body. Only published posts are ever returned.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number (optional, default 1). Values below 1 are treated as 1. |
| limit | integer | Page size (optional, default 20); clamped to the range 1-50. |
{
"type": "object",
"required": [],
"properties": {
"page": {
"type": "integer",
"description": "1-based page number (optional, default 1). Values below 1 are treated as 1."
},
"limit": {
"type": "integer",
"description": "Page size (optional, default 20); clamped to the range 1-50."
}
},
"description": "Pagination for the published-post list.",
"additionalProperties": false
}Needs a free TronRelic account: calling it makes your app ask the user to sign in, then the call runs. Read one or more published site pages in full, including the markdown body. Use after pages-list or pages-search to read the pages you picked, or directly when you already know a page's path or link. Parameters: pages (required, 1 to 5 entries). Each entry is a page id from a list or search result (a UUID), a slug starting with / such as "/about", or a full URL to a page on the site, which is reduced to its path. A slug the page used to have still finds it, at its current slug. Returns pages[], one per entry in the order given, of { requested, found, page }. page is { id, slug, title, description, keywords, ogImage, updatedAt, markdown, truncated, totalCharacters } or null when no published page answers to the entry; null is a normal result, not an error. markdown is the body without its frontmatter, cut to 20000 characters, with truncated true and totalCharacters set when it was cut. Pages are TronRelic's admin-written site pages (guides, explainers, policies, announcements) served at paths such as /about. These tools return only published pages exactly as visitors see them; drafts and edits waiting for review are never returned. Blog posts are separate and are not pages. Read-only; never changes a page.
| Argument | Type | Description |
|---|---|---|
| pages* | array | 1 to 5 pages to read, by id, slug, or URL. |
{
"type": "object",
"required": [
"pages"
],
"properties": {
"pages": {
"type": "array",
"items": {
"type": "string",
"description": "A page id (UUID), a slug starting with /, or a full URL to the page."
},
"maxItems": 5,
"minItems": 1,
"description": "1 to 5 pages to read, by id, slug, or URL."
}
},
"description": "The pages to read.",
"additionalProperties": false
}Needs a free TronRelic account: calling it makes your app ask the user to sign in, then the call runs. List the published site pages, most recently changed first, as short summaries without the body. Use to see which pages exist or to browse them; use pages-search instead to find pages about a topic. Parameters: page (optional, 1-based, default 1); limit (optional, default 20, at most 50). Returns total (every published page), page, limit, hasMore, and pages[] of { id, slug, title, description, keywords, updatedAt, excerpt }, where excerpt is a short plain-text opening of the body. Pass an id or slug to pages-get to read a page in full. Pages are TronRelic's admin-written site pages (guides, explainers, policies, announcements) served at paths such as /about. These tools return only published pages exactly as visitors see them; drafts and edits waiting for review are never returned. Blog posts are separate and are not pages. Read-only; never changes a page.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. Default 1. |
| limit | integer | Pages per call. Default 20, at most 50. |
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"minimum": 1,
"description": "1-based page number. Default 1."
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Pages per call. Default 20, at most 50."
}
},
"description": "Paging for the published-page list.",
"additionalProperties": false
}Needs a free TronRelic account: calling it makes your app ask the user to sign in, then the call runs. Search the published site pages for a text, most recently changed first, as short summaries without the body. The query is matched case-insensitively as a literal substring of each page's title, slug, description, keywords, and body. It is not a boolean or fuzzy search, so use a distinctive word or short phrase such as "energy rental", not a whole question. Use to find pages about a topic; use pages-list to browse everything. Parameters: query (required, 1 to 100 characters); page (optional, 1-based, default 1); limit (optional, default 20, at most 50). Returns query, total (every match), page, limit, hasMore, and pages[] of { id, slug, title, description, keywords, updatedAt, excerpt }. No matches returns an empty list, not an error. Pass an id or slug to pages-get to read a page in full. Pages are TronRelic's admin-written site pages (guides, explainers, policies, announcements) served at paths such as /about. These tools return only published pages exactly as visitors see them; drafts and edits waiting for review are never returned. Blog posts are separate and are not pages. Read-only; never changes a page.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. Default 1. |
| limit | integer | Pages per call. Default 20, at most 50. |
| query* | string | Text to find (1 to 100 characters), matched case-insensitively as a literal substring. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"page": {
"type": "integer",
"minimum": 1,
"description": "1-based page number. Default 1."
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Pages per call. Default 20, at most 50."
},
"query": {
"type": "string",
"description": "Text to find (1 to 100 characters), matched case-insensitively as a literal substring."
}
},
"description": "Free-text search over published pages.",
"additionalProperties": false
}Report what TronRelic's tracked energy rental markets did, as recorded on chain by each market's examiner: TRX paid by renters, energy delivered, the blended price paid in SUN per energy per day, how many sampled payments were served or never served, how fast deliveries followed payments, and how concentrated the suppliers are, plus one row of totals per UTC day. Use it first for any question about volume, revenue, prices paid, or which markets are busy or have gone quiet, over a day or a few weeks. Do not use it to check individual rentals (use resource-markets-list-rentals), for how a market is set up (use resource-markets-get-config), or for what a market advertises, its rate card, or what it pays holders (use resource-markets-get-prices; this tool reports prices renters actually paid). Read-only. Parameters: "slug" (optional), a market slug such as "catfee" or "tron-max-io", to report one market in full; "days" (optional), how many UTC days of daily totals to return, ending today, default 7, up to 14 for every market or 30 for one. Without "slug", returns { success, asOf, days, markets: [{ slug, displayName, observed, summary, daily }] }. "summary" is null for a market with no rental figures, and otherwise { windowDays, firstObservedAt, lastObservedAt, paymentTRX, energyDelivered, blendedSunPerEnergyPerDay, blendedPriceDay, sampledRentals, sampledServed, sampledUnserved, sampleCapped, medianFulfillmentMs, participantCount, topParticipantShare }. "paymentTRX" and "energyDelivered" in the summary cover the whole "windowDays" and are exact. The "sampled" counts and the other per-rental figures come from at most the newest 5000 rentals in that window; "sampleCapped" true means the sample did not reach back through the whole window, so those counts are not totals. "lastObservedAt" is the chain time of the newest rental activity recorded; a time hours before "asOf" on a normally busy market means it has gone quiet or its examiner has stopped. "daily" is [{ day (YYYY-MM-DD, UTC), paymentTRX, energyDelivered, sunPerEnergyPerDay, rentalCount, deliveredRentalCount }], oldest first, with no row for a day nothing was recorded. "rentalCount" is every rental that started that day, delivered or not, exact and not sampled; "deliveredRentalCount" is how many of those have a delivery, so the difference is rentals paid for but not (yet) delivered; resource-markets-get-errata lists them. Both leave out records a market's own figures treat as internal, such as CatFee paying itself or SoHu's collector loans, and both are absent from a row when the count could not be taken. For SoHu and Tronex a rental is a delivery, so the two counts are equal. EnergyFather's summary and "daily" rows cover only the deliveries paid in TRX at its payment address, a small share of its sales; its API buyers pay from prepaid balances the chain does not show, so read its full delivery figures from "reports" with its slug. Today's row is partial, covering only up to the last time the figures were stored, normally less than an hour ago. "paymentTRX" counts what the examiner recorded as renter payments; how a market records prepaid-balance top-ups or unserved payments differs by market, so compare a market's days with each other rather than one market's TRX with another's. With "slug", returns { success, asOf, days, market } with the same fields plus "priceBuckets" (the price paid by rental length: bucket, label, rentalCount, median, min and max SUN per energy per day), "p90FulfillmentMs", "usdtTransferEnergy" (energy one USDT transfer costs, to convert SUN per energy into TRX per transfer), "reports" (figures from other analyses of the market), "advertisedPrice" (the cheapest and dearest advertised price per USDT transfer at the newest capture, or null), and "completeBefore" (the repair watermark). An unknown slug returns { success: false, error } listing the known slugs.
Report what TronRelic's tracked energy rental markets advertise, as captured from each market's own rate card on a schedule an admin sets, which can change at any time, so read the spacing between captures from the "capturedAt" times returned rather than assuming one: which market is cheapest for a given order, every market's advertised price range and open orderbook, one market's full rate card and price history, and what each market pays TRX holders who supply it energy. Use it first for "which market is cheapest for N transfers", "what does this market charge", "how has its advertised price moved", or "which market pays holders the most". Prices here are what markets advertise; for what renters actually paid, use resource-markets-get-activity, and compare the two to see whether a market charges what it advertises. Do not use it for how a market is set up (use resource-markets-get-config). Read-only. Parameters: "slug" (optional), a market slug such as "catfee", to report one market in full; "transfers" (optional), how many USDT transfers the order must cover, 1 to 100000, default 1; "periodMinutes" (optional), the minutes within which they are sent, 1 to 129600, default 60; "usage" (optional), for a period longer than a day, "flexible" when the transfers may be sent at any time, which only a rental of a day or longer can serve, or "batched" when each day's transfers are sent together inside one rental that may last only minutes, default "flexible"; "historyDays" (optional), days back from now to look over past capture runs, 1 to 30: with "slug" it sets that market's history, default 7; without "slug" it adds a "history" summary to the ranking and is left out by default. Use "historyDays" without "slug" for "which market was cheapest for this order over the week": it prices the order on the rate card each market showed at every capture run in the window, not on the newest one. Without "slug", returns { success, asOf, order, current, outdated, unpriced, history? }. "current" is the markets priced in the newest capture run, cheapest first: those whose rate card can price the order come first by total cost, then the rest by lowest advertised rate. Markets equal to the SUN are tied, and their order is a daily rotation by the capture's UTC day of the month, not a price difference: report them as tied. "outdated" is markets missing from the newest capture run, so their capture is older than the freshest; their prices stopped updating and they are not ranked. Each is { slug, displayName, capturedAt, cheapest, dearest, usdtTransferEnergy, hasRateCard, quote, orderbook, supplyYield }. "cheapest" and "dearest" are the market's advertised extremes as { trxPerTransfer, transfersRequired, durationMinutes, discountPercent }; "transfersRequired" above 1 means the price needs an order that large. "quote" is the order priced on the market's best tier as { totalTrx, trxPerTransfer, energy, durationMinutes, purchases, raisedToMinimum } or null when the market has no rate card or no tier takes the order. A period of a day or less is priced as one burst; a longer one spreads the transfers evenly and renews a tier shorter than the period, once a day for a batched tier shorter than a day. When quoting a batched order on a tier shorter than a day, say that each day's transfers must be sent inside that one rental. "purchases" counts the rentals bought, including a fixed-size package bought several times; "energy" is summed across them. Splitting an order across different tiers is not modelled. "orderbook" is { capturedAt, bid?, ask? } with { orderCount, totalEnergy, vwapSun } per side, or null. "supplyYield" is { advertisedBestRatePercent (the highest yearly rate among the market's open programs), openPrograms, witnessedRatePercent (the yearly rate the chain shows it paid), witnessedHolders } or null when the market buys no energy from holders; an advertised rate is the market's claim and the witnessed rate is the evidence. "unpriced" lists markets with no advertised price as { slug, displayName, supplyYield }. "history", present only when "historyDays" was given, is { historyDays, runs, firstRunAt, lastRunAt, markets, unquoted }: "runs" counts the capture runs in the window; each "markets" entry is { slug, displayName, lowest, highest, runsCaptured, runsQuoted, firstCapturedAt, lastCapturedAt }, where "lowest" and "highest" are { capturedAt, quote } for the cheapest and dearest quote of the order in the window (a tie to the SUN goes to the newest run), sorted by the lowest quote's totalTrx, cheapest first; markets whose lowest totalTrx is equal to the SUN are tied, so report them as tied. "firstCapturedAt" and "lastCapturedAt" are the market's own oldest and newest capture in the window, which can be later than "firstRunAt" when its price fetch failed for part of it. "unquoted" lists markets the window captured whose rate card never took the order, as { slug, displayName, runsCaptured }. A market missing from the window entirely had no capture in it. With "slug", returns { success, asOf, order, historyDays, market: { slug, displayName, websiteUrl, isAffiliate, advertised, supplyYield } }. "advertised" is null for a market with no price fetcher, and otherwise { capturedAt, price, rateCard, orderbook, priceHistory, quoteHistory, quote }: "rateCard" is { capturedAt, usdtTransferEnergy, cells (up to 100), cellsTotal } where each cell is { minutes, sun, minBorrow?, maxBorrow?, discountPercent? } and "sun" is the price for the whole rental in SUN per unit of energy with TRON's one-day minimum applied, so an order of E energy costs sun × E / 1,000,000 TRX; "priceHistory" is [{ capturedAt, minTrxPerTransfer, maxTrxPerTransfer, usdtTransferEnergy }], one per capture run, oldest first, within the last "historyDays" days; "minTrxPerTransfer" is the cheapest point anywhere on the rate card and can need a larger order or another rental length than the one asked about. "quoteHistory" is [{ capturedAt, quote }] over the same runs, the order itself priced on each run's rate card, with "quote" null when no tier took it; use it, not "priceHistory", for what this order cost. "supplyYield" is the full { advertised, witnessed } part: "advertised" lists the market's programs with their yearly rate, resource, how a holder takes part ("delegate", "permission", or "custodial-staking"), and whether each is open; "witnessed" gives the measured rate with its window, holders, payouts, and stake. "capturedAt" hours behind "asOf" means the market's price fetch has been failing. An unknown slug returns { success: false, error } listing the known slugs.
Needs a free TronRelic account: calling it makes your app ask the user to sign in, then the call runs. Search PUBLISHED blog posts by free text, newest first, as lightweight summaries (no body). The query is a case-insensitive literal substring matched against each post's title, tags, and markdown body — not a boolean or fuzzy query, so search a distinctive word or phrase (e.g. "energy rental"), not a full question. Use when looking for posts about a specific topic; use list-blog-posts instead to browse everything or select by date. Read-only; never mutates. Parameters: "query" (required, 1-200 characters), "page" (optional, 1-based, default 1), "limit" (optional, default 20, clamped to 50). Returns { success, posts: [{ id, slug, title, tags, excerpt, publishedAt }], total, page, limit } — "total" counts every match for paging, and each "id" can be passed to get-blog-post to read the full markdown body. Only published posts are ever returned; zero matches returns an empty list (not an error).
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number (optional, default 1). Values below 1 are treated as 1. |
| limit | integer | Page size (optional, default 20); clamped to the range 1-50. |
| query* | string | The text to find (required, 1-200 characters); matched case-insensitively as a literal substring of the title, tags, or body. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"page": {
"type": "integer",
"description": "1-based page number (optional, default 1). Values below 1 are treated as 1."
},
"limit": {
"type": "integer",
"description": "Page size (optional, default 20); clamped to the range 1-50."
},
"query": {
"type": "string",
"description": "The text to find (required, 1-200 characters); matched case-insensitively as a literal substring of the title, tags, or body."
}
},
"description": "Free-text search over published posts.",
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 14, 2026.
A very long tool description (over 4,000 characters) is hard to review and easy to hide instructions in.
Fix: Keep the description to what the tool does and when to use it; move reference material to resources or docs.
| Argument | Type | Description |
|---|---|---|
| days | integer | UTC days of daily totals, ending today. Omit for 7. Up to 14 for every market, 30 for one. |
| slug | string | Market slug such as "catfee". Omit to report every market. |
{
"type": "object",
"required": [],
"properties": {
"days": {
"type": "integer",
"description": "UTC days of daily totals, ending today. Omit for 7. Up to 14 for every market, 30 for one."
},
"slug": {
"type": "string",
"description": "Market slug such as \"catfee\". Omit to report every market."
}
},
"description": "Which market to report, and how many days of daily totals.",
"additionalProperties": false
}| Argument | Type | Description |
|---|---|---|
| slug | string | Market slug such as "catfee". Omit to price the order on every market and rank them. |
| usage | string | For a period longer than a day: "flexible" (sent at any time) or "batched" (each day's transfers sent together in one rental). Omit for "flexible". |
| transfers | integer | USDT transfers the order must cover, 1 to 100000. Omit for 1. |
| historyDays | integer | Days back over past capture runs, 1 to 30. With "slug": the market's history, default 7. Without "slug": adds the "history" summary of every market's lowest and highest quote for the order; omit for no summary. |
| periodMinutes | integer | Minutes within which the transfers are sent, 1 to 129600. Omit for 60. |
{
"type": "object",
"required": [],
"properties": {
"slug": {
"type": "string",
"description": "Market slug such as \"catfee\". Omit to price the order on every market and rank them."
},
"usage": {
"enum": [
"flexible",
"batched"
],
"type": "string",
"description": "For a period longer than a day: \"flexible\" (sent at any time) or \"batched\" (each day's transfers sent together in one rental). Omit for \"flexible\"."
},
"transfers": {
"type": "integer",
"description": "USDT transfers the order must cover, 1 to 100000. Omit for 1."
},
"historyDays": {
"type": "integer",
"description": "Days back over past capture runs, 1 to 30. With \"slug\": the market's history, default 7. Without \"slug\": adds the \"history\" summary of every market's lowest and highest quote for the order; omit for no summary."
},
"periodMinutes": {
"type": "integer",
"description": "Minutes within which the transfers are sent, 1 to 129600. Omit for 60."
}
},
"description": "Which market to report, the order to price, and how much price history to return.",
"additionalProperties": false
}