Skip to main content
Glama
gregorbeul-oss

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.