@parabolicfamily/mcp 0.1.7 → 0.2.0

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 (80) hide show
  1. package/README.md +91 -12
  2. package/abi/ParabolicAggregatorRouter.json +2259 -0
  3. package/abi/ParabolicLaunchFactoryV2.json +2542 -0
  4. package/abi/ParabolicPairProbe.json +429 -0
  5. package/abi/ParabolicRouterV2.json +1171 -0
  6. package/abi/ParabolicSessionModule.json +1955 -0
  7. package/abi/deployments.json +258 -0
  8. package/dist/abi.d.ts +3 -1
  9. package/dist/abi.js +3 -1
  10. package/dist/abi.js.map +1 -1
  11. package/dist/chain.d.ts +12 -1
  12. package/dist/chain.js +13 -4
  13. package/dist/chain.js.map +1 -1
  14. package/dist/chains.d.ts +17 -10
  15. package/dist/chains.js +25 -13
  16. package/dist/chains.js.map +1 -1
  17. package/dist/coins.d.ts +38 -3
  18. package/dist/coins.js +54 -4
  19. package/dist/coins.js.map +1 -1
  20. package/dist/config.d.ts +36 -11
  21. package/dist/config.js +98 -20
  22. package/dist/config.js.map +1 -1
  23. package/dist/curve.d.ts +2 -1
  24. package/dist/curve.js +2 -1
  25. package/dist/curve.js.map +1 -1
  26. package/dist/deployed.d.ts +80 -0
  27. package/dist/deployed.js +95 -0
  28. package/dist/deployed.js.map +1 -0
  29. package/dist/docs.d.ts +13 -0
  30. package/dist/docs.js +75 -14
  31. package/dist/docs.js.map +1 -1
  32. package/dist/parabolic.d.ts +120 -3
  33. package/dist/parabolic.js +309 -41
  34. package/dist/parabolic.js.map +1 -1
  35. package/dist/quote-unit.d.ts +77 -0
  36. package/dist/quote-unit.js +143 -0
  37. package/dist/quote-unit.js.map +1 -0
  38. package/dist/referrals.d.ts +77 -0
  39. package/dist/referrals.js +55 -0
  40. package/dist/referrals.js.map +1 -0
  41. package/dist/restapi.d.ts +23 -0
  42. package/dist/restapi.js +60 -4
  43. package/dist/restapi.js.map +1 -1
  44. package/dist/routed.d.ts +389 -0
  45. package/dist/routed.js +413 -0
  46. package/dist/routed.js.map +1 -0
  47. package/dist/server.d.ts +1 -1
  48. package/dist/server.js +117 -10
  49. package/dist/server.js.map +1 -1
  50. package/dist/subgraph.d.ts +18 -6
  51. package/dist/subgraph.js +13 -1
  52. package/dist/subgraph.js.map +1 -1
  53. package/dist/ticker.d.ts +97 -0
  54. package/dist/ticker.js +109 -0
  55. package/dist/ticker.js.map +1 -0
  56. package/dist/tx.d.ts +6 -0
  57. package/dist/tx.js +12 -2
  58. package/dist/tx.js.map +1 -1
  59. package/dist/venues.d.ts +49 -0
  60. package/dist/venues.js +44 -0
  61. package/dist/venues.js.map +1 -0
  62. package/package.json +2 -2
  63. package/src/abi.ts +3 -1
  64. package/src/chain.ts +19 -4
  65. package/src/chains.ts +37 -17
  66. package/src/coins.ts +67 -5
  67. package/src/config.ts +112 -22
  68. package/src/curve.ts +2 -1
  69. package/src/deployed.ts +128 -0
  70. package/src/docs.ts +78 -15
  71. package/src/parabolic.ts +323 -42
  72. package/src/quote-unit.ts +194 -0
  73. package/src/referrals.ts +61 -0
  74. package/src/restapi.ts +66 -4
  75. package/src/routed.ts +499 -0
  76. package/src/server.ts +154 -10
  77. package/src/subgraph.ts +22 -4
  78. package/src/ticker.ts +148 -0
  79. package/src/tx.ts +13 -2
  80. package/src/venues.ts +93 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Parabolic MCP server
2
2
 
