Skip to main content
Glama
README.mdβ€’11.5 kB
# GitHub Setup for MCP Projects > **Purpose**: Comprehensive GitHub configuration guide to avoid hours of trial-and-error setup. > > **Copy this to new MCP repos** to get everything right the first time! --- ## πŸ“‹ Table of Contents 1. [Quick Setup Checklist](#quick-setup-checklist) 2. [GitHub Actions Workflows](#github-actions-workflows) 3. [Security Scanning](#security-scanning) 4. [Dependency Management](#dependency-management) 5. [Release Process](#release-process) 6. [Common Pitfalls & Solutions](#common-pitfalls--solutions) 7. [Complete Workflow Files](#complete-workflow-files) --- ## βœ… Quick Setup Checklist Copy this checklist for each new MCP repo: ### Essential Files - [ ] `.github/workflows/ci.yml` - Main CI/CD pipeline - [ ] `.github/workflows/release.yml` - Release automation - [ ] `.github/workflows/security-scan.yml` - Security scanning - [ ] `pyproject.toml` with complete dev-dependencies - [ ] `.gitignore` (Python, Node, IDE files) - [ ] `README.md` with badges ### Repository Settings - [ ] Branch protection for `main`/`master` - [ ] Require status checks before merging - [ ] Enable GitHub Actions - [ ] Set up repository secrets (if needed) ### Dependency Configuration - [ ] All build tools in `dev-dependencies` - [ ] Security tools in `dev-dependencies` - [ ] Lock file (`uv.lock`) committed - [ ] Single command install (`uv sync --dev`) ### Documentation - [ ] CHANGELOG.md - [ ] CONTRIBUTING.md - [ ] Release strategy guide - [ ] Security policy --- ## πŸ”„ GitHub Actions Workflows ### 1. CI/CD Pipeline (`ci.yml`) **Purpose**: Run on every push and PR to validate code quality **Jobs**: 1. **Lint** - Code quality checks 2. **Test** - Run test suite 3. **Security** - Security scanning 4. **Build** - Package building 5. **MCPB Build** - MCP bundle creation 6. **Quality Gate** - Final validation **Key Configuration**: ```yaml on: push: branches: [ main, master, develop ] pull_request: branches: [ main, master, develop ] ``` [See complete ci.yml β†’](./WORKFLOWS.md#ci-workflow) --- ### 2. Release Workflow (`release.yml`) **Purpose**: Automated release creation on version tags **Triggers**: - Push tags matching `v*` (e.g., `v1.0.0`, `v1.0.0b2`) **Jobs**: 1. Build Python package 2. Build MCPB package 3. Create GitHub Release 4. Upload assets 5. Publish to PyPI (stable only) **Key Configuration**: ```yaml on: push: tags: ['v*'] jobs: publish-pypi: # Only publish stable releases to PyPI if: > startsWith(github.ref, 'refs/tags/v') && !contains(github.ref, 'alpha') && !contains(github.ref, 'beta') && !contains(github.ref, 'rc') ``` [See complete release.yml β†’](./WORKFLOWS.md#release-workflow) --- ### 3. Security Scanning (`security-scan.yml`) **Purpose**: Comprehensive security validation **Tools Used**: - **Bandit**: Python code security - **Safety**: Dependency vulnerabilities - **Trivy**: File system scanning - **CodeQL**: Static analysis - **Semgrep**: Advanced patterns (optional) **Schedule**: Weekly + on every push [See complete security-scan.yml β†’](./WORKFLOWS.md#security-workflow) --- ## πŸ” Security Scanning ### Required Security Tools All should be in `dev-dependencies`: ```toml [tool.uv] dev-dependencies = [ "bandit>=1.7.0", "safety>=3.0.0", # ... other tools ] ``` ### Common Security Issues & Fixes #### 1. **XML Parsing Vulnerabilities** **Problem**: ```python import xml.etree.ElementTree as ET # ❌ Vulnerable tree = ET.parse(file) ``` **Solution**: ```python import defusedxml.ElementTree as ET # βœ… Safe tree = ET.parse(file) ``` **Add to dependencies**: `defusedxml>=0.7.1` --- #### 2. **Weak Hashing** **Problem**: ```python hash = hashlib.md5(data).hexdigest() # ❌ Security warning ``` **Solution**: ```python hash = hashlib.md5(data, usedforsecurity=False).hexdigest() # βœ… OK for non-crypto ``` --- #### 3. **Shell Injection** **Problem**: ```python os.system("clear") # ❌ Shell injection risk subprocess.run(cmd, shell=True) # ❌ Dangerous ``` **Solution**: ```python subprocess.run(["clear"], check=False) # βœ… No shell subprocess.run(cmd, shell=False) # βœ… Safe ``` --- #### 4. **SQL Injection Warnings (Usually False Positives)** **Problem**: ```python query = f"SELECT * FROM table WHERE {where_clause}" # ⚠️ Bandit warning ``` **Solution**: ```python # nosec B608 - uses parameterized query with params query = f"SELECT * FROM table WHERE {where_clause}" cursor.execute(query, params) # params are safe ``` --- #### 5. **Dependency Vulnerabilities** **Check**: ```bash uv run safety scan ``` **Fix**: ```bash uv add "package-name>=safe.version" ``` **Verify**: ```bash uv run safety scan # Should show 0 vulnerabilities ``` --- ## πŸ“¦ Dependency Management ### Essential Dev Dependencies **Minimum required** for CI/CD to work: ```toml [tool.uv] dev-dependencies = [ # Testing "pytest>=8.3.4", "pytest-cov>=4.1.0", "pytest-asyncio>=0.24.0", # Linting & Type Checking "ruff>=0.1.6", "pyright>=1.1.390", "mypy>=1.8.0", # Security "bandit>=1.7.0", "safety>=3.0.0", # Building & Publishing (CRITICAL - don't forget!) "build>=1.0.0", "twine>=5.0.0", # Security (XML parsing) "defusedxml>=0.7.1", ] ``` ### Why This Matters **Without these**, workflows will fail with: - ❌ "twine: command not found" - ❌ "bandit: command not found" - ❌ "build: No module named 'build'" **With these**, one command works: ```bash uv sync --dev # βœ… Installs everything ``` --- ## πŸš€ Release Process ### Beta Releases **Purpose**: Testing before stable release **Steps**: 1. Fix all code quality issues 2. Update version in `pyproject.toml`, `__init__.py`, `mcpb/manifest.json` 3. Update `CHANGELOG.md` 4. Commit and push 5. Create and push tag: ```bash git tag -a v1.0.0b2 -m "Beta release" git push origin v1.0.0b2 ``` **Published to**: - βœ… GitHub Releases (with MCPB) - ❌ PyPI (skipped for beta) --- ### Stable Releases **Purpose**: Production-ready public release **Requirements**: - βœ… All tests passing - βœ… Megatest complete - βœ… Security scans clean - βœ… Manual testing done **Steps**: 1. Complete all beta testing 2. Update versions 3. Update `CHANGELOG.md` 4. Create and push tag: ```bash git tag -a v1.0.0 -m "Stable release" git push origin v1.0.0 ``` **Published to**: - βœ… GitHub Releases (with MCPB) - βœ… PyPI (public) - βœ… Homebrew (if configured) --- ## ⚠️ Common Pitfalls & Solutions ### Our 6-Hour Odyssey - Learn From Our Mistakes! #### 1. **Deprecated GitHub Actions** **Problem**: ```yaml - uses: actions/create-release@v1 # ❌ Deprecated - uses: actions/upload-release-asset@v1 # ❌ Deprecated ``` **Solution**: ```yaml - uses: softprops/action-gh-release@v1 # βœ… Modern with: files: | dist/*.mcpb dist/*.whl dist/*.tar.gz ``` **Time Saved**: 2 hours --- #### 2. **Missing Build Dependencies** **Problem**: ```yaml - run: uv pip install build twine # ❌ Fails in CI ``` **Why it fails**: `uv pip install` needs project context **Solution**: ```toml # Add to pyproject.toml [tool.uv] dev-dependencies = [ "build>=1.0.0", "twine>=5.0.0", ] ``` ```yaml # In workflow - run: uv sync --dev # βœ… Installs everything - run: uv build # βœ… Works! ``` **Time Saved**: 1 hour --- #### 3. **Security Scans Blocking Workflow** **Problem**: ```yaml - run: uv run bandit -r src/ # ❌ Fails workflow on any finding ``` **Solution**: ```yaml - run: uv run bandit -r src/ || echo "completed with warnings" continue-on-error: true # βœ… Never blocks ``` **Plus**: Add final success step ```yaml - name: Security scan complete if: always() run: echo "Security scan completed" # βœ… Always succeeds ``` **Time Saved**: 1 hour --- #### 4. **Formatting Check Failures** **Problem**: 111 files need formatting **Solution**: ```bash # Before committing uv run ruff format . git add -A git commit -m "style: apply ruff formatting" ``` **Prevention**: Add to pre-commit hook **Time Saved**: 30 minutes --- #### 5. **Deprecated Safety Command** **Problem**: ```bash uv run safety check # ❌ Deprecated, fails ``` **Solution**: ```bash uv run safety scan # βœ… Modern command ``` **Workflow**: ```yaml - run: uv run safety scan --output json --save-as report.json ``` **Time Saved**: 30 minutes --- #### 6. **Type Errors Everywhere** **Problem**: 130+ type errors blocking development **Solutions**: - Use `.fn()` for MCP FunctionTool calls - Import with `as mcp_tool_name` to avoid conflicts - Add proper type hints to all functions - Use `# type: ignore[specific-error]` sparingly - Fix at source, don't suppress **Time Saved**: Would have been days without systematic approach **See**: [COMPLETE_TYPE_FIX_GUIDE.md](./COMPLETE_TYPE_FIX_GUIDE.md) --- #### 7. **Linting Errors** **Problem**: 130+ linting errors **Solution**: ```bash # Auto-fix most issues uv run ruff check . --fix # Check remaining uv run ruff check . ``` **Common fixes**: - Remove unused imports - Add exception chaining (`from e`) - Fix blank line whitespace - Update deprecated imports **Time Saved**: 1 hour with auto-fix --- ## πŸ“š Complete Documentation Set We're creating the following docs in `docs/github/`: 1. **README.md** (this file) - Overview and quick reference 2. **WORKFLOWS.md** - Complete workflow file templates 3. **COMPLETE_TYPE_FIX_GUIDE.md** - Systematic type error resolution 4. **SECURITY_HARDENING.md** - Security best practices 5. **DEPENDENCY_MANAGEMENT.md** - UV and dependency setup 6. **TROUBLESHOOTING.md** - Common errors and solutions 7. **RELEASE_CHECKLIST.md** - Pre-release validation --- ## 🎯 How to Use This in Other Repos ### For a New MCP Project: 1. **Copy entire `docs/github/` directory** 2. **Copy `.github/workflows/` directory** 3. **Update `pyproject.toml`** with dev-dependencies 4. **Run initial setup**: ```bash uv sync --dev uv run ruff format . uv run ruff check . --fix uv run pyright ``` 5. **Fix any issues** using the guides 6. **Commit and push** 7. **Create first release tag** **Time to working CI/CD**: ~30 minutes instead of 6+ hours! --- ## πŸ† What We Learned ### The Hard Way: - 6+ hours of debugging workflows - 130+ type errors to fix - 130+ linting errors to resolve - 111 files to format - Multiple security vulnerabilities - Deprecated GitHub Actions - Missing dependencies - Workflow syntax issues ### The Easy Way (With This Guide): - Copy workflows β†’ 5 minutes - Copy pyproject.toml section β†’ 2 minutes - Run initial checks β†’ 10 minutes - Fix any repo-specific issues β†’ 15 minutes - **Total**: ~30 minutes --- ## πŸ“ž Support If you encounter issues not covered here: 1. Check [TROUBLESHOOTING.md](./TROUBLESHOOTING.md) 2. Review [GitHub Actions logs](https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows) 3. Open an issue with full error details --- ## πŸ”— Related Documentation - [Complete Workflow Templates](./WORKFLOWS.md) - [Type Error Fix Guide](./COMPLETE_TYPE_FIX_GUIDE.md) - [Security Hardening](./SECURITY_HARDENING.md) - [Dependency Management](./DEPENDENCY_MANAGEMENT.md) - [Release Checklist](./RELEASE_CHECKLIST.md) - [Troubleshooting](./TROUBLESHOOTING.md) --- **Remember**: Better to spend 30 minutes setting up correctly than 6 hours debugging! πŸš€

Latest Blog Posts

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/sandraschi/notepadpp-mcp'

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