Skip to main content

Uniswap Plugin

[!IMPORTANT] Complete the short Base MCP onboarding flow defined in SKILL.md before calling any Uniswap endpoint. The user’s wallet address — passed as walletAddress in every swap and LP call — is fetched lazily when needed.

Overview

Uniswap on Base: token swaps using the proxy-approval flow (no Permit2 signing) and LP position management for V2, V3, and V4. The plugin fetches unsigned calldata from the Uniswap API, then executes transaction previews with send_calls. No additional MCP server is required. Chain: Base mainnet (chainId 8453).

Auth

Use these headers for all requests:
For the swap proxy-approval flow, also include this header on all swap endpoints: /check_approval, /quote, and /swap.
Without x-permit2-disabled, Uniswap can return Permit2 or Universal Router behavior instead of the proxy-approval flow described here.

Surface Routing

Uniswap is HTTP-only; every capability follows the standard HTTP routing in ../references/custom-plugins.md.
CapabilityPath
Swap quote / approval / calldataHarness HTTP tool if available, else web_request POST against trade-api.gateway.uniswap.org.
LP discovery / create / manage / claimHarness HTTP tool or web_request POST against liquidity.api.uniswap.org.
Execute the prepared calldataBase MCP send_calls (works on every surface).
Prerequisite: trade-api.gateway.uniswap.org and liquidity.api.uniswap.org must be in the MCP server’s web_request allowlist. If requests are rejected by the allowlist and no harness HTTP tool is available, inform the user.

Endpoints

Swap endpoints: proxy approval, no Permit2

Base URL: https://trade-api.gateway.uniswap.org/v1

1. POST /check_approval

Headers: auth headers plus "x-permit2-disabled": "true".
Response:
approval can be null, especially for native ETH. If it is non-null, pass it to send_calls. You can batch the approval and swap together after /swap returns.

2. POST /quote

Headers: auth headers plus "x-permit2-disabled": "true".
Use "slippageTolerance": <0-20> instead of autoSlippage if the user specifies slippage. See Risks & Warnings before submitting elevated values. Response includes a top-level quote object plus metadata. Keep the response as a flat object for /swap; do not nest it under a quote key.

3. POST /swap

Headers: auth headers plus "x-permit2-disabled": "true". Use the /quote response as the body, but remove any null or absent permit fields before sending:
Do not send signature, and do not send permitData or permitTransaction when they are null. Response:

LP endpoints

Base URL: https://liquidity.api.uniswap.org/lp Use this host for LP endpoints in this plugin environment. Do not switch to api.uniswap.org or trade-api.gateway.uniswap.org/v1/lp/... unless that host is explicitly available to the API key and MCP allowlist.

Pool Discovery: POST /lp/pool_info

Use pool discovery before creating V3/V4 LP positions. poolReference must be a valid pool address for V3 or pool ID for V4.
Known Base V4 ETH/USDC fee=3000, tickSpacing=60 pool reference observed in testing:
Pool references can change by pair, fee, tick spacing, and protocol. Prefer querying /lp/pool_info instead of hard-coding a pool reference unless the user explicitly selected a pool.

Approval Step: POST /lp/check_approval

Use this before LP create/increase/decrease operations. The body uses lpTokens as an array of token/amount objects.
action: "CREATE" | "INCREASE" | "DECREASE" | "MIGRATE" Response:
If transactions is empty, no approval transaction is needed. If it has entries, map every transactions[*].transaction to send_calls.

Create V3/V4 Position: POST /lp/create

Use newPool instead of existingPool when creating a pool:
Response:
Prefer tickBounds when possible. priceBounds can be accepted by the API, but its price units are easy to misread; validate carefully before using it.

Manage Existing Positions

