Commit Graph
55 Commits
Author SHA1 Message Date
Daniele a2bbedad40 whatsapp: fix history sync + session corruption, Baileys 7.0.0-rc14 (v7 / 2.1.0)
Diagnosed from the live server (two users, two accounts, one shared log).

- history sync was gated off entirely on Baileys 6.7.x: the library derives
  shouldSyncHistoryMessage from syncFullHistory when unset, and the connector
  shipped syncFullHistory: false. Now both are passed explicitly, so behaviour
  no longer depends on the resolved Baileys version. browser -> ['Mac OS', ...]
  because PLATFORM_MAP only grants a desktop-grade sync to Mac OS / Windows.
- reconnects leaked their socket, leaving two writers over auth/: no end(), no
  removeAllListeners(). ~15 reconnects/day produced 1422 Bad MAC lines, all on
  the account's own LID device 0. Added teardownSock(), per-socket generation
  guards, and a single-slot reconnect timer with exponential backoff.
- undecryptable messages (stubType CIPHERTEXT) were stored with empty text and
  rendered as blank transcript lines; now labelled and counted. Text-less
  protocol frames are dropped.
- fetchLatestBaileysVersion() ran on every reconnect; now cached for 6h.
- libsignal's direct console.error spam collapsed into one counted line, log
  lines tagged with the linked account, console.log redirected off stdout.

Baileys pinned ^6.7.9 -> 7.0.0-rc14 (the range resolved to 6.7.24 for one user
and 6.17.16 for the other). RC is ESM-only, so index.js is now ESM.

Verified on skald-runtime:v4 (Node 20.19.2): initialize, tools/list, status,
list_chats, version fetch, QR, and logout -> teardown -> single reconnect.

Remaining gap: the store is still in-memory only, so synced history is lost on
the next process restart.
2026-08-23 18:15:56 +01:00
Daniele 040a0b2320 exa: fix verify.py rejecting every API key (v5 / 1.0.4)
Activating Exa always failed with "Exa API key is invalid or
unauthorized (HTTP 403)" — the key was never actually tested.

Two bugs stacked:

1. mcp.exa.ai is behind Cloudflare, which bans urllib's default
   Python-urllib/3.x agent with 403 / "error code: 1010" before Exa
   sees the request. verify.py sent no User-Agent and mapped any 403
   to "API key is invalid". Reproduced on the server with no key set
   at all — same "invalid key" message.

2. The probed endpoint cannot validate a key anyway: JSON-RPC
   initialize against the MCP endpoint returns 200 no matter what
   ?exaApiKey= carries (checked with a real key, a bogus key, and no
   key). Fixing only the headers would have flipped the bug to
   accepting every key, including garbage.

With a key, the probe is now a minimal POST to api.exa.ai/search with
the key in the x-api-key header — the only call that exercises the
credential (200 valid, 401/403 + Exa JSON error invalid, 402 out of
credits, 429 valid but throttled). With no key it probes MCP
initialize and reports reachability only, never validity. Both
requests send a User-Agent; the MCP one also sends
Accept: application/json, text/event-stream (else HTTP 406).

An opaque 401/403 with no Exa JSON error is now reported as "blocked
before reaching the API — the key was not tested", instead of blaming
the credential.

Also re-aligns manifest/fragment versions to 5 / 1.0.4 (were 2/1.0.1
vs 4/1.0.3; skald reads installed_version from the manifest, so the
update badge would never have appeared) and raises verify.timeout_secs
15 -> 20.
2026-08-20 23:02:30 +01:00
Daniele f02bb78ebd playwright: force --browser chromium (v2 / 1.0.1)
default 'chrome' channel requires system Google Chrome, missing on slim
Linux hosts; use the postinstall-downloaded Chromium build instead
2026-08-19 18:20:13 +01:00
Daniele fa8bbcb808 add playwright connector (v1 / 1.0.0) + commit pending docs reorganization
- new global mcp_local connector wrapping @playwright/mcp@0.0.79:
  index.js argv wrapper (--headless --isolated --no-sandbox) importing
  the package cli.js, postinstall downloads chromium-only browser,
  verify.js headless-launch probe, 24 tools with display names
- also carries the pending docs work: changelog extracted to
  CHANGELOG.md, manifest guide, SKALD.md/CLAUDE.md updates
