get_official_package_info
Retrieve details about official Arch Linux repository packages, including Core and Extra, using local pacman or the archlinux.org API to ensure accurate package information.
Instructions
[DISCOVERY] Get information about an official Arch repository package (Core, Extra, etc.). Uses local pacman if available, otherwise queries archlinux.org API. Always prefer official packages over AUR when available.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | Yes | Exact package name |
Implementation Reference
- src/arch_ops_server/pacman.py:28-52 (handler)Main handler function implementing the tool logic: fetches official Arch Linux package information using local pacman query if available, otherwise remote API.async def get_official_package_info(package_name: str) -> Dict[str, Any]: """ Get information about an official repository package. Uses hybrid approach: - If on Arch Linux: Execute `pacman -Si` for local database query - Otherwise: Query archlinux.org API Args: package_name: Package name Returns: Dict with package information """ logger.info(f"Fetching info for official package: {package_name}") # Try local pacman first if on Arch if IS_ARCH and check_command_exists("pacman"): info = await _get_package_info_local(package_name) if info is not None: return info logger.warning(f"Local pacman query failed for {package_name}, trying remote API") # Fallback to remote API return await _get_package_info_remote(package_name)
- MCP tool schema definition: input validation schema specifying required 'package_name' string parameter.name="get_official_package_info", description="[DISCOVERY] Get information about an official Arch repository package (Core, Extra, etc.). Uses local pacman if available, otherwise queries archlinux.org API. Always prefer official packages over AUR when available.", inputSchema={ "type": "object", "properties": { "package_name": { "type": "string", "description": "Exact package name" } }, "required": ["package_name"] } ),
- src/arch_ops_server/server.py:1189-1192 (registration)Tool registration dispatch: calls the handler function in the MCP server's call_tool method.elif name == "get_official_package_info": package_name = arguments["package_name"] result = await get_official_package_info(package_name) return [TextContent(type="text", text=json.dumps(result, indent=2))]
- src/arch_ops_server/server.py:37-38 (registration)Import of the handler function into the MCP server module for registration.# Pacman functions get_official_package_info,
- src/arch_ops_server/pacman.py:91-169 (helper)Helper function for remote API query: fetches package details from archlinux.org API and handles errors.async def _get_package_info_remote(package_name: str) -> Dict[str, Any]: """ Query package info using archlinux.org API. Args: package_name: Package name Returns: Package info dict or error response """ params = { "name": package_name, "exact": "on" # Exact match only } try: async with httpx.AsyncClient(timeout=DEFAULT_TIMEOUT) as client: response = await client.get(ARCH_PACKAGES_API, params=params) response.raise_for_status() data = response.json() results = data.get("results", []) if not results: return create_error_response( "NotFound", f"Official package '{package_name}' not found in repositories" ) # Take first exact match (there should only be one) pkg = results[0] info = { "source": "remote", "name": pkg.get("pkgname"), "repository": pkg.get("repo"), "version": pkg.get("pkgver"), "release": pkg.get("pkgrel"), "epoch": pkg.get("epoch"), "description": pkg.get("pkgdesc"), "url": pkg.get("url"), "architecture": pkg.get("arch"), "maintainers": pkg.get("maintainers", []), "packager": pkg.get("packager"), "build_date": pkg.get("build_date"), "last_update": pkg.get("last_update"), "licenses": pkg.get("licenses", []), "groups": pkg.get("groups", []), "provides": pkg.get("provides", []), "depends": pkg.get("depends", []), "optdepends": pkg.get("optdepends", []), "conflicts": pkg.get("conflicts", []), "replaces": pkg.get("replaces", []), } logger.info(f"Successfully fetched {package_name} info remotely") return info except httpx.TimeoutException: logger.error(f"Remote package info fetch timed out for: {package_name}") return create_error_response( "TimeoutError", f"Package info fetch timed out for: {package_name}" ) except httpx.HTTPStatusError as e: logger.error(f"Remote package info HTTP error: {e}") return create_error_response( "HTTPError", f"Package info fetch failed with status {e.response.status_code}", str(e) ) except Exception as e: logger.error(f"Remote package info fetch failed: {e}") return create_error_response( "InfoError", f"Failed to get package info: {str(e)}" )