Thank you for your interest in contributing to Open Edison! This guide will help you get started with contributing to the single-user MCP proxy server.
Open Edison is designed to be:
- Simple: Easy to understand, setup, and use
- Single-user focused: No multi-tenancy complexity
- Local-first: Designed for self-hosting
- Educational: Great for learning MCP concepts
- Gateway: Bridge to more complex systems like edison.watch
- Python 3.12+
- Rye for dependency management
- Git for version control
# Clone the repository
git clone https://github.com/Edison-Watch/open-edison.git
cd open-edison
# Install dependencies
make setup
# Start development server
make runFound a bug? Please create an issue with:
- Clear description of the problem
- Steps to reproduce the issue
- Expected vs actual behavior
- Environment details (OS, Python version, etc.)
- Configuration (sanitized
config.json)
Template:
## Bug Description
Brief description of the issue
## Steps to Reproduce
1. Configure server with...
2. Run command...
3. See error...
## Expected Behavior
What should happen
## Actual Behavior
What actually happens
## Environment
- OS: macOS 14.0
- Python: 3.12.0
- Open Edison: 0.1.0Have an idea? Open an issue with:
- Clear use case for the feature
- Proposed solution (if you have one)
- Alternatives considered
- Impact on simplicity (stay true to our philosophy)
Documentation improvements are always welcome:
- Fix typos or unclear instructions
- Add examples and use cases
- Improve API documentation
- Create tutorials
See Development Guidelines below.
We use automated tools to maintain code quality:
# Format code
make format
# Lint code
make lint
# Run all checks
make ci
make testStandards:
- uv for formatting (
make format) - Ruff for linting (
make lint) - Type hints for all function signatures
- Docstrings for public functions and classes
# Import order
import json # Standard library
from pathlib import Path
import uvicorn # Third party
from fastapi import FastAPI
from src.config import Config # Project imports at top-level- Classes:
PascalCase(OpenEdisonProxy) - Functions:
snake_case(start_server) - Variables:
snake_case(server_name) - Constants:
UPPER_SNAKE_CASE(DEFAULT_PORT) - Files:
snake_case(mcp_proxy.py)
All code changes should include tests:
# Run all tests
make test
# Run specific test file
pytest tests/test_config.py
# Run with coverage
pytest --cov=src tests/Test Guidelines:
- Unit tests for individual functions
- Integration tests for API endpoints
- Configuration tests for config loading
- Use descriptive test names
Update documentation for any changes:
- Code changes: Update relevant docs
- API changes: Update API reference
- Configuration: Update config guide
- New features: Add usage examples
# Fork on GitHub, then clone your fork
git clone https://github.com/your-username/open-edison.git
cd open-edison
# Add upstream remote
git remote add upstream https://github.com/Edison-Watch/open-edison.git# Create and switch to feature branch
git checkout -b feature/your-feature-name
# Or for bugfixes
git checkout -b fix/issue-description- Write your code
- Add tests
- Update documentation
- Follow code style guidelines
# Run full test suite
make ci
# Test your specific changes
pytest tests/test_your_feature.py
# Manual testing
make dev
# Test your feature manuallyUse conventional commit messages:
# Good commit messages
git commit -m "feat: add MCP server auto-restart functionality"
git commit -m "fix: resolve authentication header parsing issue"
git commit -m "docs: update configuration guide with examples"
git commit -m "test: add integration tests for proxy endpoints"Commit Types:
feat: New featurefix: Bug fixdocs: Documentation changestest: Adding or updating testsrefactor: Code refactoringstyle: Code style changesci: CI/CD changes
# Push to your fork
git push origin feature/your-feature-name
# Create pull request on GitHubPR Title: Use conventional commit format
feat: add support for WebSocket MCP servers
PR Description:
## Description
Brief description of changes
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Documentation update
- [ ] Refactoring
## Testing
- [ ] Tests added/updated
- [ ] Manual testing performed
- [ ] CI checks pass
## Documentation
- [ ] Documentation updated
- [ ] API reference updated (if applicable)
## Related Issues
Closes #123def test_feature_behavior():
"""Test that feature behaves correctly under normal conditions."""
# Arrange
config = create_test_config()
# Act
result = feature_function(config)
# Assert
assert result.status == "success"
assert len(result.items) == 2- Unit Tests: Test individual functions
- Integration Tests: Test API endpoints
- Configuration Tests: Test config loading/validation
- End-to-End Tests: Test complete workflows
Use fixtures for test data:
@pytest.fixture
def sample_config():
return Config(
server=ServerConfig(host="localhost", port=3000),
logging=LoggingConfig(level="INFO"),
mcp_servers=[
MCPServerConfig(name="test", command="echo", args=["hello"])
]
)- Clear and concise: Easy to understand
- Example-driven: Show don't just tell
- Complete: Cover all major use cases
- Current: Keep up to date with code
- API Documentation: Complete endpoint reference
- User Guides: How to use features
- Developer Docs: Architecture and development
- Examples: Working code samples
# Main Heading
## Section Heading
### Subsection
**Bold text** for emphasis
`code` for inline code# Code blocks with language
command --option valueAsk yourself:
- Does this maintain simplicity?
- Can a new user understand this quickly?
- Does this add unnecessary complexity?
Features should:
- Work for individual users
- Not require multi-user infrastructure
- Be appropriate for local deployment
Consider:
- Does this work offline?
- Are there cloud dependencies?
- Can users own their data?
## Feature: Advanced Logging Dashboard
### Pros
- Better visibility into MCP server activity
- Useful for debugging
### Cons
- Adds web UI complexity
- Requires frontend development
- May violate simplicity principle
### Decision
- Start with simple log files
- Consider basic web UI in future
- Maintain command-line accessLooking for ways to contribute? Try these:
- Fix typos in documentation
- Add examples to configuration guide
- Improve error messages
- Add unit tests for utility functions
- Implement new API endpoints
- Add MCP server health checks
- Improve configuration validation
- Add integration tests
- WebSocket support for MCP protocol
- Session logging with SQLite
- Plugin system for MCP servers
- Performance optimizations
- GitHub Issues: Bug reports and feature requests
- GitHub Discussions: General questions and ideas
- Pull Request Reviews: Code-specific discussions
- Is this change aligned with project goals?
- Does this maintain simplicity?
- Will this work for single-user deployment?
- Are there tests for this change?
- Is documentation updated?
Contributors are recognized in:
CONTRIBUTORS.mdfile- Release notes for significant contributions
- GitHub contributor statistics
We follow a simple code of conduct:
- Be respectful and considerate
- Be collaborative and helpful
- Be patient with new contributors
- Focus on the project goals
- Maintain professional discourse
We follow Semantic Versioning:
- MAJOR: Breaking changes
- MINOR: New features (backwards compatible)
- PATCH: Bug fixes
- Patch releases: As needed for bug fixes
- Minor releases: Monthly for new features
- Major releases: When significant breaking changes accumulate
Contributing to Open Edison should be:
- Simple: Easy process to follow
- Welcoming: Helpful to new contributors
- Focused: Aligned with project goals
- Quality: Maintains high standards
Thank you for contributing to Open Edison! Your help makes the project better for everyone. 🚀