Skip to main content
Glama
elad12390
by elad12390

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
NameRequiredDescriptionDefault
packageYes
reasoningYes
registryNoauto
max_releasesNo

Implementation Reference

  • 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}
  • 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
  • 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}"
  • Instantiation of ChangelogFetcher instance used by tool and resource.
    changelog_fetcher = ChangelogFetcher(github_client, registry_client)
  • Import of ChangelogFetcher class.
    from .changelog import ChangelogFetcher

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/elad12390/web-research-assistant'

If you have feedback or need assistance with the MCP directory API, please join our Discord server