@inkyswap/pump-mcp
v0.1.1
Published
MCP server that lets Claude Code / Codex launch InkyPump V2 tokens on Ink
Downloads
34
Maintainers
Readme
@inkyswap/pump-mcp
MCP server that lets Claude Code, Codex CLI, or any other MCP-aware client launch InkyPump V2 tokens on Ink directly from the editor.
Tools
| Tool | Description |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| launch_token | Broadcasts createLaunch (or createLaunchWithReferral) on the InkyPump V2 hook contract on Ink mainnet. Writes are off by default. |
| preview_launch | Dry-run that resolves the on-chain params and reports expected creator-fee economics. No transaction. |
| wallet_info | Returns the MCP signer address and its current Ink ETH balance. |
| recent_launches | Fetches /api/tokens/recent-v2 from the configured InkyPump host (default https://inkypump.com). Returns a sanitized field set. |
| launch_status | Reads getLaunchState(launchId) on the hook contract and reports funding progress. |
Install
Claude Code
# stash the key in a 0600 file (the MCP refuses to read it otherwise)
umask 077
printf '%s' '0xYOUR_BURNER_PRIVATE_KEY' > ~/.inkypump-mcp-key
chmod 600 ~/.inkypump-mcp-key
# register the MCP — npx pulls @inkyswap/pump-mcp from npm on first use
claude mcp add inkypump \
--command npx \
--args "-y @inkyswap/pump-mcp" \
--env INKYPUMP_MCP_PRIVATE_KEY_FILE=$HOME/.inkypump-mcp-key \
--env INKYPUMP_MCP_ENABLE_WRITES=trueCodex CLI
Add to ~/.codex/config.toml (or your Codex MCP config):
[mcp_servers.inkypump]
command = "npx"
args = ["-y", "@inkyswap/pump-mcp"]
[mcp_servers.inkypump.env]
INKYPUMP_MCP_PRIVATE_KEY_FILE = "/Users/you/.inkypump-mcp-key"
INKYPUMP_MCP_ENABLE_WRITES = "true"Manual / dev
git clone https://github.com/InkySwap/pump-mcp
cd pump-mcp
bun install --frozen-lockfile
bun run build
node dist/index.jsEnvironment
| Variable | Default | Required | Purpose |
| --------------------------------- | -------------------------------- | -------------------- | ------------------------------------------------------------------------------------------------ |
| INKYPUMP_MCP_PRIVATE_KEY_FILE | — | one-of | Path to a chmod 600 file whose contents are the hex private key. Preferred. Refuses to load on POSIX if mode ≠ 0600. On Windows the mode check is skipped — secure the file with NTFS ACLs. |
| INKYPUMP_MCP_PRIVATE_KEY | — | one-of | Raw hex private key. Less safe — stored plaintext in your MCP config. |
| INKYPUMP_MCP_ENABLE_WRITES | false | yes for writes | Must be true / 1 / yes to permit broadcasting transactions. |
| INKYPUMP_MCP_MAX_PREBUY_ETH | 0.1 | no | Per-call cap on prebuyEth. |
| INKYPUMP_MCP_MAX_RAISE_ETH | 5 | no | Per-call cap on targetRaiseEth. |
| INKYPUMP_MCP_MAX_GAS_GWEI | 100 | no | Per-call cap on maxFeePerGas in gwei. Defends against an RPC reporting inflated fees. |
| INKYPUMP_MCP_RPC_URL | https://rpc-gel.inkonchain.com | no | Override the Ink RPC endpoint. Validated to be a public https URL. |
| INKYPUMP_BASE_URL | https://inkypump.com | no | Origin used to build trade URLs and call /api/tokens/recent-v2. |
Safety
⚠ The MCP holds a hot wallet. Only ever load a key that:
- is not your main wallet,
- holds only enough ETH for prebuys + gas, and
- is rotated whenever the host machine changes.
Defense-in-depth baked into this server:
- Writes opt-in.
launch_tokenrefuses unlessINKYPUMP_MCP_ENABLE_WRITES=true. - Explicit confirm. Every
launch_tokencall requiresconfirm: "YES"— partial / hallucinated calls fail closed. - Operator spend caps.
MAX_PREBUY_ETH(0.1 default) andMAX_RAISE_ETH(5 default) clamp every call. - Error sanitizing. Tool errors are stripped of long hex blobs (signed-tx payloads) and URL credentials before they hit the LLM transcript.
- URL validation. Image / social URLs must be
https://, must not contain credentials, must not use reserved TLDs (.local,.internal,.localhost,.test,.example,.invalid), and must resolve via DNS to a public IP (covers RFC1918, loopback, link-local, CGNAT, IPv6 unique-local, hex-form IPv4-mapped). Defeats public-name-points-at-private-IP attempts. - Chain assertion. Every write verifies the RPC reports chain ID 57073 before signing — defends against a hijacked or misconfigured
INKYPUMP_MCP_RPC_URL. - Gas / nonce hardening. Every write caps
maxFeePerGasagainstINKYPUMP_MCP_MAX_GAS_GWEI, pins the nonce viagetTransactionCount({ blockTag: "pending" }), and times out the receipt wait at 120s with no retries. - Untrusted input handling.
recent_launchesreturns a minimal allowlisted, length-clipped field set with an explicit "untrusted data" warning. - Pinned deps. Runtime + dev deps exact-pinned; install with
--frozen-lockfile. - npm provenance. Releases publish with
--provenanceso the npm page links back to the GitHub Actions run that built them.
Example session
> wallet_info
{ "address": "0x…", "balanceEth": "0.4", "chainId": 57073 }
> preview_launch {
"name": "Anita",
"ticker": "ANITA",
"description": "Test launch",
"imageUrl": "https://example.com/anita.png",
"targetRaiseEth": 3,
"curveGainMultiplier": 6,
"creatorFeeSplitBps": 5000
}
{ "feeMath": { "creatorEarningsAsPctOfVolume": 0.495, ... } }
> launch_token { …same args plus "confirm": "YES" }
{ "transactionHash": "0x…", "tokenAddress": "0x…",
"tradeUrl": "https://inkypump.com/trade/0x…",
"explorerUrl": "https://explorer.inkonchain.com/tx/0x…" }License
MIT — see LICENSE.