3
- A small [Model Context Protocol](https://modelcontextprotocol.io) server for **Parabolic**, the dollar-native token launchpad on Arc. It lets AI agents (Claude Code, Cursor, custom ERC-8004 agents) discover coins, quote curve trades with the contract's exact math, and build **unsigned** transactions, without a browser.
3
+ A small [Model Context Protocol](https://modelcontextprotocol.io) server for **Parabolic**, a bonding-curve token launchpad on Arc and Robinhood Chain. It lets AI agents (Claude Code, Cursor, custom ERC-8004 agents) discover coins, quote curve trades with the contract's exact math, and build **unsigned** transactions, without a browser.
4
4
 
5
5
  **What it never does:** hold keys, sign, send or broadcast transactions, custody funds, or accept private keys, seed phrases or session tokens as input. Every `build_*` tool returns `{ to, data, value, chainId }` for the caller's own wallet to sign. Quotes are read from chain at call time and can move before a transaction lands.
6
6
 
@@ -14,6 +14,52 @@ npx -y @parabolicfamily/mcp # starts the server on stdio
14
14
 
15
15
  The ABIs ship with the package, so it works offline against any Arc RPC you point it at.
16
16
 
17
+ ## What changed in 0.1.8
18
+
19
+ One tool, `parabolic.check_ticker`, and nothing else moved: every call that worked in 0.1.7 works unchanged.
20
+ Given a ticker it asks the Parabolic site whether a coin already carries it on **any** chain the site serves
21
+ and whether `<ticker>.parabolic.family` is free. It is advice and not a gate — nothing on chain enforces a
22
+ unique symbol — and the hostname is the one exclusive thing, held by the oldest coin with that ticker. The
23
+ ticker is normalised the way the site normalises it, so an impossible one is refused before a request is spent.
24
+
25
+ ## What changed in 0.2.0
26
+
27
+ Five tools for coins made on **other launchpads** (pons on Robinhood Chain, SolonPad on Arc), traded through
28
+ Parabolic's aggregator router; every call that worked in 0.1.9 works unchanged.
29
+
30
+ - `parabolic.list_venue_coins` reads that launchpad's subgraph when `PARABOLIC_SUBGRAPH_URL_PONS_RHC` (or
31
+ `..._SOLONPAD_ARC`) is set.
32
+ - `parabolic.quote_routed_buy` / `quote_routed_sell` and `build_routed_buy_tx` / `build_routed_sell_tx` encode
33
+ `ParabolicAggregatorRouter.buy` / `sell` byte for byte as the site does, with no fee voucher and, for an ERC-20
34
+ input, an exact-amount approval of the router in place of the site's Permit2 signature. The coin lives on the
35
+ other launchpad's contracts; the router charges Parabolic's routed fee (its `defaultFeeBps`, 60 bps at deploy)
36
+ on top of that launchpad's own, and every answer shows both.
37
+ - They refuse, by name, until the chain's deployment record carries the router under `aggregator`, when the
38
+ router has the launchpad switched off, when the coin is not that launchpad's, and when any read fails.
39
+
40
+ ## What changed in 0.1.9
41
+
42
+ 0.1.9 makes **Robinhood Chain (4663) a chain this server serves**. Every call that worked before works
43
+ unchanged and means the same chain it meant: an unqualified address is still Arc, permanently.
44
+
45
+ - **Set `PARABOLIC_CHAIN_ID=4663` and nothing else.** The chain's public RPC, its factory and its start
46
+ block ship with the package, read from the deploy's own record rather than typed in. Until 0.1.9 the
47
+ server answered `chain: "rhc"` with "Parabolic is not deployed on Robinhood Chain yet", which had been
48
+ false since 19 September 2026, and an operator who set the chain id got Arc's RPC and no factory.
49
+ - **`list_coins` reaches that board.** One site serves both, and it answers for its own chain when nothing
50
+ names one, so the listing now names the chain (`?chain=rhc`) the way the Telegram bot does. Arc's URLs
51
+ are byte-identical to what they have always been, because Arc's prefix is empty.
52
+ - **No routed buy there yet.** The chain deploys `ParabolicRouter`, which takes the referral code and the
53
+ note as arguments; `ParabolicMemoRouter` is Arc's and the two share no function selector, so this
54
+ package encodes no routed call on chain 4663. `build_buy_tx` goes straight to the curve and
55
+ `build_launch_tx` to the factory, which is the same call on every chain. The referral share itself is
56
+ paid on that chain, credited by the indexer through the same ledger as Arc's memo, so what is missing
57
+ here is the encoder and not the payout: `parabolic.docs` and the buy payload both say so, and passing
58
+ `memo` is refused by name rather than by asking for a variable that must stay unset.
59
+ - **`parabolic.docs` states Arc mainnet as live.** It described chain 5042 as "unofficial until Circle
60
+ publishes it" and Arc's launch fee as 1e18; mainnet has been public since 16 September 2026 and the fee
61
+ has been 0 since the 19th. The fee is read from the factory and never written down.
62
+
17
63
  ## What changed in 0.1.7 (for an existing consumer: nothing has to)
18
64
 
19
65
  0.1.7 makes the server chain-aware. **Every call that worked in 0.1.6 works unchanged and means the same
@@ -44,13 +90,13 @@ mainnet by mistake, and `protocol_stats` reports the chain and RPC host the serv
44
90
 
45
91
  | Variable | Meaning | Default |
46
92
  |---|---|---|
47
- | `PARABOLIC_CHAIN_ID` | 5042002 Arc Testnet, 5042 Arc mainnet | `5042` |
48
- | `PARABOLIC_RPC_URL` | Arc JSON-RPC endpoint | the public endpoint for the chain id |
93
+ | `PARABOLIC_CHAIN_ID` | 5042 Arc mainnet, 5042002 Arc Testnet, 4663 Robinhood Chain | `5042` |
94
+ | `PARABOLIC_RPC_URL` | JSON-RPC endpoint | the public endpoint for the chain id |
49
95
  | `PARABOLIC_FACTORY` | `ParabolicLaunchFactory`: coin lookups and launch transactions | the deployment for the chain id |
50
- | `PARABOLIC_MEMO_ROUTER` | `ParabolicMemoRouter`: the atomic launch-and-buy and the referral-carrying buy | the deployment for the chain id |
96
+ | `PARABOLIC_MEMO_ROUTER` | `ParabolicMemoRouter`: the atomic launch-and-buy and the referral-carrying buy. Refused on a chain whose record deploys `ParabolicRouter` and no memo router, because the two share no function selector and a routed build against that address would revert | the deployment for the chain id |
51
97
  | `PARABOLIC_EURC` | EURC address, only for EURC-quoted coins | the deployment for the chain id |
52
98
  | `PARABOLIC_SUBGRAPH_URL` | Subgraph endpoint: richer listings, holders, 24h volume, protocol stats | unset (the public API is used instead) |
53
- | `PARABOLIC_EXPLORER_URL` | Block explorer the address and transaction links are built from | Arcscan for the chain id; Arc mainnet's host is unconfirmed |
99
+ | `PARABOLIC_EXPLORER_URL` | Block explorer the address and transaction links are built from | the explorer for the chain id |
54
100
  | `PARABOLIC_HOOK` | `ParabolicHook` address | read from `factory.memeHook()` |
55
101
  | `PARABOLIC_ARC_MEMO` | Arc `Memo` system contract | `0x5294E9927c3306DcBaDb03fe70b92e01cCede505` |
56
102
  | `PARABOLIC_AGENT_REGISTRY` | Arc's ERC-8004 `IdentityRegistry`: `agent_status`, `build_register_agent_tx` and the `pair: "Agents"` listing filter | the registry Arc publishes for the chain id (Arc Testnet only, today) |
@@ -58,7 +104,8 @@ mainnet by mistake, and `protocol_stats` reports the chain and RPC host the serv
58
104
  | `PARABOLIC_FACTORY_START_BLOCK` | First block of the `TokenLaunched` scan, used only when neither a subgraph nor the API is available | the factory's deployment block |
59
105
 
60
106
  The API default follows the chain: Arc Testnet reads the testnet site (`https://parabolic-testnet.vercel.app/api/v1`,
61
- live testnet data), Arc reads `https://www.parabolic.family/api/v1`. Running against a fork or your own
107
+ live testnet data), Arc and Robinhood Chain both read `https://www.parabolic.family/api/v1`, which serves
108
+ both boards and is asked for the right one by name. Running against a fork or your own
62
109
  factory: the server skips the site's API automatically whenever `PARABOLIC_FACTORY` differs from the
