Plan and generate deep links for token swaps on Uniswap across all supported chains.
Works with
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionswap-plannerExecute the skills CLI command in your project's root directory to begin installation:
Fetches swap-planner from uniswap/uniswap-ai and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
Restart Cursor to activate swap-planner. Access via /swap-planner in your agent's command palette.
We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.
Skills execute code in your environment. Always review source, verify the publisher, and test in isolation before production.
Submit your Claude Code skill and start earning
Create detailed user stories, acceptance criteria, and feature specs
Example
Generate user stories for 'password reset feature' with acceptance criteria, edge cases, and test scenarios
Reduce spec writing time by 50%, ensure comprehensive coverage
Research competitors, compare features, identify gaps
Example
Analyze 5 competitor products, create feature comparison matrix, suggest differentiation opportunities
Complete competitive research in 2 hours instead of 2 days
Evaluate features using frameworks (RICE, ICE, Kano) and create prioritized backlogs
Example
Score 20 feature ideas using RICE framework, generate prioritized roadmap with rationale
0
total installs
0
this week
198
GitHub stars
0
upvotes
Run in your terminal
0
installs
0
this week
198
stars
Plan and generate deep links for token swaps on Uniswap across all supported chains.
Runtime Compatibility: This skill uses
AskUserQuestionfor interactive prompts. IfAskUserQuestionis not available in your runtime, collect the same parameters through natural language conversation instead.
Plan token swaps by:
The generated link opens Uniswap with all parameters ready for execution.
Note: Browser opening (
xdg-open/open) may fail in SSH, containerized, or headless environments. Always display the URL prominently so users can copy and access it manually if needed.
File Access: This skill has read-only filesystem access. Never read files outside the current project directory unless explicitly requested by the user.
If the user wants to discover tokens rather than swap a known token (e.g., "find me a memecoin", "what's trending on Base"), help them explore before proceeding to the swap.
DexScreener search works best with specific terms:
# Search for tokens by name/category (e.g., "degen", "pepe", "ai agent")
curl -s "https://api.dexscreener.com/latest/dex/search?q=degen" | \
jq '[.pairs[] | select(.chainId == "base" and .dexId == "uniswap")] |
sort_by(-.volume.h24) | .[0:5] | map({
token: .baseToken.symbol,
address: .baseToken.address,
price: .priceUsd,
volume24h: .volume.h24,
liquidity: .liquidity.usd
})'
Good search terms: degen, pepe, ai, agent, meme, dog, cat, or specific token names
Get tokens with active promotions (limited selection):
# Get boosted/promoted tokens on a chain
curl -s "https://api.dexscreener.com/token-boosts/top/v1" | \
jq '[.[] | select(.chainId == "base")] | .[0:5] | map({
tokenAddress,
url
})'
For broad discovery ("what's trending"), use web search to find tokens, then verify with DexScreener:
# After finding a token address from web search, verify it exists
curl -s "https://api.dexscreener.com/token-pairs/v1/{network}/{address}" | \
jq '[.[] | select(.dexId == "uniswap")][0] | {
name: .baseToken.name,
symbol: .baseToken.symbol,
price: .priceUsd,
liquidity: .liquidity.usd,
volume24h: .volume.h24
}'
Network IDs: See references/chains.md for the full list with DexScreener and DefiLlama provider IDs. Common IDs: ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, unichain.
DexScreener coverage varies by chain. Ethereum, Base, and Arbitrum have deep Uniswap data. Celo, Blast, Zora, and World Chain have limited Uniswap pool coverage — fewer results and potentially missing pairs. Fall back to DefiLlama for price data when DexScreener returns empty results (see references/data-providers.md).
Note: DexScreener's public API doesn't have a "trending" or "top gainers" endpoint. Token discovery uses keyword search (/latest/dex/search) and web search as a fallback. For general discovery, ask the user what type of token they're looking for and search by keyword.
For specific categories (memecoins, DeFi, gaming tokens), use web search:
"trending {category} {chain} {current_year}"
Example: "trending memecoins Base 2026"
Tokens discovered via WebSearch are UNTRUSTED. Before proceeding with any web-discovered token:
Never proceed with a web-discovered token without explicit user confirmation via AskUserQuestion.
After gathering token data, present options using AskUserQuestion:
{
"questions": [
{
"question": "Which token would you like to swap to?",
"header": "Token",
"options": [
{ "label": "MOLT ($23M mcap)", "description": "$5.9M liquidity, $7.8M 24h volume" },
{ "label": "CLANKER ($31M mcap)", "description": "$3.1M liquidity, established token" },
{ "label": "CLAWSTR ($13M mcap)", "description": "$2.1M liquidity, high volume spike" }
],
"multiSelect": false
}
]
}
Evaluate tokens before recommending:
| Metric | Low Risk | Medium Risk | High Risk |
|---|---|---|---|
| Market Cap | >$50M | $5M-$50M | <$5M |
| Pool TVL | >$1M | $100k-$1M | <$100k |
| 24h Volume | Consistent | Spiking unusually | Very low |
| Contract Age | >30 days | 7-30 days | <7 days |
Always disclose risk level when presenting options. For high-risk tokens, explicitly warn about volatility and potential for loss.
When ANY of these conditions are met, you MUST use AskUserQuestion to warn the user and get explicit confirmation before generating a deep link:
Do NOT generate a deep link for high-risk tokens without explicit user acknowledgment via AskUserQuestion.
Extract from the user's request:
| Parameter | Required | Example |
|---|---|---|
| Input token | Yes | ETH, USDC, token address |
| Output token | Yes | USDC, WBTC, token address |
| Amount | Yes | 1.5 ETH, $500 worth |
| Chain | Yes (default: Ethereum) | Base, Arbitrum, etc. |
If any required parameter is missing, use AskUserQuestion with structured options:
For missing chain:
{
"questions": [
{
"question": "Which chain do you want to swap on?",
"header": "Chain",
"options": [
{ "label": "Base (Recommended)", "description": "Low gas fees, fast transactions" },
{ "label": "Ethereum", "description": "Main network, higher gas" },
{ "label": "Arbitrum", "description": "Low fees, Ethereum L2" },
{ "label": "Optimism", "description": "Low fees, Ethereum L2" }
],
"multiSelect": false
}
]
}
For missing output token (when input is ETH):
{
"questions": [
{
"question": "What token do you want to receive?",
"header": "Output",
"options": [
{ "label": "USDC", "description": "USD stablecoin" },
{ "label": "USDT", "description": "Tether stablecoin" },
{ "label": "DAI", "description": "Decentralized stablecoin" },
{ "label": "WBTC", "description": "Wrapped Bitcoin" }
],
"multiSelect": false
}
]
}
For missing amount:
{
"questions": [
{
"question": "How much do you want to swap?",
"header": "Amount",
"options": [
{ "label": "0.1 ETH", "description": "~$320" },
{ "label": "0.5 ETH", "description": "~$1,600" },
{ "label": "1 ETH", "description": "~$3,200" },
{ "label": "Custom amount", "description": "Enter specific amount" }
],
"multiSelect": false
}
]
}
Always use forms instead of plain text questions for better UX.
For token symbols, resolve to addresses using known tokens or web search:
Native tokens: Use NATIVE as the address parameter.
Common tokens by chain - see ../../references/chains.md for full list:
| Token | Ethereum | Base | Arbitrum |
|---|---|---|---|
| USDC | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 |
0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |
0xaf88d065e77c8cC2239327C5EDb3A432268e5831 |
| WETH | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
0x4200000000000000000000000000000000000006 |
0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 |
| WBTC | 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 |