SKALD.md: document OAuth deliver, auth in index, oauth/show.html
This commit is contained in:
@@ -1,8 +1,10 @@
|
|||||||
# Skald Connectors Marketplace
|
# Skald Connectors Marketplace
|
||||||
|
|
||||||
_Updated: 2026-07-16_
|
_Updated: 2026-07-17_
|
||||||
|
|
||||||
**Remote**: `https://git.skaldagent.net/dguiducci/skald-connectors.git` (branch: `main`)
|
**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'è
|
## Cos'è
|
||||||
|
|
||||||
@@ -19,6 +21,8 @@ Due tipi di connector:
|
|||||||
connectors/
|
connectors/
|
||||||
├── connectors.json ← INDICE (radice di fiducia unica)
|
├── connectors.json ← INDICE (radice di fiducia unica)
|
||||||
├── index.html ← Catalogo UI (legge connectors.json via fetch)
|
├── index.html ← Catalogo UI (legge connectors.json via fetch)
|
||||||
|
├── oauth/
|
||||||
|
│ └── show.html ← OAuth callback receiver (client-side, no backend)
|
||||||
├── gmail/ ← Un connector per cartella
|
├── gmail/ ← Un connector per cartella
|
||||||
│ ├── connector.json ← Configurazione tecnica
|
│ ├── connector.json ← Configurazione tecnica
|
||||||
│ ├── gmail_mcp_server.py ← Script MCP
|
│ ├── gmail_mcp_server.py ← Script MCP
|
||||||
@@ -26,8 +30,22 @@ connectors/
|
|||||||
│ ├── requirements.txt ← Dipendenze Python
|
│ ├── requirements.txt ← Dipendenze Python
|
||||||
│ ├── icon_sm.svg ← Icona piccola (48×48)
|
│ ├── icon_sm.svg ← Icona piccola (48×48)
|
||||||
│ └── icon_lg.svg ← Icona grande (es. preview)
|
│ └── 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/
|
└── tavily/
|
||||||
├── connector.json
|
├── connector.json
|
||||||
|
├── verify.py
|
||||||
├── icon_sm.png
|
├── icon_sm.png
|
||||||
└── icon_lg.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...",
|
"user_description": "Read, send, and manage Gmail emails via OAuth...",
|
||||||
"requires": ["OAUTH", "PYTHON"],
|
"requires": ["OAUTH", "PYTHON"],
|
||||||
"tags": ["email", "mcp", "local", "google"],
|
"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",
|
"folder": "gmail",
|
||||||
"files": [
|
"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_mcp_server.py", "sha256": "a50d4da9621f7a4b092f...", "size": 46772},
|
||||||
{"path": "gmail_oauth_setup.py", "sha256": "e488acb289c43a3e6d54...", "size": 3627},
|
{"path": "gmail_oauth_setup.py", "sha256": "e488acb289c43a3e6d54...", "size": 3627},
|
||||||
{"path": "icon_lg.svg", "sha256": "93c8d9c8dae96f0206e5...", "size": 254},
|
{"path": "icon_lg.svg", "sha256": "93c8d9c8dae96f0206e5...", "size": 254},
|
||||||
@@ -119,7 +147,12 @@ Configurazione tecnica per l'attivazione del connector.
|
|||||||
"scopes": [
|
"scopes": [
|
||||||
"https://www.googleapis.com/auth/gmail.modify",
|
"https://www.googleapis.com/auth/gmail.modify",
|
||||||
"https://www.googleapis.com/auth/gmail.labels"
|
"https://www.googleapis.com/auth/gmail.labels"
|
||||||
]
|
],
|
||||||
|
"deliver": {
|
||||||
|
"as": "file",
|
||||||
|
"format": "google_authorized_user",
|
||||||
|
"path": "{secrets}/gmail_creds.json"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"mcp_config": {
|
"mcp_config": {
|
||||||
"command": "python3",
|
"command": "python3",
|
||||||
@@ -197,9 +230,13 @@ Struttura che descrive come il connector gestisce l'autenticazione:
|
|||||||
// API key in header
|
// API key in header
|
||||||
{"type": "api_key", "delivery": "header", "param": "X-API-Key"}
|
{"type": "api_key", "delivery": "header", "param": "X-API-Key"}
|
||||||
|
|
||||||
// OAuth2
|
// OAuth2 — provider SOLO slug (Skald risolve endpoint + client secrets)
|
||||||
{"type": "oauth2", "provider": "google", "scopes": ["...", "..."]}
|
{"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
|
// Password / app-password fornita via variabili d'ambiente
|
||||||
{"type": "password", "delivery": "env"}
|
{"type": "password", "delivery": "env"}
|
||||||
|
|
||||||
@@ -207,6 +244,18 @@ Struttura che descrive come il connector gestisce l'autenticazione:
|
|||||||
{"type": "none"}
|
{"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)
|
## Campo env (variabili d'ambiente)
|
||||||
|
|
||||||
Usato quando `requires` include `ENV`. È un **array** che dichiara le variabili
|
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 |
|
| ID | Nome | Tipo | Scope | Auth | Verify |
|
||||||
|----|------|------|-------|------|--------|
|
|----|------|------|-------|------|--------|
|
||||||
| `tavily` | Tavily | `mcp_remote` | `global` | api_key (`{SECRET:tavilyApiKey}` in URL) | `verify.py` (HTTP probe `/search`) |
|
| `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 |
|
| `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) |
|
| `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) |
|
| `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
|
**Stato del verify-before-save in skald**: `email` e `tavily` hanno `verify` completo
|
||||||
|
|||||||
Reference in New Issue
Block a user