2026-08-19 17:37:13 +01:00
DanieleandClaude Opus 5 28aeb9bcd7 SKALD.md: note that a reinstall does not rewrite a global server's command/args
refresh_connector_after_reinstall updates only the description on the
mcp_global_servers row before restarting from it, so an instance that already
had http-fetch/firecrawl enabled keeps the stale `npx …/-y` launch after an
Update. Record the deploy → Update → re-save sequence that actually applies it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 14:15:17 +01:00
DanieleandClaude Opus 5 ecb6835fa5 http-fetch/firecrawl: replace npx launch with a shipped wrapper (v5 / 1.1.0)
Both connectors declared `mcp_config: {command: "npx", args: ["-y", "<pkg>"]}`
and shipped no code at all. Skald treats a mcp_local `args[0]` as the *name of
the file to run*, not as an argument: install stores `script_path = "<id>/-y"`
and global_enable launches `npx /…/connectors/<id>/-y`, a path that does not
exist. The server never answered `initialize`, so start_server failed — and
since global_enable still returns 200 with an `error` in the body, the UI showed
the connector as enabled while `render_mcp_list` (built from the live runtime)
left it out of the agent's system context entirely.

Ship a two-file wrapper instead: a package.json pinning the upstream package
(mcp-fetch-server@1.1.2, firecrawl-mcp@3.23.7) and an index.js importing it for
its side effect, so `node index.js` is a real local_script and
ensure_installed_host installs the deps beside it. No node_modules, no lockfile.

Also: drop the legacy `launch_command` / top-level `transport` / `dependencies`
fields; drop firecrawl's inert `mcp_config.env` placeholder (same case as gmaps
— tokens are only substituted in the URL); add firecrawl_developer_search to
firecrawl's tools[] and API_KEY to its requires; realign manifest and fragment
versions to 5 / 1.1.0 (they were 2 vs 4, so no Update badge could ever appear).

Verified end-to-end against the shipped files by reproducing Skald's own path:
`npm ci || npm install --omit=dev` then `node <abs>/index.js` — initialize,
tools/list and a real tools/call, JSON-RPC only on stdout.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 14:14:36 +01:00
Daniele 73d1a51b1f gmaps: fix missing dependency install + wire verify (v6 / 1.1.0)
The connector shipped no requirements.txt, so ensure_installed_host()
installed nothing and every tool call failed with "No module named
'googlemaps'" while the server still answered tools/list — skald logged
"connected — 6 tool(s)" on a connector that could not work.

- add requirements.txt (googlemaps>=4.10.0); deps were declared in the
  manifest's `dependencies` field, which skald only uses for the card
- wire the shipped verify.py through a `verify` manifest block, so a
  broken install fails visibly at enable time instead of silently
- verify.py puts .pydeps on sys.path: skald sets PYTHONPATH only for the
  server process, not for the `sh -c "python3 verify.py"` verify step
- drop the inert mcp_config.env {SECRET:…} placeholder — those tokens are
  substituted in the URL only, never in env values
- realign manifest/fragment versions (were 2/1.0.1 vs 5/1.0.4); skald
  prefers the manifest, so "update available" could never appear
- requires ENV -> API_KEY; drop deprecated secrets/ path from error text
- regenerate the index
2026-08-10 12:38:32 +01:00
dguiducci 2ad3954e3a add linkedin connector + gitignore .claude + regenerate index 2026-08-07 13:30:44 +01:00
dguiducci c778450812 gcal/gmail: version bump (gcal 0.3.5, gmail 1.0.6) + regenerate index 2026-08-07 12:27:12 +01:00
dguiducci 371b7f75b5 gcal/gmail: update MCP servers + SKALD.md 2026-08-07 12:22:24 +01:00
dguiducci c49c3fa74d gmaps: fix env var injection — add mcp_config.env to pass GOOGLE_MAPS_API_KEY to subprocess 2026-07-25 09:09:17 +01:00
dguiducci a13d0295ca serpapi-flights: replace SVG icons with new PNG icons (sm 48x48, lg 96x96) 2026-07-23 17:45:35 +01:00
dguiducci 1094f11e34 context7: replace SVG icons with new PNG icons (sm 48x48, lg 96x96) 2026-07-23 17:42:46 +01:00
dguiducci 028d240ef2 fix: add missing requires field to 6 connector fragment.json and connector.json files 2026-07-22 23:28:46 +01:00
dguiducci c151739021 docs: replace connector manifest guide with coding agent version, adapted for compile.py workflow 2026-07-22 23:26:52 +01:00
dguiducci b97de67176 compile.py: rewrite all output messages and docstrings in English 2026-07-22 22:54:17 +01:00
dguiducci ccab72c586 Nuovo sistema: index.json + fragment.json + compile.py (SHA-256 automatici) 2026-07-22 22:52:01 +01:00
dguiducci 5f254d9a96 Aggiunto connector Google Trends (mcp_local) — trendspyg, nessuna API key 2026-07-22 22:46:08 +01:00
dguiducci 9236f668ec Fix llm_short_description: descrivere cosa fa l'MCP, non elencare i tool 2026-07-22 22:24:10 +01:00
dguiducci 3440890d11 Migliorate llm_short_description per tutti i connector — tool names espliciti
Ogni connector.json ora ha una llm_short_description che elenca i tool
specifici che espone, così l'LLM sa esattamente cosa attivare (lazy load).

