Skip to content

Commit 51f1f64

Browse files
committed
docs: add comprehensive fork attribution and fix container publishing
- Add proper fork attribution in README with original project credit - Update container workflow to use fork maintainer's registry (quay.io/macayaven) - Add FORKING.md with guidelines and etiquette for forked projects - Fix gofmt hints in OpenShift AI toolsets - Maintain learning phase transparency and proper open source etiquette This ensures proper attribution to Marc Nuri's original kubernetes-mcp-server while clearly documenting this fork's OpenShift AI enhancements.
1 parent 9f6be66 commit 51f1f64

File tree

4 files changed

+256
-32
lines changed

4 files changed

+256
-32
lines changed

.github/workflows/release-image.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@ on:
66
- main
77
tags:
88
- '*'
9+
workflow_dispatch: # Allow manual triggering
910

1011
env:
11-
IMAGE_NAME: quay.io/manusa/kubernetes_mcp_server
12+
# Fork attribution: This is a fork of containers/kubernetes-mcp-server enhanced with OpenShift AI support
13+
# Original project: https://github.com/containers/kubernetes-mcp-server by Marc Nuri
14+
# This fork adds OpenShift AI capabilities while maintaining full compatibility with the original
15+
IMAGE_NAME: quay.io/macayaven/kubernetes_mcp_server_openshift_ai
1216
TAG: ${{ github.ref_name == 'main' && 'latest' || github.ref_type == 'tag' && github.ref_name && startsWith(github.ref_name, 'v') && github.ref_name || 'unknown' }}
1317

1418
jobs:
@@ -32,6 +36,7 @@ jobs:
3236
sudo apt-get install -y podman
3337
- name: Quay Login
3438
run: |
39+
# Using fork maintainer's registry credentials
3540
echo ${{ secrets.QUAY_PASSWORD }} | podman login quay.io -u ${{ secrets.QUAY_USERNAME }} --password-stdin
3641
- name: Build Image
3742
run: |
@@ -52,6 +57,7 @@ jobs:
5257
steps:
5358
- name: Quay Login
5459
run: |
60+
# Using fork maintainer's registry credentials
5561
echo ${{ secrets.QUAY_PASSWORD }} | podman login quay.io -u ${{ secrets.QUAY_USERNAME }} --password-stdin
5662
- name: Create Manifest
5763
run: |

FORKING.md

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
# Forking & Extension Guidelines
2+
3+
This document outlines the proper etiquette and guidelines followed when creating this fork of kubernetes-mcp-server.
4+
5+
## 🍴 Fork Information
6+
7+
### Original Project
8+
- **Name**: kubernetes-mcp-server
9+
- **Author**: Marc Nuri
10+
- **Repository**: https://github.com/containers/kubernetes-mcp-server
11+
- **License**: Apache License 2.0
12+
13+
### This Fork
14+
- **Name**: openshift-mcp-server (with OpenShift AI enhancements)
15+
- **Author**: Carlos Macaya
16+
- **Repository**: https://github.com/macayaven/openshift-mcp-server
17+
- **License**: Apache License 2.0 (preserved)
18+
19+
## 🎯 Purpose of This Fork
20+
21+
This fork was created to add **OpenShift AI** capabilities to the excellent kubernetes-mcp-server foundation while maintaining full compatibility with the original project.
22+
23+
### Key Principles Followed
24+
25+
1. **🔧 Compatibility**: All original functionality preserved
26+
2. **📝 Attribution**: Original work clearly credited
27+
3. **🏷️ Naming**: Distinct package names to avoid confusion
28+
4. **📚 Documentation**: Comprehensive documentation of changes
29+
5. **🤝 Openness**: Transparent development process
30+
6. **🎓 Learning**: Clear indication of learning/development status
31+
32+
## 📋 Forking Etiquette Checklist
33+
34+
### ✅ What We Did Right
35+
36+
1. **Proper Attribution**
37+
- Original author and project clearly credited
38+
- Link to original repository provided
39+
- Original license preserved
40+
41+
2. **Clear Naming**
42+
- Different package names: `kubernetes-mcp-server-openshift-ai`
43+
- Different container registry: `quay.io/macayaven/kubernetes_mcp_server_openshift_ai`
44+
- Clear indication in documentation
45+
46+
3. **Documentation**
47+
- Comprehensive README with fork notice
48+
- Clear explanation of enhancements
49+
- Installation differences documented
50+
51+
4. **License Compliance**
52+
- Original Apache License 2.0 maintained
53+
- No license violations
54+
55+
5. **Transparent Development**
56+
- All commits publicly visible
57+
- Clear commit messages
58+
- Proper branching strategy
59+
60+
6. **Learning Phase Indication**
61+
- Clear notice about learning/development status
62+
- Encouragement for issue reporting
63+
- Patience requested from users
64+
65+
### 🎯 Development Guidelines
66+
67+
#### Code Changes
68+
- **Preserve Original**: Don't modify core functionality unnecessarily
69+
- **Additive Approach**: Add new features without breaking existing ones
70+
- **Code Style**: Follow original project's coding conventions
71+
- **Testing**: Maintain or improve test coverage
72+
73+
#### Distribution
74+
- **Separate Packages**: Use different package names
75+
- **Different Registries**: Use your own container registry
76+
- **Clear Documentation**: Explain differences and installation
77+
78+
#### Communication
79+
- **Credit Original**: Always mention original project
80+
- **Be Transparent**: Be clear about fork status and purpose
81+
- **Contribute Back**: Consider contributing useful changes upstream
82+
83+
## 🚀 For Others Wanting to Fork
84+
85+
If you want to fork this (or the original) project, here's a recommended approach:
86+
87+
### 1. Initial Setup
88+
```bash
89+
# Fork the repository on GitHub
90+
git clone https://github.com/YOUR_USERNAME/kubernetes-mcp-server.git
91+
cd kubernetes-mcp-server
92+
git remote add upstream https://github.com/containers/kubernetes-mcp-server.git
93+
```
94+
95+
### 2. Make Changes
96+
```bash
97+
# Create a feature branch
98+
git checkout -b feature/your-enhancement
99+
100+
# Make your changes
101+
# ... (code changes) ...
102+
103+
# Commit with clear messages
104+
git commit -m "feat: add your enhancement description"
105+
```
106+
107+
### 3. Update Package Names
108+
```bash
109+
# Update package.json files with your own scope/name
110+
find npm -name "package.json" -exec sed -i 's/kubernetes-mcp-server/your-mcp-server/g' {} \;
111+
```
112+
113+
### 4. Update Container Registry
114+
```yaml
115+
# In .github/workflows/release-image.yml
116+
env:
117+
IMAGE_NAME: quay.io/YOUR_USERNAME/your_mcp_server
118+
```
119+
120+
### 5. Update Documentation
121+
- Add fork notice to README.md
122+
- Create attribution section
123+
- Document your enhancements
124+
- Update installation instructions
125+
126+
### 6. Publishing
127+
- Use your own npm registry or scope
128+
- Use your own container registry
129+
- Don't conflict with original package names
130+
131+
## 🤝 Contributing Back
132+
133+
If you add useful features, consider contributing them back to the original project:
134+
135+
1. **Check Original**: Does the original project need this feature?
136+
2. **Create PR**: Submit a pull request to upstream
137+
3. **Coordinate**: Work with original maintainer
138+
4. **Credit**: Mention your fork in the PR
139+
140+
## 📚 Resources
141+
142+
- [GitHub Forking Guide](https://docs.github.com/en/get-started/quickstart/fork-a-repo)
143+
- [Open Source Etiquette](https://opensource.guide/starting-a-project/)
144+
- [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0)
145+
146+
---
147+
148+
**Remember**: Forking is a normal part of open source. The key is to do it respectfully, with proper attribution, and clear communication about your intentions and changes.

README.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# OpenShift MCP Server
22

3+
> **🍴 Fork Notice**: This is a fork of [containers/kubernetes-mcp-server](https://github.com/containers/kubernetes-mcp-server) by Marc Nuri, enhanced with **OpenShift AI** support.
4+
>
5+
> **Original Project**: A powerful Kubernetes [Model Context Protocol (MCP)](https://blog.marcnuri.com/model-context-protocol-mcp-introduction) server implementation.
6+
>
7+
> **This Fork**: Adds comprehensive OpenShift AI capabilities while maintaining full compatibility with the original kubernetes-mcp-server functionality.
8+
>
9+
> **🎯 Learning Phase**: This fork is actively developed as part of a learning journey. While thoroughly tested, please report any issues encountered.
10+
311
OpenShift MCP Server is currently under development.
412

513
## ✨ Features <a id="features"></a>
@@ -22,6 +30,12 @@ A powerful and flexible Kubernetes [Model Context Protocol (MCP)](https://blog.m
2230
- **✅ Namespaces**: List Kubernetes Namespaces.
2331
- **✅ Events**: View Kubernetes events in all namespaces or in a specific namespace.
2432
- **✅ Projects**: List OpenShift Projects.
33+
- **🤖 OpenShift AI** (Fork Enhancement):
34+
- **Data Science Projects**: List, get, create, and delete Data Science Projects
35+
- **Models**: Manage ML models with list, get, create, and delete operations
36+
- **Applications**: Handle Data Science applications lifecycle
37+
- **Experiments**: Track and manage ML experiments
38+
- **Pipelines**: Manage Data Science pipelines and workflows
2539
- **☸️ Helm**:
2640
- **Install** a Helm chart in the current or provided namespace.
2741
- **List** Helm releases in all namespaces or in a specific namespace.
@@ -398,3 +412,59 @@ make build
398412
# Run the Kubernetes MCP server with mcp-inspector
399413
npx @modelcontextprotocol/inspector@latest $(pwd)/kubernetes-mcp-server
400414
```
415+
416+
## 🍴 Fork Attribution & Etiquette <a id="fork-attribution"></a>
417+
418+
### Original Project
419+
This project is a fork of [containers/kubernetes-mcp-server](https://github.com/containers/kubernetes-mcp-server) by **Marc Nuri**.
420+
421+
- **Original Author**: Marc Nuri
422+
- **Original Repository**: https://github.com/containers/kubernetes-mcp-server
423+
- **License**: Apache License 2.0 (preserved from original)
424+
425+
### This Fork's Purpose
426+
This fork enhances the original kubernetes-mcp-server with **OpenShift AI** support while maintaining full backward compatibility.
427+
428+
**Enhancements Added**:
429+
- 🤖 **OpenShift AI Toolset**: Complete integration with OpenShift AI/Red Hat OpenShift Data Science
430+
- 📊 **Data Science Projects**: Manage Data Science Projects lifecycle
431+
- 🤖 **Models**: ML model management and operations
432+
- 🚀 **Applications**: Data Science application handling
433+
- 🧪 **Experiments**: ML experiment tracking
434+
-**Pipelines**: Data Science pipeline management
435+
436+
### Development Philosophy
437+
- **🎯 Learning Phase**: This fork is developed as part of a learning journey
438+
- **🔧 Compatibility**: Maintains 100% compatibility with original kubernetes-mcp-server
439+
- **📝 Attribution**: All original work is properly attributed
440+
- **🤝 Collaboration**: Open to contributions and feedback
441+
- **🐛 Issue Reporting**: Please report issues encountered during usage
442+
443+
### Fork Etiquette Followed
444+
1. **✅ Proper Attribution**: Original project and author clearly credited
445+
2. **✅ License Preservation**: Original Apache License 2.0 maintained
446+
3. **✅ Clear Documentation**: All changes and enhancements documented
447+
4. **✅ Separate Distribution**: Uses different package names to avoid confusion
448+
5. **✅ Open Development**: All changes visible and properly committed
449+
6. **✅ Learning Focus**: Clear indication of learning/development status
450+
451+
### Installation Differences
452+
- **Original**: `kubernetes-mcp-server` (npm), `quay.io/manusa/kubernetes_mcp_server` (container)
453+
- **This Fork**: `kubernetes-mcp-server-openshift-ai` (npm), `quay.io/macayaven/kubernetes_mcp_server_openshift_ai` (container)
454+
455+
### Contributing to This Fork
456+
While this is a learning project, contributions are welcome! Please:
457+
1. Clearly indicate the purpose of your contribution
458+
2. Follow the existing code style and patterns
459+
3. Add appropriate tests for new functionality
460+
4. Update documentation as needed
461+
462+
### Reporting Issues
463+
If you encounter issues with this fork:
464+
1. **Original Functionality**: Check if issue exists in upstream project first
465+
2. **OpenShift AI Features**: Report issues in this repository
466+
3. **Learning Phase**: Be patient - this is actively developed and improved
467+
468+
---
469+
470+
**Thank you to Marc Nuri and the Kubernetes community for the excellent foundation!** 🙏

pkg/toolsets/openshift-ai/pipelines.go

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,13 @@ func (t *PipelinesToolset) handlePipelinesList(params api.ToolHandlerParams) (*a
106106
response := make([]map[string]interface{}, len(pipelines))
107107
for i, pipeline := range pipelines {
108108
response[i] = map[string]interface{}{
109-
"name": pipeline.Name,
110-
"namespace": pipeline.Namespace,
109+
"name": pipeline.Name,
110+
"namespace": pipeline.Namespace,
111111
"displayName": pipeline.DisplayName,
112-
"description": pipeline.Description,
113-
"labels": pipeline.Labels,
114-
"annotations": pipeline.Annotations,
115-
"status": pipeline.Status,
112+
"description": pipeline.Description,
113+
"labels": pipeline.Labels,
114+
"annotations": pipeline.Annotations,
115+
"status": pipeline.Status,
116116
}
117117
}
118118

@@ -162,13 +162,13 @@ func (t *PipelinesToolset) handlePipelineGet(params api.ToolHandlerParams) (*api
162162
}
163163

164164
result := map[string]interface{}{
165-
"name": pipeline.Name,
166-
"namespace": pipeline.Namespace,
165+
"name": pipeline.Name,
166+
"namespace": pipeline.Namespace,
167167
"displayName": pipeline.DisplayName,
168-
"description": pipeline.Description,
169-
"labels": pipeline.Labels,
170-
"annotations": pipeline.Annotations,
171-
"status": pipeline.Status,
168+
"description": pipeline.Description,
169+
"labels": pipeline.Labels,
170+
"annotations": pipeline.Annotations,
171+
"status": pipeline.Status,
172172
}
173173

174174
// Convert to JSON response
@@ -245,14 +245,14 @@ func (t *PipelinesToolset) handlePipelineCreate(params api.ToolHandlerParams) (*
245245
}
246246

247247
result := map[string]interface{}{
248-
"name": createdPipeline.Name,
249-
"namespace": createdPipeline.Namespace,
248+
"name": createdPipeline.Name,
249+
"namespace": createdPipeline.Namespace,
250250
"displayName": createdPipeline.DisplayName,
251-
"description": createdPipeline.Description,
252-
"labels": createdPipeline.Labels,
253-
"annotations": createdPipeline.Annotations,
254-
"status": createdPipeline.Status,
255-
"message": "Pipeline created successfully",
251+
"description": createdPipeline.Description,
252+
"labels": createdPipeline.Labels,
253+
"annotations": createdPipeline.Annotations,
254+
"status": createdPipeline.Status,
255+
"message": "Pipeline created successfully",
256256
}
257257

258258
// Convert to JSON response
@@ -351,14 +351,14 @@ func (t *PipelinesToolset) handlePipelineRunsList(params api.ToolHandlerParams)
351351
response := make([]map[string]interface{}, len(pipelineRuns))
352352
for i, pipelineRun := range pipelineRuns {
353353
response[i] = map[string]interface{}{
354-
"name": pipelineRun.Name,
354+
"name": pipelineRun.Name,
355355
"pipelineName": pipelineRun.PipelineName,
356-
"namespace": pipelineRun.Namespace,
356+
"namespace": pipelineRun.Namespace,
357357
"displayName": pipelineRun.DisplayName,
358-
"description": pipelineRun.Description,
359-
"labels": pipelineRun.Labels,
360-
"annotations": pipelineRun.Annotations,
361-
"status": pipelineRun.Status,
358+
"description": pipelineRun.Description,
359+
"labels": pipelineRun.Labels,
360+
"annotations": pipelineRun.Annotations,
361+
"status": pipelineRun.Status,
362362
}
363363
}
364364

@@ -408,14 +408,14 @@ func (t *PipelinesToolset) handlePipelineRunGet(params api.ToolHandlerParams) (*
408408
}
409409

410410
result := map[string]interface{}{
411-
"name": pipelineRun.Name,
411+
"name": pipelineRun.Name,
412412
"pipelineName": pipelineRun.PipelineName,
413-
"namespace": pipelineRun.Namespace,
413+
"namespace": pipelineRun.Namespace,
414414
"displayName": pipelineRun.DisplayName,
415-
"description": pipelineRun.Description,
416-
"labels": pipelineRun.Labels,
417-
"annotations": pipelineRun.Annotations,
418-
"status": pipelineRun.Status,
415+
"description": pipelineRun.Description,
416+
"labels": pipelineRun.Labels,
417+
"annotations": pipelineRun.Annotations,
418+
"status": pipelineRun.Status,
419419
}
420420

421421
// Convert to JSON response

0 commit comments

Comments
 (0)