Skip to main content
Glama
README.md
# oferty-spike-mcp

Spike #1 projektu „Oferty Online": czy wbudowany serwer OAuth 2.1 Supabase Auth (beta)
dogada się z aplikacją Claude przez Dynamic Client Registration.

**Kod jest do wyrzucenia.** Zero testów, zero obsługi błędów poza tym, co diagnozuje
sam spike, zero prawdziwych narzędzi MCP. Po wykonaniu zostaje wyłącznie notatka z wnioskami.

## Co tu jest

| Plik | Rola |
|---|---|
| `src/server.js` | routing HTTP, walidacja `Host`, lazy auth, discovery |
| `src/mcp.js` | serwer MCP v2 + narzędzie `ping()` zwracające tożsamość z tokenu |
| `src/verifier.js` | dwie ścieżki: statyczny Bearer (Claude Code) i token Supabase (aplikacja Claude) |
| `src/consent.js` | strona zgody — jedyna rzecz, którą piszemy sami |
| `src/supabase-metadata.js` | pobranie metadanych AS przy starcie, fail fast |

Używamy **SDK v2** (`@modelcontextprotocol/server` + `@modelcontextprotocol/node`).
`@modelcontextprotocol/sdk` to legacy v1 — większość tutoriali w sieci opisuje właśnie ją.

## Zmienne środowiskowe

Patrz `.env.example`. Wszystkie cztery są wymagane, proces nie wstanie bez nich.

## Uruchomienie lokalne

```bash
npm ci
APP_ORIGIN=http://localhost:3000 SUPABASE_URL=https://twoj.supabase.co \
  SUPABASE_ANON_KEY=... SPIKE_STATIC_TOKEN=... npm start
```

## Endpointy

- `POST /mcp` — Streamable HTTP, stateless
- `GET /.well-known/oauth-protected-resource/mcp` — RFC 9728
- `GET /.well-known/oauth-authorization-server` — metadane Supabase, przekazane dosłownie
- `GET /oauth/consent?authorization_id=…` — strona zgody
- `GET /healthz` — żywotność **procesu**, celowo nie pinguje Supabase

## Diagnostyka

Bez tokenu `POST /mcp` odpowiada `401` z nagłówkiem `WWW-Authenticate` wskazującym
Protected Resource Metadata — po tym poznasz, że lazy authentication działa.

Przy podejrzeniu problemu z rekonektem connectora (najbardziej podejrzany punkt spike'a)
przydają się `supabase.auth.oauth.listGrants()` i `revokeGrant({ clientId })` — pozwalają
zobaczyć i skasować zapisaną zgodę bez ruszania bazy ręcznie.