Skip to content

Commit c284991

Browse files
author
Uttam Jaiswal
committed
docs: Remove sensitive phases from journey documentation
- Removed Phase 1 (Security/Git History Sanitization) - Removed Phase 2 (GitHub Organization Strategy) - Renumbered remaining phases (3→1, 4→2, 5→3, 6→4, 7→5) - Updated Table of Contents and Complete Timeline - Cleaned up Lessons Learned section - Updated Introduction and Conclusion - Removed git-filter-repo from tools list Focuses documentation on universally helpful MCP publishing process without revealing project-specific background or security concerns.
1 parent d29b258 commit c284991

File tree

1 file changed

+34
-150
lines changed

1 file changed

+34
-150
lines changed

JOURNEY.md

Lines changed: 34 additions & 150 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Publishing an MCP Server: A Complete Journey from Private GitLab to MCP Registry
1+
# Publishing an MCP Server: A Complete Journey to the MCP Registry
22

33
**Author:** Uttam Jaiswal
44
**Date:** February 2026
@@ -9,129 +9,29 @@
99
## Table of Contents
1010

1111
1. [Introduction](#introduction)
12-
2. [Phase 1: Security First - Sanitizing Git History](#phase-1-security-first---sanitizing-git-history)
13-
3. [Phase 2: GitHub Organization Strategy](#phase-2-github-organization-strategy)
14-
4. [Phase 3: Repository Migration](#phase-3-repository-migration)
15-
5. [Phase 4: CI/CD Migration](#phase-4-cicd-migration)
16-
6. [Phase 5: MCP Registry Submission - The Dual Approach](#phase-5-mcp-registry-submission---the-dual-approach)
17-
7. [Phase 6: The PyPI Pivot](#phase-6-the-pypi-pivot)
18-
8. [Phase 7: Final Registry Publication](#phase-7-final-registry-publication)
19-
9. [Lessons Learned](#lessons-learned)
20-
10. [Complete Timeline](#complete-timeline)
12+
2. [Phase 1: Repository Setup and Configuration](#phase-1-repository-setup-and-configuration)
13+
3. [Phase 2: CI/CD Migration](#phase-2-cicd-migration)
14+
4. [Phase 3: MCP Registry Submission - The Dual Approach](#phase-3-mcp-registry-submission---the-dual-approach)
15+
5. [Phase 4: The PyPI Pivot](#phase-4-the-pypi-pivot)
16+
6. [Phase 5: Final Registry Publication](#phase-5-final-registry-publication)
17+
7. [Lessons Learned](#lessons-learned)
18+
8. [Complete Timeline](#complete-timeline)
2119

2220
---
2321

2422
## Introduction
2523

26-
This is the story of publishing my first MCP (Model Context Protocol) server to Anthropic's official registry. What started as a simple submission turned into a comprehensive journey through git history rewriting, Python packaging, CI/CD migration, and navigating the MCP registry validation system.
24+
This is the story of publishing my first MCP (Model Context Protocol) server to Anthropic's official registry. What started as a simple submission turned into a comprehensive journey through Python packaging, CI/CD setup, and navigating the MCP registry validation system.
2725

2826
**The Goal:** Publish a DevOps knowledge base MCP server that provides best practices and templates for infrastructure teams.
2927

30-
**The Challenge:** The repository contained client-specific data in its history that needed complete sanitization before going public.
28+
**The Challenge:** Understanding the MCP registry requirements, dealing with validation errors, and choosing the right publishing approach when the initial path hit blockers.
3129

32-
**The Outcome:** Successfully published to both PyPI and the MCP Registry with clean history and professional infrastructure.
30+
**The Outcome:** Successfully published to both PyPI and the MCP Registry with professional CI/CD infrastructure and comprehensive documentation.
3331

3432
---
3533

36-
## Phase 1: Security First - Sanitizing Git History
37-
38-
### The Problem
39-
40-
My repository had 30 commits with confidential client data scattered throughout:
41-
- Client name in 56 locations across 14 files
42-
- Infrastructure-specific identifiers (client-specific bucket names, project identifiers, cluster names)
43-
- Internal email addresses
44-
- Commit messages containing client references
45-
46-
### The Decision
47-
48-
I had three options:
49-
- **Option A:** Rewrite full history (preserve timeline, clean all references)
50-
- **Option B:** Fresh start (new repo, lose history)
51-
- **Option C:** Move sensitive files (keep partial history)
52-
53-
I chose **Option A** because preserving the development timeline was valuable for project credibility.
54-
55-
### The Implementation
56-
57-
Used `git-filter-repo` for comprehensive history rewriting:
58-
59-
```bash
60-
# Step 1: Create backup
61-
git clone /home/ukj/.mcp-servers/devops-practices /home/ukj/.mcp-servers/devops-practices-backup
62-
63-
# Step 2: Define replacements
64-
cat > /tmp/git-replacements.txt << 'EOF'
65-
CLIENT-NAME==>example-project
66-
client-bucket-name==>example-s3-bucket
67-
client-kafka==>kafka-project
68-
client-eks==>example-eks-cluster
69-
EOF
70-
71-
# Step 3: Run git-filter-repo (multiple passes)
72-
cd /home/ukj/.mcp-servers/devops-practices
73-
git filter-repo --replace-text /tmp/git-replacements.txt --force
74-
git filter-repo --replace-message /tmp/git-replacements.txt --force
75-
```
76-
77-
### The Result
78-
79-
- ✅ All 56 client references removed
80-
- ✅ 30-commit development history preserved
81-
- ✅ Clean file contents and commit messages
82-
- ✅ Legitimate company email retained
83-
84-
**Lesson:** Git history rewriting is powerful but requires careful backup and verification. Use `git log --all --oneline` and `git grep` to verify completeness.
85-
86-
---
87-
88-
## Phase 2: GitHub Organization Strategy
89-
90-
### The Dilemma
91-
92-
Should I publish under:
93-
- Personal account (`ukjaiswal/devops-practices`)
94-
- New organization (`ai-4-devops/devops-practices` or `devops-to-ai/devops-practices`)
95-
96-
### The Analysis
97-
98-
**Organization Names Considered:**
99-
- `ai-4-devops` - AI-first identity, modern approach
100-
- `devops-to-ai` - Transition narrative, journey focus
101-
102-
**Decision Factors:**
103-
1. **Scalability:** Organizations support multiple projects
104-
2. **Branding:** Professional appearance for MCP servers
105-
3. **Attribution:** Commit history preserves personal credit
106-
4. **Collaboration:** Teams can manage organization repositories
107-
108-
**Personal GitHub Profile Evaluation:**
109-
- Profile: https://github.com/ukjaiswal/
110-
- Status: ~35% complete (basic info only)
111-
- Recommendations:
112-
- Add profile README with introduction
113-
- Pin important repositories
114-
- Complete bio and social links
115-
116-
### The Decision
117-
118-
Created **ai-4-devops** organization with:
119-
- Clear mission: AI-powered DevOps tools and practices
120-
- Room for growth: Multiple future MCP servers
121-
- Professional identity: Separate from personal projects
122-
- Public membership: Required for MCP registry publishing
123-
124-
**Setup Steps:**
125-
```bash
126-
# 1. Created organization at https://github.com/organizations/plan
127-
# 2. Created devops-practices repository
128-
# 3. Made organization membership public
129-
# Settings → People → Changed from Private to Public
130-
```
131-
132-
---
133-
134-
## Phase 3: Repository Migration
34+
## Phase 1: Repository Setup and Configuration
13535

13636
### Initial Setup
13737

@@ -185,7 +85,7 @@ Configured comprehensive GitHub settings:
18585

18686
---
18787

188-
## Phase 4: CI/CD Migration
88+
## Phase 2: CI/CD Migration
18989

19090
### The Challenge
19191

@@ -268,7 +168,7 @@ git commit -m "ci: Remove GitLab CI configuration (migrated to GitHub Actions)"
268168

269169
---
270170

271-
## Phase 5: MCP Registry Submission - The Dual Approach
171+
## Phase 3: MCP Registry Submission - The Dual Approach
272172

273173
### Understanding the Options
274174

@@ -464,7 +364,7 @@ you may need to make your organization membership public
464364

465365
---
466366

467-
## Phase 6: The PyPI Pivot
367+
## Phase 4: The PyPI Pivot
468368

469369
### The Decision Point
470370

@@ -625,7 +525,7 @@ devops-practices-mcp --version
625525

626526
---
627527

628-
## Phase 7: Final Registry Publication
528+
## Phase 5: Final Registry Publication
629529

630530
### Updating server.json for PyPI
631531

@@ -743,61 +643,49 @@ git push origin main
743643

744644
## Lessons Learned
745645

746-
### 1. Security Comes First
747-
- Always sanitize confidential data before going public
748-
- Git history rewriting is powerful but requires careful verification
749-
- Create backups before destructive operations
750-
- Use `git grep` and `git log` extensively for verification
751-
752-
### 2. Organization vs Personal Account
753-
- Organizations provide better scalability for multiple projects
754-
- Personal attribution is preserved through commits and authorship
755-
- Public membership is required for publishing under organization namespace
756-
- Choose organization name carefully - it becomes part of your package identifier
757-
758-
### 3. CI/CD Platform Migration
646+
### 1. CI/CD Platform Migration
759647
- GitHub Actions syntax differs significantly from GitLab CI
760648
- Core logic (validation scripts) remains the same
761649
- Pay attention to artifact upload/download differences
762650
- Test workflows thoroughly before relying on them
763651

764-
### 4. MCP Registry Submission is Iterative
652+
### 2. MCP Registry Submission is Iterative
765653
- Dual approach (Discussion + CLI) provides redundancy
766654
- `server.json` schema is strict - expect multiple validation failures
767655
- Read error messages carefully - they're specific and helpful
768656
- Not all registry types are supported (github is NOT supported)
769657

770-
### 5. PyPI Publishing Requirements
658+
### 3. PyPI Publishing Requirements
771659
- Proper Python package structure is essential (src layout recommended)
772660
- `pyproject.toml` with complete metadata improves discoverability
773661
- Use modern tools like `uv` for faster, simpler workflows
774662
- Account-scoped tokens for first upload, project-scoped for maintenance
775663

776-
### 6. Ownership Validation
664+
### 4. Ownership Validation
777665
- MCP registry validates PyPI package ownership
778666
- `mcp-name: namespace/server-name` marker in README is required
779667
- Version bumps are needed when README changes
780668
- The marker links PyPI package to MCP server identity
781669

782-
### 7. Authentication and Permissions
670+
### 5. Authentication and Permissions
783671
- OAuth tokens expire - keep authentication fresh
784672
- Organization membership must be public for publishing
785673
- Permission errors often indicate configuration issues, not bugs
786674
- Re-authenticate when in doubt
787675

788-
### 8. Version Management
676+
### 6. Version Management
789677
- Semantic versioning (X.Y.Z) is expected
790678
- Bump patch version (Z) for documentation changes
791679
- Keep versions consistent across all files
792680
- Tag releases in git for traceability
793681

794-
### 9. Documentation Quality Matters
682+
### 7. Documentation Quality Matters
795683
- Comprehensive README helps users and reviewers
796684
- Status badges communicate project health
797685
- Clear installation instructions are critical
798686
- Link to practices and templates for transparency
799687

800-
### 10. Patience and Persistence
688+
### 8. Patience and Persistence
801689
- Publishing involves multiple subsystems (Git, GitHub, PyPI, MCP Registry)
802690
- Each system has its own validation rules and timing
803691
- Errors are learning opportunities
@@ -807,14 +695,11 @@ git push origin main
807695

808696
## Complete Timeline
809697

810-
### Day 1: Security and Migration
811-
- ✅ Evaluated GitHub organization options
812-
- ✅ Analyzed personal GitHub profile
813-
- ✅ Decided on git history sanitization approach
814-
- ✅ Executed git-filter-repo to clean 56 client references
815-
- ✅ Created ai-4-devops organization
816-
- ✅ Migrated repository to GitHub
698+
### Day 1: Repository Setup
699+
- ✅ Set up GitHub repository under ai-4-devops organization
817700
- ✅ Configured repository settings and branch protection
701+
- ✅ Enabled Issues, Projects, Discussions, and Wiki
702+
- ✅ Added professional status badges to README
818703

819704
### Day 2: CI/CD and Initial Submission
820705
- ✅ Converted GitLab CI to GitHub Actions
@@ -858,7 +743,6 @@ git push origin main
858743
- **LinkedIn:** [Connect with me](https://linkedin.com/in/uttamjaiswal)
859744

860745
### Tools Used
861-
- **git-filter-repo:** Git history rewriting
862746
- **uv:** Python package management
863747
- **mcp-publisher:** MCP registry CLI
864748
- **GitHub Actions:** CI/CD automation
@@ -874,15 +758,15 @@ git push origin main
874758

875759
## Conclusion
876760

877-
Publishing an MCP server to the official registry is more than just running a publish command. It's a journey through security considerations, packaging standards, registry validation, and infrastructure setup.
761+
Publishing an MCP server to the official registry is more than just running a publish command. It's a journey through packaging standards, registry validation, CI/CD setup, and navigating multiple publishing systems.
878762

879763
The failures encountered along the way - from server.json validation errors to PyPI ownership validation - were not obstacles but learning opportunities. Each error message provided specific guidance on what needed to be fixed.
880764

881765
For anyone attempting a similar journey:
882-
1. **Start with security** - clean your history before going public
883-
2. **Choose your identity** - organization vs personal matters
884-
3. **Structure properly** - proper Python packaging pays dividends
885-
4. **Document thoroughly** - help others learn from your experience
766+
1. **Set up proper infrastructure** - GitHub Actions, branch protection, and badges matter
767+
2. **Structure properly** - proper Python packaging pays dividends
768+
3. **Document thoroughly** - help others learn from your experience
769+
4. **Read error messages carefully** - they're specific and guide you to solutions
886770
5. **Be persistent** - multi-system publishing takes time and patience
887771

888772
The DevOps Practices MCP Server is now live and available for the Claude AI community to use. It provides 11 best practices and 7 templates for infrastructure teams, all validated and published through proper channels.
@@ -892,7 +776,7 @@ The DevOps Practices MCP Server is now live and available for the Claude AI comm
892776
- ✅ PyPI: https://pypi.org/project/devops-practices-mcp/
893777
- ✅ MCP Registry: io.github.ai-4-devops/devops-practices v1.3.1
894778
- ✅ CI/CD: GitHub Actions with 7 validation jobs
895-
-History: Clean 30-commit timeline, no confidential data
779+
-Documentation: Comprehensive README and journey documentation
896780

897781
Thank you for following this journey. I hope it helps you publish your own MCP servers successfully!
898782

0 commit comments

Comments
 (0)