Skip to content

connectors: batch 2b — 33 more greenfield SaaS adapters + engine fixes (catalog 134→167)#237

Merged
keysersoft merged 3 commits into
mainfrom
keysersoft/connector-batch-2
May 20, 2026
Merged

connectors: batch 2b — 33 more greenfield SaaS adapters + engine fixes (catalog 134→167)#237
keysersoft merged 3 commits into
mainfrom
keysersoft/connector-batch-2

Conversation

@keysersoft
Copy link
Copy Markdown
Contributor

Summary

Brings the connector catalog from 134 → 167 adapters (+33 greenfield).

Together with the just-merged PR #236 (batch 2a), this lands 48 of the 50 connectors from the top-50 plan in two waves (two were dropped as duplicates of existing region-specific adapters: paystack is in `ng/`, personio in `de/`).

Connectors in this PR (33)

Category New connectors
crm zoho-crm, bitrix24, streak, nimble, nutshell-crm, agilecrm, less-annoying-crm, salesflare
accounting freshbooks, wave-accounting, sage-business-cloud, invoiced, kashflow
hr greenhouse, lever, workable, bamboohr, deel
support freshchat, tidio
project-management wrike, teamwork-projects, plane-so
time-tracking timetastic
email mailerlite, omnisend
payments plaid, gocardless, flutterwave
social pinterest, buffer
storage dropbox, box

All verified no-vendor-MCP via `gh search repos`.

Engine + service fixes uncovered while authoring 2b

These are small, surgical and unblock real connectors. All come with passing unit coverage.

1. `rest.engine.ts` OAUTH2 — `tokenPrefix` support

Added support for non-Bearer token prefixes via `authConfig.tokenPrefix` (defaults to `Bearer`). Required by Zoho, which sends `Authorization: Zoho-oauthtoken ` instead of `Bearer`.

2. `adapters.service.ts importAdapter` — persist `connector.headers` + `connector.envVars`

The previous code wasn't persisting `connector.headers` from the catalog JSON. That silently broke adapters from batch 2a (harvest, freshservice, mastodon) whose per-tenant headers (`Harvest-Account-Id`, `GoCardless-Version`, etc.) were never sent at runtime.

Fix: headers are now resolved via `{{VAR}}` substitution from credentials and persisted on the `Connector` row. The import credentials are also persisted as `connector.envVars` so the runtime engine can resolve `$VAR_NAME` references inside `bodyMapping` / `path` / `queryParams` — used by:

  • `plaid` (client_id+secret-in-body auth)
  • `less-annoying-crm` (Function-dispatch envelope where auth lives in the body)
  • `bamboohr`, `kashflow` (subdomain embedded in URL path)

3. `catalog.spec.ts` — exempt env-var refs from "must be declared" check

The well-formed-endpointMapping test now skips `$UPPER_SNAKE_CASE` references, since those are legitimately resolved at request time from `connector.envVars` and intentionally NOT declared as tool parameters.

Verification

```
$ node scripts/validate-adapters.mjs
Validated 167 adapters: 167 passed, 0 failed.

$ npx jest --testPathPatterns='adapters' --silent
Test Suites: 1 skipped, 130 passed
Tests: 26 skipped, 2436 passed, 2462 total
```

