@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.
- package/README.md +11 -10
- package/dist/index.js +22 -2
- 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-
|
|
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
|
-
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
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-
|
|
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 `
|
|
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.
|
|
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 —
|
|
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
|