Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
e55d190
connector-batch: foundation for large-scale catalog growth
keysersoft May 20, 2026
4beb424
connectors: add Pipedrive, Mailchimp, SendGrid adapters
keysersoft May 20, 2026
e7df7fc
connectors: add Calendly, Telegram Bot, Discord Bot adapters
keysersoft May 20, 2026
3f58be4
connectors: add Zendesk, Typeform, LemonSqueezy, Klaviyo adapters
keysersoft May 20, 2026
b578a04
connectors: add Close, Brevo, Kit (ConvertKit), Loops, ActiveCampaign
keysersoft May 20, 2026
507b61a
connectors: add Copper, Apollo, Salesloft, Outreach, Lemlist
keysersoft May 20, 2026
fc9b22a
connectors: add ClickUp, Trello, Todoist, Basecamp, Coda
keysersoft May 20, 2026
dcfdac1
connectors: add Hunter, NeverBounce, Mapbox, Nominatim, Mintlify
keysersoft May 20, 2026
42a8223
connectors: add Tally, SurveyMonkey, Freshdesk, Mollie, PandaDoc
keysersoft May 20, 2026
fca9af5
connectors: add Ghost, Substack, Reddit, Help Scout, Front
keysersoft May 20, 2026
a550ca6
connectors: add BigCommerce, Acuity, Drip, Heap, Fathom
keysersoft May 20, 2026
209d0b2
connectors: add Chargebee, Recurly, Crisp, Adyen, Statsig
keysersoft May 20, 2026
ae33d04
connectors: add Clearbit, Snov.io, GitBook, beehiiv, Wufoo
keysersoft May 20, 2026
bc2e2d5
connectors: add Magento, Etsy, YouTube Data, Insightly, Fillout
keysersoft May 20, 2026
e91e652
connectors: add Attio, Folk, TickTick, Slab, Dropbox Sign
keysersoft May 20, 2026
cb349e8
connectors: add Medium, Height, SavvyCal, MessageBird, SignWell
keysersoft May 20, 2026
bb43dc0
connectors: add Microsoft Bookings, Kustomer, Ecwid, Vercel Analytics…
keysersoft May 20, 2026
b17b186
connectors: add Mailshake, Microsoft Teams, LinkedIn, Amadeus (finale)
keysersoft May 20, 2026
0317519
fix(connectors): slab GraphQL spec + statsig CodeQL false positive
keysersoft May 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,19 @@ jobs:
- name: Install dependencies
run: npm ci

- name: Validate adapter catalog
run: node scripts/validate-adapters.mjs

- name: Verify catalog.ts is up-to-date with adapter JSONs
run: |
node scripts/regenerate-catalog.mjs
if ! git diff --quiet packages/backend/src/adapters/catalog.ts; then
echo "::error::catalog.ts is out of sync with adapter JSON files."
echo "Run: node scripts/regenerate-catalog.mjs && commit the result."
git diff packages/backend/src/adapters/catalog.ts
exit 1
fi

