connectors: batch 2b — 33 more greenfield SaaS adapters + engine fixes (catalog 134→167)#237
Merged
Merged
Conversation
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.
…batch-2 # Conflicts: # packages/backend/src/adapters/catalog.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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)
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:
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
Test plan
Follow-ups (not in this PR)