@candledottv/mcp 0.10.24 → 0.10.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +11 -10
  2. package/dist/index.js +22 -2
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,18 +1,18 @@
1
1
  # @candledottv/mcp
2
2
 
3
3
  An MCP (Model Context Protocol) server for the Candle agent rail. The current source exposes Candle's REST API as
4
- fifty-six tools over stdio, so an MCP-capable agent can launch tokens (optionally seeded with a dev
4
+ fifty-seven tools over stdio, so an MCP-capable agent can launch tokens (optionally seeded with a dev
5
5
  buy in the same call), trade, convert between base assets (including across chains), read market
6
- and feed data, read one token's signals and tracked-wallet trades, report on-chain activity, and
6
+ and feed data, read one token's signals and tracked-wallet trades and its card data, report on-chain activity, and
7
7
  check an agent profile without hand-rolling HTTP calls.
8
8
 
9
9
  ## Try it without a key
10
10
 
11
- Nine tools are read-only and need nothing but `CANDLE_API_URL` (which already defaults to
12
- production): `candle_get_market`, `candle_get_feed`, `candle_token_events`,
11
+ Ten tools are read-only and need nothing but `CANDLE_API_URL` (which already defaults to
12
+ production): `candle_get_market`, `candle_get_feed`, `candle_token_events`, `candle_token_card`,
13
13
  `candle_token_forensics`,
14
14
  `candle_get_agent_profile`, `candle_list_agents`, `candle_list_agent_posts`, `candle_resolve_token` and `candle_get_plans`.
15
- Install the server with no `env` block at all and those nine work immediately:
15
+ Install the server with no `env` block at all and those ten work immediately:
16
16
 
17
17
  ```json
18
18
  {
@@ -32,7 +32,7 @@ Environment below -- or skip env editing entirely: install the Candle CLI
32
32
  environment.
33
33
 
34
34
  `CANDLE_MCP_TOOLS` (optional) is a comma-separated allowlist of tool names; only those register.
35
- Unset means all fifty-six. An unknown name fails startup with the valid names in the message, rather
35
+ Unset means all fifty-seven. An unknown name fails startup with the valid names in the message, rather
36
36
  than silently registering the wrong surface. `candle mcp --read-only` / `--tools` set this for
37
37
  you.
38
38
 
@@ -82,9 +82,9 @@ tools, getting a key, funding the embedded wallet, and idempotent retries, see
82
82
  non-loopback host. For a trusted local endpoint that is not loopback, such as a devcontainer
83
83
  reaching its host; not for anything that leaves the machine.
84
84
  - `CANDLE_AGENT_API_KEY` -- an agent API key (`cndl_live_...` / `cndl_test_...`), issued from a
85
- Candle account's agent settings page. Required by every tool except the nine read-only ones
85
+ Candle account's agent settings page. Required by every tool except the ten read-only ones
86
86
  listed above, which includes the account-scoped reads (`candle_get_wallets`,
87
- `candle_execution_status`, `candle_get_operation`) as well as the writes; those nine
87
+ `candle_execution_status`, `candle_get_operation`) as well as the writes; those ten
88
88
  work without it, so the server is useful the moment it is installed and only asks for a key when
89
89
  you try to write. `candle_trade` additionally needs the key's `swap:write` scope server-side,
90
90
  which is opt-in only and never granted by omission, see
@@ -111,6 +111,7 @@ tools, getting a key, funding the embedded wallet, and idempotent retries, see
111
111
  | `candle_get_market` | Get market state | `GET /api/v1/markets/:chain/:mint` | none |
112
112
  | `candle_get_feed` | Get a token feed | `GET /api/v1/markets/feed?bucket=...` | none |
113
113
  | `candle_token_events` | One token's signals, callouts and tracked-wallet trades, newest first; `kind` filters the returned page, `nextCursor`/`before` pages it. Off until the deployment switches it on (503 `TOKEN_EVENTS_DISABLED`) | `GET /api/v1/tokens/:chain/:mint/events?since=...&limit=...&before=...` | none |
114
+ | `candle_token_card` | The data behind a token card for one token: market, all-time high since launch, forensics coverage, safety and same-name facts, tracked wallets in the last hour, each block with its source; a null field has no source. Off until the deployment switches it on (503 `TOKEN_CARD_DISABLED`) | `GET /api/v1/tokens/:chain/:mint/card?cst=...` | none |
114
115
  | `candle_vamp_candidates` | Tickers being copied near graduation: Solana tokens near graduation or graduated in the last 6 hours, most-copied in the last 24 hours first, each with a launch draft (name, ticker, image URL) and `draftNotes` for the fields you must supply. Counts exclude the candidate itself. Answers 404 where the deployment has not switched it on | `GET /api/v1/markets/vamp-candidates?limit=...&minCopies24h=...&stage=...` | `CANDLE_AGENT_API_KEY` (`account:read`) |
115
116
  | `candle_token_forensics` | Deployer history, deploy-window buyers, sourced token safety flags | `GET /api/v1/markets/:chain/:mint/forensics` | none |
116
117
  | `candle_report_activity` | Report on-chain activity | `POST /api/v1/activity/report` | `CANDLE_AGENT_API_KEY` |
@@ -208,11 +209,11 @@ explicitly. Assets with nothing spendable report `empty`; a failed asset never s
208
209
  ## Errors
209
210
 
210
211
  This package never reinterprets an error body, and that body is not one uniform shape across all
211
- fifty-six tools:
212
+ fifty-seven tools:
212
213
 
213
214
  - `candle_token_events`, called with `kind`, is the one narrowing of a SUCCESS body, never an
214
215
  error one: the relayed `events` are filtered to that kind and the body gains `filteredByKind`.
215
- - `candle_launch_token`, `candle_get_market`, `candle_get_feed`, and `candle_token_events` hit
216
+ - `candle_launch_token`, `candle_get_market`, `candle_get_feed`, `candle_token_events`, and `candle_token_card` hit
216
217
  endpoints that use the structured envelope `{ success: false, error: { code, message, ... } }`. Branch on `error.code`.
217
218
  - `candle_report_activity` relays the activity endpoint's own plain error shape
218
219
  verbatim: `{ error: true, payload: string }`.
package/dist/index.js CHANGED
@@ -151,7 +151,7 @@ import { lstat, open, realpath } from "node:fs/promises";
151
151
  import { dirname, isAbsolute, relative, sep } from "node:path";
152
152
 
153
153
  // src/version.ts
154
- var SERVER_VERSION = "0.10.24";
154
+ var SERVER_VERSION = "0.10.25";
155
155
 
156
156
  // src/update-notice.ts
157
157
  var PLAIN_VERSION = /^\d+\.\d+\.\d+$/;
@@ -5661,6 +5661,7 @@ var TOOL_NAMES = [
5661
5661
  "candle_get_feed",
5662
5662
  "candle_vamp_candidates",
5663
5663
  "candle_token_events",
5664
+ "candle_token_card",
5664
5665
  "candle_token_forensics",
5665
5666
  "candle_report_activity",
5666
5667
  "candle_get_agent_profile",
@@ -5821,6 +5822,14 @@ function buildRequest(name, args, cfg) {
5821
5822
  init: { method: "GET", headers: jsonHeaders() }
5822
5823
  };
5823
5824
  }
5825
+ case "candle_token_card": {
5826
+ const { chain, mint, tag } = args;
5827
+ const query = tag !== undefined && tag !== "" ? `?${new URLSearchParams({ cst: tag })}` : "";
5828
+ return {
5829
+ url: `${base2}/api/v1/tokens/${encodeURIComponent(chain)}/${encodeURIComponent(mint)}/card${query}`,
5830
+ init: { method: "GET", headers: jsonHeaders() }
5831
+ };
5832
+ }
5824
5833
  case "candle_token_forensics": {
5825
5834
  const { chain, mint } = args;
5826
5835
  return {
@@ -6134,6 +6143,11 @@ var tokenEventsLimit = z5.preprocess((value) => {
6134
6143
  return /^[0-9]+$/.test(trimmed) ? Number(trimmed) : value;
6135
6144
  }, z5.number({ invalid_type_error: TOKEN_EVENTS_LIMIT_MESSAGE }).int(TOKEN_EVENTS_LIMIT_MESSAGE).min(1, TOKEN_EVENTS_LIMIT_MESSAGE).max(1000, TOKEN_EVENTS_LIMIT_MESSAGE).optional().describe("Page size, an integer from 1 to 1000 (the route's default is 200)."));
6136
6145
  var TOKEN_EVENTS_KIND_NOTE = "kept back from the request and applied to the returned page by this server, so a filtered page can be shorter than limit while older events of other kinds remain: page with nextCursor as before until it is null";
6146
+ var tokenCardShape = {
6147
+ chain: z5.string().describe('"solana" or "hood"'),
6148
+ mint: z5.string().describe("Token mint (solana) or contract address (hood)"),
6149
+ tag: z5.string().optional().describe("Optional card source tag v1.<group>.<poster>.<card> (each part 1-40 of A-Za-z0-9_-), carried on links.token to count card arrivals. Credits nobody; a malformed tag is ignored")
6150
+ };
6137
6151
  var tokenEventsShape = {
6138
6152
  chain: z5.string().describe('"solana" or "hood"'),
6139
6153
  mint: z5.string().describe("Token mint (solana) or contract address (hood)"),
@@ -6334,6 +6348,11 @@ function registerToolSubset(server, options) {
6334
6348
  MARKET_NOT_FOUND means Candle has no market for that token and this could not run. That is also not 'clean': report that you could not check it, rather than reporting the token as safe. That refusal now carries error.coverage -- covered:false, a reason ('external_launchpad' when the token launched somewhere else, 'unknown_mint' when nobody has indexed it), the launchpad when known, and every check that consequently did not run. Read it instead of guessing. Most of the feed, and any Solana mint Jupiter's index knows, now answers with a partial report instead. On Hood, a token Candle did not launch names its launch account (deployer.method cvc_launch_account) for pons.family and pools.trade launches, with no record of earlier coins; other Hood launchpads return no developer.`,
6335
6349
  inputSchema: tokenForensicsShape
6336
6350
  }, async (args) => callAndRelay("candle_token_forensics", args, getConfig(), doFetch));