63
110
  built-in address for the chain or `PARABOLIC_RPC_URL` points anywhere but the chain's own endpoint, and
64
111
  reads the chain instead. To force that for any other reason, set `PARABOLIC_API_URL=""`.
@@ -69,11 +116,11 @@ with source, before you sign anything:
69
116
 
70
117
  | Contract | Arc Testnet (5042002) |
71
118
  |---|---|
72
- | `ParabolicLaunchFactory` | [`0x2E06eD99bD7D164458847D186B282B23700b2C63`](https://testnet.arcscan.app/address/0x2E06eD99bD7D164458847D186B282B23700b2C63) |
73
- | `ParabolicMemoRouter` | [`0x1381567ea31a094e64f6B39Bd880d0b59c48e08F`](https://testnet.arcscan.app/address/0x1381567ea31a094e64f6B39Bd880d0b59c48e08F) |
74
- | EURC (test token) | [`0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a`](https://testnet.arcscan.app/address/0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a) |
75
- | Arc `Memo` (system) | [`0x5294E9927c3306DcBaDb03fe70b92e01cCede505`](https://testnet.arcscan.app/address/0x5294E9927c3306DcBaDb03fe70b92e01cCede505) |
76
- | ERC-8004 `IdentityRegistry` (Arc's) | [`0x8004A818BFB912233c491871b3d84c89A494BD9e`](https://testnet.arcscan.app/address/0x8004A818BFB912233c491871b3d84c89A494BD9e) |
119
+ | `ParabolicLaunchFactory` | [`0x2E06eD99bD7D164458847D186B282B23700b2C63`](https://explorer.testnet.arc.io/address/0x2E06eD99bD7D164458847D186B282B23700b2C63) |
120
+ | `ParabolicMemoRouter` | [`0x1381567ea31a094e64f6B39Bd880d0b59c48e08F`](https://explorer.testnet.arc.io/address/0x1381567ea31a094e64f6B39Bd880d0b59c48e08F) |
121
+ | EURC (test token) | [`0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a`](https://explorer.testnet.arc.io/address/0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a) |
122
+ | Arc `Memo` (system) | [`0x5294E9927c3306DcBaDb03fe70b92e01cCede505`](https://explorer.testnet.arc.io/address/0x5294E9927c3306DcBaDb03fe70b92e01cCede505) |
123
+ | ERC-8004 `IdentityRegistry` (Arc's) | [`0x8004A818BFB912233c491871b3d84c89A494BD9e`](https://explorer.testnet.arc.io/address/0x8004A818BFB912233c491871b3d84c89A494BD9e) |
77
124
 
78
125
  The identity registry is **Arc's contract, not ours**: Arc deploys it, documents it and can change it.
79
126
  It is an ERC-1967 proxy, so the implementation behind that address is upgradeable by Arc. Parabolic only
@@ -84,6 +131,12 @@ Arc mainnet (5042), deployed 16 September 2026 at block 21,105,294: factory
84
131
  source verified on Sourcify. Arc has published no identity registry for mainnet, so on chain 5042
85
132
  `agent_status` says there is no registry rather than reporting a wallet as unregistered.
86
133
 
134
+ Robinhood Chain (4663), deployed 19 September 2026: factory
135
+ `0x25c9cFa179256A29f84b9Fd0DcF7cB2ff24b473d`, quoted in USDG (`0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168`,
136
+ six decimals, Paxos), gas paid in ETH, source verified on Sourcify. Gas there is not a dollar, so a launch
137
+ fee or a balance on that chain is never a figure in dollars, and no identity registry exists. The chain's
138
+ `ParabolicRouter` is deliberately not configured here; see 0.1.9 above.
139
+
87
140
  ### Claude Code
88
141
 
89
142
  ```sh
@@ -150,12 +203,14 @@ Arguments are strict: a key a tool does not know fails with `Unrecognized key` i
150
203
  | `parabolic.agent_status` | `{ address }`. Whether the wallet holds an ERC-8004 agent identity on Arc's `IdentityRegistry` (`balanceOf`), how many it holds, and the registry address and chain. On a chain where Arc has published no registry the answer is that fact, with `registered` and `identities` null. |
151
204
  | `parabolic.build_register_agent_tx` | `{ from, metadataURI? }` → unsigned `IdentityRegistry.register(metadataURI)` (no value). The registry mints the ERC-721 identity to the signer, so `from` is the wallet that sends it, and returns the agent id; read it from the `Transfer` log in the receipt. `metadataURI` is a pointer to the agent's metadata stored as `tokenURI` and may be empty. Warns when the wallet already holds an identity. |
152
205
  | `parabolic.protocol_stats` | Subgraph totals (launches, graduations, trades, volume, fees, daily series) plus the factory's live launch fee, curve preset, snipe-tax terms and contract addresses. |
206
+ | `parabolic.check_ticker` | `{ ticker }`. Whether a Parabolic coin already carries the ticker on **any** chain the site serves, and whether `<ticker>.parabolic.family` is free, read from the site's own route (`/api/v1/studio/ticker` on `PARABOLIC_API_URL`'s site). **Advice, not a gate**: nothing on chain enforces a unique symbol, so `free: false` lists what exists (`taken[]`, each with a `ref` for `get_coin`) and does not stop a launch. The hostname is the one exclusive thing and belongs to the oldest coin carrying the ticker (`hostFree`). A name on the site's reserved list comes back as `reserved` and is not a coin. The ticker is normalised the way the site does it (A-Z and 0-9, case and punctuation ignored, 2 to 10 characters); one outside that is refused before the site is asked. Call it before `build_launch_tx`. |
153
207
  | `parabolic.docs` | The adopted parameters, curve mechanics, verified Arc facts and this server's configuration, as text. |
154
208
 
155
209
  Every tool above also takes an optional `chain` (see "What changed in 0.1.7"), and every coin argument
156
210
  takes a reference: `0x…` for a coin on this server's chain, `rhc:0x…` for one elsewhere. A wallet argument
157
211
  (`recipient`, `buyer`, `creator`, `from`, `agent_status`'s `address`) stays a plain address — a wallet is
158
- the same person on every EVM chain.
212
+ the same person on every EVM chain. `check_ticker` accepts `chain` like the others and its verdict still
213
+ covers every chain the site serves, because a ticker taken elsewhere is a collision the moment a link is shared.
159
214
 
160
215
  Resources: `parabolic://docs/parameters` (same text as `parabolic.docs`) and `parabolic://coins/{address}` (same JSON as `parabolic.get_coin`; the address may be a reference).
161
216
 
@@ -221,6 +276,29 @@ The result is `kind: "register_agent"`: one unsigned `tx` to the registry carryi
221
276
  registry mints to `msg.sender`. Once it lands, `parabolic.list_coins` with `pair: "Agents"` keeps the
222
277
  coins launched from that wallet, and the site tags them `[ Agent ]`.
223
278
 
279
+ Check a ticker before launching under it:
280
+
281
+ ```json
282
+ { "name": "parabolic.check_ticker", "arguments": { "ticker": "$para" } }
283
+ ```
284
+ ```json
285
+ {
286
+ "ticker": "PARA", "asked": "$para",
287
+ "chain": { "id": 5042, "key": "arc", "name": "Arc" },
288
+ "scope": "every chain the Parabolic site serves, not only this server's chain",
289
+ "free": false,
290
+ "taken": [{ "chain": { "id": 5042, "key": "arc", "name": "Arc" }, "name": "Parabolic", "address": "0x552F…4073", "ref": "0x552F…4073", "page": "https://www.parabolic.family/coin/0x552F…4073" }],
291
+ "reserved": null,
292
+ "host": "para.parabolic.family", "hostFree": false,
293
+ "message": "$PARA already trades on Arc as \"Parabolic\". Nothing on chain stops a second coin using it; para.parabolic.family belongs to the oldest coin carrying the ticker.",
294
+ "notes": ["Advice, not a gate: …", "…"]
295
+ }
296
+ ```
297
+
298
+ `free: true` comes back with `taken: []` and `hostFree: true`, and a name on the site's reserved list as
299
+ `reserved: { name }`. Nothing here is a lock: the verdict is what the site's board holds at the moment of
300
+ asking, and it lags the site's indexer by however far that is behind.
301
+
224
302
  ## Notes on the mechanics
225
303
 
226
304
  - Curve math is a port of `ParabolicBondingCurve` / `ParabolicBondingCurveMath` (and of `web/lib/curve.ts`): fee legs are taken off the buy input separately, the constant product is priced on `getReserves()`, and a buy that would take more than `sellableTokens()` is clamped to the last sellable tokens, charged the grossed-up price and refunded the rest; that buy graduates the coin, so give it extra gas. Sells take the fee off the gross quote output and close once the curve is ready to graduate.
@@ -246,6 +324,7 @@ src/
246
324
  chain.ts viem RPC wrapper (batched HTTP) behind a small Rpc interface
247
325
  subgraph.ts GraphQL client and Coin/Protocol shapes
248
326
  coins.ts coin summaries, sorting
327
+ ticker.ts check_ticker's rule: the site's normalisation, its verdict shape, the sentence
249
328
  config.ts PARABOLIC_* environment
250
329
  abi.ts loads abi/*.json
251
330
  docs.ts parameters + Arc facts text