๐Ÿ›  Developer Portal

๐Ÿ”Œ MCP Servers
65 tools across 3 servers โ€” connect to Claude Desktop, Claude Code, Cursor, or any MCP client. Two auth modes: browser OAuth (Claude Desktop / Cursor) or CF Access service token (programmatic).

๐Ÿ“Š Technical Analysis MCP

63 tools โ€” RSI, MACD, SMA/EMA, Bollinger, trend, momentum, multi-timeframe
ta-mcp.tradevoicelab.com

๐Ÿ” Search MCP

1 tool โ€” web search, news, financial research via SearXNG
search-mcp.tradevoicelab.com

๐Ÿค– Expert MCP

1 tool โ€” routes to any of 23 domain experts by name or auto-routing
experts-mcp.tradevoicelab.com
Option A โ€” Claude Desktop / Cursor (browser OAuth)

Add the portal URL to your MCP client config. On first use, a browser window opens to log in with your TradeVoice account โ€” then stays silent for 24 hours.

{
  "mcpServers": {
    "tradevoice": {
      "command": "npx",
      "args": ["-y", "mcp-remote@latest", "https://mcp.tradevoicelab.com/mcp"],
      "env": { "MCP_REMOTE_AUTH": "oauth" }
    }
  }
}
claude mcp add tradevoice --transport http https://mcp.tradevoicelab.com/mcp
# โ†’ browser opens once for OAuth login, then silent for 24h
{
  "mcpServers": {
    "tradevoice": {
      "command": "npx",
      "args": ["-y", "mcp-remote@latest", "https://mcp.tradevoicelab.com/mcp"],
      "env": { "MCP_REMOTE_AUTH": "oauth" }
    }
  }
}

Option B โ€” Programmatic / Python (CF Access service token)

Use your CF Access token (from the A2A section below) to call individual MCP servers directly โ€” no browser needed.

from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client

headers = {
    "CF-Access-Client-Id":     "your-client-id",   # from A2A section below
    "CF-Access-Client-Secret": "your-client-secret",
}

async with streamablehttp_client(
        "https://ta-mcp1.tradevoicelab.com/mcp", headers=headers) as (r, w, _):
    async with ClientSession(r, w) as session:
        await session.initialize()
        result = await session.call_tool("ta_trend_signals", {"symbol": "NVDA"})
        print(result.content[0].text)
Direct node URLs (pinned, no LB session issues): ta-mcp1 search-mcp1 experts-mcp1 (.tradevoicelab.com/mcp)
๐ŸŒ A2A Servers
Agent-to-Agent (A2A) protocol โ€” call TradeVoice servers from LangGraph, AutoGen, or any HTTP client. All A2A servers require a CF Access token in every request header.
๐Ÿ”‘ Step 1 โ€” Get your CF Access Token

One token works on both A2A servers. Generate it once, copy both values, and add them as headers on every request. The client secret is shown only once โ€” regenerate if lost.

Loadingโ€ฆ
1 token per account โ€” revoke to replace. Tokens do not expire.

๐Ÿค– Domain A2A Gateway
a2a.tradevoicelab.com

Route questions to 23 domain experts via A2A JSON-RPC. Use @expert_name to target a specific expert, or omit it and the router picks the best match.

๐Ÿ“Š technical_analyst
๐Ÿ“ˆ fundamental_analyst
โš ๏ธ risk_analyst
๐Ÿ’ฐ valuation_analyst
๐Ÿ” equity_analyst
๐Ÿ“‹ earnings_reviewer
๐ŸŽฏ options_analyst
๐Ÿฆ institutional_analyst
๐Ÿญ sector_analyst
๐ŸŒ economist
๐Ÿ“‰ chartist
๐Ÿ—“ trade_planner
๐ŸŒ… premarket_analyst
๐ŸŒ† postmarket_analyst
๐Ÿ“ฐ news_watcher
๐Ÿ”ฎ forecaster
๐Ÿ“Š market_analyst
๐Ÿ”Ž stock_analyst
๐Ÿ’ก investment_advisor
๐Ÿง  mental_model_advisor
๐Ÿ”„ second_thinker
๐ŸŒฆ weather_watcher
โš™๏ธ strategy_moderator
import httpx

headers = {
    "CF-Access-Client-Id":     "your-client-id",
    "CF-Access-Client-Secret": "your-client-secret",
}
async with httpx.AsyncClient(headers=headers) as client:
    r = await client.post(
        "https://a2a.tradevoicelab.com/experts/risk_analyst/a2a",
        json={"message": "@risk_analyst What is the downside risk for NVDA?"}
    )

๐Ÿ“ˆ Alpaca A2A
alpaca-a2a.tradevoicelab.com

27 trading actions on Alpaca Markets via A2A JSON-RPC. Requires both a CF Access token (above) and your own Alpaca API credentials passed per-request in the metadata. Use "demo": true to test with fixture data โ€” no real Alpaca account needed.

Account
get_account
get_portfolio_history
get_account_activities
Orders
get_orders / get_order
place_order
cancel_order / cancel_all
replace_order
Positions
get_positions / get_position
close_position / close_all
exercise_option
Market Data
get_market_quote
get_crypto_quote
get_bars / get_snapshot
get_market_clock
get_calendar
Options & Info
get_options_chain
get_options_expirations
get_screener / get_news
get_asset
get_watchlists / manage_watchlist
๐Ÿ” Alpaca API Credentials Get an Alpaca account โ†’

Your credentials are never stored on our side โ€” pass them in the metadata of every Alpaca A2A request:

r = await client.post(
    "https://alpaca-a2a.tradevoicelab.com/a2a/jsonrpc",
    json={
        "jsonrpc": "2.0", "id": 1, "method": "SendMessage",
        "params": {"message": {
            "role": "ROLE_USER", "messageId": "1", "contextId": "1",
            "parts": [{"text": "{\"action\": \"get_account\"}"}],
            "metadata": {
                "alpaca_api_key":    "YOUR_API_KEY",
                "alpaca_api_secret": "YOUR_API_SECRET",
                "alpaca_endpoint":   "https://paper-api.alpaca.markets/v2"
            }
        }}
    }
)
๐Ÿ“Š Usage
Loadingโ€ฆ