gregor-mcp-gateway
README.md
# Dein eigenes MCP-Gateway
Ein Dienst, eine Adresse, ein Token — und dahinter beliebig viele Werkzeuge.
**Du musst das hier nicht verstehen, um es zu benutzen.** Sag Deinem Agenten: *„Häng mir mein
Werkzeug XY in mein Gateway ein"*, und er macht den Rest. Diese Datei ist zum Nachschlagen.
---
## Brauche ich das überhaupt?
| Wenn … | dann … |
|---|---|
| ein Werkzeug, das Du am Schreibtisch nutzt | **kein Gateway.** Ein lokaler Server ist einfacher und sicherer |
| zwei oder drei Werkzeuge | Gateway lohnt sich |
| etwas soll laufen, während Dein Rechner aus ist | Gateway, im Netz |
| Du willst es aus **ChatGPT** nutzen | Gateway, im Netz — anders geht es nicht |
---
## Der Aufbau
```
mein-gateway/
server.js Der Gateway. Musst Du nicht anfassen.
werkzeuge/
feiertage.js Ein Werkzeug ohne Schlüssel — läuft sofort.
todoist.js Ein Werkzeug mit Schlüssel — das Muster für Deine eigenen.
.env Deine Schlüssel. Kommt nie ins Internet.
Procfile Sagt dem Hoster, wie gestartet wird.
```
**Ein neues Werkzeug hinzufügen heißt: eine Datei in `werkzeuge/` legen.** Sonst nichts. Der
Gateway sieht beim Start selbst nach, was dort liegt.
---
## Das erste Mal starten
```bash
npm install
cp .env.beispiel .env
openssl rand -hex 32
```
Den ausgegebenen langen Zufallswert in die `.env` als `MCP_TOKEN` eintragen. Dann:
```bash
node server.js
```
Es erscheint, welche Werkzeuge eingehängt wurden. **Drei Prüfungen:**
```bash
curl http://localhost:8787/
```
Zeigt Deine Werkzeuge. Ohne Token — das ist Absicht, hier stehen nur Namen.
```bash
curl -X POST http://localhost:8787/feiertage/mcp
```
Muss **401** ergeben. Wenn nicht, hält Dein Schloss nicht.
Und dann das Werkzeug im Agenten eintragen (siehe unten) und einmal aufrufen.
---
## Im Agenten eintragen
**Claude Code** — in die `.mcp.json` im Projektordner:
```json
{
"mcpServers": {
"feiertage": {
"type": "http",
"url": "http://localhost:8787/feiertage/mcp",
"headers": { "Authorization": "Bearer ${MCP_TOKEN}" }
}
}
}
```
**Goose** — `goose configure` → Add Extension → Remote Extension (Streamable HTTP), Adresse
eintragen, als Header `Authorization: Bearer <dein-token>`.
**ChatGPT** — Einstellungen → Apps & Connectors → Developer Mode → Create. Braucht eine
**öffentliche HTTPS-Adresse**, also den Schritt „ins Netz" unten, und einen bezahlten Tarif.
**Nach jeder Änderung an der Konfiguration den Agenten neu starten.** Ohne das ändert sich nichts.
---
## Ins Netz, in der EU
Empfehlung: **Scaleway** — französisches Unternehmen, Rechenzentren in Paris, Amsterdam, Warschau
und Mailand. Der Grund: ein **dauerhaft kostenloser Rahmen** jeden Monat. Ein Gateway, das nur
antwortet, wenn es gefragt wird, bleibt darin — kein Testzeitraum, der abläuft.
**Docker brauchst Du dafür nicht auf Deinem Rechner.** Gebaut wird bei GitHub, durch die Action in
`.github/workflows/`.
1. Diesen Ordner in ein **privates** GitHub-Repository legen.
**Vorher prüfen, dass `.env` in der `.gitignore` steht.** Ein einmal veröffentlichter Schlüssel
bleibt für immer in der Versionsgeschichte — auch nach dem Löschen.
2. Bei Scaleway anlegen, in dieser Reihenfolge:
- eine **Container Registry** (Namespace-Name merken)
- einen **Serverless Container** (die UUID merken)
- einen **API-Schlüssel** — der geheime Teil wird **nur einmal angezeigt**
3. Die Umgebungsvariablen beim **Container** setzen, nicht im Repository: `MCP_TOKEN` bzw. die
Google-Zugangsdaten, dazu die Schlüssel Deiner Werkzeuge.
4. In GitHub zwei Secrets anlegen: `SCW_SECRET_KEY` und `SCW_CONTAINER_ID`. Und in
`.github/workflows/deploy.yml` den Registry-Namespace eintragen.
5. Pushen. Im Tab **Actions** läuft der Job, danach antwortet Deine Adresse.
**Gewöhnliches Webhosting funktioniert nicht** — auch nicht das günstige Paket, das Du vielleicht
gerade gekauft hast. Dort wird ein dauerhaft laufendes Programm nach kurzer Zeit beendet.
**Wenn Du lieber ohne Container arbeitest:** Scalingo (Frankreich) liefert direkt aus dem
Repository aus, ohne Docker und ohne Registry — dafür gibt es dort nur 30 Tage kostenlos statt
eines dauerhaften Rahmens. Die `Procfile` im Ordner ist für diesen Weg da.
Andere Anbieter in Europa: Clever Cloud (FR), Upsun (FR), oder ein VPS bei Hetzner oder netcup (DE).
## Wenn es nicht geht
| Symptom | Wahrscheinlich |
|---|---|
| Werkzeug erscheint nicht in den Startmeldungen | In der Datei fehlt `name` oder `registriere`. Die Startmeldungen sagen es |
| 401, obwohl der Token stimmt | Leerzeichen oder Zeilenumbruch beim Kopieren mitgekommen |
| 404 mit gültigem Token | Der Name in der Adresse passt nicht zum `name` in der Datei |
| Tool sichtbar, Aufruf hängt („timed out") | Irgendwo wird auf stdout geschrieben. `console.error` benutzen, nie `console.log` |
| 404 oder 410 von der fremden Schnittstelle | Der Endpunkt hat sich geändert. Aktuelle Doku lesen — das passiert öfter, als man denkt |
| Nichts geht mehr nach einer Änderung | Agent neu gestartet? |
---
## Die zwei Sätze, die Du behalten solltest
**Der beste Schutz ist nicht das Türschloss, sondern der Schlüssel, den Du den Werkzeugen gibst.**
Wo die Schnittstelle es anbietet: einen Schlüssel mit Leserecht allein nehmen. Der kann auch dann
nichts anrichten, wenn Dein Token in falsche Hände gerät.
**Endpunkte nie aus dem Gedächtnis.** Erst die Doku lesen, dann ein `curl`, dann Code — auch wenn
der Agent sehr überzeugt klingt.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues