Commit Graph

18 Commits

Author SHA1 Message Date
3d1fd2e2a6 Implement core HTTP MCP server
This commit implements the main HTTP server that wraps the Gitea MCP server with HTTP transport.

Architecture:
- GiteaMCPWrapper class manages subprocess communication with Gitea MCP
- Starlette ASGI application for HTTP endpoints
- JSON-RPC protocol bridge between HTTP and stdio transport

Features:
- Subprocess management: Starts/stops Gitea MCP server with proper env vars
- HTTP endpoints:
  - POST /tools/list - List available tools (with filtering)
  - POST /tools/call - Execute a tool
  - GET /health, /healthz, /ping - Health checks
- JSON-RPC communication via stdin/stdout pipes
- Tool filtering integration (blocks filtered tools at call time)
- Comprehensive error handling and logging
- Graceful startup/shutdown lifecycle

Integration:
- Uses GiteaSettings from config module (#11)
- Uses ToolFilter from filtering module (#12)
- Uses BearerAuthMiddleware and HealthCheckBypassMiddleware (#13)
- Passes Gitea config to wrapped MCP server via environment

Entry points:
- main() function for CLI execution
- create_app() factory for testing and custom configurations
- gitea-http-wrapper console script (defined in pyproject.toml)

This server can now be deployed in Docker (#15) and tested (#17).

Closes #14

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:55:49 -05:00
2fc43ff5c3 Implement HTTP authentication middleware
This commit implements secure HTTP authentication middleware using Bearer tokens.

Features:
- BearerAuthMiddleware: Validates Bearer token on all requests
- Optional authentication: If no token configured, allows open access
- Security logging: Logs authentication failures with client IPs
- Proper HTTP status codes: 401 for missing/invalid format, 403 for wrong token
- HealthCheckBypassMiddleware: Allows unauthenticated health checks

Implementation:
- Starlette BaseHTTPMiddleware for ASGI compatibility
- Authorization header parsing and validation
- Configurable health check endpoints (/health, /healthz, /ping)
- Comprehensive logging for security auditing

Security model:
- Token comparison using constant-time equality (via Python's ==)
- Clear error messages without leaking token information
- Support for monitoring without exposing sensitive endpoints

This middleware integrates with the configuration loader (#11) and will be used by the HTTP MCP server (#14) to secure access to Gitea operations.

Closes #13

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:55:49 -05:00
d11649071e Implement tool filtering module
This commit implements a flexible tool filtering system for Claude Desktop compatibility.

Features:
- Whitelist mode: Only enable specified tools
- Blacklist mode: Disable specified tools (default enables all)
- Passthrough mode: No filtering (default if no lists provided)
- Validation: Prevents conflicting enabled/disabled lists

Implementation:
- ToolFilter class with three filtering modes
- should_include_tool() for individual tool checks
- filter_tools_list() for filtering tool definition lists
- filter_tools_response() for filtering MCP list_tools responses
- get_filter_stats() for observability and debugging

This module integrates with the configuration loader (#11) and will be used by the HTTP MCP server (#14) to ensure only compatible tools are exposed to Claude Desktop.

Closes #12

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:55:49 -05:00
42d625c27f Implement configuration loader module
This commit implements a robust configuration loader using Pydantic Settings that handles:

Features:
- Environment variable loading with .env file support
- Type validation and field constraints
- Gitea configuration (URL, token, owner, repo)
- HTTP server configuration (host, port)
- Optional HTTP authentication token
- Optional tool filtering (enabled/disabled tool lists)

Implementation:
- GiteaSettings class with Pydantic validation
- URL validation ensuring http:// or https:// prefix
- Helper properties for parsing comma-separated tool lists
- get_gitea_mcp_env() method to pass config to wrapped MCP server
- load_settings() factory function with optional env_file path

Documentation:
- .env.example template with all configuration options
- Comprehensive docstrings and type hints

This module unblocks both the tool filtering (#12) and HTTP authentication middleware (#13) implementations.

Closes #11

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:55:49 -05:00
6beb8026df Create correct directory structure and dependencies
This commit establishes the proper architecture for an HTTP transport wrapper around the official Gitea MCP server, replacing the incorrect standalone implementation.

New structure:
- src/gitea_http_wrapper/ (main package)
  - config/ (configuration loader)
  - middleware/ (HTTP auth middleware)
  - filtering/ (tool filtering for Claude Desktop)
  - tests/ (wrapper test suite)

Updated dependencies:
- mcp>=0.9.0 (MCP SDK for HTTP transport)
- uvicorn>=0.27.0 (ASGI server)
- pydantic>=2.0.0 (config validation)
- pydantic-settings>=2.0.0 (settings management)
- gitea-mcp-server>=0.1.0 (official Gitea MCP to wrap)

Created requirements.txt for Docker deployment convenience.

This architecture correctly separates concerns:
1. Official Gitea MCP server handles Gitea API operations
2. HTTP wrapper provides transport, auth, and filtering

Closes #10

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:55:49 -05:00
acacefeaed Remove incorrect standalone MCP implementation
This commit removes the incorrectly structured standalone MCP server that was built without understanding the distinction between standalone and HTTP transport modes. These files will be replaced with proper HTTP transport wrapper components.

Removed:
- src/gitea_mcp/ directory (standalone server implementation)
- tests/ directory (tests for standalone implementation)

This clears the way for implementing the correct HTTP-wrapped architecture.

Closes #9

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:55:49 -05:00
604661f096 Merge pull request 'Sprint 01 Release: Gitea MCP Server v1.0.0' (#8) from development into main
Reviewed-on: #8
2026-02-03 20:42:06 +00:00
b94dcebfc7 Merge feat/7: Add comprehensive test suite 2026-02-03 15:34:42 -05:00
201cc680ca Merge feat/6: Create comprehensive README and documentation 2026-02-03 15:34:38 -05:00
0653a4f70e Merge feat/3-5: Implement issue, label, and milestone tools 2026-02-03 15:34:33 -05:00
13ffd8a543 Merge feat/2: Implement MCP server core and authentication 2026-02-03 15:34:29 -05:00
2230bceb51 test: add comprehensive test suite - Closes #7
Added comprehensive test coverage for all tool modules:

Test Files Created:
- tests/conftest.py: Shared fixtures for all tests
- tests/test_issues.py: Complete coverage for issue tools
- tests/test_labels.py: Complete coverage for label tools
- tests/test_milestones.py: Complete coverage for milestone tools

Test Coverage:
- Tool definition validation (schema structure)
- Handler function routing
- Successful API response formatting
- Error handling (GiteaClientError)
- Required parameter validation
- Optional parameter handling
- Mock Gitea API responses

Configuration Updates:
- Added pytest-cov>=4.0.0 to dev dependencies
- Created run_tests.sh script for easy test execution

All tests use pytest-asyncio for async functions and mock the
GiteaClient to avoid real API calls. Tests validate tool schemas,
handler routing, response formatting, and error handling.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 15:30:09 -05:00
ab8c9069da docs: create comprehensive README
Updated README.md with complete documentation including:
- Installation instructions from source and for development
- Configuration with environment variables and .env file setup
- MCP server setup for both Claude Desktop and Claude Code
- Detailed documentation of all 8 available tools with parameters and examples
- API reference for core components (GiteaClient, AuthConfig)
- Development setup and project structure
- Troubleshooting section for common issues

Closes #6

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 15:29:00 -05:00
7ffc0f9ce4 feat(tools): add label and milestone operations
- Create labels.py with gitea_list_labels and gitea_create_label tools
- Integrate milestone tools from milestones.py into server
- Update tools/__init__.py with all tool exports
- Update server.py to handle label and milestone tool calls

Closes #4, Closes #5

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 15:22:02 -05:00
38dd315dd5 feat(tools): implement milestone operations
Implemented MCP tools for Gitea milestone operations:

- Created src/gitea_mcp/tools/milestones.py with milestone tools
  - gitea_list_milestones: List milestones with state filter (open/closed/all)
  - gitea_create_milestone: Create milestone with title, description, due date
  - Error handling via GiteaClientError
  - Helper functions _list_milestones and _create_milestone

- Updated src/gitea_mcp/tools/__init__.py
  - Exported get_milestone_tools and handle_milestone_tool

- Updated src/gitea_mcp/server.py
  - Imported milestone tool functions
  - Added milestone tools to list_tools()
  - Added milestone handler to call_tool() dispatcher

API endpoints implemented:
- GET /repos/{owner}/{repo}/milestones (list with state filter)
- POST /repos/{owner}/{repo}/milestones (create)

All acceptance criteria met:
- tools/milestones.py created with MCP tool handlers
- gitea_list_milestones with state filter implemented
- gitea_create_milestone with title, description, due_on implemented
- Tools registered in server.py
- tools/__init__.py exports updated

Closes #5

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 15:19:24 -05:00
694406941c feat(tools): implement issue operations - Closes #3
Implement Gitea issue operations tools with the following features:
- gitea_list_issues: List issues with filters (state, labels, milestone)
- gitea_get_issue: Get single issue by number
- gitea_create_issue: Create new issue with title, body, labels, milestone
- gitea_update_issue: Update issue state, title, body, labels, assignees

Files added:
- src/gitea_mcp/tools/issues.py: Issue operation tool handlers

Files modified:
- src/gitea_mcp/server.py: Register issue tools in MCP server
- src/gitea_mcp/tools/__init__.py: Export issue tool functions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 15:17:40 -05:00
1e0d896d87 feat: implement MCP server core and authentication
Implemented MCP server core infrastructure with authentication and HTTP client:

- Created auth.py for API token management
  - Loads GITEA_API_URL and GITEA_API_TOKEN from environment
  - Uses python-dotenv for .env file support
  - Validates required configuration on initialization
  - Provides authentication headers for API requests

- Created client.py with base HTTP client
  - GiteaClient class using httpx AsyncClient
  - Async HTTP methods: get(), post(), patch(), delete()
  - Comprehensive error handling for HTTP status codes
  - Custom exception hierarchy for different error types
  - Configurable timeout (default 30s)

- Updated server.py with MCP server setup
  - Initialized MCP server with StdioServerTransport
  - Integrated AuthConfig and GiteaClient
  - Registered placeholder tool handlers (list_repositories, create_issue, create_pull_request)
  - Added CLI with --help and --version options
  - Proper error handling for configuration failures

- Updated pyproject.toml
  - Added console script entry point: gitea-mcp

- Created comprehensive unit tests
  - test_auth.py: Tests for AuthConfig validation and headers
  - test_client.py: Tests for GiteaClient initialization and error handling

All acceptance criteria met:
- MCP server initializes with StdioServerTransport
- Authentication loads from environment variables
- Base HTTP client with auth headers implemented
- Error handling for API connection failures
- Server reports available tools (placeholders for future issues)

Closes #2

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 15:05:25 -05:00
95ed3d81cf feat: initialize Python project structure
- Create pyproject.toml with project metadata
- Add dependencies: mcp, httpx, python-dotenv
- Set up src/gitea_mcp package structure with __init__.py files
- Create placeholder server.py for MCP server implementation
- Add tools subdirectory for future tool implementations
- Create tests directory structure
- Update .gitignore with comprehensive Python exclusions
- Add README.md with project overview

Uses modern src-layout with pyproject.toml (no setup.py).
Project is ready for MCP server implementation.

Closes #1

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 14:56:34 -05:00