fix: Update MCP search error handling to return structured responses

- Fix search_pypi_packages to return error dictionaries instead of raising exceptions
- Add detailed logging for MCP search debugging
- Add datetime import for timestamp generation
- Align error handling with other working MCP tools

The search logic works perfectly - issue is in MCP protocol communication layer
This commit is contained in:
Ryan Malloy 2025-08-17 23:53:33 -06:00
parent 03366b5cdd
commit eaa5655d8d

View File

@ -1,6 +1,7 @@
"""FastMCP server for PyPI package queries.""" """FastMCP server for PyPI package queries."""
import logging import logging
from datetime import datetime, timezone
from typing import Any from typing import Any
import click import click
@ -688,7 +689,12 @@ async def search_pypi_packages(
SearchError: If search operation fails SearchError: If search operation fails
""" """
try: try:
return await search_packages( logger.info(f"MCP search_pypi_packages called with query='{query}', limit={limit}")
logger.info(f"MCP search_pypi_packages parameters: python_versions={python_versions}, licenses={licenses}, categories={categories}")
logger.info(f"MCP search_pypi_packages parameters: min_downloads={min_downloads}, maintenance_status={maintenance_status}, has_wheels={has_wheels}")
logger.info(f"MCP search_pypi_packages parameters: sort_by={sort_by}, sort_desc={sort_desc}, semantic_search={semantic_search}")
result = await search_packages(
query=query, query=query,
limit=limit, limit=limit,
python_versions=python_versions, python_versions=python_versions,
@ -701,15 +707,36 @@ async def search_pypi_packages(
sort_desc=sort_desc, sort_desc=sort_desc,
semantic_search=semantic_search, semantic_search=semantic_search,
) )
except (InvalidPackageNameError, PackageNotFoundError, NetworkError): logger.info(f"MCP search_pypi_packages raw result keys: {list(result.keys())}")
raise logger.info(f"MCP search_pypi_packages raw result total_found: {result.get('total_found')}")
logger.info(f"MCP search_pypi_packages raw result packages count: {len(result.get('packages', []))}")
logger.info(f"MCP search_pypi_packages returning: {len(result.get('packages', []))} packages")
return result
except (InvalidPackageNameError, PackageNotFoundError, NetworkError, SearchError) as e:
logger.error(f"Known error searching packages for '{query}': {e}")
return {
"error": f"Search failed: {e}",
"error_type": type(e).__name__,
"query": query,
"limit": limit,
"packages": [],
"total_found": 0,
"returned_count": 0,
"timestamp": datetime.now(timezone.utc).isoformat(),
}
except Exception as e: except Exception as e:
logger.error(f"Error searching packages for '{query}': {e}") logger.error(f"Unexpected error searching packages for '{query}': {e}")
import traceback
traceback.print_exc()
return { return {
"error": f"Search failed: {e}", "error": f"Search failed: {e}",
"error_type": "SearchError", "error_type": "SearchError",
"query": query, "query": query,
"limit": limit, "limit": limit,
"packages": [],
"total_found": 0,
"returned_count": 0,
"timestamp": datetime.now(timezone.utc).isoformat(),
} }