- name: Generate Prisma client
run: npx prisma generate
working-directory: packages/backend
Expand Down
1 change: 1 addition & 0 deletions packages/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"private": true,
"license": "BUSL-1.1",
"scripts": {
"prebuild": "node ../../scripts/regenerate-catalog.mjs",
"build": "prisma generate && nest build",
"dev": "nest start --watch",
"start": "nest start",
Expand Down
278 changes: 220 additions & 58 deletions packages/backend/src/adapters/catalog.ts
Original file line number Diff line number Diff line change
@@ -1,43 +1,124 @@
import * as dhlTracking from './de/dhl-tracking.json';
// === AUTOGEN-IMPORTS-BEGIN === run scripts/regenerate-catalog.mjs ===
import * as billomat from './de/billomat.json';
import * as bundesbank from './de/bundesbank.json';
import * as datev from './de/datev.json';
import * as destatisGenesis from './de/destatis-genesis.json';
import * as ninaWarnung from './de/nina-warnung.json';
import * as teamviewer from './de/teamviewer.json';
import * as n26OpenBanking from './de/n26-openbanking.json';
import * as payone from './de/payone.json';
import * as weclapp from './de/weclapp.json';
import * as immobilienscout24 from './de/immobilienscout24.json';
import * as mfrFieldservice from './de/mfr-fieldservice.json';
import * as deutscheBahn from './de/deutsche-bahn.json';
import * as dhlTracking from './de/dhl-tracking.json';
import * as dpdGermany from './de/dpd-germany.json';
import * as fastbill from './de/fastbill.json';
import * as billomat from './de/billomat.json';
import * as datev from './de/datev.json';
import * as scopevisio from './de/scopevisio.json';
import * as kenjo from './de/kenjo.json';
import * as planradar from './de/planradar.json';
import * as viesVat from './de/vies-vat.json';
import * as glsTracking from './de/gls-tracking.json';
import * as handelsregister from './de/handelsregister.json';
import * as deutscheBahn from './de/deutsche-bahn.json';
import * as hereGeocoding from './de/here-geocoding.json';
import * as hrworks from './de/hrworks.json';
import * as immobilienscout24 from './de/immobilienscout24.json';
import * as kenjo from './de/kenjo.json';
import * as mfrFieldservice from './de/mfr-fieldservice.json';
import * as n26Openbanking from './de/n26-openbanking.json';
import * as ninaWarnung from './de/nina-warnung.json';
import * as openplz from './de/openplz.json';
import * as oxomi from './de/oxomi.json';
import * as dpdGermany from './de/dpd-germany.json';
import * as glsTracking from './de/gls-tracking.json';
import * as shipcloud from './de/shipcloud.json';
import * as payone from './de/payone.json';
import * as personio from './de/personio.json';
import * as planradar from './de/planradar.json';
import * as scopevisio from './de/scopevisio.json';
import * as sendcloud from './de/sendcloud.json';
import * as xentral from './de/xentral.json';
import * as shipcloud from './de/shipcloud.json';
import * as shopware6 from './de/shopware-6.json';
import * as hereGeocoding from './de/here-geocoding.json';
import * as personio from './de/personio.json';
import * as hrworks from './de/hrworks.json';
import * as teamviewer from './de/teamviewer.json';
import * as viesVat from './de/vies-vat.json';
import * as weclapp from './de/weclapp.json';
import * as xentral from './de/xentral.json';
import * as companiesHouse from './gb/companies-house.json';
import * as wise from './gb/wise.json';
import * as razorpay from './in/razorpay.json';
import * as mercadoLibre from './br/mercado-libre.json';
import * as paystack from './ng/paystack.json';
import * as lineMessaging from './jp/line-messaging.json';
import * as activecampaign from './intl/activecampaign.json';
import * as acuityScheduling from './intl/acuity-scheduling.json';
import * as adyen from './intl/adyen.json';
import * as amadeus from './intl/amadeus.json';
import * as apollo from './intl/apollo.json';
import * as attio from './intl/attio.json';
import * as basecamp from './intl/basecamp.json';
import * as beehiiv from './intl/beehiiv.json';
import * as bigcommerce from './intl/bigcommerce.json';
import * as brevo from './intl/brevo.json';
import * as calendly from './intl/calendly.json';
import * as chargebee from './intl/chargebee.json';
import * as clearbit from './intl/clearbit.json';
import * as clickup from './intl/clickup.json';
import * as close from './intl/close.json';
import * as coda from './intl/coda.json';
import * as convertkit from './intl/convertkit.json';
import * as copper from './intl/copper.json';
import * as crisp from './intl/crisp.json';
import * as discordBot from './intl/discord-bot.json';
import * as drip from './intl/drip.json';
import * as dropboxSign from './intl/dropbox-sign.json';
import * as ecwid from './intl/ecwid.json';
import * as etsy from './intl/etsy.json';
import * as fathom from './intl/fathom.json';
import * as fillout from './intl/fillout.json';
import * as folk from './intl/folk.json';
import * as freshdesk from './intl/freshdesk.json';
import * as front from './intl/front.json';
import * as ghost from './intl/ghost.json';
import * as gitbook from './intl/gitbook.json';
import * as heap from './intl/heap.json';
import * as height from './intl/height.json';
import * as helpScout from './intl/help-scout.json';
import * as hunter from './intl/hunter.json';
import * as insightly from './intl/insightly.json';
import * as instantly from './intl/instantly.json';
import * as klaviyo from './intl/klaviyo.json';
import * as kustomer from './intl/kustomer.json';
import * as lemlist from './intl/lemlist.json';
import * as lemonsqueezy from './intl/lemonsqueezy.json';
import * as linkedin from './intl/linkedin.json';
import * as loops from './intl/loops.json';
import * as magento from './intl/magento.json';
import * as mailchimp from './intl/mailchimp.json';
import * as mailshake from './intl/mailshake.json';
import * as mapbox from './intl/mapbox.json';
import * as medium from './intl/medium.json';
import * as messagebird from './intl/messagebird.json';
import * as microsoftBookings from './intl/microsoft-bookings.json';
import * as microsoftTeams from './intl/microsoft-teams.json';
import * as mintlify from './intl/mintlify.json';
import * as mollie from './intl/mollie.json';
import * as neverbounce from './intl/neverbounce.json';
import * as nominatim from './intl/nominatim.json';
import * as outreach from './intl/outreach.json';
import * as pandadoc from './intl/pandadoc.json';
import * as pipedrive from './intl/pipedrive.json';
import * as recurly from './intl/recurly.json';
import * as reddit from './intl/reddit.json';
import * as salesloft from './intl/salesloft.json';
import * as savvycal from './intl/savvycal.json';
import * as sendgrid from './intl/sendgrid.json';
import * as signwell from './intl/signwell.json';
import * as slab from './intl/slab.json';
import * as snov from './intl/snov.json';
import * as sorare from './intl/sorare.json';
import * as statsig from './intl/statsig.json';
import * as substack from './intl/substack.json';
import * as surveymonkey from './intl/surveymonkey.json';
import * as tally from './intl/tally.json';
import * as telegramBot from './intl/telegram-bot.json';
import * as ticktick from './intl/ticktick.json';
import * as todoist from './intl/todoist.json';
import * as trello from './intl/trello.json';
import * as typeform from './intl/typeform.json';
import * as vercelAnalytics from './intl/vercel-analytics.json';
import * as whatsappBusiness from './intl/whatsapp-business.json';
import * as wordpress from './intl/wordpress.json';
import * as woocommerce from './intl/woocommerce.json';
import * as wordpress from './intl/wordpress.json';
import * as wufoo from './intl/wufoo.json';
import * as youtubeData from './intl/youtube-data.json';
import * as zendesk from './intl/zendesk.json';
import * as mercadoLibre from './br/mercado-libre.json';
import * as razorpay from './in/razorpay.json';
import * as lineMessaging from './jp/line-messaging.json';
import * as paystack from './ng/paystack.json';
// === AUTOGEN-IMPORTS-END ===
import { buildGraphqlBuiltinTools } from '../connectors/graphql-builtins';

export interface AdapterMeta {
Expand Down Expand Up @@ -103,52 +184,133 @@ function withGraphqlBuiltins(adapter: AdapterDefinition): AdapterDefinition {
return { ...adapter, tools: [...builtins, ...adapter.tools] };
}

// Register all adapters here. To add a new adapter:
// 1. Create the JSON file in the appropriate region folder
// 2. Import it above
// 3. Add it to this array
// To add a new adapter:
// 1. Create the JSON file under packages/backend/src/adapters/{region}/
// 2. Run `node scripts/regenerate-catalog.mjs` from the repo root.
// The imports and RAW_ADAPTERS array below are auto-generated.
// === AUTOGEN-ARRAY-BEGIN === run scripts/regenerate-catalog.mjs ===
const RAW_ADAPTERS: AdapterDefinition[] = [
dhlTracking as unknown as AdapterDefinition,
billomat as unknown as AdapterDefinition,
bundesbank as unknown as AdapterDefinition,
datev as unknown as AdapterDefinition,
destatisGenesis as unknown as AdapterDefinition,
ninaWarnung as unknown as AdapterDefinition,
teamviewer as unknown as AdapterDefinition,
n26OpenBanking as unknown as AdapterDefinition,
payone as unknown as AdapterDefinition,
weclapp as unknown as AdapterDefinition,
immobilienscout24 as unknown as AdapterDefinition,
mfrFieldservice as unknown as AdapterDefinition,
deutscheBahn as unknown as AdapterDefinition,
dhlTracking as unknown as AdapterDefinition,
dpdGermany as unknown as AdapterDefinition,
fastbill as unknown as AdapterDefinition,
billomat as unknown as AdapterDefinition,
datev as unknown as AdapterDefinition,
scopevisio as unknown as AdapterDefinition,
kenjo as unknown as AdapterDefinition,
planradar as unknown as AdapterDefinition,
viesVat as unknown as AdapterDefinition,
glsTracking as unknown as AdapterDefinition,
handelsregister as unknown as AdapterDefinition,
deutscheBahn as unknown as AdapterDefinition,
hereGeocoding as unknown as AdapterDefinition,
hrworks as unknown as AdapterDefinition,
immobilienscout24 as unknown as AdapterDefinition,
kenjo as unknown as AdapterDefinition,
mfrFieldservice as unknown as AdapterDefinition,
n26Openbanking as unknown as AdapterDefinition,
ninaWarnung as unknown as AdapterDefinition,
openplz as unknown as AdapterDefinition,
oxomi as unknown as AdapterDefinition,
dpdGermany as unknown as AdapterDefinition,
glsTracking as unknown as AdapterDefinition,
shipcloud as unknown as AdapterDefinition,
payone as unknown as AdapterDefinition,
personio as unknown as AdapterDefinition,
planradar as unknown as AdapterDefinition,
scopevisio as unknown as AdapterDefinition,
sendcloud as unknown as AdapterDefinition,
xentral as unknown as AdapterDefinition,
shipcloud as unknown as AdapterDefinition,
shopware6 as unknown as AdapterDefinition,
hereGeocoding as unknown as AdapterDefinition,
personio as unknown as AdapterDefinition,
hrworks as unknown as AdapterDefinition,
teamviewer as unknown as AdapterDefinition,
viesVat as unknown as AdapterDefinition,
weclapp as unknown as AdapterDefinition,
xentral as unknown as AdapterDefinition,
companiesHouse as unknown as AdapterDefinition,
wise as unknown as AdapterDefinition,
razorpay as unknown as AdapterDefinition,
mercadoLibre as unknown as AdapterDefinition,
paystack as unknown as AdapterDefinition,
lineMessaging as unknown as AdapterDefinition,
activecampaign as unknown as AdapterDefinition,
acuityScheduling as unknown as AdapterDefinition,
adyen as unknown as AdapterDefinition,
amadeus as unknown as AdapterDefinition,
apollo as unknown as AdapterDefinition,
attio as unknown as AdapterDefinition,
basecamp as unknown as AdapterDefinition,
beehiiv as unknown as AdapterDefinition,
bigcommerce as unknown as AdapterDefinition,
brevo as unknown as AdapterDefinition,
calendly as unknown as AdapterDefinition,
chargebee as unknown as AdapterDefinition,
clearbit as unknown as AdapterDefinition,
clickup as unknown as AdapterDefinition,
close as unknown as AdapterDefinition,
coda as unknown as AdapterDefinition,
convertkit as unknown as AdapterDefinition,
copper as unknown as AdapterDefinition,
crisp as unknown as AdapterDefinition,
discordBot as unknown as AdapterDefinition,
drip as unknown as AdapterDefinition,
dropboxSign as unknown as AdapterDefinition,
ecwid as unknown as AdapterDefinition,
etsy as unknown as AdapterDefinition,
fathom as unknown as AdapterDefinition,
fillout as unknown as AdapterDefinition,
folk as unknown as AdapterDefinition,
freshdesk as unknown as AdapterDefinition,
front as unknown as AdapterDefinition,
ghost as unknown as AdapterDefinition,
gitbook as unknown as AdapterDefinition,
heap as unknown as AdapterDefinition,
height as unknown as AdapterDefinition,
helpScout as unknown as AdapterDefinition,
hunter as unknown as AdapterDefinition,
insightly as unknown as AdapterDefinition,
instantly as unknown as AdapterDefinition,
klaviyo as unknown as AdapterDefinition,
kustomer as unknown as AdapterDefinition,
lemlist as unknown as AdapterDefinition,
lemonsqueezy as unknown as AdapterDefinition,
linkedin as unknown as AdapterDefinition,
loops as unknown as AdapterDefinition,
magento as unknown as AdapterDefinition,
mailchimp as unknown as AdapterDefinition,
mailshake as unknown as AdapterDefinition,
mapbox as unknown as AdapterDefinition,
medium as unknown as AdapterDefinition,
messagebird as unknown as AdapterDefinition,
microsoftBookings as unknown as AdapterDefinition,
microsoftTeams as unknown as AdapterDefinition,
mintlify as unknown as AdapterDefinition,
mollie as unknown as AdapterDefinition,
neverbounce as unknown as AdapterDefinition,
nominatim as unknown as AdapterDefinition,
outreach as unknown as AdapterDefinition,
pandadoc as unknown as AdapterDefinition,
pipedrive as unknown as AdapterDefinition,
recurly as unknown as AdapterDefinition,
reddit as unknown as AdapterDefinition,
salesloft as unknown as AdapterDefinition,
savvycal as unknown as AdapterDefinition,
sendgrid as unknown as AdapterDefinition,
signwell as unknown as AdapterDefinition,
slab as unknown as AdapterDefinition,
snov as unknown as AdapterDefinition,
sorare as unknown as AdapterDefinition,
statsig as unknown as AdapterDefinition,
substack as unknown as AdapterDefinition,
surveymonkey as unknown as AdapterDefinition,
tally as unknown as AdapterDefinition,
telegramBot as unknown as AdapterDefinition,
ticktick as unknown as AdapterDefinition,
todoist as unknown as AdapterDefinition,
trello as unknown as AdapterDefinition,
typeform as unknown as AdapterDefinition,
vercelAnalytics as unknown as AdapterDefinition,
whatsappBusiness as unknown as AdapterDefinition,
wordpress as unknown as AdapterDefinition,
woocommerce as unknown as AdapterDefinition,
wordpress as unknown as AdapterDefinition,
wufoo as unknown as AdapterDefinition,
youtubeData as unknown as AdapterDefinition,
zendesk as unknown as AdapterDefinition,
mercadoLibre as unknown as AdapterDefinition,
razorpay as unknown as AdapterDefinition,
lineMessaging as unknown as AdapterDefinition,
paystack as unknown as AdapterDefinition,
];
// === AUTOGEN-ARRAY-END ===

const ALL_ADAPTERS: AdapterDefinition[] = RAW_ADAPTERS.map(withGraphqlBuiltins);

Expand Down
Loading
Loading