Skip to main content
Glama
layer-3

yellow-pro-mcp

by layer-3
README.md
# yellow-pro-mcp

English | [简体中文](README.zh-CN.md)

MCP server + CLI exposing the **yellow_pro** exchange to AI agents — Claude Code,
Codex CLI, Gemini CLI, Cursor, Hermes, OpenClaw, or any MCP client. Market data, account state, and
(when explicitly enabled) trading.

Follows the same conventions as the official OKX / Bybit / Alpaca exchange MCP
servers: local stdio process, credentials stay on your machine (environment
variables or your MCP client's local config — never sent anywhere else),
**read-only by default**, module filtering, built-in rate limiting, plus a CLI
and an agent skill file for non-MCP agents.

## Pairing onboarding preview

Pairing lets a Yellow Pro user connect a supported AI client without copying an API key or
secret. Generate a short-lived pairing code in Yellow Pro, then run:

```bash
yellow-pro connect yp_pair_... --client claude-code
```

The command:

1. Redeems the one-time code through Yellow Pro Auth.
2. Verifies the returned read-only credential against the trading API.
3. Stores it in a client-specific file under `~/.yellow/connections/` with owner-only permissions.
4. Registers `yellow-pro-mcp` without putting secrets in the AI client's config.

Paired client registrations enable the MCP trading tool surface by default with
`YELLOW_PRO_ENABLE_TRADING=true`. The exchange still enforces the credential's
scopes, so read-only pairing codes can read data but receive `insufficient_scope`
on trading calls.

Each client uses its own named profile and credential file. The profile defaults
to the client name:

```text
~/.yellow/connections/claude-code.json
~/.yellow/connections/codex.json
~/.yellow/connections/gemini.json
~/.yellow/connections/cursor.json
~/.yellow/connections/hermes.json
~/.yellow/connections/openclaw.json
```

Use `--profile NAME` when you need more than one connection for the same client.
The scopes reported by `connect` and `status` are captured at pairing time; use
`get_api_key_permissions` for live permissions after a UI change.

Restart the selected client after setup, then check the connection at any time:

```bash
yellow-pro status --profile claude-code
```

Remove the local credential with:

```bash
yellow-pro disconnect --profile claude-code
```

Local disconnect does not revoke the remote API key. Revoke it in Yellow Pro.
The preview supports Claude Code, Codex CLI, Gemini CLI, Cursor, Hermes, OpenClaw,
and read-only primary-account or sub-account credentials.
Use `--replace` to replace an existing local connection.

Production endpoints are built in. For UAT or another test deployment, provide
both service origins explicitly:

```bash
yellow-pro connect yp_pair_... --client claude-code \
  --auth-url https://auth.uat.yellow.pro.neodax.app \
  --api-url https://api.uat.yellow.pro.neodax.app
```

## One-liner install (for agents and humans)

Install from GitHub and register with Claude Code:

```bash
curl -fsSL -H 'Accept: application/vnd.github.raw+json' \
  'https://api.github.com/repos/layer-3/yellow-pro-mcp/contents/install.sh?ref=main' | bash && \
  YELLOW_PRO_API_KEY=... YELLOW_PRO_API_SECRET=... YELLOW_PRO_APP_SESSION_ID=... \
  yellow-pro setup claude-code
```

The installer checks Node.js >= 18, builds in a temporary directory, installs a
packed tarball globally, and removes the temporary files. If the system npm
prefix is not writable, it installs under `~/.local` instead. Inspect
`install.sh` before running it if your environment does not permit `curl | bash`.

Then register any MCP client with the installed server, for example Claude Code:

```bash
claude mcp add yellow_pro -s user \
  -e YELLOW_PRO_API_KEY=... -e YELLOW_PRO_API_SECRET=... -e YELLOW_PRO_APP_SESSION_ID=... \
  -- yellow-pro-mcp
```

The repo is public, so installation does not require GitHub credentials.

Multi-client setup — each registers the MCP server using your current
`YELLOW_PRO_*` environment:

```bash
yellow-pro setup claude-code   # via `claude mcp add` (user scope)
yellow-pro setup codex         # via `codex mcp add`, falls back to config.toml snippet
yellow-pro setup gemini        # via `gemini mcp add` (user scope)
yellow-pro setup cursor        # atomically merges ~/.cursor/mcp.json
yellow-pro setup hermes        # via `hermes mcp add`, falls back to config.yaml snippet
yellow-pro setup openclaw      # via `openclaw mcp add`
yellow-pro setup json          # prints generic MCP JSON for any other client
```

`npm i -g` (or a local checkout: `npm i -g /path/to/yellow_pro_mcp`) gives you two
commands: `yellow-pro-mcp` (MCP server) and `yellow-pro` (CLI).

### Manual config (any MCP client)

```toml
# Codex CLI (~/.codex/config.toml)
[mcp_servers.yellow_pro]
command = "yellow-pro-mcp"
env = { YELLOW_PRO_API_KEY = "...", YELLOW_PRO_API_SECRET = "...", YELLOW_PRO_APP_SESSION_ID = "..." }
```

```json
// OpenClaw (~/.openclaw/openclaw.json), Claude Desktop, Cursor, ...
{ "mcpServers": { "yellow_pro": { "command": "yellow-pro-mcp", "env": { "YELLOW_PRO_API_KEY": "..." } } } }
```

### Agent skill (non-MCP agents)

`skills/yellow-pro/SKILL.md` teaches agents to use the `yellow-pro` CLI — copy it
into your agent's skills directory (e.g. `~/.claude/skills/yellow-pro/`).

## Configuration

| Variable | Required | Default | Description |
|---|---|---|---|
| `YELLOW_PRO_BASE_URL` | no | production API | Explicit REST base URL override for testing |
| `YELLOW_PRO_SANDBOX` | no | `false` | When `true`, requires an explicit `YELLOW_PRO_BASE_URL` |
| `YELLOW_PRO_API_KEY` | private tools | — | API key |
| `YELLOW_PRO_API_SECRET` | private tools | — | API secret (HMAC-SHA256) |
| `YELLOW_PRO_APP_SESSION_ID` | private tools | — | app session id (`uid` credential) |
| `YELLOW_PRO_ENABLE_TRADING` | no | off | exactly `true` to enable trading tools/commands |
| `YELLOW_PRO_MODULES` | no | all | comma list of `market,account,trading` to filter tools |
| `YELLOW_PRO_RATE_LIMIT_MS` | no | `100` | min gap between requests (ms) |
| `YELLOW_PRO_PROFILE` | no | — | named credential profile under `~/.yellow/connections/` |
| `YELLOW_PRO_CONFIG_PATH` | no | — | explicit credential file path |

Trading tools are **not registered** unless `YELLOW_PRO_ENABLE_TRADING=true`.
Market data tools work without credentials.
An explicit `YELLOW_PRO_BASE_URL` takes precedence over sandbox mode.

## Tools

- **market**: `get_health`, `get_markets`, `get_ticker`, `get_orderbook`, `get_klines`,
  `get_funding_rate`, `get_funding_rate_history`, `get_networks`, `get_transfer_assets`
- **account**: `get_balance`, `get_open_orders`, `get_order_history`, `get_my_trades`,
  `get_positions`, `get_position_history`, `get_position_history_detail`,
  `get_spot_accounts`, `get_spot_account`, `get_perpetual_accounts`, `get_fee_schedule`,
  `get_fee_tier`, `get_market_fee_rate`, `get_transaction_history`, `get_funding_payments`
- **trading** (opt-in): `place_order`, `cancel_order`, `cancel_all_orders`,
  `close_positions`, `set_leverage`, `transfer`

Markets use native ids: spot `ETHUSDT`, perpetual `BTCUSDT-PERP`.
Amounts and prices are decimal strings. All results are raw exchange JSON.

`place_order` supports the same common single-order types for Spot and Perpetual:

- `limit`: requires `price`
- `market`: no `price`
- `post_only`: requires `price` and guarantees the order is maker-only
- `trigger_limit` (Stop Limit): requires both `trigger_price` and `price`
- `trigger_market` (Stop Market): requires `trigger_price`

Perpetual markets have a per-market **position mode**, listed under
`position_modes` in `get_perpetual_accounts`. In `HEDGE` mode a market holds
separate long and short legs and orders take `direction` `long`/`short`
(defaulting from `side`, flipped by `reduce_only`). In `ONE_WAY` mode a market
holds a single net position and the exchange requires `direction: "both"` —
pass it explicitly, it is never inferred. Switching modes is only available in
the yellow_pro web UI.

Perpetual trigger orders also accept the optional `trigger_type` value
`stop_loss` or `take_profit`. Order queries return the classified conditional
type, such as `stop_limit`, `stop_loss`, `take_limit`, or `take_profit`.
`cancel_order` accepts either the request type (`trigger_*`) or these returned
types and normalizes Spot cancellation.

Most list tools use the documented opt-in cursor protocol. Omit `cursor` for
the first request; the MCP sends `use_cursor=true`. Pass the returned
`next_cursor` to fetch the next page. `page_size` defaults to 50 and is capped
at 100. Fill-level position history is cursor-native: its first request omits
both `cursor` and `use_cursor`, and its documented `page_size` maximum is 500.

The `yellow-pro` CLI mirrors the same surface — `yellow-pro --help`.

## Agent operating guidelines

The MCP server sends a compact version of these rules to clients as its default
instructions:

- Call `get_markets` before trading to confirm market ids, precision, limits,
  leverage caps, and position modes.
- Amounts are decimal strings in the market's base asset, such as ETH for
  `ETHUSDT` or BTC for `BTCUSDT-PERP`. Prices are decimal strings in the quote
  asset, usually USDT.
- Check balances, open orders, and positions before any state-changing tool call.
- Spot and Perpetual balances are separate. Use `transfer` explicitly when funds
  need to move between Spot and Perps.
- Trading tools may be visible even when the credential is read-only. The
  exchange enforces API scopes. Scopes can change in the Yellow Pro UI without
  reconnecting, so call `get_api_key_permissions` before trading or after a UI
  permission change rather than relying on the scopes shown during onboarding.
- For tests, prefer small `post_only` or `limit` orders that rest on the book,
  then verify open orders and cancel/cleanup.
- Do not place market orders, close positions, or use bulk cancellation unless
  the user explicitly asks or confirms.
- For Perpetuals, `HEDGE` mode uses `direction: "long"` or `"short"`.
  `ONE_WAY` mode requires `direction: "both"`; confirm the mode before using it.

## Troubleshooting

**MCP client shows no tools / server fails to connect**

- Register through the CLI (`yellow-pro setup claude-code`, or `claude mcp add`
  directly) rather than editing config files by hand — Claude Code reads MCP config
  from `~/.claude.json`, not `~/.claude/settings.json`.
- The client spawns the server without loading your shell profile, so
  `yellow-pro-mcp` must be on the client's `PATH`. Check with `which yellow-pro-mcp`;
  if the installer printed a PATH hint, add that directory to your profile and
  restart the client.
- Restart the client after changing MCP config — servers connect at session start.
- Verify the server itself starts:

```bash
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' | yellow-pro-mcp
```

**Authentication errors (`invalid_api_key`, `invalid_timestamp`)**

- Private tools need all three of `YELLOW_PRO_API_KEY`, `YELLOW_PRO_API_SECRET`,
  `YELLOW_PRO_APP_SESSION_ID`, and they must match the environment you are hitting
  (`YELLOW_PRO_SANDBOX=true` keys do not work on production, and vice versa).
- `invalid_timestamp` means the machine clock is more than a few seconds off the
  exchange's — sync it (e.g. `sudo sntp -sS time.apple.com` on macOS, `chrony`/`ntp`
  on Linux).

**Trading commands fail with "trading is disabled"**

Set `YELLOW_PRO_ENABLE_TRADING=true` in the MCP client's env config. This is
intentional — do not work around it by calling the REST API directly.

## Risk warning

Trading involves risk of loss. Before use:

- **Protect your credentials** — grant API keys the minimum permissions needed and
  never commit them to source control.
- **Test on staging first** — run with `YELLOW_PRO_SANDBOX=true` against the staging
  environment before pointing at production.
- **Trading is off by default** — order/placement tools only exist when
  `YELLOW_PRO_ENABLE_TRADING=true`. Review every order the agent proposes before
  letting it through.
- **You are in control** — all actions are initiated by you or your AI assistant;
  the maintainers are not responsible for losses from agent behavior.

## Development

```bash
npm install
npm test          # signature vectors (cross-checked against the reference impl) + tool registration
npm run build
```

The endpoint and request contracts follow the current
[yellow_pro API documentation](https://docs.yellow.pro/api-and-programmatic-access/overview).
Not implemented on purpose: EIP-191/JWT auth and WebSocket streams.