Skip to main content
Glama
RWAValueRouter

ValueRouter MCP Server

README.md
# ValueRouter MCP Server

A Model Context Protocol (MCP) server that provides AI agents with comprehensive cross-chain USDC bridging capabilities through ValueRouter. This server enables AI agents to seamlessly bridge USDC across multiple blockchain networks including Ethereum, Solana, Sui, and Cosmos ecosystem chains.

## Features

- **Multi-Chain Support**: Bridge USDC across 15+ blockchain networks
- **Real-Time Quotes**: Get accurate bridging quotes with fees and timing estimates
- **Transaction Simulation**: Prepare bridge transactions without execution
- **Status Tracking**: Monitor bridge transaction progress in real-time
- **Balance Queries**: Check user token balances across all supported chains
- **Fee Estimation**: Calculate bridge fees and gas costs

## Supported Chains

### Mainnet

- **Ethereum** (Chain ID: 1)
- **Arbitrum One** (Chain ID: 42161)
- **Optimism** (Chain ID: 10)
- **Polygon** (Chain ID: 137)
- **Avalanche C-Chain** (Chain ID: 43114)
- **Base** (Chain ID: 8453)
- **Solana** (Chain ID: 'solana')
- **Sui** (Chain ID: 'sui')
- **Noble** (Chain ID: 'noble-1')
- **Osmosis** (Chain ID: 'osmosis-1')
- **Evmos** (Chain ID: 'evmos_9001-2')
- **Sei** (Chain ID: 'pacific-1')
- **Coreum** (Chain ID: 'coreum-mainnet-1')
- **dYdX** (Chain ID: 'dydx-mainnet-1')

### Testnet

- **Goerli** (Chain ID: 5)
- **Sepolia** (Chain ID: 11155111)
- **Solana Devnet** (Chain ID: 'solana-devnet')
- **Sui Testnet** (Chain ID: 'sui-testnet')
- **Noble Testnet** (Chain ID: 'grand-1')
- **Avalanche Fuji** (Chain ID: 43113)
- **Arbitrum Goerli** (Chain ID: 421613)
- **Optimism Goerli** (Chain ID: 420)
- **Polygon Mumbai** (Chain ID: 80001)

## Installation

```bash
npm install @valuerouter/mcp-server
```

## Usage

### Starting the Server

```bash
npx @valuerouter/mcp-server
```

### Environment Variables

Create a `.env` file in your project root:

```env
# RPC URLs (replace with your API keys)
ETHEREUM_RPC_URL=https://mainnet.infura.io/v3/YOUR_INFURA_KEY
ARBITRUM_RPC_URL=https://arb1.arbitrum.io/rpc
OPTIMISM_RPC_URL=https://mainnet.optimism.io
POLYGON_RPC_URL=https://polygon-rpc.com
AVALANCHE_RPC_URL=https://api.avax.network/ext/bc/C/rpc
BASE_RPC_URL=https://mainnet.base.org
SOLANA_RPC_URL=https://api.mainnet-beta.solana.com
SUI_RPC_URL=https://fullnode.mainnet.sui.io:443

# Optional: API keys for better performance
ALCHEMY_API_KEY=your_alchemy_key
INFURA_API_KEY=your_infura_key
QUICKNODE_API_KEY=your_quicknode_key
```

## Available Tools

### 1. `get_supported_chains`

Get all supported chains for USDC bridging.

**Parameters:**

- `includeTestnets` (boolean, optional): Include testnet chains (default: false)

**Example:**

```json
{
  "name": "get_supported_chains",
  "arguments": {
    "includeTestnets": false
  }
}
```

**Response:**

```json
{
  "chains": [
    {
      "chainId": 1,
      "name": "Ethereum",
      "symbol": "ETH",
      "decimals": 18,
      "explorerUrl": "https://etherscan.io",
      "isTestnet": false,
      "networkType": "mainnet",
      "usdcAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
    }
  ],
  "count": 14
}
```

### 2. `get_supported_tokens`

Get supported tokens for bridging.

**Parameters:**

- `chainId` (number|string, optional): Specific chain ID to get tokens for
- `includeTestnets` (boolean, optional): Include testnet tokens (default: false)

**Example:**

```json
{
  "name": "get_supported_tokens",
  "arguments": {
    "chainId": 1,
    "includeTestnets": false
  }
}
```

### 3. `get_bridge_quote`

Get a quote for bridging USDC between chains.

**Parameters:**

- `fromChainId` (number|string): Source chain ID
- `toChainId` (number|string): Destination chain ID
- `fromToken` (object): Source token details
- `toToken` (object): Destination token details
- `amount` (string): Amount to bridge in smallest unit (wei, lamports, etc.)
- `slippageBps` (number, optional): Slippage tolerance in basis points (default: 100)
- `userAddress` (string, optional): User address for better quote accuracy

**Example:**

