Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 102 additions & 6 deletions src/polymarket_mcp/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -311,9 +311,15 @@ async def fetch_gamma_markets(params: dict) -> list:

response = await client.get(url, params=params, headers=headers)
print(f"[DEBUG] Response status: {response.status_code}", file=sys.stderr)
print(f"[DEBUG] Response headers: {dict(response.headers)}", file=sys.stderr)

if response.status_code == 200:
try:
raw_content = response.text
print(f"[DEBUG] Raw response length: {len(raw_content)} chars", file=sys.stderr)
if len(raw_content) < 1000:
print(f"[DEBUG] Raw response: {raw_content[:500]}...", file=sys.stderr)

data = response.json()
print(f"[DEBUG] Response data type: {type(data)}", file=sys.stderr)

Expand All @@ -338,21 +344,30 @@ async def fetch_gamma_markets(params: dict) -> list:
markets = []

print(f"[DEBUG] Number of markets: {len(markets)}", file=sys.stderr)
if markets and len(markets) > 0:
print(f"[DEBUG] First market sample: {json.dumps(markets[0], indent=2)[:500]}...", file=sys.stderr)
return markets
except json.JSONDecodeError as e:
print(f"[DEBUG] JSON decode error: {e}", file=sys.stderr)
print(f"[DEBUG] Response text: {response.text[:500]}...", file=sys.stderr)
return []
else:
print(f"[DEBUG] Error response status: {response.status_code}", file=sys.stderr)
print(f"[DEBUG] Error response text: {response.text[:500]}...", file=sys.stderr)
return []
except httpx.TimeoutException:
print(f"[DEBUG] Request timed out after {TIMEOUT_SECONDS} seconds", file=sys.stderr)
return []
except httpx.NetworkError as e:
print(f"[DEBUG] Network error: {type(e).__name__}: {str(e)}", file=sys.stderr)
return []
except httpx.ConnectError as e:
print(f"[DEBUG] Connection error - unable to reach {GAMMA_API_URL}: {str(e)}", file=sys.stderr)
return []
except Exception as e:
print(f"[DEBUG] Unexpected error in fetch_gamma_markets: {type(e).__name__}: {str(e)}", file=sys.stderr)
import traceback
print(f"[DEBUG] Traceback: {traceback.format_exc()}", file=sys.stderr)
return []

async def fetch_gamma_market(market_id: str) -> dict:
Expand Down Expand Up @@ -390,6 +405,33 @@ async def fetch_gamma_market(market_id: str) -> dict:
print(f"[DEBUG] Error fetching market: {type(e).__name__}: {str(e)}", file=sys.stderr)
return {}

async def test_gamma_api_connectivity():
"""Test if Gamma API is reachable"""
print("[DEBUG] Testing Gamma API connectivity...", file=sys.stderr)
async with httpx.AsyncClient(timeout=5.0) as client:
try:
response = await client.get(f"{GAMMA_API_URL}/markets?limit=1")
if response.status_code == 200:
print(f"[DEBUG] ✅ Gamma API is reachable! Status: {response.status_code}", file=sys.stderr)
try:
data = response.json()
if isinstance(data, list) and len(data) > 0:
print(f"[DEBUG] ✅ API returned valid data. Sample market:", file=sys.stderr)
print(f"[DEBUG] ID: {data[0].get('id', 'N/A')}", file=sys.stderr)
print(f"[DEBUG] Title: {data[0].get('title', data[0].get('question', 'N/A'))}", file=sys.stderr)
print(f"[DEBUG] Active: {data[0].get('active', 'N/A')}", file=sys.stderr)
print(f"[DEBUG] Archived: {data[0].get('archived', 'N/A')}", file=sys.stderr)
except:
print(f"[DEBUG] ⚠️ API reachable but response format unexpected", file=sys.stderr)
else:
print(f"[DEBUG] ❌ Gamma API returned error status: {response.status_code}", file=sys.stderr)
except httpx.ConnectError as e:
print(f"[DEBUG] ❌ Cannot connect to Gamma API: {str(e)}", file=sys.stderr)
except httpx.TimeoutException:
print(f"[DEBUG] ❌ Gamma API connection timed out", file=sys.stderr)
except Exception as e:
print(f"[DEBUG] ❌ Unexpected error testing Gamma API: {type(e).__name__}: {str(e)}", file=sys.stderr)

