From 675edad6129533c2654d1e6accf5885ec7edea73 Mon Sep 17 00:00:00 2001 From: Ian Keane Date: Sat, 22 Aug 2026 12:36:58 -0400 Subject: [PATCH] First shot at MCP server --- apps/mcp.yaml | 18 ++++ charts/forgejo-mcp/Chart.yaml | 5 + .../templates/external-secret.yaml | 21 ++++ charts/forgejo-mcp/templates/forgejo-mcp.yaml | 97 +++++++++++++++++++ manifests/mcp/forgejo-mcp.yaml | 20 ++++ terraform/terraform.tfvars | 2 +- 6 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 apps/mcp.yaml create mode 100644 charts/forgejo-mcp/Chart.yaml create mode 100644 charts/forgejo-mcp/templates/external-secret.yaml create mode 100644 charts/forgejo-mcp/templates/forgejo-mcp.yaml create mode 100644 manifests/mcp/forgejo-mcp.yaml diff --git a/apps/mcp.yaml b/apps/mcp.yaml new file mode 100644 index 0000000..b33c1a5 --- /dev/null +++ b/apps/mcp.yaml @@ -0,0 +1,18 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: mcp + namespace: argocd +spec: + project: default + source: + repoURL: https://forge.keane.sh/ian/dumpnet-argo.git + targetRevision: HEAD + path: manifests/mcp + destination: + server: https://kubernetes.default.svc + namespace: argocd + syncPolicy: + automated: + prune: true + selfHeal: true diff --git a/charts/forgejo-mcp/Chart.yaml b/charts/forgejo-mcp/Chart.yaml new file mode 100644 index 0000000..c4e692e --- /dev/null +++ b/charts/forgejo-mcp/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: forgejo-mcp +description: Forgejo MCP server for AI assistant access to git repos +type: application +version: 0.1.0 diff --git a/charts/forgejo-mcp/templates/external-secret.yaml b/charts/forgejo-mcp/templates/external-secret.yaml new file mode 100644 index 0000000..34ee6a4 --- /dev/null +++ b/charts/forgejo-mcp/templates/external-secret.yaml @@ -0,0 +1,21 @@ +apiVersion: external-secrets.io/v1 +kind: ExternalSecret +metadata: + name: forgejo-mcp-secrets + namespace: mcp +spec: + refreshInterval: 1h + secretStoreRef: + name: aws-secrets-manager + kind: ClusterSecretStore + target: + name: forgejo-mcp-secrets + data: + - secretKey: FORGEJO_TOKEN + remoteRef: + key: dumpnet + property: forgejo.token + - secretKey: FORGEJO_MCP_API_KEY + remoteRef: + key: dumpnet + property: forgejo.mcp_api_key diff --git a/charts/forgejo-mcp/templates/forgejo-mcp.yaml b/charts/forgejo-mcp/templates/forgejo-mcp.yaml new file mode 100644 index 0000000..d5ec440 --- /dev/null +++ b/charts/forgejo-mcp/templates/forgejo-mcp.yaml @@ -0,0 +1,97 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: forgejo-mcp + namespace: mcp +spec: + replicas: 1 + selector: + matchLabels: + app: forgejo-mcp + template: + metadata: + labels: + app: forgejo-mcp + spec: + securityContext: + runAsNonRoot: true + runAsUser: 1000 + seccompProfile: + type: RuntimeDefault + containers: + - name: forgejo-mcp + image: richarvey/forgejo-mcp:latest + ports: + - containerPort: 3000 + env: + - name: FORGEJO_URL + value: https://forge.keane.sh + - name: PORT + value: "3000" + - name: RATE_LIMIT_MAX + value: "100" + - name: RATE_LIMIT_WINDOW_MS + value: "60000" + envFrom: + - secretRef: + name: forgejo-mcp-secrets + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: ["ALL"] + readOnlyRootFilesystem: true + volumeMounts: + - name: tmp + mountPath: /tmp + readinessProbe: + httpGet: + path: /health + port: 3000 + initialDelaySeconds: 5 + periodSeconds: 10 + livenessProbe: + httpGet: + path: /health + port: 3000 + initialDelaySeconds: 15 + periodSeconds: 30 + volumes: + - name: tmp + emptyDir: {} +--- +apiVersion: v1 +kind: Service +metadata: + name: forgejo-mcp + namespace: mcp +spec: + selector: + app: forgejo-mcp + ports: + - port: 80 + targetPort: 3000 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: forgejo-mcp + namespace: mcp + annotations: + cert-manager.io/cluster-issuer: letsencrypt-prod +spec: + ingressClassName: nginx + tls: + - hosts: + - git-mcp.dumpnet.chat + secretName: forgejo-mcp-tls + rules: + - host: git-mcp.dumpnet.chat + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: forgejo-mcp + port: + number: 80 diff --git a/manifests/mcp/forgejo-mcp.yaml b/manifests/mcp/forgejo-mcp.yaml new file mode 100644 index 0000000..34d679c --- /dev/null +++ b/manifests/mcp/forgejo-mcp.yaml @@ -0,0 +1,20 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: forgejo-mcp + namespace: argocd +spec: + project: default + source: + repoURL: https://forge.keane.sh/ian/dumpnet-argo.git + targetRevision: HEAD + path: charts/forgejo-mcp + destination: + server: https://kubernetes.default.svc + namespace: mcp + syncPolicy: + automated: + prune: true + selfHeal: true + syncOptions: + - CreateNamespace=true diff --git a/terraform/terraform.tfvars b/terraform/terraform.tfvars index 16a1cb5..0cffbf1 100644 --- a/terraform/terraform.tfvars +++ b/terraform/terraform.tfvars @@ -1,2 +1,2 @@ hosted_zone_id = "Z068835512G0ZQJ9SJGOI" -dns_records = ["argocd", "todo"] +dns_records = ["argocd", "todo", "git-mcp"]