```json
{
  "name": "get_bridge_quote",
  "arguments": {
    "fromChainId": 1,
    "toChainId": 42161,
    "fromToken": {
      "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
      "chainId": 1,
      "symbol": "USDC",
      "name": "USD Coin",
      "decimals": 6
    },
    "toToken": {
      "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
      "chainId": 42161,
      "symbol": "USDC",
      "name": "USD Coin",
      "decimals": 6
    },
    "amount": "1000000",
    "slippageBps": 100
  }
}
```

**Response:**

```json
{
  "fromChainId": 1,
  "toChainId": 42161,
  "fromAmount": "1000000",
  "toAmount": "999500",
  "toAmountMin": "998501",
  "bridgeFee": "500",
  "gasFee": "10000000000000000",
  "totalFee": "10000000000000500",
  "estimatedTime": "480",
  "priceImpact": "0.01",
  "route": {
    "steps": [
      {
        "type": "bridge",
        "chainId": 1,
        "fromToken": {...},
        "toToken": {...},
        "amount": "1000000",
        "protocol": "ValueRouter"
      }
    ]
  },
  "validUntil": 1703958743123
}
```

### 4. `execute_bridge`

Execute a bridge transaction (simulation only).

**Parameters:**

- `fromChainId` (number|string): Source chain ID
- `toChainId` (number|string): Destination chain ID
- `fromToken` (object): Source token details
- `toToken` (object): Destination token details
- `amount` (string): Amount to bridge
- `recipientAddress` (string): Recipient address on destination chain
- `userAddress` (string): User address initiating the transaction
- `slippageBps` (number, optional): Slippage tolerance in basis points
- `memo` (string, optional): Memo for Cosmos chains

**Example:**

```json
{
  "name": "execute_bridge",
  "arguments": {
    "fromChainId": 1,
    "toChainId": 42161,
    "fromToken": {
      "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
      "chainId": 1,
      "symbol": "USDC",
      "name": "USD Coin",
      "decimals": 6
    },
    "toToken": {
      "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
      "chainId": 42161,
      "symbol": "USDC",
      "name": "USD Coin",
      "decimals": 6
    },
    "amount": "1000000",
    "recipientAddress": "0x742d35Cc6634C0532925a3b8D45c07F9624f8b4c",
    "userAddress": "0x742d35Cc6634C0532925a3b8D45c07F9624f8b4c",
    "slippageBps": 100
  }
}
```

**Response:**

```json
{
  "transactionHash": "simulated-1703958743123-abc123def",
  "fromChainId": 1,
  "toChainId": 42161,
  "status": "pending",
  "explorerUrl": "https://etherscan.io/tx/simulated-1703958743123-abc123def",
  "estimatedCompletionTime": "600",
  "trackingId": "simulated-1703958743123-abc123def",
  "warning": "This is a simulation only. To execute the transaction, use the returned transaction data with your wallet.",
  "simulationOnly": true
}
```

### 5. `get_transaction_status`

Get the status of a bridge transaction.

**Parameters:**

- `transactionHash` (string): Transaction hash to check status for
- `fromChainId` (number|string): Source chain ID
- `toChainId` (number|string): Destination chain ID

**Example:**

```json
{
  "name": "get_transaction_status",
  "arguments": {
    "transactionHash": "simulated-1703958743123-abc123def",
    "fromChainId": 1,
    "toChainId": 42161
  }
}
```

**Response:**

```json
{
  "transactionHash": "simulated-1703958743123-abc123def",
  "fromChainId": 1,
  "toChainId": 42161,
  "status": "attesting",
  "steps": [
    {
      "name": "Simulation",
      "status": "completed",
      "timestamp": 1703958773123
    },
    {
      "name": "Bridge Scanning",
      "status": "completed",
      "timestamp": 1703958803123
    },
    {
      "name": "Circle Attestation",
      "status": "processing",
      "timestamp": 1703958863123
    }
  ],
  "fromTxHash": "simulated-1703958743123-abc123def"
}
```

### 6. `get_user_balance`

Get user token balance on a specific chain.

**Parameters:**

- `chainId` (number|string): Chain ID to check balance on
- `tokenAddress` (string): Token contract address
- `userAddress` (string): User address to check balance for

**Example:**

```json
{
  "name": "get_user_balance",
  "arguments": {
    "chainId": 1,
    "tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
    "userAddress": "0x742d35Cc6634C0532925a3b8D45c07F9624f8b4c"
  }
}
```

**Response:**

```json
{
  "chainId": 1,
  "tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
  "balance": "1000000000",
  "decimals": 6,
  "symbol": "USDC",
  "formattedBalance": "1000.0"
}
```

### 7. `estimate_bridge_fees`

Estimate fees for a bridge transaction.

**Parameters:**

- `fromChainId` (number|string): Source chain ID
- `toChainId` (number|string): Destination chain ID
- `amount` (string): Amount to bridge
- `tokenAddress` (string, optional): Token address (defaults to USDC)

**Example:**

```json
{
  "name": "estimate_bridge_fees",
  "arguments": {
    "fromChainId": 1,
    "toChainId": 42161,
    "amount": "1000000"
  }
}
```

**Response:**

```json
{
  "bridgeFee": "500",
  "gasFee": "10000000000000000",
  "totalFee": "10000000000000500"
}
```