Notable per-connector decisions

  • zoho-crm: needs the `Zoho-oauthtoken` prefix → triggered the engine extension.
  • bitrix24: webhook-URL auth (no headers — secret embedded in URL path).
  • less-annoying-crm: POST-only Function-dispatch envelope; auth goes in the body via $ENV_VAR substitution.
  • plaid: server-side auth via client_id+secret-in-body; defaults to sandbox.plaid.com for safety.
  • dropbox, box: file upload multipart deliberately out of scope — the existing engine doesn't stream binary; documented in instructions.
  • bluesky, personio: explicit JWT-as-parameter pattern (Bluesky session lifecycle, Personio's rotating single-use tokens) — clients manage the token.
  • mastodon: per-instance baseUrl via `{{MASTODON_INSTANCE_URL}}` placeholder.

Test plan

  • CI green (validator + catalog-sync + jest)
  • Merge → trigger docker-publish.yml → deploy-cloud.yml
  • Verify `https://cloud.anythingmcp.com/api/adapters | jq 'length'` == 167
  • Spot-check 3-5 new slugs end-to-end: zoho-crm (Zoho-oauthtoken prefix), bamboohr (subdomain in path), plaid (sandbox auth)
  • Confirm harvest / freshservice / mastodon (2a) now get their per-tenant headers correctly (the fix in this PR)

Follow-ups (not in this PR)

  • EN/DE/IT MDX guides for all 48 batch-2 connectors on the website repo
  • ES/JA/RU/ZH translation fan-out

Brings the catalog from 119 to 134 adapters. Each comes with rich
instructions, per-tool descriptions, parameter docs and a static live
spec asserting baseUrl + auth shape.

Categories covered:
  data:         openweather, coingecko, newsapi, hackernews
  monitoring:   datadog, new-relic, bugsnag, uptime-robot
  time-tracking: harvest, toggl-track, clockify
  social:       bluesky, mastodon
  support:      gorgias, freshservice

Notes:
- coingecko uses optional x-cg-demo-api-key (works anon for the public
  tier, raises rate limit when set).
- datadog requires the dual DD-API-KEY + DD-APPLICATION-KEY pair via
  the existing API_KEY extraHeaders extension.
- new-relic wraps NerdGraph (GraphQL) NRQL queries through a REST POST
  to /graphql plus the legacy REST deployments endpoint.
- uptime-robot uses QUERY_AUTH on api_key + format=json so each tool
  body stays clean form-encoded params (the API accepts auth in URL).
- harvest, gorgias, freshservice, mastodon use {{}} placeholders in
  baseUrl/headers so each tenant injects subdomain/account-id/instance
  at import time.
- toggl-track uses the documented Basic auth pair (token, "api_token").
- bluesky exposes session create + refresh so the JWT lifecycle is
  client-managed; subsequent tools take the access_jwt as a tool param.

All adapters validate via scripts/validate-adapters.mjs and 15/15 new
live specs pass (35 tests). Catalog regenerated.
…fixes

Catalog grows 134 → 167 adapters. With this PR the original "+50 in 2
waves" plan lands: batch 2a (15) + batch 2b (33, deferring paystack
duplicate to ng/) = 48 new adapters since main, on top of the 119
already shipped pre-batch-2.

Categories covered in 2b:
  crm:               zoho-crm, bitrix24, streak, nimble, nutshell-crm,
                     agilecrm, less-annoying-crm, salesflare (8)
  accounting:        freshbooks, wave-accounting, sage-business-cloud,
                     invoiced, kashflow (5)
  hr:                greenhouse, lever, workable, bamboohr, deel (5;
                     personio already exists in de/)
  support:           freshchat, tidio (2)
  project-management:wrike, teamwork-projects, plane-so (3)
  time-tracking:     timetastic (1)
  email:             mailerlite, omnisend (2)
  payments:          plaid, gocardless, flutterwave (3; paystack
                     already exists in ng/)
  social:            pinterest, buffer (2)
  storage:           dropbox, box (2)

Engine + service fixes uncovered while authoring 2b:

1. rest.engine.ts OAUTH2 — added support for non-Bearer token prefixes
   via authConfig.tokenPrefix (defaults to "Bearer"). Required by Zoho,
   which sends "Authorization: Zoho-oauthtoken <token>" instead.

2. adapters.service.ts importAdapter — was NOT persisting
   connector.headers from the catalog JSON, meaning adapters like
   harvest / freshservice / mastodon (shipped in 2a) silently dropped
   their per-tenant headers (Harvest-Account-Id, GoCardless-Version,
   etc.) at runtime. Fixed: headers are now resolved via {{VAR}}
   substitution from credentials and persisted on the Connector row.
   Also persists import credentials as connector.envVars so the
   runtime engine can resolve $VAR_NAME references inside
   bodyMapping / path / queryParams (used by plaid for the
   client_id+secret-in-body auth and less-annoying-crm for the
   Function-dispatch envelope).

3. catalog.spec.ts well-formed-endpointMapping — exempted env-var-style
   $UPPER_SNAKE_CASE references from the "must be a declared tool
   parameter" check, since those are now legitimately resolved at
   request time from connector.envVars.

All 167 adapters validate via scripts/validate-adapters.mjs; 2436/2436
adapter tests pass.
@keysersoft keysersoft requested a review from D3nisty as a code owner May 20, 2026 19:14
…batch-2

# Conflicts:
#	packages/backend/src/adapters/catalog.ts
@keysersoft keysersoft merged commit 58bca91 into main May 20, 2026
10 checks passed
@keysersoft keysersoft deleted the keysersoft/connector-batch-2 branch May 20, 2026 19:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant