Adapter Catalog

@chat-adapter/catalog is a static catalog of every adapter listed on chat-sdk.dev: official, vendor-official, and community. It imports no adapter packages, so you can use it from websites, setup screens, build scripts, or onboarding flows without pulling in Slack, Teams, Redis, or other platform SDKs. The Adapters page and create-chat-sdk both read from it.

The chat/adapters subpath is deprecated. It re-exports the original official and vendor-official API from @chat-adapter/catalog, so existing imports keep working. Import from @chat-adapter/catalog in new code.

Install

pnpm add @chat-adapter/catalog

List adapters

List adapters and check what each one supports:

scripts/list-adapters.ts
import { getFeatureSupport, listAdapters } from "@chat-adapter/catalog";

for (const adapter of listAdapters({ type: "platform" })) {
  const streaming = getFeatureSupport(adapter, "streaming");
  console.log(adapter.name, adapter.group, adapter.packageName, streaming);
}

listAdapters() returns official and vendor-official adapters in the order the Adapters page lists them, followed by community adapters. Pass group or type to filter the list.

Read setup requirements

Official and vendor-official entries also describe setup. Use the env helpers when you need to show setup instructions or inject secrets for one adapter:

import { getAdapter, getSecretEnvVars } from "@chat-adapter/catalog";

const slack = getAdapter("slack");
const secrets = getSecretEnvVars("slack").map((envVar) => envVar.key);

console.log(slack.name, slack.factoryExport, secrets);

Community entries carry listing metadata and capabilities only, so listEnvVars() and getSecretEnvVars() return an empty array for them.

Capabilities

Each entry's features field records which Chat SDK capabilities the adapter supports. These are the same values the feature tables on each adapter page show. A value is either a status ("yes", "no", or "partial") or an object with a status and a short label, such as { status: "yes", label: "Native" }. Omitted keys mean "no".

getFeatureSupport(adapterOrSlug, key) always returns the object form. PLATFORM_FEATURE_CATEGORIES and STATE_FEATURE_CATEGORIES list every capability key with a display label, grouped the way the docs tables group them. getFeatureCategories(type) returns the categories for "platform" or "state".

Environment specs

Each official and vendor-official entry includes an env spec:

  • required lists variables needed regardless of auth mode.
  • credentialModes groups mutually exclusive ways to authenticate, such as a bot token or OAuth client credentials.
  • optional lists tuning variables that are safe to omit.
  • config lists constructor options that do not have an environment-variable equivalent.

Types

Official and vendor-official entries are CatalogAdapter objects, and community entries are CommunityAdapter objects. CatalogEntry is the union of the two. Both share these fields:

PropTypeDescription
slug?string
Stable catalog slug. Matches the key in `ADAPTERS` or `COMMUNITY_ADAPTERS`.
name?string
Display name.
description?string
One-line summary of what the adapter connects to.
packageName?string
npm package that provides the adapter implementation.
type?"platform" | "state"
Whether the adapter connects to a platform or stores Chat SDK state.
group?"official" | "vendor-official" | "community"
Who maintains the adapter. `CatalogAdapter` entries are official or vendor-official.
author?string
Maintainer of a vendor-official or community adapter.
readme?string
GitHub URL of the adapter's README.
features?AdapterFeatures
Capability support keyed by capability. Omitted keys mean `"no"`.
icon?string
Logo identifier used by chat-sdk.dev.

CatalogAdapter adds the fields setup tools need:

PropTypeDescription
factoryExport?string
Named factory export from `packageName`, such as `createSlackAdapter`.
importPath?string
Module specifier to import the factory from when it ships on a subpath of `packageName`. Defaults to `packageName`.
peerDeps?readonly string[]
Runtime packages the adapter expects the consuming app to provide or install alongside it.
env?AdapterEnvSpec
Environment variables and constructor-only configuration.

AdapterEnvSpec describes the env field:

PropTypeDescription
required?readonly EnvVar[]
Variables needed regardless of credential mode.
credentialModes?readonly EnvGroup[]
Mutually exclusive credential groups. A caller usually satisfies exactly one group.
optional?readonly EnvVar[]
Optional environment variables that tune behavior.
config?readonly string[]
Constructor options that have no environment-variable equivalent.
notes?string
Additional caveats that do not fit the structured fields.

EnvGroup describes one credential mode:

PropTypeDescription
label?string
Human-readable name for this credential mode.
vars?readonly EnvVar[]
Variables that together satisfy this mode.

EnvVar describes one environment variable:

PropTypeDescription
key?string
Canonical environment variable name.
description?string
Short description of what the value configures.
secret?boolean
Whether the value should be masked in logs and setup UIs.
aliases?readonly string[]
Alternative variable names accepted for the same value.

Helpers

  • listAdapters({ group, type }) returns every entry, including community adapters, with optional filters.
  • getCatalogEntry(slug) returns any entry, including community adapters, or undefined for unknown slugs.
  • getAdapter(slug) returns one official or vendor-official entry, or undefined for other slugs.
  • isAdapterSlug(slug) narrows a string to AdapterSlug, the official and vendor-official slugs.
  • listPlatformAdapters() and listStateAdapters() return official and vendor-official entries sorted by slug.
  • getFeatureSupport(adapterOrSlug, key) returns { status, label? } for one capability.
  • listEnvVars(slug) flattens required, credential-mode, and optional env vars, de-duplicated by key.
  • getSecretEnvVars(slug) returns the subset of listEnvVars(slug) marked as secrets.

Example: build a setup checklist

This script combines the catalog helpers into a setup checklist for a set of adapters, which is the core of what create-chat-sdk does. Given the adapter slugs a user picked and the capabilities the bot depends on, it prints an install command, a .env.example template, and a warning for each platform adapter that doesn't fully support a required capability.

scripts/setup-checklist.ts
import {
  type FeatureKey,
  getAdapter,
  getFeatureSupport,
  isAdapterSlug,
  listEnvVars,
} from "@chat-adapter/catalog";

// Adapters the user picked, and capabilities the bot depends on.
const selected = ["slack", "teams", "redis"];
const requiredFeatures: FeatureKey[] = ["streaming", "modals"];

const packages = new Set(["chat"]);
const envLines: string[] = [];
const warnings: string[] = [];

for (const slug of selected) {
  if (!isAdapterSlug(slug)) {
    throw new Error(`Unknown adapter: ${slug}`);
  }
  const adapter = getAdapter(slug);

  packages.add(adapter.packageName);
  for (const dependency of adapter.peerDeps) {
    packages.add(dependency);
  }

  envLines.push(`# ${adapter.name}`);
  for (const envVar of listEnvVars(slug)) {
    const secret = envVar.secret ? " (secret)" : "";
    envLines.push(`# ${envVar.description}${secret}`, `${envVar.key}=`);
  }

  if (adapter.type === "platform") {
    for (const feature of requiredFeatures) {
      const { status } = getFeatureSupport(adapter, feature);
      if (status !== "yes") {
        warnings.push(`${adapter.name}: ${feature} is ${status}`);
      }
    }
  }
}

console.log(`npm install ${[...packages].join(" ")}\n`);
console.log(envLines.join("\n"));
for (const warning of warnings) {
  console.warn(`Warning: ${warning}`);
}

For Slack, Microsoft Teams, and Redis, the install command includes each adapter's peer dependencies, such as @slack/web-api and redis, and the script warns that Microsoft Teams streaming is partial.

listEnvVars() returns every variable an adapter reads, including optional ones and the variables for every credential mode. To show only what a user must set, read adapter.env.required, let the user choose one entry from adapter.env.credentialModes, and list adapter.env.optional separately.

Read more