Skip to main content
Glama
README.md
# next-dns-mcp

MCP-server för [NextDNS](https://nextdns.io) med **Streamable HTTP**, redo att deployas på [Fly.io](https://fly.io).

## Funktioner

- Lista/skapa/uppdatera/ta bort profiler
- Denylist / allowlist / blocklists
- Analytics (status, domains, devices, … + time-series)
- DNS-loggar (hämtning, clear, download-URL)
- Generiska GET/PATCH för nästlade sektioner (`security`, `privacy`, `settings/…`)

## Snabbstart lokalt

```bash
cp .env.example .env
# fyll i NEXTDNS_API_KEY (från https://my.nextdns.io/account)
# valfritt: NEXTDNS_PROFILE_ID, MCP_AUTH_TOKEN

npm install
npm run dev
```

Health: `GET http://127.0.0.1:8080/health`  
MCP: `POST http://127.0.0.1:8080/mcp`

Smoke-test:

```bash
NEXTDNS_API_KEY=… MCP_AUTH_TOKEN=dev npm run dev &
MCP_URL=http://127.0.0.1:8080/mcp MCP_AUTH_TOKEN=dev npm run smoke
```

## Deploy till Fly.io

### 1. Förutsättningar

- [flyctl](https://fly.io/docs/flyctl/install/) installerat och inloggat (`fly auth login`)
- NextDNS API-nyckel

### 2. Skapa app + secrets

```bash
fly apps create next-dns-mcp   # hoppa över om appen redan finns
fly secrets set \
  NEXTDNS_API_KEY="din_nextdns_api_key" \
  MCP_AUTH_TOKEN="$(openssl rand -hex 32)" \
  NEXTDNS_PROFILE_ID="valfri_default_profil"
```

Uppdatera `ALLOWED_HOSTS` i `fly.toml` om appnamnet skiljer sig från `next-dns-mcp`.

### 3. Deploy

```bash
fly deploy
fly status
fly open /health
```

MCP-URL: `https://next-dns-mcp.fly.dev/mcp`

## Anslut från Cursor

```json
{
  "mcpServers": {
    "next-dns": {
      "url": "https://next-dns-mcp.fly.dev/mcp",
      "headers": {
        "Authorization": "Bearer <MCP_AUTH_TOKEN>"
      }
    }
  }
}
```

Transport: **Streamable HTTP**.

## Anslut från Claude (iPhone / web / Desktop)

Claude kräver OAuth (Client ID + Secret). Konfigurera på **claude.ai** (synkas till iPhone-appen):

1. **Customize → Connectors → Add custom connector**
2. **URL:** `https://next-dns-mcp.fly.dev/mcp`
3. **OAuth Client ID:** värdet av `OAUTH_CLIENT_ID` (default `nextdns-mcp-claude`)
4. **OAuth Client Secret:** värdet av `OAUTH_CLIENT_SECRET` (Fly secret)
5. Klicka **Add** → **Connect**
6. I webbläsaren: ange `MCP_AUTH_TOKEN` som lösenord och godkänn

I iPhone-appen: **+ → Connectors** och aktivera NextDNS.

## Anslut från ChatGPT

ChatGPT visar en unik **Callback URL** per connector, typ:

`https://chatgpt.com/connector/oauth/<id>`

Den mönstret accepteras automatiskt av servern (ingen manuell registrering behövs).

1. Aktivera Developer mode i ChatGPT om det behövs
2. Lägg till MCP / connector med URL: `https://next-dns-mcp.fly.dev/mcp`
3. **OAuth Client ID:** `nextdns-mcp-claude`
4. **OAuth Client Secret:** samma som på Fly (`OAUTH_CLIENT_SECRET`)
5. Lämna/ange den Callback URL ChatGPT visar (servern tillåter `chatgpt.com/connector/oauth/*`)
6. Godkänn och ange `MCP_AUTH_TOKEN` på consent-sidan

Om ChatGPT visar en ovanlig callback-URL, sätt den via Fly-secret:

```bash
fly secrets set OAUTH_EXTRA_REDIRECT_URIS="https://exakt-url-fran-chatgpt"
```

## Miljövariabler

| Variabel | Obligatorisk | Beskrivning |
|---|---|---|
| `NEXTDNS_API_KEY` | ja | API-nyckel från NextDNS-kontot |
| `MCP_AUTH_TOKEN` | ja | Bearer-token + lösenord på OAuth-consent |
| `OAUTH_CLIENT_SECRET` | ja | Secret till Claude/ChatGPT connector |
| `OAUTH_CLIENT_ID` | nej | Default `nextdns-mcp-claude` |
| `OAUTH_EXTRA_REDIRECT_URIS` | nej | Extra callback-URL:er (kommaseparerade) |
| `PUBLIC_BASE_URL` | ja i prod | t.ex. `https://next-dns-mcp.fly.dev` |
| `NEXTDNS_PROFILE_ID` | nej | Default-profil om `profileId` utelämnas |
| `PORT` | nej | Default `8080` |
| `HOST` | nej | Default `0.0.0.0` |
| `ALLOWED_HOSTS` | nej | Reserved for future host checks |

## Verktyg (urval)

| Tool | Syfte |
|---|---|
| `nextdns_list_profiles` | Lista profiler |
| `nextdns_get_profile` | Hämta profil |
| `nextdns_add_denylist_domain` | Blockera domän |
| `nextdns_add_allowlist_domain` | Tillåt domän |
| `nextdns_analytics` | Analytics / time-series |
| `nextdns_logs` | DNS-loggar |
| `nextdns_get_section` / `nextdns_patch_section` | Nästlade sektioner |

### Föräldrakontroll

| Tool | Syfte |
|---|---|
| `nextdns_get_parental_control` | Hämta hela parentalControl |
| `nextdns_list_available_services` | Katalog: appar/spel (minecraft, tiktok, …) |
| `nextdns_list_available_categories` | Katalog: kategorier (porn, gaming, …) |
| `nextdns_set_service` | Blockera/schemalägg app (`active`, `recreation`) |
| `nextdns_remove_service` | Ta bort app-regel |
| `nextdns_set_category` | Blockera/schemalägg kategori |
| `nextdns_remove_category` | Ta bort kategori-regel |
| `nextdns_set_recreation` | Sätt fritidstider + timezone |
| `nextdns_set_parental_settings` | safeSearch / youtubeRestrictedMode / blockBypass |

`recreation: true` = tillåten bara under fritidstiderna. `recreation: false` + `active: true` = alltid blockerad.

## Utveckling

```bash
npm run typecheck
npm run build
npm start
```

API-dokumentation: https://nextdns.github.io/api/