A lightweight Model Context Protocol (MCP) server for fetching TradingView chart snapshots. Uses Playwright for efficient browser automation with persistent sessions and cookie-based authentication.
Note: This uses Playwright because TradingView renders charts client-side with JavaScript/Canvas. There is no pure HTTP API for chart images. This is the lightest possible working solution (~150MB RAM vs ~500MB with Selenium).
- πͺΆ Lightweight: Playwright in headless mode (~150MB vs ~500MB with Selenium)
- π Fast: Persistent browser reuse, 3-5 seconds per chart
- π Secure: Session-based authentication via cookies
- π¨ Customizable: Configure chart dimensions, intervals, and themes
- π§ MCP Compatible: Works with any MCP-enabled client (Claude Desktop, etc.)
- β»οΈ Efficient: Reuses browser instances across multiple requests
- Python 3.10 or higher
- A TradingView account (free or paid)
- TradingView session cookies
- Installation
- Quick Start
- Usage
- Configuration
- Available Tools
- Symbol Format
- Troubleshooting
- Performance
- Contributing
git clone https://github.com/yourusername/tradingview-mcp.git
cd tradingview-mcp# Windows
python -m venv venv
.\venv\Scripts\activate
# Linux/Mac
python3 -m venv venv
source venv/bin/activatepip install -r requirements.txt
# Install Playwright browsers (one-time setup, ~150MB download)
python -m playwright install chromium-
Copy
.env.exampleto.env:# Windows copy .env.example .env # Linux/Mac cp .env.example .env
-
Get your TradingView session cookies:
- Log into TradingView in your browser
- Press F12 to open Developer Tools
- Go to Application tab (Chrome) or Storage tab (Firefox)
- Navigate to Cookies >
https://www.tradingview.com - Find and copy these two cookie values:
sessionidβ Copy the entire valuesessionid_signβ Copy the entire value
β οΈ Important: Copy the full values including any special characters (slashes, equals signs, etc.). Don't add quotes or extra spaces. -
Edit
.envand paste your values:TRADINGVIEW_SESSION_ID=your_actual_session_id_here TRADINGVIEW_SESSION_ID_SIGN=your_actual_session_id_sign_here
Example (with fake values):
TRADINGVIEW_SESSION_ID=47zlhkbl2weohrhmjgufeg1o24droaod TRADINGVIEW_SESSION_ID_SIGN=v3:6S2OD9ta349/yqN0RdCeK3UKxTl/tJr4AOoPRUa0Crk=
Create a test file test.py:
import asyncio
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent / "src"))
from dotenv import load_dotenv
load_dotenv()
from tradingview_mcp.server import get_chart_snapshot
async def test():
image = await get_chart_snapshot("BINANCE:BTCUSDT", "D", 1200, 600, "dark")
if image:
Path("test_chart.png").write_bytes(image)
print(f"β
Success! Chart saved to test_chart.png ({len(image)} bytes)")
else:
print("β Failed to fetch chart")
asyncio.run(test())Run it:
python test.pyIf successful, you'll see test_chart.png with a Bitcoin chart!
After installation, test the server:
python src/tradingview_mcp/server.pyThe server will start and wait for MCP client connections via stdio.
Add this to your Claude Desktop config file:
Windows: %APPDATA%\Claude\claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json
Option 1: Using .env file (Recommended)
{
"mcpServers": {
"tradingview": {
"command": "python",
"args": ["C:\\path\\to\\tradingview-mcp\\src\\tradingview_mcp\\server.py"],
"cwd": "C:\\path\\to\\tradingview-mcp"
}
}
}Option 2: Inline credentials
{
"mcpServers": {
"tradingview": {
"command": "python",
"args": ["C:\\path\\to\\tradingview-mcp\\src\\tradingview_mcp\\server.py"],
"env": {
"TRADINGVIEW_SESSION_ID": "your_session_id",
"TRADINGVIEW_SESSION_ID_SIGN": "your_session_id_sign"
}
}
}
}π‘ Tip: Use absolute paths. On Windows, use double backslashes
\\or forward slashes/.
Restart Claude Desktop and you'll see the TradingView tools available!
Once configured, you can ask Claude:
- "Get me a daily chart of Bitcoin"
- "Show me AAPL on 1-hour timeframe"
- "Fetch a weekly chart for NASDAQ:TSLA with light theme"
- "Get BINANCE:ETHUSDT 5-minute chart"
- "Validate my TradingView session"
- "What timeframes are available?"
Fetch a TradingView chart snapshot.
Parameters:
symbol(required): Trading pair in TradingView format- Examples:
"BINANCE:BTCUSDT","NASDAQ:AAPL","BITSTAMP:BTCUSD"
- Examples:
interval(optional): Chart timeframe (default:"D")- Minutes:
"1","5","15","30","60","240" - Days/Weeks/Months:
"D","W","M"
- Minutes:
width(optional): Image width in pixels (default:1200)height(optional): Image height in pixels (default:600)theme(optional):"dark"or"light"(default:"dark")
Example:
Get me a daily chart of Bitcoin on Binance
Check if your TradingView session credentials are valid.
Example:
Validate my TradingView session
List all available chart timeframes/intervals.
Example:
What timeframes are available?
TradingView uses the format: EXCHANGE:SYMBOL
| Symbol | Description |
|---|---|
BINANCE:BTCUSDT |
Bitcoin/USDT on Binance |
NASDAQ:AAPL |
Apple Inc. on NASDAQ |
NYSE:TSLA |
Tesla Inc. on NYSE |
BITSTAMP:BTCUSD |
Bitcoin/USD on Bitstamp |
FX:EURUSD |
EUR/USD forex pair |
COINBASE:ETHUSD |
Ethereum/USD on Coinbase |
- Go to TradingView
- Search for your desired asset
- Look at the URL or chart title for the format
EXCHANGE:SYMBOL
This MCP server uses Playwright for lightweight browser automation:
- Authentication: Session cookies passed to browser context
- Chart Generation: Playwright navigates to TradingView and captures screenshots
- Efficiency: Persistent browser instances reused across requests
- MCP Protocol: Communicates via stdio with MCP clients
Why Playwright (Not Pure HTTP)?
- TradingView renders charts client-side with JavaScript/Canvas
- No server-side API exists for chart image generation
- Playwright is lighter than Selenium (~150MB vs ~500MB RAM)
- Headless mode with optimized flags minimizes resource usage
- Browser reuse makes subsequent requests very fast (1-2 seconds)
β This is the lightest possible approach for TradingView charts
Problem: "Session credentials are not working" or "Invalid session"
Solutions:
-
Check for trailing commas or spaces: Make sure your
.envfile has no extra characters# β Wrong (has comma) TRADINGVIEW_SESSION_ID=abc123, # β Correct TRADINGVIEW_SESSION_ID=abc123
-
Refresh cookies: Session cookies expire after ~30 days
- Log out and back into TradingView
- Get fresh cookies from Developer Tools
- Update your
.envfile
-
Check you're logged in: Make sure you're logged into TradingView when copying cookies
-
Copy entire value: Include special characters (=, /, :, etc.)
Problem: "Failed to fetch chart snapshot"
Solutions:
-
Use correct format:
EXCHANGE:SYMBOL(all uppercase)- β
BINANCE:BTCUSDT - β
btcusdtorbinance:btcusdt
- β
-
Verify symbol exists on TradingView.com
-
Test with a known symbol first:
BINANCE:BTCUSDTorNASDAQ:AAPL
Problem: "Timeout exceeded" or slow performance
Solutions:
- Check internet connection and TradingView.com accessibility
- First request takes longer (5-8s) while browser starts
- Subsequent requests are faster (3-5s) due to browser reuse
- If persistent, restart the MCP server
Problem: "Playwright not found" or browser download fails
Solutions:
# Reinstall Playwright
pip uninstall playwright
pip install playwright
# Install browsers again
python -m playwright install chromium
# If still failing, install system dependencies (Linux)
sudo playwright install-depsProblem: Tools don't appear in Claude Desktop
Solutions:
- Check JSON syntax in config file (use a JSON validator)
- Use absolute paths (not relative)
- Verify Python path is correct:
# Windows where python # Mac/Linux which python
- Completely restart Claude Desktop (not just reload)
- Check Claude logs for errors:
- Windows:
%APPDATA%\Claude\logs\ - Mac:
~/Library/Logs/Claude/
- Windows:
Problem: High memory usage or slow responses
Tips:
- Memory usage: ~150MB is normal for Playwright
- First chart: 5-8 seconds (browser startup)
- Subsequent charts: 3-5 seconds
- Browser is reused across requests for efficiency
- If memory grows over time, restart the server
| Metric | Value | Notes |
|---|---|---|
| Memory Usage | ~150MB | Playwright headless browser |
| First Request | 5-8 seconds | Browser startup + chart load |
| Subsequent Requests | 3-5 seconds | Browser reuse (persistent) |
| Image Size | 50-200KB | PNG format, varies by dimensions |
| Browser | Chromium | ~150MB download (one-time) |
Comparison with Alternatives:
| Approach | Memory | Speed | Status |
|---|---|---|---|
| Pure HTTP | ~50MB | 1-2s | β Impossible (no API exists) |
| Selenium | ~500MB | 10-15s | |
| Playwright | ~150MB | 3-5s | β Best option |
β οΈ Never commit your.envfile - it contains your session credentialsβ οΈ Don't share your session cookies - they provide full account accessβ οΈ Rotate cookies regularly - they expire after ~30 days- β
.envis in.gitignoreby default - β Use environment variables or secure credential management in production
tradingview-mcp/
βββ src/
β βββ tradingview_mcp/
β βββ __init__.py
β βββ server.py # Main MCP server
βββ .env.example # Template for credentials
βββ .gitignore
βββ README.md
βββ requirements.txt # Python dependencies
βββ pyproject.toml # Project metadata
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
pytest# Format code
black src/
# Lint code
ruff check src/Contributions are welcome! Here's how:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Test thoroughly
- Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Development Setup:
pip install -e ".[dev]"
black src/
ruff check src/MIT License - see LICENSE file for details.
- TradingView - Excellent charting platform
- Anthropic - Model Context Protocol
- Playwright - Browser automation
This is an unofficial tool and is not affiliated with, endorsed by, or connected to TradingView. Use at your own risk and in accordance with TradingView's Terms of Service. Respect rate limits and be mindful of your usage.
- π Bug Reports: GitHub Issues
- π¬ Questions: GitHub Discussions
- π§ Email: your.email@example.com
- Version: 0.1.0
- Python: 3.10+
- Memory: ~150MB
- Response Time: 3-5 seconds
- License: MIT
Made with β€οΈ by the trading community
Star β this repo if you find it useful!