SKALD.md: documentata criticità del campo llm_short_description
nel system prompt dell'LLM.
2026-07-22 22:21:52 +01:00
dguiducci be1150fe51 Ridimensionate icone Google Drive (sm: 32px, lg: 64px) 2026-07-22 22:03:08 +01:00
dguiducci 607a059f10 Icona Google Drive ufficiale da Wikimedia (PNG) 2026-07-22 22:02:34 +01:00
dguiducci d36c511132 Icona Google Maps ufficiale da Wikimedia 2026-07-22 22:01:12 +01:00
dguiducci 20fd017a9a Icone: Gmail (SVG ufficiale) e Tavily (ridimensionata da upload utente) 2026-07-22 21:56:05 +01:00
dguiducci 2750e773d4 Aggiunto connector Google Maps (mcp_local)
- Script: gmaps_mcp_server.py (MCP stdio, JSON-RPC 2.0)
- 6 tools: status, directions, geocode, reverse_geocode, search_places, distance_matrix
- Auth: API key via env GOOGLE_MAPS_API_KEY
- Verify: test Geocoding API con probe 'Rome, IT' 
- Dipendenze: googlemaps>=4.10.0
- Icone SVG pin Google Maps
2026-07-22 21:46:43 +01:00
dguiducci 7f6477dd68 Aggiunto connector Context7 (mcp_remote)
- URL: https://mcp.context7.com/mcp, trasporto streamable-http
- Auth: none (endpoint pubblico, free tier)
- Verify: MCP initialize probe (testato )
- Icone SVG dal logo ufficiale Context7

Inoltre:
- Copiata docs/connector.manifest_guide.md da skald-circle/blueprint/
- Riferimento alla guida in SKALD.md
2026-07-22 21:40:12 +01:00
dguiducci c495b98574 fix: ricalcolati sha256 di connector.json dopo version bump
Lo script aveva calcolato lo sha256 prima di scrivere il bump di
versione in connector.json, causando mismatch su tutti i 13 connector.
2026-07-21 23:55:42 +01:00
dguiducci 955b1ba069 feat: friendly tool names per MCP title field or manifest
- Aggiunto campo 'title' a tools/list in tutti gli script MCP locali
  (Gmail, Gcal, Drive, Email, SSH, Weather, Wikipedia, WhatsApp)
- Aggiunto tools[]/display_name nel manifest per connector remoti/package
  esterni (Firecrawl, HTTP Fetch, Exa, Tavily, SerpAPI Flights)
- Documentata convenzione e resolution order in SKALD.md
- Aggiornata manifest_guide.md per tools[] in connectors.json
- Bumped version e sha256 per tutti i 13 connector
2026-07-21 23:43:24 +01:00
dguiducci ad0909b18d Fix weather + wikipedia: add requires:["PYTHON"] so Skald installs httpx deps
Without requires:["PYTHON"] Skald skips pip install and httpx is
missing at runtime. Bump v2→v3 (3.0.0).
2026-07-20 17:20:39 +01:00
dguiducci f1654d7d9d Fix weather + wikipedia: add mcp_config (command+args) to manifest
Both connectors were missing the mcp_config block that the frontend requires
to install mcp_local connectors. Bump v1→v2 (2.0.0).
2026-07-19 17:25:40 +01:00
dguiducci 513483e81b Add SerpAPI Flights connector: mcp_remote, flight search via Google Flights, verify.py with MCP initialize probe 2026-07-19 14:46:20 +01:00
dguiducci e469f48b52 Add Google Drive connector: mcp_local, OAuth2 (same pattern as Gmail/GCal), 8 tools, verify with Drive API probe, SVG icons 2026-07-19 14:44:10 +01:00
dguiducci e8ce11989d SKALD.md: update connector table — add Exa, fill missing entries 2026-07-19 14:15:12 +01:00
dguiducci 341e4382c8 Add Exa connector: mcp_remote, neural web search, optional API key (free tier), verify.py with MCP initialize probe 2026-07-19 14:13:28 +01:00
dguiducci b83b2feb0f whatsapp: bump version 1→2 for update detection test (2.0.1→2.0.2) 2026-07-19 10:27:57 +01:00
dguiducci 7039816b73 Add versioning schema: version (int), version_string, version_release_date to all 10 connectors
- version: intero per-connector (parte da 1)
- version_string: semver ereditato (display only)
- version_release_date: ISO 8601 (display only)
- Campi identici in index (connectors.json) e manifest (connector.json)
- Aggiunto connector.json alle files[] di gmail, gcal, email, ssh, tavily
- Aggiornata documentazione in SKALD.md
2026-07-19 10:23:22 +01:00
dguiducci dd88363d98 whatsapp: fix crypto.subtle polyfill for Node 18, bump to v2.0.1 2026-07-19 10:16:37 +01:00
dguiducci 4e428073df Add WhatsApp connector v2 (Baileys, QR auth) 2026-07-19 10:08:12 +01:00
dguiducci 61248454e3 Add HTTP Fetch connector (npx mcp-fetch-server, no auth) 2026-07-18 21:54:32 +01:00
dguiducci d02b5ce1df Add HTTP Fetch connector (npx mcp-fetch-server, no auth) 2026-07-18 21:54:03 +01:00
dguiducci 36a026ff71 Add Firecrawl connector
- mcp_local via npx -y firecrawl-mcp
- API key come env FIRECRAWL_API_KEY (secret:true)
- Requires NODE runtime
- Verify via Node.js: Firecrawl scrape API probe
- Icona PNG fornita dall'utente
2026-07-18 21:52:30 +01:00
dguiducci c3521c4ac0 Add Weather (Open-Meteo) and Wikipedia connectors
- weather/ — Python MCP server (copiato da skald/scripts), no auth, free API
- wikipedia/ — nuovo Python MCP server, Wikipedia API pubblica, no auth
- Entrambi: mcp_local, scope global, auth none, dipendenza httpx
- connectors.json: +2 connector (totale 7), auth:none aggiunto anche a SSH
2026-07-18 21:49:47 +01:00
dguiducci 9cc84fd8ff Tavily: fix Italian -> English in docs and env descriptions 2026-07-17 22:27:52 +01:00
dguiducci 4954aad667 Adotta schema single-field env[] per Tavily: chiave API come voce env, auth semplificato, no requires
- Tavily: applicato manifest esatto con env[0] tavilyApiKey (secret:true),
  auth: {type:api_key}, no requires, URL referenzia {SECRET:tavilyApiKey}
