v0.10.0 — 66 new connectors (189 → 255), HMAC signing, databases as a first-class adapter
66 new connectors — 189 → 255
A market survey in September found the same shape repeated across the European SMB market: the software is everywhere, the API is public, there is no MCP server, and there is visible demand. Every Tier A/B/C candidate it named now ships, in six waves, across eight new region directories (it es fr nl be ch se dk) — 255 adapters, 2,367 tools, 20 of which still need no API key.
- DACH — lexware-office, sevdesk, buchhaltungsbutler, bexio, clockodo, timetac, papershift, kimai, zammad, paperless-ngx, nextcloud, glpi, cas-genesisworld, docuware, d-velop, checkmk, znuny.
- ERP and commerce — odoo, dynamics-nav, jtl-wawi, haufe-x360, sage-100, ebay-sell, otto-market, zalando-zds, kaufland, propstack, elo, topdesk, matrix42.
- Southern Europe — fatture-in-cloud, aruba-fatturazione, teamsystem, zucchetti, holded, quipu, pennylane, sellsy, axonaut, dolibarr.
- Benelux and Nordics — exact-online, moneybird, afas-profit, teamleader, fortnox, visma-eaccounting, e-conomic.
- Infrastructure and open source — zabbix, proxmox, synology, erpnext, espocrm, openproject, youtrack, redmine, matomo, mautic, invoice-ninja, fhir.
Each one has a setup guide on anythingmcp.com/guides, in seven languages.
Databases are a first-class adapter, not something the engine tolerates
New auth type CONNECTION_STRING, and five adapters that use it: postgres, mysql, mssql, oracle and mongodb. Credentials live in the encrypted authConfig and are spliced into the DSN at call time, so the connection string you paste no longer has to carry a password in plaintext. catalog.spec stops applying URL rules to a path that is a SQL statement.
HMAC request signing
New auth type HMAC. An adapter describes the canonical string its vendor signs — template, algorithm, encoding, header names, extra headers — rather than pushing another vendor into engine code. Signing runs where OAuth 1.0a already runs, after the query and body are built, and the body is signed exactly as it will be sent; signing a different rendering of the same object is the usual way an HMAC integration fails with an error that blames the key.
This closes the last gap the September research left open. Kaufland Marketplace (ex real.de) is the first connector through it: orders, order units, shipments, tickets, storefronts, warehouses.
Six bugs that only running it found
Every one of these passed review and passed the test suite. They were found by installing the adapters against real servers and watching the wire.
- MongoDB — every call failed
Authentication failed, code 18. A root account lives inadmin, not the target database.authSourceis now required; the driver rejects an empty one, so it cannot be optional. - GLPI — a GET login with no
loginBodyputs every template parameter, password included, in the query string. It now authenticates with a revocableuser_tokenheader and an explicit empty body. - Synology —
loginUrlis never interpolated, so${username}would have reached DSM as those ten characters. Credentials moved intologinBody. - Array
bodyMapping—mapParamsbuilt a fresh object, so[{…}]went out as{"0": {…}}. Broke bexio's search and OTTO's two writes. - Array
queryParams— axios sendscolumns[]=a; OpenAPI's default and Checkmk's parser wantcolumns=a&columns=b. The bracketed form is ignored rather than rejected, so the call succeeds with the wrong columns. - OTTO's install probe — probed a tool whose required argument the probe cannot supply, so correct partner credentials reported a failed install.
The fix for 5 then introduced a seventh, caught before merge: the new serializer was built on URLSearchParams, which percent-encodes the colon and so re-spelled every ISO 8601 filter value across the 150 adapters that send one. The encoder now reproduces axios's rules, verified by a character sweep across printable ASCII and beyond reporting zero differences.
Guards were added for each shape so it cannot come back: no $UPPER_SNAKE in a REST path, no ${…} in a loginUrl, no GET login without a loginBody, every probe satisfiable by the arguments it supplies, every {UPPER_SNAKE} path segment a declared env var — plus the shipped bexio, otto-market, checkmk, glpi, synology and mongodb definitions driven through the real engines.
A missing credential is now a refusal, not a request
authConfig was substituted once at import and never again, so pasting credentials in after installing a connector changed nothing — the connector kept sending the template. Thirty-one Etsy connectors were in exactly that state, sending x-api-key: {{ETSY_CLIENT_ID}}:{{ETSY_CLIENT_SECRET}} and getting back an error about key format that means something else entirely.
authConfig is now interpolated on every call, like the base URL and headers already were, and Test connection exercises the credentials the workspace actually has. When there is nothing to substitute, the request is not sent: the error names the variables and says where to set them. Bodies are deliberately exempt — braces there can be a template the upstream renders itself.
Upstream errors carry actionable hints too: a SQL-backed API that rejects a filter now says which filter, and the adapter validator reports what to change rather than which schema rule failed.
131 trials that were never created
/api/license/trial rate-limits three registrations per hour per IP. The cloud backend calls it server to server for every verified email, always from the same droplet, so the whole cloud shared one bucket of three an hour — and activation is best-effort by design, so every loss was a warning line nobody read. On one measured day: 11 trials attempted, 9 rejected with 429.
Four changes, any one of which would have prevented it: a service token so the licence API can tell its own cloud from the public, retry with backoff on 429 and 5xx, an idempotent activate-trial (it had been answering 400 on every signup), and a repair pass in the onboarding cron that hands a licence to any verified user whose workspace has none. The 131 drained themselves.
The droplet filled its own disk
MOTIS logs one debug line per unresolvable GTFS-RT trip. The realtime feed carries every bus in Germany while the static timetable is rail-only, so nearly every trip is unresolvable by construction: 1.5 GB an hour, 32 GB in total, on a 77 GB disk with no logging: limits anywhere in the compose file.
The failure was silent in the worst way. Every container went unhealthy, Postgres could not write, the MCP endpoints answered 503 — and GET /api/adapters kept returning 200, so nothing looked wrong from outside. It surfaced because a deploy failed at its copy step.
Fixed at the root: a 50 MB × 5 log cap on all five cloud services, --log-level info in the MOTIS entrypoint, and a deploy step that keeps the eight newest application images instead of every image ever pulled. Also here, the MOTIS healthcheck that had failed 2,300 times in a row on a container serving traffic perfectly — it probed localhost (which resolves to ::1, where MOTIS does not bind) and / (which MOTIS answers 404).
Also
- New adapters outside the survey: Airtable and a read-only Sentry.
ADOPTERS.md, and a README link to it.- React 19.3 and Next 16.3.5, with a single hoisted
@types/react; nodemailer 9, hono 4.13, and the usual run of dependency bumps. - The
tools/listcache hint is pinned toprivate.
Upgrade notes: no database migration. Self-hosters pull and restart as usual; those running the MOTIS profile pick up the healthcheck and log-level fixes on recreate. LICENSE_SERVICE_TOKEN is cloud-only — leaving it unset keeps the public rate limit, which is the correct behaviour for a self-hosted install.