@candledottv/mcp 0.10.15 → 0.10.16

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 CHANGED
@@ -55,6 +55,12 @@ Both take decimal amounts, never raw base units, and resolve the scale themselve
55
55
  there the caller genuinely picks the new token's quote pair: `quoteAsset` if given, otherwise
56
56
  SOL on Solana and ETH on Hood.
57
57
 
58
+ Both launch tools also take `mode: "exp-custom"` with `curve: { virtualQuote, threshold }`: a
59
+ Solana curve with your own V and G, in whole SOL or CNDL as decimal strings, inside limits the
60
+ API enforces and each tool's description states. Dry-run first: the dry run returns the curve's
61
+ terms. It works only where the deployment has switched it on. See
62
+ [Custom curves](https://docs.candle.tv/developers/headless-launch#custom-curves-choose-v-and-g-switched-off).
63
+
58
64
  For a full walkthrough of `candle_launch_and_seed` and `candle_trade`, including the keyless read
59
65
  tools, getting a key, funding the embedded wallet, and idempotent retries, see
60
66
  [Candle MCP server](https://docs.candle.tv/developers/mcp-server).
package/dist/index.js CHANGED
@@ -112,7 +112,7 @@ import { lstat, open, realpath } from "node:fs/promises";
112
112
  import { dirname, isAbsolute, relative, sep } from "node:path";
113
113
 
114
114
  // src/version.ts
115
- var SERVER_VERSION = "0.10.15";
115
+ var SERVER_VERSION = "0.10.16";
116
116
 
117
117
  // src/update-notice.ts
118
118
  var PLAIN_VERSION = /^\d+\.\d+\.\d+$/;
@@ -1653,6 +1653,7 @@ function planTableMarkdown(table) {
1653
1653
 
1654
1654
  // src/tools.ts
1655
1655
  var VAMP_CANDIDATES_DESCRIPTION = "Lists Solana tokens that are close to graduating or graduated in the last 6 hours whose ticker other tokens " + "are copying, most-copied in the last 24 hours first. Each entry carries a launch draft (name, ticker, image URL) " + "for `candle_launch_token` or `candle_launch_and_seed`; draft notes identify fields you must supply or adjust. " + "Upload your own image through the agent image upload when the image is unavailable. Use `dryRun: true` first. " + "Counts exclude the candidate itself and cover both Solana and Hood launches at the venues returned in " + "`coverage`, not Candle's own. `coverage.since` is the returned Solana coverage date; Hood history may differ.";
1656
+ var CUSTOM_CURVE_RULE = 'mode "exp-custom" with curve { virtualQuote, threshold } launches a Solana curve with your own V (the virtual ' + "quote it starts with) and G (the quote it raises before graduating), in whole SOL or CNDL as decimal strings, " + "accepted when V is 1 to 100 SOL and G 1 to 250 SOL (66,000 to 6,600,000 and 66,000 to 16,500,000 CNDL), when " + "every price up to 20 x G stays under the ceiling (V + 20G)^2 < V x X at this stakerAllocationBps, when neither " + "is finer than the quote's decimals, and when the dev buy is at most 10% of G; a curve past a limit is " + "CURVE_OUT_OF_RANGE, and at the ceiling it carries maxThresholdRaw, the largest G that fits. " + "Dry-run it first (dryRun: true): the dry run spends nothing and returns curveTerms, the market cap at start and " + "at graduation and the supply sold by graduation. Only where the API has EXP_CURVES and EXP_CUSTOM_CURVES on; " + "elsewhere exp-custom is refused as an unknown mode.";
1656
1657
  var localProfileTools = new WeakMap;
1657
1658
  var STAKING_DISCLOSURE = "No instant unstake. Read pool.withdrawalTimelockSeconds for the wait. Solana rewards accrue to the holding wallet. Outside the account's main wallet, sCNDL earns no Hood staking rewards; Pro eligibility follows the deployment's tier mode (main-wallet mode excludes it). CNDL in a pending withdrawal counts toward nothing for Pro.";
1658
1659
  var stakingWriteShape = {
@@ -2072,7 +2073,11 @@ var launchTokenShape = {
2072
2073
  bannerUrl: z2.string().optional().describe("Optional https URL to WIDE artwork for the token page's banner strip (wider than 1.5:1, " + "e.g. 1200x630). This is where a share card or OG image belongs. A square image here is " + "rejected with BANNER_WRONG_SHAPE. Omit it and the strip falls back to imageUrl"),
2073
2074
  chain: z2.string().optional().describe('"solana" or "hood"; defaults to solana'),
2074
2075
  quoteAsset: z2.string().optional().describe("Quote asset symbol; defaults per chain"),
2075
- mode: z2.string().optional().describe('"open" or "exclusive"; defaults to open. "test-open" / "test-exclusive" launch the ' + "low-threshold test curves (~1/80 economics) where the API has ENABLE_TEST_CURVES on"),
2076
+ mode: z2.string().optional().describe('"open" or "exclusive"; defaults to open. "test-open" / "test-exclusive" launch the ' + "low-threshold test curves (~1/80 economics) where the API has ENABLE_TEST_CURVES on. " + '"exp-custom" launches a Solana curve with your own V and G, given in curve, where the API has it ' + "switched on"),
2077
+ curve: z2.object({
2078
+ virtualQuote: z2.string().describe('V: the virtual quote the curve starts with, in whole quote units, e.g. "12" SOL'),
2079
+ threshold: z2.string().describe('G: the quote the curve raises before it graduates, in whole quote units, e.g. "40" SOL')
2080
+ }).strict().optional().describe('mode "exp-custom" only, and required there. Decimal strings in whole units of the quote asset (sol or ' + "cndl), never raw units. Dry-run first: the API checks the limits and returns the curve's terms"),
2076
2081
  stakerAllocationBps: z2.number().optional().describe("Staker allocation in basis points"),
2077
2082
  dexVersion: z2.string().nullable().optional().describe('"v3" or "v4"; required for hood launches'),
2078
2083
  buyAmount: z2.union([z2.string(), z2.number()]).optional().describe("Initial buy, in quote base units (string or number)"),
@@ -2243,7 +2248,7 @@ function registerToolSubset(server, options) {
2243
2248
  const imageDir = configuredImageDir(env);
2244
2249
  register("candle_launch_token", {
2245
2250
  title: "Launch a token on Candle",
2246
- description: "Launch a new token via the Candle headless launch API, from the account's embedded wallet. Works on every plan, Free included. Set dryRun: true to validate without spending anything." + (imageDir ? IMAGE_PATH_DISCLOSURE : ""),
2251
+ description: "Launch a new token via the Candle headless launch API, from the account's embedded wallet. Works on every plan, Free included. Set dryRun: true to validate without spending anything. " + CUSTOM_CURVE_RULE + (imageDir ? IMAGE_PATH_DISCLOSURE : ""),
2247
2252
  inputSchema: imageDir ? localLaunchTokenShape : launchTokenShape
2248
2253
  }, async (args) => {
2249
2254
  const image = await resolveLaunchImage(args, imageDir, getConfig(), doFetch);
@@ -2494,7 +2499,7 @@ MARKET_NOT_FOUND means Candle has no market for that token and this could not ru
2494
2499
  });
2495
2500
  register("candle_launch_and_seed", {
2496
2501
  title: "Launch a token and seed it",
2497
- description: "Launch a new token from the account's embedded wallet, with an optional dev-buy seed (in the " + "launch transaction on solana, a best-effort follow-up on hood). Works on every plan, Free included (this is not the atomic launch). Then " + "return the fresh market state and token links in one result. MOVES REAL FUNDS unless " + "dryRun. Seeds above the platform dev-buy ceiling are rejected (DEV_BUY_TOO_HIGH); " + "launch, then top up with candle_trade." + (imageDir ? IMAGE_PATH_DISCLOSURE : ""),
2502
+ description: "Launch a new token from the account's embedded wallet, with an optional dev-buy seed (in the " + "launch transaction on solana, a best-effort follow-up on hood). Works on every plan, Free included (this is not the atomic launch). Then " + "return the fresh market state and token links in one result. MOVES REAL FUNDS unless " + "dryRun. Seeds above the platform dev-buy ceiling are rejected (DEV_BUY_TOO_HIGH); " + "launch, then top up with candle_trade. " + CUSTOM_CURVE_RULE + (imageDir ? IMAGE_PATH_DISCLOSURE : ""),
2498
2503
  inputSchema: imageDir ? localLaunchAndSeedShape : launchAndSeedShape
2499
2504
  }, async (args) => {
2500
2505
  const result = await executeLaunchAndSeed(args, getConfig(), doFetch, imageDir);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@candledottv/mcp",
3
- "version": "0.10.15",
3
+ "version": "0.10.16",
4
4
  "description": "MCP server for the Candle agent rail: launch tokens, read markets, report activity",
5
5
  "type": "module",
6
6
  "license": "MIT",