diff --git a/SKALD.md b/SKALD.md index abf9dbc..fc366ea 100644 --- a/SKALD.md +++ b/SKALD.md @@ -1,8 +1,10 @@ # Skald Connectors Marketplace -_Updated: 2026-07-16_ +_Updated: 2026-07-17_ **Remote**: `https://git.skaldagent.net/dguiducci/skald-connectors.git` (branch: `main`) +**Live**: `https://connectors.skaldagent.net/` +**OAuth callback**: `https://connectors.skaldagent.net/oauth/show.html` ## Cos'è @@ -19,6 +21,8 @@ Due tipi di connector: connectors/ ├── connectors.json ← INDICE (radice di fiducia unica) ├── index.html ← Catalogo UI (legge connectors.json via fetch) +├── oauth/ +│ └── show.html ← OAuth callback receiver (client-side, no backend) ├── gmail/ ← Un connector per cartella │ ├── connector.json ← Configurazione tecnica │ ├── gmail_mcp_server.py ← Script MCP @@ -26,8 +30,22 @@ connectors/ │ ├── requirements.txt ← Dipendenze Python │ ├── icon_sm.svg ← Icona piccola (48×48) │ └── icon_lg.svg ← Icona grande (es. preview) +├── email/ +│ ├── connector.json +│ ├── email_mcp_server.py +│ ├── verify.py +│ ├── requirements.txt +│ ├── icon_sm.svg +│ └── icon_lg.svg +├── ssh/ +│ ├── connector.json +│ ├── ssh_mcp_server.py +│ ├── requirements.txt +│ ├── icon_sm.svg +│ └── icon_lg.svg └── tavily/ ├── connector.json + ├── verify.py ├── icon_sm.png └── icon_lg.png ``` @@ -51,8 +69,18 @@ Non ha hash di sé stesso — in futuro potrà essere firmato digitalmente. "user_description": "Read, send, and manage Gmail emails via OAuth...", "requires": ["OAUTH", "PYTHON"], "tags": ["email", "mcp", "local", "google"], + "auth": { + "type": "oauth2", + "provider": "google", + "scopes": [ + "https://www.googleapis.com/auth/gmail.modify", + "https://www.googleapis.com/auth/gmail.labels" + ] + }, "folder": "gmail", "files": [ +| `auth` | per OAuth | Oggetto con `type`, `provider`, `scopes` per badge UI (NO `deliver` qui, è nel manifest) | + {"path": "gmail_mcp_server.py", "sha256": "a50d4da9621f7a4b092f...", "size": 46772}, {"path": "gmail_oauth_setup.py", "sha256": "e488acb289c43a3e6d54...", "size": 3627}, {"path": "icon_lg.svg", "sha256": "93c8d9c8dae96f0206e5...", "size": 254}, @@ -119,7 +147,12 @@ Configurazione tecnica per l'attivazione del connector. "scopes": [ "https://www.googleapis.com/auth/gmail.modify", "https://www.googleapis.com/auth/gmail.labels" - ] + ], + "deliver": { + "as": "file", + "format": "google_authorized_user", + "path": "{secrets}/gmail_creds.json" + } }, "mcp_config": { "command": "python3", @@ -197,8 +230,12 @@ Struttura che descrive come il connector gestisce l'autenticazione: // API key in header {"type": "api_key", "delivery": "header", "param": "X-API-Key"} -// OAuth2 -{"type": "oauth2", "provider": "google", "scopes": ["...", "..."]} +// OAuth2 — provider SOLO slug (Skald risolve endpoint + client secrets) +{"type": "oauth2", "provider": "google", "scopes": ["...", "..."]} + +// OAuth2 con deliver (come Skald consegna la credenziale al processo MCP) +{"type": "oauth2", "provider": "google", "scopes": ["..."], + "deliver": {"as": "file", "format": "google_authorized_user", "path": "{secrets}/gmail_creds.json"}} // Password / app-password fornita via variabili d'ambiente {"type": "password", "delivery": "env"} @@ -207,6 +244,18 @@ Struttura che descrive come il connector gestisce l'autenticazione: {"type": "none"} ``` +### Campo deliver (solo OAuth2) + +Dichiara **come** Skald consegna la credenziale OAuth ottenuta al processo del server MCP. + +| Campo | Obbligatorio | Descrizione | +|-------|-------------|-------------| +| `as` | ✅ | `"file"` (su disco) o `"env"` (variabile d'ambiente) | +| `format` | ✅ | Nome della serializzazione — es. `"google_authorized_user"` (JSON Google che `from_authorized_user_file` legge), `"refresh_token"`, `"access_token"` | +| `path` | solo `as=file` | Path con placeholder `{secrets}` (Skald lo espande a dir per-utente a runtime). DEVE matchare il path in `mcp_config.env`. | + +Il feed NON contiene MAI: `client_id`, `client_secret`, `endpoint` URL, `redirect_uri`. Questi sono risolti lato Skald a partire dal nome del `provider`. + ## Campo env (variabili d'ambiente) Usato quando `requires` include `ENV`. È un **array** che dichiara le variabili @@ -389,8 +438,8 @@ sudo find /var/www/connectors.skaldagent.net/ -type f -exec chmod 644 {} \; | ID | Nome | Tipo | Scope | Auth | Verify | |----|------|------|-------|------|--------| - | `tavily` | Tavily | `mcp_remote` | `global` | api_key (`{SECRET:tavilyApiKey}` in URL) | `verify.py` (HTTP probe `/search`) | -| `gmail` | Gmail | `mcp_local` | `user` | oauth2 (Google) | ⏳ Fase 2 — il flusso OAuth non è ancora cablato in skald | +| `tavily` | Tavily | `mcp_remote` | `global` | api_key (`{SECRET:tavilyApiKey}` in URL) | `verify.py` (HTTP probe `/search`) | +| `gmail` | Gmail | `mcp_local` | `user` | oauth2 (Google) + deliver: `file/google_authorized_user` | ⏳ Fase 2 — OAuth via loopback listener | | `email` | Email (IMAP/SMTP) | `mcp_local` | `user` | password (env) | `verify.py` (IMAP+SMTP probe) | | `ssh` | SSH Remote Access | `mcp_local` | `user` | none (auth runtime per-alias) | — (nessun setup credential) | **Stato del verify-before-save in skald**: `email` e `tavily` hanno `verify` completo