package_info
Get detailed information about a specific package from PyPI, npm, crates.io, or Terraform Registry, including the latest version or a specific version.
Instructions
Get detailed information about a specific package
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | Package index to query (pypi, npm, crates, terraform) | |
| name | Yes | Package name | |
| version | No | Specific version to get info for (default: latest) |
Implementation Reference
- src/mcp_server_pacman/server.py:274-316 (handler)The call_tool handler for 'package_info' - validates arguments via PackageInfo model, dispatches to the appropriate provider function (get_pypi_info, get_npm_info, get_crates_info, get_terraform_module_info) based on the index field, and returns the result as a TextContent response.
elif name == "package_info": try: args = PackageInfo(**arguments) logger.debug(f"Validated package info args: {args}") except ValueError as e: logger.error(f"Invalid package info parameters: {str(e)}") raise McpError(ErrorData(code=INVALID_PARAMS, message=str(e))) logger.info( f"Getting package info for {args.name} on {args.index}" + (f" (version={args.version})" if args.version else "") ) if args.index == "pypi": info = await get_pypi_info(args.name, args.version) elif args.index == "npm": info = await get_npm_info(args.name, args.version) elif args.index == "crates": info = await get_crates_info(args.name, args.version) elif args.index == "terraform": if args.version: logger.info( "Version-specific info for Terraform modules is not supported yet" ) info = await get_terraform_module_info(args.name) else: logger.error(f"Unsupported package index: {args.index}") raise McpError( ErrorData( code=INVALID_PARAMS, message=f"Unsupported package index: {args.index}", ) ) logger.info( f"Successfully retrieved package info for {args.name} on {args.index}" ) return [ TextContent( type="text", text=f"Package information for {args.name} on {args.index}:\n{json.dumps(info, indent=2)}", ) ] - PackageInfo Pydantic model defining the input schema for the 'package_info' tool. Fields: index (Literal['pypi','npm','crates','terraform']), name (str), version (Optional[str], default None).
class PackageInfo(BaseModel): """Parameters for getting package information.""" index: Annotated[ Literal["pypi", "npm", "crates", "terraform"], Field(description="Package index to query (pypi, npm, crates, terraform)"), ] name: Annotated[str, Field(description="Package name")] version: Annotated[ Optional[str], Field( default=None, description="Specific version to get info for (default: latest)", ), ] - src/mcp_server_pacman/server.py:75-78 (registration)Registration of the 'package_info' tool in the list_tools handler, with name='package_info', description and inputSchema derived from PackageInfo.model_json_schema().
Tool( name="package_info", description="Get detailed information about a specific package", inputSchema=PackageInfo.model_json_schema(), - src/mcp_server_pacman/models/__init__.py:1-17 (registration)PackageInfo re-exported from the models package's __init__.py for convenient import.
"""Data models for mcp-server-pacman.""" from .package_models import ( PackageSearch, PackageInfo, DockerImageSearch, DockerImageInfo, TerraformModuleLatestVersion, ) __all__ = [ "PackageSearch", "PackageInfo", "DockerImageSearch", "DockerImageInfo", "TerraformModuleLatestVersion", ] - get_pypi_info - provider function called when index='pypi'. Fetches package details from PyPI JSON API.
@async_cached(http_cache) async def get_pypi_info(name: str, version: Optional[str] = None) -> Dict: """Get information about a package from PyPI.""" async with httpx.AsyncClient() as client: url = f"https://pypi.org/pypi/{name}/json" if version: url = f"https://pypi.org/pypi/{name}/{version}/json" response = await client.get( url, headers={"Accept": "application/json", "User-Agent": DEFAULT_USER_AGENT}, follow_redirects=True, ) if response.status_code != 200: raise McpError( ErrorData( code=INTERNAL_ERROR, message=f"Failed to get package info from PyPI - status code {response.status_code}", ) ) try: data = response.json() result = { "name": data["info"]["name"], "version": data["info"]["version"], "description": data["info"]["summary"], "author": data["info"]["author"], "homepage": data["info"]["home_page"], "license": data["info"]["license"], "releases": list(data["releases"].keys()), } return result except Exception as e: raise McpError( ErrorData( code=INTERNAL_ERROR, message=f"Failed to parse PyPI package info: {str(e)}", ) )