fix: Use download_url from API response instead of constructing URL

CRITICAL BUG FIX - Resolves 404 errors when fetching configs from API

Root Cause:
The code was constructing download URLs manually:
  download_url = f"{API_BASE_URL}/api/download/{config_name}.json"

This fails because the API provides download_url in the response, which
may differ from the constructed path (e.g., CDN URLs, version-specific paths).

Solution:
Changed both MCP server implementations to use download_url from API:
  download_url = config_info.get("download_url")

Added validation check for missing download_url field.

Files Modified:
- src/skill_seekers/mcp/tools/source_tools.py (FastMCP server, line 285-297)
- src/skill_seekers/mcp/server_legacy.py (Legacy server, line 1483-1494)

Bug Report:
User reported: skill-seekers install --config godot --unlimited
- API check: /api/configs/godot → 200 OK 
- Download: /api/download/godot.json → 404 Not Found 

After Fix:
- Uses download_url from API response → Works correctly 

Testing:
 All 15 source tools tests pass (test_mcp_fastmcp.py::TestSourceTools)
 All 8 fetch_config tests pass
 test_fetch_config_download_api: PASSED
 test_fetch_config_from_source: PASSED

Impact:
- Fixes config downloads from official API (skillseekersweb.com)
- Fixes config downloads from private Git repositories
- Prevents all future 404 errors from URL construction mismatch
- No breaking changes - fully backward compatible

Related Issue: Bug reported by user when testing Godot skill

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
yusyus
2026-01-18 22:25:35 +03:00
parent e44977c8da
commit f1d97facbc
2 changed files with 20 additions and 4 deletions

View File

@@ -1479,8 +1479,16 @@ Next steps:
detail_response.raise_for_status()
config_info = detail_response.json()
# Download the actual config file
download_url = f"{API_BASE_URL}/api/download/{config_name}.json"
# Download the actual config file using the download_url from API response
download_url = config_info.get("download_url")
if not download_url:
return [
TextContent(
type="text",
text=f"❌ Config '{config_name}' has no download_url. Contact support.",
)
]
download_response = await client.get(download_url)
download_response.raise_for_status()
config_data = download_response.json()

View File

@@ -282,8 +282,16 @@ Next steps:
detail_response.raise_for_status()
config_info = detail_response.json()
# Download the actual config file
download_url = f"{API_BASE_URL}/api/download/{config_name}.json"
# Download the actual config file using the download_url from API response
download_url = config_info.get("download_url")
if not download_url:
return [
TextContent(
type="text",
text=f"❌ Config '{config_name}' has no download_url. Contact support.",
)
]
download_response = await client.get(download_url)
download_response.raise_for_status()
config_data = download_response.json()