Add official read-only GitHub MCP

This commit is contained in:
Mikei386
2026-08-23 16:55:40 +02:00
parent 111ccaa543
commit 825f4ed469
12 changed files with 161 additions and 16 deletions
+12
View File
@@ -0,0 +1,12 @@
FROM ghcr.io/github/github-mcp-server@sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567 AS github
FROM ghcr.io/supercorp-ai/supergateway@sha256:095acf4471e142553c1a5514aa5e480abbc5885d00549d4a3481cc70eac53889
# GitHub publishes a minimal image containing only the official Go binary.
# Supergateway contributes transport conversion only; GitHub API behavior and
# every exposed tool remain implemented by GitHub's official MCP server.
COPY --from=github /server/github-mcp-server /usr/local/bin/github-mcp-server
USER 65532:65532
ENTRYPOINT ["supergateway"]
CMD ["--stdio", "/usr/local/bin/github-mcp-server stdio", "--outputTransport", "streamableHttp", "--stateful", "--sessionTimeout", "600000", "--streamableHttpPath", "/mcp", "--port", "8000", "--logLevel", "info"]
+36 -4
View File
@@ -14,6 +14,7 @@ Prompts heraus, verhindert den früher beobachteten Kontextverbrauch von über
| `mcp-homeassistant` | `http://mike-ai-mcp-homeassistant:8000/mcp` | Relay zum nativen HA-MCP; Token bleibt serverseitig | Profil `homeassistant` |
| `mcp-arr` | `http://mike-ai-mcp-arr:8000/mcp` | Sonarr/Radarr/Prowlarr mit serverseitiger Policy | Profil `arr` |
| `mcp-navidrome` | `http://mike-ai-mcp-navidrome:3000/mcp` | Navidrome-Bibliothek, Suche, Playlists, Favoriten und Hörverlauf | Profil `navidrome` |
| `mcp-github` | `http://mike-ai-mcp-github:8000/mcp` | offizieller GitHub-MCP, auf vier reine Repository-Lesewerkzeuge begrenzt | Profil `github` |
| `mcp-unraid-official` | `http://mike-ai-mcp-unraid-official:8000/mcp` | offizieller, read-only begrenzter Unraid-Zugang | Profil `unraid` |
| `mcp-unraid-ssh` | `http://mike-ai-mcp-unraid-ssh:8000/mcp` | erweiterte Diagnose über einen erzwungenen SSH-Befehl | optional (`extended`) |
@@ -53,7 +54,8 @@ passenden Server wählen:
| Aufgabe | Werkzeugserver | Nicht zusätzlich verwenden |
|---|---|---|
| Aktuelle öffentliche Informationen, Quellen, GitHub/Hugging Face, Produkte | Web | HA, ARR, Unraid |
| Aktuelle öffentliche Informationen, Quellen, Hugging Face, Produkte | Web | HA, ARR, Unraid |
| GitHub-Repository finden, Baum/README/Quellcode/API-Routen lesen | GitHub Repository | Web, HA, ARR |
| Entitäten, Zustände, Historie, Automationen und Dashboards | Home Assistant | Web, Unraid |
| Serien, Filme, fehlende Episoden und Indexer-Releases | Sonarr und Radarr | Web |
| Persönliche Musikbibliothek, Titel, Alben, Künstler und Playlists | Navidrome | Web, ARR |
@@ -98,6 +100,7 @@ Die lokale Installation benötigt die vorhandenen Secret-Dateien:
/etc/mike-ai/homeassistant-admin-mcp.env
/etc/mike-ai/arr-mcp.env
/etc/mike-ai/navidrome-mcp.env
/etc/mike-ai/github-mcp.env
/etc/mike-ai/runraid/.env
```
@@ -142,11 +145,40 @@ Metadaten. Das Last.fm Shared Secret ist dafür nicht erforderlich und wird
nicht gespeichert. Die Integration greift damit weder auf das persönliche
Last.fm-Profil noch auf dessen Hörverlauf zu.
## GitHub
Der GitHub-Container verwendet unverändert den offiziellen
`github/github-mcp-server` 1.10.1. Da dessen lokaler Container stdio spricht,
wandelt Supergateway 3.4.3 ausschließlich den Transport in Streamable HTTP für
Open WebUI und weitere interne Clients um. Beide Images sind per OCI-Digest
festgeschrieben; die Brücke implementiert keine GitHub-Operationen.
Dem Modell werden ausschließlich `search_repositories`, `get_repository_tree`,
`get_file_contents` und `search_code` angeboten. `GITHUB_READ_ONLY=1` erzwingt
zusätzlich serverseitig den Nur-Lesen-Modus. Der Container veröffentlicht keinen
Host-Port und speichert den Token nicht in Open WebUI.
Einrichtung:
```bash
sudo install -m 0600 config/github-mcp.env.example /etc/mike-ai/github-mcp.env
sudoedit /etc/mike-ai/github-mcp.env
sudo platform/mcp/install-tools.sh
sudo platform/openwebui/install-filters.sh
```
Der Token muss eigens für Athena erzeugt werden und ausschließlich lesenden
Zugriff auf die tatsächlich benötigten Repositories erhalten. Die vier
begrenzten Werkzeuge werden bei vorhandener Secret-Datei an die fünf
MikeAI-Profile geheftet. Dadurch kann das Modell Repositoryfragen selbständig
prüfen, ohne den großen GitHub-Standardwerkzeugkatalog in den Kontext zu laden.
## Client-Auswahl
Werkzeuge werden nicht pauschal an jedes Modell gehängt. Für Home-Assistant-
Fragen wird HA ausgewählt, für Medien ARR, für Recherche Web und für die NAS
Unraid. Mehrere Werkzeuge werden nur aktiviert, wenn die Aufgabe tatsächlich
Große Fachwerkzeuge werden nicht pauschal an jedes Modell gehängt. Nur die
kompakte Websuche und die vier GitHub-Lesewerkzeuge sind allgemein verfügbar.
Für Home-Assistant-Fragen wird HA ausgewählt, für Medien ARR und für die NAS
Unraid. Weitere Werkzeuge werden nur aktiviert, wenn die Aufgabe tatsächlich
mehrere Bereiche verbindet.
Schreibende Aktionen bleiben hinter der jeweiligen serverseitigen Policy und
+23
View File
@@ -137,6 +137,29 @@ services:
- /config:rw,noexec,nosuid,nodev,size=4m,mode=0700
networks: [tools, egress]
mcp-github:
<<: *tool-common
build:
context: .
dockerfile: Dockerfile.github
image: mike-ai/mcp-github:github-v1.10.1-supergateway-v3.4.3
container_name: mike-ai-mcp-github
profiles: [github]
env_file:
- ${GITHUB_MCP_ENV_FILE:-/etc/mike-ai/github-mcp.env}
environment:
# These server-side limits remain authoritative even if a client asks
# for broader toolsets. The token itself must also remain read-only.
GITHUB_TOOLS: search_repositories,get_repository_tree,get_file_contents,search_code
GITHUB_READ_ONLY: "1"
networks: [tools, egress]
healthcheck:
test: ["CMD", "node", "-e", "const s=require('net').connect(8000,'127.0.0.1');s.setTimeout(2000);s.on('connect',()=>{s.end();process.exit(0)});s.on('error',()=>process.exit(1));s.on('timeout',()=>process.exit(1))"]
interval: 30s
timeout: 5s
retries: 5
start_period: 15s
mcp-unraid-official:
<<: *tool-common
image: debian:13-slim
+6
View File
@@ -33,6 +33,12 @@ if [[ -s /etc/mike-ai/navidrome-mcp.env ]]; then
else
echo "Navidrome bleibt aus: Secret-Datei fehlt."
fi
if [[ -s /etc/mike-ai/github-mcp.env ]] && \
grep -Eq '^GITHUB_PERSONAL_ACCESS_TOKEN=.+$' /etc/mike-ai/github-mcp.env; then
profiles+=(--profile github)
else
echo "GitHub bleibt aus: dedizierter Read-only-Token fehlt."
fi
if [[ -s /etc/mike-ai/runraid/.env && -x /usr/local/bin/runraid ]]; then
profiles+=(--profile unraid)
else