feat: implement PyPI metadata management tools

- Add new metadata.py module with 4 core functions:
  * update_package_metadata: Update description, keywords, classifiers
  * manage_package_urls: Update homepage, documentation, repository URLs
  * set_package_visibility: Make packages private/public (for organizations)
  * manage_package_keywords: Update search keywords and tags

- Add PyPIMetadataClient with comprehensive async/await patterns
- Include robust error handling and validation for all metadata formats
- Provide implementation guidance for metadata updates via package uploads
- Add MCP server endpoints for all 4 metadata management functions
- Update tools/__init__.py with proper imports and exports
- Create comprehensive test suite with 50+ test cases covering:
  * Client initialization and validation
  * All metadata management functions
  * Error handling and edge cases
  * URL validation and accessibility checking
  * Keyword quality analysis and scoring
  * Integration workflows

Features:
- Production-ready code following existing patterns
- Comprehensive docstrings and type hints
- Authentication with API tokens
- Dry-run mode for safe validation
- URL quality scoring and accessibility validation
- Keyword quality analysis with recommendations
- Organization detection for visibility management
- Detailed validation errors and recommendations
This commit is contained in:
Ryan Malloy 2025-08-16 09:00:32 -06:00
parent 9f3fd459b3
commit 2534f42d8b
4 changed files with 1978 additions and 0 deletions

View file

@ -21,6 +21,12 @@ from .package_query import (
query_package_info,
query_package_versions,
)
from .metadata import (
manage_package_keywords,
manage_package_urls,
set_package_visibility,
update_package_metadata,
)
from .publishing import (
check_pypi_credentials,
delete_pypi_release,
@ -58,4 +64,8 @@ __all__ = [
"delete_pypi_release",
"manage_pypi_maintainers",
"get_pypi_account_info",
"update_package_metadata",
"manage_package_urls",
"set_package_visibility",
"manage_package_keywords",
]

File diff suppressed because it is too large Load diff