|
|
|
|
|
""" |
|
|
Debug script to test MCP arXiv client with enhanced error handling. |
|
|
This script helps diagnose issues with MCP server connections and downloads. |
|
|
""" |
|
|
import os |
|
|
import sys |
|
|
import logging |
|
|
from pathlib import Path |
|
|
|
|
|
|
|
|
logging.basicConfig( |
|
|
level=logging.DEBUG, |
|
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' |
|
|
) |
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent)) |
|
|
|
|
|
from utils.mcp_arxiv_client import MCPArxivClient |
|
|
from utils.schemas import Paper |
|
|
from datetime import datetime |
|
|
|
|
|
|
|
|
def test_client_initialization(): |
|
|
"""Test client initialization and storage setup.""" |
|
|
print("\n" + "="*80) |
|
|
print("TEST 1: Client Initialization") |
|
|
print("="*80) |
|
|
|
|
|
try: |
|
|
client = MCPArxivClient(storage_path="./data/mcp_papers") |
|
|
print(f"β Client initialized successfully") |
|
|
print(f" Storage path: {client.storage_path}") |
|
|
print(f" Storage exists: {client.storage_path.exists()}") |
|
|
return client |
|
|
except Exception as e: |
|
|
print(f"β Client initialization failed: {str(e)}") |
|
|
import traceback |
|
|
traceback.print_exc() |
|
|
return None |
|
|
|
|
|
|
|
|
def test_search_papers(client): |
|
|
"""Test paper search functionality.""" |
|
|
print("\n" + "="*80) |
|
|
print("TEST 2: Search Papers") |
|
|
print("="*80) |
|
|
|
|
|
if not client: |
|
|
print("β Skipped - no client available") |
|
|
return [] |
|
|
|
|
|
try: |
|
|
papers = client.search_papers("machine learning", max_results=2) |
|
|
print(f"β Search completed successfully") |
|
|
print(f" Found {len(papers)} papers") |
|
|
for i, paper in enumerate(papers, 1): |
|
|
print(f" {i}. {paper.title[:60]}...") |
|
|
print(f" arXiv ID: {paper.arxiv_id}") |
|
|
return papers |
|
|
except Exception as e: |
|
|
print(f"β Search failed: {str(e)}") |
|
|
import traceback |
|
|
traceback.print_exc() |
|
|
return [] |
|
|
|
|
|
|
|
|
def test_download_paper(client, papers): |
|
|
"""Test paper download functionality.""" |
|
|
print("\n" + "="*80) |
|
|
print("TEST 3: Download Paper") |
|
|
print("="*80) |
|
|
|
|
|
if not client or not papers: |
|
|
print("β Skipped - no client or papers available") |
|
|
return |
|
|
|
|
|
paper = papers[0] |
|
|
print(f"Attempting to download: {paper.title[:60]}...") |
|
|
print(f"arXiv ID: {paper.arxiv_id}") |
|
|
print(f"Expected path: {client.storage_path / f'{paper.arxiv_id}.pdf'}") |
|
|
|
|
|
try: |
|
|
pdf_path = client.download_paper(paper) |
|
|
|
|
|
if pdf_path: |
|
|
print(f"β Download completed successfully") |
|
|
print(f" File path: {pdf_path}") |
|
|
print(f" File exists: {pdf_path.exists()}") |
|
|
if pdf_path.exists(): |
|
|
print(f" File size: {pdf_path.stat().st_size / 1024:.1f} KB") |
|
|
else: |
|
|
print(f"β Download returned None (check logs above for details)") |
|
|
print(f" This could indicate:") |
|
|
print(f" - MCP server error") |
|
|
print(f" - Storage path mismatch") |
|
|
print(f" - Network/API issue") |
|
|
|
|
|
except Exception as e: |
|
|
print(f"β Download failed with exception: {str(e)}") |
|
|
import traceback |
|
|
traceback.print_exc() |
|
|
|
|
|
|
|
|
def test_storage_contents(client): |
|
|
"""Check storage directory contents.""" |
|
|
print("\n" + "="*80) |
|
|
print("TEST 4: Storage Directory Contents") |
|
|
print("="*80) |
|
|
|
|
|
if not client: |
|
|
print("β Skipped - no client available") |
|
|
return |
|
|
|
|
|
try: |
|
|
pdf_files = list(client.storage_path.glob("*.pdf")) |
|
|
print(f"Storage path: {client.storage_path}") |
|
|
print(f"Total PDF files: {len(pdf_files)}") |
|
|
|
|
|
if pdf_files: |
|
|
print("\nFiles in storage:") |
|
|
for i, pdf_file in enumerate(pdf_files[:10], 1): |
|
|
size_kb = pdf_file.stat().st_size / 1024 |
|
|
print(f" {i}. {pdf_file.name} ({size_kb:.1f} KB)") |
|
|
|
|
|
if len(pdf_files) > 10: |
|
|
print(f" ... and {len(pdf_files) - 10} more files") |
|
|
else: |
|
|
print(" (no PDF files found)") |
|
|
|
|
|
except Exception as e: |
|
|
print(f"β Storage check failed: {str(e)}") |
|
|
import traceback |
|
|
traceback.print_exc() |
|
|
|
|
|
|
|
|
def main(): |
|
|
"""Run all diagnostic tests.""" |
|
|
print("\n") |
|
|
print("β" + "="*78 + "β") |
|
|
print("β" + " "*20 + "MCP arXiv Client Diagnostic Tool" + " "*26 + "β") |
|
|
print("β" + "="*78 + "β") |
|
|
|
|
|
|
|
|
print("\nEnvironment Configuration:") |
|
|
print(f" USE_MCP_ARXIV: {os.getenv('USE_MCP_ARXIV', 'not set')}") |
|
|
print(f" MCP_ARXIV_STORAGE_PATH: {os.getenv('MCP_ARXIV_STORAGE_PATH', 'not set')}") |
|
|
|
|
|
|
|
|
client = test_client_initialization() |
|
|
test_storage_contents(client) |
|
|
papers = test_search_papers(client) |
|
|
test_download_paper(client, papers) |
|
|
|
|
|
|
|
|
print("\n" + "="*80) |
|
|
print("DIAGNOSTIC SUMMARY") |
|
|
print("="*80) |
|
|
print("Review the logs above to identify any issues.") |
|
|
print("\nCommon issues and solutions:") |
|
|
print(" 1. 'Cannot mix str and non-str arguments' error:") |
|
|
print(" β Now handled with robust type checking in _call_tool") |
|
|
print(" 2. 'File not found after download':") |
|
|
print(" β Check MCP server storage path configuration") |
|
|
print(" β Review 'MCP response' logs to see what server returned") |
|
|
print(" 3. 'Connection failed':") |
|
|
print(" β Ensure MCP server is running and accessible") |
|
|
print(" β Check server command in logs") |
|
|
print("\n") |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |
|
|
|