## Error Handling

All tools return structured error responses when something goes wrong:

```json
{
  "error": "Unsupported chain: 999",
  "code": "UNSUPPORTED_CHAIN",
  "details": "Chain ID 999 is not supported by ValueRouter"
}
```

Common error codes:

- `UNSUPPORTED_CHAIN`: Chain is not supported
- `INVALID_TOKEN`: Token address is invalid
- `INSUFFICIENT_BALANCE`: User has insufficient balance
- `QUOTE_ERROR`: Failed to get quote
- `BRIDGE_ERROR`: Failed to prepare bridge transaction
- `STATUS_ERROR`: Failed to get transaction status
- `BALANCE_ERROR`: Failed to get balance

## Chain-Specific Notes

### Ethereum & EVM Chains

- Use `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` for native ETH
- Gas fees are in wei (18 decimals)
- Bridge fees are 0.05% (5 basis points)

### Solana

- Use `So11111111111111111111111111111111111111112` for native SOL
- Gas fees are in lamports (9 decimals)
- Requires WSOL wrapping for bridging

### Sui

- Use `0x2::sui::SUI` for native SUI
- Gas fees are in MIST (9 decimals)
- Supports Move-based tokens

### Cosmos Chains

- Use denomination strings like `uusdc`, `uosmo`, etc.
- Gas fees vary by chain
- Supports IBC transfers

## Integration Examples

### Basic Bridge Flow

```javascript
// 1. Get supported chains
const chains = await callTool('get_supported_chains', {})

// 2. Get user balance
const balance = await callTool('get_user_balance', {
  chainId: 1,
  tokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
  userAddress: '0x742d35Cc6634C0532925a3b8D45c07F9624f8b4c'
})

// 3. Get bridge quote
const quote = await callTool('get_bridge_quote', {
  fromChainId: 1,
  toChainId: 42161,
  fromToken: {
    address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
    chainId: 1,
    symbol: 'USDC',
    name: 'USD Coin',
    decimals: 6
  },
  toToken: {
    address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
    chainId: 42161,
    symbol: 'USDC',
    name: 'USD Coin',
    decimals: 6
  },
  amount: '1000000'
})

// 4. Execute bridge (simulation)
const bridge = await callTool('execute_bridge', {
  fromChainId: 1,
  toChainId: 42161,
  fromToken: quote.fromToken,
  toToken: quote.toToken,
  amount: '1000000',
  recipientAddress: '0x742d35Cc6634C0532925a3b8D45c07F9624f8b4c',
  userAddress: '0x742d35Cc6634C0532925a3b8D45c07F9624f8b4c'
})

// 5. Track transaction status
const status = await callTool('get_transaction_status', {
  transactionHash: bridge.transactionHash,
  fromChainId: 1,
  toChainId: 42161
})
```

## Security Considerations

- **Simulation Only**: The `execute_bridge` tool only simulates transactions and returns transaction data. It does not execute real transactions.
- **Address Validation**: All addresses are validated before processing
- **Amount Validation**: Amounts are validated to prevent overflow errors
- **RPC Security**: Use secure RPC endpoints and API keys
- **Rate Limiting**: Implement rate limiting for production use

## Development

### Building

```bash
npm run build
```

### Testing

```bash
npm run test
```

### Linting

```bash
npm run lint
```

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests
5. Submit a pull request

## License

MIT License - see LICENSE file for details

## Support

For support and questions:

- GitHub Issues: [ValueRouter MCP Server Issues](https://github.com/valuerouter/mcp-server/issues)
- Discord: [ValueRouter Community](https://discord.gg/valuerouter)
- Documentation: [ValueRouter Docs](https://docs.valuerouter.com)

## Changelog

See [CHANGELOG.md](./CHANGELOG.md) for release history.

TDQS

B3.4/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clearly distinct purpose with no ambiguity: fee estimation, transaction execution, quote retrieval, chain/token support queries, status checking, and balance fetching. The descriptions clearly differentiate between informational queries (get_*) and action-oriented tools (estimate_*, execute_*), making misselection unlikely.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with clear, descriptive names. The naming convention is uniform throughout: estimate_bridge_fees, execute_bridge, get_bridge_quote, get_supported_chains, get_supported_tokens, get_transaction_status, get_user_balance. No mixing of styles or inconsistent verb usage is present.

Tool Count5/5

With 7 tools, this server is well-scoped for its bridge transaction domain. Each tool earns its place by covering distinct aspects of the bridging workflow: preparation (estimate, quote), execution (execute), information (chains, tokens, status, balance). The count is neither too thin nor bloated, fitting typical MCP server expectations.

Completeness4/5

The tool surface provides excellent coverage for core bridge transaction workflows: quote→estimate→execute→status, plus supporting queries for chains, tokens, and balances. The only minor gap is the lack of a tool for canceling or modifying transactions, but agents can work around this given the simulation-only nature of execute_bridge. Overall, it's nearly complete for the stated purpose.

Maintenance

ActivityInactive
ResponsivenessNo issues