Thank you for your interest in contributing to the MarkItDown MCP Server! 🎉
- Code of Conduct
- Getting Started
- Development Setup
- Making Changes
- Submitting Pull Requests
- Reporting Issues
- Feature Requests
This project adheres to a code of conduct that we expect all contributors to follow. Please be respectful and constructive in all interactions.
- Python 3.10 or higher
- Git
- Basic understanding of the Model Context Protocol (MCP)
- Fork the repository on GitHub
- Clone your fork locally:
git clone https://github.com/YOUR_USERNAME/markitdown-mcp.git cd markitdown-mcp
-
Create a virtual environment:
python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate
-
Install in development mode:
pip install -e . -
Install development dependencies:
pip install -e ".[dev]" -
Verify installation:
markitdown-mcp --help
feat/- New featuresfix/- Bug fixesdocs/- Documentation updatestest/- Test improvementsrefactor/- Code refactoring
Example: feat/add-new-file-format or fix/mcp-protocol-error
-
Create a feature branch:
git checkout -b feat/your-feature-name
-
Make your changes:
- Follow existing code style
- Add tests for new functionality
- Update documentation as needed
-
Test your changes:
# Test MCP server functionality python -c " import json import subprocess test_request = {'jsonrpc': '2.0', 'id': 1, 'method': 'tools/list', 'params': {}} proc = subprocess.run(['markitdown-mcp'], input=json.dumps(test_request), capture_output=True, text=True) print('✅ Server working' if proc.stdout else '❌ Server error') "
-
Format code (if you have dev dependencies):
black markitdown_mcp/ isort markitdown_mcp/
- Follow PEP 8 Python style guide
- Use meaningful variable and function names
- Add docstrings to all functions and classes
- Keep functions focused and small
- Use type hints where appropriate
If you want to add support for a new file format:
- Check if MarkItDown library already supports it
- Update the
supported_extensionsset inmarkitdown_mcp/server.py - Add the format to the README documentation
- Test with sample files
- Update the format count in documentation if needed
- Code follows the project's style guidelines
- Self-review of code completed
- Tests pass locally
- Documentation updated if needed
- No merge conflicts with main branch
When creating a PR, please include:
- Description: Clear description of what the PR does
- Type: Feature, bug fix, documentation, etc.
- Testing: How you tested the changes
- Screenshots: If applicable (especially for documentation changes)
- Breaking Changes: Any breaking changes and migration steps
- Automated checks will run
- Maintainer will review the code
- Address any feedback
- Once approved, PR will be merged
All commits MUST follow conventional commit format for automated version management:
<type>(<scope>): <description>
[optional body]
[optional footer]
| Type | Description | Version Impact |
|---|---|---|
feat |
New feature | Minor (0.1.0) |
fix |
Bug fix | Patch (0.0.1) |
docs |
Documentation only | None |
style |
Code formatting | None |
refactor |
Code restructuring | None |
perf |
Performance improvement | Patch (0.0.1) |
test |
Testing changes | None |
chore |
Build/dependencies | None |
ci |
CI/CD changes | None |
BREAKING CHANGE |
Breaking API change | Major (1.0.0) |
# New feature (minor version bump)
feat(mcp): add support for PowerBI files
# Bug fix (patch version bump)
fix(security): resolve path traversal vulnerability
# Breaking change (major version bump)
feat(api): redesign tool interface
BREAKING CHANGE: tool parameters now require explicit typesReleases are fully automated based on conventional commits:
- Version Detection: Commits since last release determine version bump
- Quality Gates: All CI checks must pass before release
- Changelog: Automatically generated from commit messages
- Publishing: Package published to PyPI automatically
- GitHub Release: Created with auto-generated release notes
# 1. Create feature branch
git checkout -b feat/new-file-format
# 2. Make changes with proper commits
git commit -m "feat(converter): add support for Pages files"
git commit -m "test(converter): add Pages file test cases"
git commit -m "docs(readme): update supported formats list"
# 3. Create PR with conventional title
# PR Title: "feat(converter): add support for Pages files"# 1. Create fix branch
git checkout -b fix/memory-leak
# 2. Make fix with proper commit
git commit -m "fix(memory): resolve memory leak in large file processing"
# 3. Create PR
# PR Title: "fix(memory): resolve memory leak in large file processing"Breaking changes require special attention:
# Commit message must include BREAKING CHANGE footer
git commit -m "feat(api): redesign tool response format
BREAKING CHANGE: tool responses now return structured data with metadata instead of plain text"- Patch Releases: Automated when bug fixes are merged
- Minor Releases: Automated when new features are merged
- Major Releases: Automated when breaking changes are merged
- Security Releases: Emergency releases within 24 hours
Before any release, automated systems verify:
- All tests pass on supported Python versions (3.10, 3.11, 3.12)
- Code formatting and linting pass (ruff)
- Type checking passes (mypy)
- Test coverage maintains minimum threshold (80%)
- Security scans pass (no high/critical vulnerabilities)
- MCP protocol compliance verified
- Documentation builds successfully
For emergency situations, maintainers can create manual releases:
# 1. Ensure quality gates pass
ruff format --check && ruff check && mypy markitdown_mcp/
# 2. Update version in pyproject.toml
# 3. Update CHANGELOG.md
# 4. Create and push tag
git tag v1.2.3
git push origin v1.2.3Contributors will be notified of releases through:
- GitHub Releases: Automated release notes
- PyPI: Package updates
- Changelog: Updated CHANGELOG.md file
- Issues: Automatic closure of fixed issues
For detailed release procedures, see the RELEASE.md file in the repository root.
When reporting bugs, please include:
- Environment: OS, Python version, package version
- Steps to reproduce: Detailed steps
- Expected behavior: What should happen
- Actual behavior: What actually happens
- Error messages: Full error output
- Sample files: If related to specific file types (redact sensitive data)
**Environment:**
- OS: [e.g., macOS 13.0, Windows 11, Ubuntu 20.04]
- Python version: [e.g., 3.9.7]
- Package version: [e.g., 1.0.0]
- MCP Client: [e.g., Claude Desktop 0.4.1]
**Bug Description:**
A clear description of the bug.
**Steps to Reproduce:**
1. Install package...
2. Run command...
3. Error occurs...
**Expected Behavior:**
What you expected to happen.
**Actual Behavior:**
What actually happened.
**Error Output:**Paste error messages here
**Sample Files:**
If applicable, attach sample files that cause the issue.
We welcome feature requests! Please:
- Check existing issues to avoid duplicates
- Clearly describe the use case
- Explain why this feature would benefit MCP users
- Consider implementation complexity
**Is your feature request related to a problem?**
A clear description of the problem.
**Describe the solution you'd like**
A clear description of what you want to happen.
**Describe alternatives you've considered**
Other solutions you've thought about.
**Use Case**
How would this feature benefit MCP users?
**Additional context**
Any other context about the feature request.We use these labels to organize issues and PRs:
bug- Something isn't workingenhancement- New feature or requestdocumentation- Documentation improvementsgood first issue- Good for newcomershelp wanted- Extra attention neededmcp-protocol- Related to MCP protocolfile-format- New file format supportperformance- Performance improvements
Contributors will be recognized in:
- GitHub contributors list
- Release notes for significant contributions
- Special thanks in documentation
- GitHub Issues: For bugs and feature requests
- GitHub Discussions: For questions and general discussion
- Code Review: We're happy to help review code before you submit
By contributing, you agree that your contributions will be licensed under the MIT License.
Thank you for contributing to MarkItDown MCP Server! 🚀