Skip to main content
Glama

PyGithub MCP Server

by AstroMined
# Active Context ## Current Development Focus We're focused on implementing comprehensive test coverage improvements following ADR-002 principles while continuing to refine the modular tool architecture (ADR-006) and completing the Pydantic-First Architecture implementation (ADR-007). Key areas of current work: 1. Improving test coverage for high and medium priority modules 2. Implementing real API testing across all components (ADR-002) 3. Refining unit testing techniques without using mocks 4. Creating reusable test fixtures and patterns for integration testing 5. Maintaining the modular tool architecture (ADR-006) 6. Establishing patterns for testing future tool group implementations 7. Aligning test suite with Pydantic-First Architecture (ADR-007) ## Recent Changes ### Repository Operations Test Fixes - Fixed integration test failures in repository operations: - Fixed `test_update_file_integration` by properly distinguishing between file creation and update in `create_or_update_file()`: - Now uses `repository.update_file()` when a SHA is provided (for updates) - Uses `repository.create_file()` when no SHA is provided (for new files) - Fixed `test_push_files_error_handling` by adding proper validation: - Implemented early validation for empty file content - Improved error handling with explicit GitHubError exceptions - Enhanced error propagation for invalid content - Improved error handling in repository operations: - Added validation before making API calls - Enhanced defensive coding practices - Improved error message clarity ### Test Migration Plan Development - Created a comprehensive test migration plan to replace brittle unit tests with integration tests: - Documented all unit tests targeted for replacement with appropriate priorities - Designed a four-phase migration approach (Analysis, Development, Verification, Cleanup) - Created a module-by-module implementation plan with clear priorities - Established standard patterns for integration test development - Defined clear success criteria for the migration process - Identified risks and mitigation strategies for the migration - Created a timeline and resource allocation for the work - Developed a specialized coverage analysis tool for test migration: - Created `scripts/coverage/test_coverage_analyzer.py` for test-specific coverage - Implemented test case extraction and mapping functionality - Added support for comparing unit and integration test coverage - Created detailed reporting for coverage gaps between test suites - Implemented initial integration tests to replace unit tests: - Added `test_files_operations_integration.py` for file-related operations - Created `test_branch_operations_integration.py` for branch operations - Both follow real API testing principles from ADR-002 - Include robust error handling and API retry mechanisms ### Coverage Analysis Tool Improvements - Reorganized `analyze_coverage.py` into a proper Python package: - Created `scripts/coverage/` package with modular components - Implemented dedicated modules for parser, runner, models, and reports - Added comprehensive HTML reporting with test failure display - Created clean package structure with well-defined interfaces - Added explicit package exports in `__init__.py` - Fixed issues with the --run-integration flag in test collection - Created a direct module entry point using `__main__.py` - Fixed test grouping logic for accurate coverage reporting: - Improved directory structure handling for nested test paths - Fixed coverage calculation to properly include all tests - Added fallback grouping for tests with non-standard paths - Added detailed diagnostic logging to track test grouping - Added Jinja2 dependency for HTML report generation - Added real-time output display capability to debug test execution: - Implemented `--show-output` flag to display real-time test output - Fixed test execution to avoid duplicating test runs - Added proper handling for both captured and real-time output modes - Improved error messages and diagnostic information during test runs - Enhanced stability by properly handling None values in output processing ### Testing Infrastructure Improvements - Created a more maintainable and modular approach to coverage analysis: - Separated concerns with dedicated modules for each responsibility - Implemented a cleaner object model for coverage data - Enhanced HTML reporting with interactive features - Added proper packaging for easier imports - Fixed redundant --run-integration flag in test collection - Implemented readable priority categorization for modules ### Comprehensive Test Improvement Plan - Created detailed test improvement strategy with: - Coverage analysis for all modules with priority categorization - Specific line-level targeting for high-priority modules - Test pattern standardization using dataclasses instead of mocks - Implementation templates for unit and integration tests - Tooling for test generation and coverage analysis - CI/CD integration for test coverage reporting - Clear timeline and completion criteria ### Integration Test Standardization - Fixed skipped repository integration tests by standardizing environment variable handling - Created robust `test_cleanup` fixture with proper resource tracking and cleanup - Added standardized `with_retry` mechanism for all GitHub API calls to handle rate limits - Developed consistent pattern for test fixtures (test_owner, test_repo_name, unique_id) - Created comprehensive documentation in `tests/integration/README.md` with best practices and examples ### Test Maintenance & Error Handling Improvements - Fixed repository tests to match operation function signatures - Updated config tests to use DEFAULT_CONFIG for dynamic validation - Enhanced schema validation in repository models with strict mode - Added field validators for all critical string fields (path, branch, etc.) - Documented maintainable test strategies in system_patterns.md - Updated GitHubError constructor pattern documentation in .clinerules - Fixed all test failures for a clean test suite ### Repository Tools Implementation - Implemented Repository Tools Group as part of ADR-006 - Created `operations/repositories.py` with comprehensive repository operations - Implemented `tools/repositories/` module following modular architecture - Added support for repository management, file operations, and branch operations - Created extensive unit tests using dataclasses instead of mocks (ADR-002) - Added safe integration tests for read operations - Enabled repository tools group by default in configuration ### Pagination Implementation - Created unified pagination in `converters/common/pagination.py` - Implemented safe handling of GitHub's PaginatedList objects - Added comprehensive unit and integration tests - Fixed naming conflicts and improved error handling - Made list operations consistently use the pagination utility ## Next Steps 1. Fix Coverage Analysis Tool Issues: - Investigate and fix the inaccurate coverage report (currently showing 28% instead of expected ~90%) - Review coverage configuration in pyproject.toml and the tool - Add debug output to identify where the issue is occurring - Ensure all modules are properly included in coverage calculation - Verify the coverage data parsing logic in parser.py 2. Execute Enhanced Test Improvement Plan: - Phase 1: Complete dataclass framework for PyGithub objects - Phase 2: Improve tools/repositories/tools.py coverage (63% → 80%+) - Phase 2: Enhance repositories.py operations coverage (77% → 90%+) - Phase 3: Standardize remaining integration tests with fixtures - Phase 3: Create test generation scripts for rapid test creation 3. Expand Modular Architecture: - Implement additional tool groups (pull_requests, users, etc.) - Create consistent patterns for new tool groups - Develop configuration templates for different scenarios - Enhance modularity with pluggable architecture 4. Performance Optimization: - Optimize tool loading based on configuration - Implement lazy loading for tool groups - Add caching strategies for frequently accessed data - Improve memory usage for large number of tools 5. Documentation: - Create detailed guide for adding new tool groups - Document configuration best practices - Add examples for common configuration scenarios - Create architectural diagrams for better understanding ## Design Decisions ### 1. Modular Coverage Analysis Architecture - Organize code into well-defined responsibilities (runner, parser, reporting) - Use dataclasses for structured coverage data representation - Implement a Python package structure for proper imports - Provide direct module execution capability through __main__.py - Remove external entry points in favor of module-based execution ### 2. Modular Architecture Approach - Use decorator-based registration for tools - Organize tools by domain (issues, repositories, etc.) - Support selective enabling/disabling of tool groups - Maintain backward compatibility during transition ### 3. Configuration System Design - Support both file-based and environment variable configuration - Establish clear precedence rules for configuration sources - Provide sensible defaults for all settings - Document all configuration options clearly ### 4. Testing Strategy - Follow ADR-002's real API testing approach - Test configuration components without mocks - Create integration tests for tool functionality - Ensure proper cleanup of test resources ### 5. Code Organization - Group related tools in dedicated modules - Keep tool implementations separate from registration - Maintain clear separation between configuration and execution - Establish consistent patterns across all modules ## Implementation Lessons ### Integration Test Development Learnings - Integration tests require careful attention to environment setup: - Each test should create unique resources to avoid conflicts - Resource cleanup is essential to prevent test pollution - Rate limit handling is critical for reliable test execution - Tests must be resilient to network and API failures - Test design patterns should focus on real behaviors: - Each test should validate a specific behavior or scenario - Tests should be readable and maintainable - Standard fixtures improve consistency and reduce duplication - Error handling should be comprehensive and informative - Balancing test coverage with performance: - Group related test operations to minimize API calls - Use conditional requests with ETags to reduce rate limit impact - Organize tests to minimize setup/teardown overhead - Consider caching strategies for frequently accessed data ### Robust GitHub API Response Handling - GitHub API responses may have different structures in different contexts: - Some responses have direct properties (e.g., `result["commit"].message`) - Others use nested objects (e.g., `result["commit"].commit.message`) - Properties may sometimes be `None` or missing - Defensive coding practices are essential when accessing GitHub API responses: - Always check for attributes using `hasattr()` before accessing them - Provide fallbacks for when attributes are missing or `None` - Log the structure of API responses in debug mode for better troubleshooting - Use graceful degradation to maintain functionality even with incomplete data - Catch specific exceptions like AttributeError and KeyError to prevent cascading failures - Layer-specific error handling improves code robustness: - Operations layer should handle API response variations - Tools layer should present consistent response formats to clients - Logging should occur at both layers with appropriate detail levels ### Python Package Best Practices - Proper package structure improves import experience and usability - Direct module execution via __main__.py is cleaner than external scripts - Package exports in __init__.py make the API clear and discoverable - Separation of concerns with dedicated modules enhances maintainability - Good object model design simplifies data flow and transformation ### Coverage Analysis Challenges - Coverage calculation is sensitive to test execution approach - Existing .coverage data files can lead to inaccurate results - Direct coverage.py invocation may produce different results than pytest-cov - Coverage configuration in pyproject.toml needs careful alignment with analysis tools - Multiple coverage outputs (HTML, JSON, terminal) require careful configuration to avoid conflicts ### Datetime Handling and Testing Lessons - Function roles should be clearly differentiated and documented: - convert_iso_string_to_datetime: Parses ISO strings but doesn't enforce timezone awareness - ensure_utc_datetime: Handles timezone normalization and adding UTC timezone to naive datetimes - Tests should match actual function behavior rather than assumed behavior - Pydantic schema validation is the proper layer for enforcing data requirements (not utility functions) - Utility functions should be flexible to support various internal use cases - Test failures often indicate misunderstood function behavior rather than bugs ### Real API Testing (ADR-002) - Real API testing provides higher confidence than mocked tests - Test fixtures with proper cleanup prevent test pollution - Tests should focus on behaviors rather than implementation details - Dataclasses can replace mock objects for cleaner, type-safe tests - Context managers simplify test environment setup and teardown - Tests should respect class hierarchies and implementation details ### Modular Tool Architecture (ADR-006) - Decorator-based registration simplifies tool management - Dynamic import provides flexibility but requires careful error handling - Clear separation of concerns improves maintainability - Configuration-driven loading enables customization without code changes - Factory pattern in server.py centralizes server creation and configuration ### Pydantic-First Architecture (ADR-007) - Passing Pydantic models directly to operations improves type safety - Built-in Pydantic validation eliminates need for custom validation code - Validation happens automatically at model instantiation time - Reducing parameter unpacking/repacking improves maintainability - Clear ownership of validation in Pydantic models reduces duplication - No need for validation decorator since Pydantic handles it naturally ### PyGithub Integration Lessons - PyGithub's `get_issues()` doesn't directly accept per_page parameter - Need to handle pagination through PaginatedList objects instead - API behavior differs from documentation in some cases - Tests need to be resilient to real-world repository state

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/AstroMined/pygithub-mcp-server'

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