get_changelog
Retrieve package changelog and release notes to understand version updates, new features, and breaking changes across npm and PyPI registries.
Instructions
Get changelog and release notes for a package.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| package | Yes | ||
| reasoning | Yes | ||
| registry | No | auto | |
| max_releases | No |
Implementation Reference
- src/searxng_mcp/changelog.py:61-102 (handler)Core implementation of the get_changelog tool handler in ChangelogFetcher class. Fetches repository from registry, gets GitHub releases, parses them, detects breaking changes, and returns structured changelog data.async def get_changelog(self, package: str, registry: str, max_releases: int = 5) -> dict: """Get changelog for a package.""" # Find repository repo_url = await self._find_repository(package, registry) if not repo_url: return {"error": "Could not find repository", "package": package} # Extract owner/repo owner, repo = self._parse_repo_url(repo_url) if not owner or not repo: return {"error": "Invalid repository URL", "package": package} # Fetch releases try: releases_data = await self.github.get_releases(owner, repo, max_releases) releases = [self.parser.parse_release(r) for r in releases_data] breaking_count = sum(len(r.breaking_changes) for r in releases) return { "package": package, "registry": registry, "repository": repo_url, "releases": [ { "version": r.version, "date": r.date, "notes": r.notes, "breaking_changes": r.breaking_changes, } for r in releases ], "summary": { "total_releases": len(releases), "breaking_changes_count": breaking_count, "recommendation": "Safe to upgrade" if breaking_count == 0 else f"{breaking_count} breaking change(s) - review carefully", }, } except Exception as e: return {"error": f"Failed to fetch releases: {e}", "package": package}
- src/searxng_mcp/server.py:1407-1457 (registration)MCP tool registration for 'get_changelog'. Wraps the core handler, handles parameters with annotations (schema), auto-detects registry, formats output as JSON string, and tracks usage.@mcp.tool() async def get_changelog( package: Annotated[str, "Package name (e.g., react, fastapi)"], reasoning: Annotated[str, "Why you're checking the changelog"], registry: Annotated[Literal["npm", "pypi", "auto"], "Package registry"] = "auto", max_releases: Annotated[int, "Maximum releases to fetch"] = 5, ) -> str: """Get changelog and release notes for a package.""" import json start_time = time.time() success = False error_msg = None result = "" detected_registry = registry try: # Auto-detect registry if registry == "auto": detected_registry = "npm" # Default to npm # Fetch changelog changelog = await changelog_fetcher.get_changelog(package, detected_registry, max_releases) result = json.dumps(changelog, indent=2, ensure_ascii=False) result = clamp_text(result, MAX_RESPONSE_CHARS) success = "error" not in changelog if not success: error_msg = changelog.get("error") except Exception as exc: error_msg = str(exc) result = f"Changelog fetch failed for {package}: {exc}" finally: response_time = (time.time() - start_time) * 1000 tracker.track_usage( tool_name="get_changelog", reasoning=reasoning, parameters={ "package": package, "registry": detected_registry, "max_releases": max_releases, }, response_time_ms=response_time, success=success, error_message=error_msg, response_size=len(result.encode("utf-8")), ) return result
- src/searxng_mcp/server.py:1591-1610 (registration)MCP resource registration for changelog access via URI pattern, reusing the core handler.@mcp.resource("changelog://{registry}/{package}") async def get_changelog_resource(registry: str, package: str) -> str: """ Get package changelog and release notes. URI format: changelog://{registry}/{package} Examples: - changelog://npm/react - changelog://pypi/fastapi """ import json if registry not in ("npm", "pypi"): return f"Unknown registry: {registry}. Supported: npm, pypi" try: changelog = await changelog_fetcher.get_changelog(package, registry, max_releases=5) return json.dumps(changelog, indent=2, ensure_ascii=False) except Exception as exc: # noqa: BLE001 return f"Failed to fetch changelog for '{package}': {exc}"
- src/searxng_mcp/server.py:42-42 (helper)Instantiation of ChangelogFetcher instance used by tool and resource.changelog_fetcher = ChangelogFetcher(github_client, registry_client)
- src/searxng_mcp/server.py:12-12 (helper)Import of ChangelogFetcher class.from .changelog import ChangelogFetcher