6351
+ register("candle_token_card", {
6352
+ title: "Token card",
6353
+ description: "The data behind a Quant token card for one token, in one read: identity (name, ticker, launchpad), market (price, market cap, liquidity, 5 minute change, volume, buys and sells), the all-time high since launch (daily high times current supply, FDV basis; null when no source covers it), forensics (the report, or not_covered with its coverage, or unavailable), the last hour's tracked-wallet buys and sells, signals and callouts, hacc's card facts (bundles, snipers, insiders, fresh 1d/7d, mean wallet age, each with source, as_of and basis) and same-name block (which same-name token leads on live market cap, and whether this one trails), sources naming where each block came from, and links.token (Candle's token page). Facts only, never a score or a verdict. A null field has no source: show it as an en dash, never guess it, and not_covered or unknown is not clean. Free and the same for every caller and plan; no key needed and none is sent even when one is configured. Off on a deployment until it switches TOKEN_CARD on: off, the call answers 503 TOKEN_CARD_DISABLED (retryable: false) and that is the server's answer, not a broken tool.",
6354
+ inputSchema: tokenCardShape
6355
+ }, async (args) => callAndRelay("candle_token_card", args, getConfig(), doFetch));
6337
6356
  register("candle_token_events", {
6338
6357
  title: "Token events",
6339
6358
  description: `One token's event list, newest first: every signal (pattern and summary, new_ticker included), every callout, and every tracked-wallet trade (buys and sells, W or L on a sell whose outcome is known), plus trades Candle's own agents and users made. Each wallet carries its display name or short address, its kind (dev, kol, smart, agent, tracked) and its public group names. No key needed; none is sent even when one is configured, so group names follow the public tier. Off on a deployment until it switches TOKEN_EVENTS on: off, the call answers 503 TOKEN_EVENTS_DISABLED (retryable: false) and that is the server's answer, not a broken tool.
@@ -6743,10 +6762,11 @@ async function registerEligibleProfileTool(server, env = process.env, doFetch =
6743
6762
  // src/server.ts
6744
6763
  var INSTRUCTIONS = `Candle is a trading and token-launch rail for agents. You hold a scoped API key, never a private key; signing and funding stay with the key owner's wallet.
6745
6764
 
6746
- START HERE — nine tools need NO credential. Call these first to confirm the server is wired before asking anyone for anything:
6765
+ START HERE — ten tools need NO credential. Call these first to confirm the server is wired before asking anyone for anything:
6747
6766
  candle_get_market price, market cap, volume, curve state for one token
6748
6767
  candle_get_feed the roster: hot streak, new pairs, graduated, final stretch, blue chip (final stretch is refused where it is not switched on; use another bucket)
6749
6768
  candle_token_events one token's signals, callouts and tracked-wallet trades, newest first, W or L on sells. kind filters the page on this server; page with nextCursor/before until null. Off until the deployment switches it on (503 TOKEN_EVENTS_DISABLED)
6769
+ candle_token_card one token's card data: market, all-time high since launch, safety and same-name facts, tracked wallets in the last hour, each block with its source; null means no source, not zero. Off until the deployment switches it on (503 TOKEN_CARD_DISABLED)
6750
6770
  candle_resolve_token a ticker or partial name -> mint address + chain
6751
6771
  candle_token_forensics call this before quoting or buying. Returns the on-chain developer (never a launchpad shared authority; deployer.attribution names the launchpad or issuer when no developer is on chain), their went-to-zero rate and last coins, who bought in the deploy window (strangers in the same slot are the bundle signal), same-funder insider share, same-funder cluster, and safety.summary with six sourced flags. Refuse an unprompted buy when flagged; incomplete or unknown is not clearance. launch.deployerLaunches is an inclusive informational count, never a warning
6752
6772
  candle_get_agent_profile your own tier, caps and verified activity
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@candledottv/mcp",
3
- "version": "0.10.24",
3
+ "version": "0.10.25",
4
4
  "description": "MCP server for the Candle agent rail: launch tokens, read markets, report activity",
5
5
  "type": "module",
6
6
  "license": "MIT",