- Email: auth semplificato (type:password, no delivery), rimosso ENV da requires
- connectors.json: aggiunto auth compatto per Tavily ed Email, rimossi requires
  API_KEY/ENV, fixati duplicati icon_lg.svg/verify.py residui
2026-07-17 22:21:39 +01:00
dguiducci 1502df04cf SKALD.md: document deploy flow — branch main = release, script marketplace_deploy.sh 2026-07-17 22:03:58 +01:00
dguiducci df4a18bd84 Fix duplicated entries in connectors.json index after purge 2026-07-17 22:01:03 +01:00
dguiducci b1a3944fc8 Purge standalone OAuth setup for Gmail and Gcal
- Deleted gmail_oauth_setup.py and gcal_oauth_setup.py (Skald handles OAuth)
- Removed google-auth-oauthlib dependency from requirements.txt and connector.json
- Simplified setup_instructions to point to Skald's OAuth flow
- Updated docstrings and error messages in *_mcp_server.py (no more refs to
  *_oauth_setup.py, point to Skald OAuth / env-var instead)
- connectors.json: removed oauth_setup.py from files[], updated sha256 hashes
2026-07-17 21:53:17 +01:00
dguiducci 46c1446eae Switch Gmail and Gcal to env-var OAuth delivery pattern
auth.deliver changes from as:file to as:env:
- Gmail: GMAIL_CREDS_JSON env var (Google authorized_user JSON)
- Gcal: GCAL_CREDS_JSON env var

mcp_config.env removed entirely — Skald injects the env var at runtime,
no path on disk needed.

Server scripts updated:
- Check GMAIL_CREDS_JSON / GCAL_CREDS_JSON env var first
- Use Credentials.from_authorized_user_info() instead of
  from_authorized_user_file()
- Fall back to file-based loading for standalone/legacy use
- _persist_creds only writes to disk when _creds_path is set

gcal/verify.py: support GCAL_CREDS_JSON env var with shared _check_api()

Docs (SKALD.md): updated examples, field table, connector table.
2026-07-17 21:00:58 +01:00
dguiducci 3a3bc4e1e9 Add Google Calendar connector (gcal)
- connector.json: OAuth Google, scope https://www.googleapis.com/auth/calendar
  deliver: file/google_authorized_user → {secrets}/google_creds.json
  mcp_config.env.GOOGLE_CREDS_PATH = {secrets}/google_creds.json
- verify.py: loads creds + API probe (calendarList.list)
- gcal_mcp_server.py: 8 tools (status, list_calendars, list_events,
  get_event, create_event, update_event, delete_event, respond_to_event)
  + push notification polling
- icons: calendar SVG (48px + 96px)
- connectors.json index: gcal entry with auth + sha256
- SKALD.md: tabella connector + stato verify aggiornati
2026-07-17 20:53:38 +01:00
dguiducci 04912fccd9 SKALD.md: document OAuth deliver, auth in index, oauth/show.html 2026-07-17 20:48:54 +01:00