ActionEndpointKey params
Add liquidityPOST /lp/increasewalletAddress, chainId, protocol, token0Address, token1Address, nftTokenId, independentToken { tokenAddress, amount }
Remove liquidityPOST /lp/decreasewalletAddress, chainId, protocol, token0Address, token1Address, nftTokenId, liquidityPercentageToDecrease (0-100)
Collect feesPOST /lp/claim_feeswalletAddress, chainId, protocol, tokenId; optional simulateTransaction
Create V2 positionPOST /lp/create_classicwalletAddress, poolParameters { token0Address, token1Address, chainId }, independentToken { tokenAddress, amount }
Optional on LP operation endpoints: "slippageTolerance": <decimal> where 0.5 means 0.5%. See Risks & Warnings before submitting elevated values. Important: LP APIs can return calldata for syntactically valid nftTokenId values even if the connected wallet may not own the position. Treat generated calldata as a transaction preview input, not proof of ownership or guaranteed execution.

Claim Fees: POST /lp/claim_fees

Response:
No approval step is needed for fee collection.

Create V2 Position: POST /lp/create_classic

For V2 create, /lp/check_approval may return multiple approval transactions. Batch all approvals plus the create transaction if you want one send_calls approval link.

Orchestration

Swap orchestration

LP orchestration

Submission

Target tool: send_calls (chain "base"). Open the returned approvalUrl only if the user asks, and poll get_request_status after they act (see ../references/approval-mode.md and ../references/batch-calls.md).

Swap send_calls

Approval and swap can be sent separately or batched in one send_calls preview:

LP send_calls

For any LP operation response field such as create, increase, decrease, or claim, map to:
For approval + action batching:

Example Prompts

Swap 1 USDC to WETH on Base
  1. get_wallets -> address; use USDC address 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, amount 1000000.
  2. web_request POST /check_approval with x-permit2-disabled: true.
  3. web_request POST /quote with x-permit2-disabled: true.
  4. Remove null permit fields from quote response.
  5. web_request POST /swap with x-permit2-disabled: true.
  6. send_calls approval + swap, or swap only if no approval was returned.
Create a V4 ETH/USDC LP position on Base
  1. get_wallets -> address.
  2. web_request POST /lp/pool_info to find the pool reference.
  3. web_request POST /lp/check_approval using lpTokens array.
  4. web_request POST /lp/create using existingPool.poolReference and tickBounds.
  5. send_calls approval transactions plus create transaction.
Add liquidity to an existing V4 position
  1. get_wallets -> address.
  2. Confirm the wallet owns the nftTokenId or warn that generated calldata may still fail.
  3. web_request POST /lp/check_approval with action "INCREASE".
  4. web_request POST /lp/increase.
  5. send_calls approval transactions plus increase transaction.
Collect LP fees
  1. get_wallets -> address.
  2. web_request POST /lp/claim_fees with tokenId.
  3. send_calls claim transaction.

Risks & Warnings

High slippage tolerance exposes the user to worse fills and sandwich/MEV attacks. Before calling /swap or any LP endpoint with an elevated value, warn the user and get explicit confirmation:
ToleranceLevelAction
≤ 1%NormalProceed.
> 1% and ≤ 5%ElevatedMention the value and ask the user to confirm.
> 5% and ≤ 20%HighWarn that the trade can fill significantly below quote and is a likely sandwich target. Require explicit confirmation.
> 20%Very highStrongly warn; do not submit without the user re-confirming the exact number.
Apply the same thresholds to swap and LP slippage. If the user did not specify a value, prefer autoSlippage: "DEFAULT" on swaps rather than picking a high number.

Notes

  • Native ETH address: 0x0000000000000000000000000000000000000000
  • USDC on Base: 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
  • WETH on Base: 0x4200000000000000000000000000000000000006
  • Token amounts are base units: USDC = 1e6 per token, ETH/WETH = 1e18 per token.
  • Use chain: "base" with send_calls, not numeric chain id.
  • For swap proxy approval, include x-permit2-disabled: true on /check_approval, /quote, and /swap.
  • For swap proxy approval, remove null permitData and permitTransaction fields before calling /swap.
  • /quote response fields must be spread directly into /swap body, not nested under a quote key.
  • Do not send signature in the proxy swap flow.