@server.call_tool()
async def handle_call_tool(
name: str, arguments: dict | None
Expand Down Expand Up @@ -447,6 +489,7 @@ async def execute_tool():
# Handle sorting
params["order"] = arguments.get("order", "desc")

print(f"[DEBUG] Attempting to fetch from Gamma API...", file=sys.stderr)
markets_data = await fetch_gamma_markets(params)

if not markets_data:
Expand All @@ -460,13 +503,63 @@ async def execute_tool():
markets_data = await fetch_gamma_markets(minimal_params)

if not markets_data:
return [types.TextContent(
type="text",
text="Unable to fetch markets. The API may be temporarily unavailable or rate limited.\n\n"
"Please try again in a moment."
)]
print(f"[DEBUG] Gamma API failed, falling back to CLOB client", file=sys.stderr)
print(f"[DEBUG] ⚠️ WARNING: CLOB client may return outdated markets!", file=sys.stderr)

# Final fallback to CLOB client
try:
client = get_clob_client()
if client:
markets_data = client.get_markets()
print(f"[DEBUG] CLOB client returned data type: {type(markets_data)}", file=sys.stderr)

# Handle string response
if isinstance(markets_data, str):
try:
markets_data = json.loads(markets_data)
except json.JSONDecodeError:
return [types.TextContent(type="text", text="Error: Invalid response format from API")]

# Ensure we have a list
if not isinstance(markets_data, list):
if isinstance(markets_data, dict) and 'data' in markets_data:
markets_data = markets_data['data']
else:
return [types.TextContent(type="text", text="Error: Unexpected response format from API")]

# Apply manual filtering for CLOB response
if arguments.get("active", True):
markets_data = [m for m in markets_data if m.get('active', False)]

# Apply pagination
offset = arguments.get("offset", 0)
limit = arguments.get("limit", 10)
markets_data = markets_data[offset:offset + limit]

# Add warning to output
warning = "⚠️ WARNING: Showing cached data from CLOB client. These markets may be outdated.\n\n"
else:
return [types.TextContent(
type="text",
text="Unable to fetch markets. Both Gamma API and CLOB client are unavailable.\n\n"
"Please check:\n"
"1. Your internet connection\n"
"2. If Polymarket APIs are accessible from your location\n"
"3. Your API credentials in the .env file"
)]
except Exception as e:
print(f"[DEBUG] CLOB fallback failed: {str(e)}", file=sys.stderr)
return [types.TextContent(
type="text",
text=f"Error: Unable to fetch markets from any source.\n\n{str(e)}"
)]
else:
print(f"[DEBUG] Successfully fetched {len(markets_data)} markets from Gamma API", file=sys.stderr)
warning = ""

formatted_list = format_market_list(markets_data)
formatted_list = format_market_list(markets_data if isinstance(markets_data, list) else [])
if warning:
formatted_list = warning + formatted_list
return [types.TextContent(type="text", text=formatted_list)]

elif name == "get-market-prices":
Expand Down Expand Up @@ -521,6 +614,9 @@ async def main():
print(f"[DEBUG] Gamma API URL: {GAMMA_API_URL}", file=sys.stderr)
print(f"[DEBUG] Timeout: {TIMEOUT_SECONDS} seconds", file=sys.stderr)

# Test Gamma API connectivity
await test_gamma_api_connectivity()

# Initialize CLOB client early to catch any stdout output
print("[DEBUG] Initializing CLOB client...", file=sys.stderr)
get_clob_client()
Expand Down