Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.supaproxy.cloud/llms.txt

Use this file to discover all available pages before exploring further.

SupaProxy is built on a plugin architecture. Every extension point follows the same pattern: an interface definition, a registry for auto-discovery, a config schema that the dashboard renders dynamically, and an npm package that bundles the built-in implementations.

Plugin types

Consumers

Entry points where users interact with the AI. Slack, API, and custom integrations.
@supaproxy/consumers

Connections

Data sources the AI can call. HTTP, STDIO, and authenticated MCP transports.
@supaproxy/connections

Providers

AI model providers. Anthropic, OpenAI, and custom LLM backends.
@supaproxy/providers

Knowledge Sources

External content ingested into workspace context. URLs, Confluence, inline text.
@supaproxy/knowledge-sources

How it works

Every plugin type follows the same lifecycle:
1. Define      Plugin implements a typed interface (e.g. ConsumerPlugin)
2. Register    Plugin is added to its package's registry
3. Discover    Server loads all registered plugins at startup
4. Configure   Dashboard renders config forms from the plugin's schema
5. Execute     Server calls the plugin at runtime

Interface

Each plugin type defines a TypeScript interface. The interface specifies the methods the server calls and the config schema the dashboard uses to render forms.
interface Plugin<TConfig> {
  type: string;
  name: string;
  description: string;
  configSchema: ZodSchema<TConfig>;
  // type-specific methods...
}

Registry

Each package exports a registry object that maps plugin types to their implementations. The server imports the registry and looks up plugins by type at runtime.
import { consumerRegistry } from "@supaproxy/consumers";

const plugin = consumerRegistry.get("slack");

Config schema

Every plugin defines its configuration as a Zod schema. The dashboard reads this schema via the API and renders form fields dynamically. Adding a new plugin with new config fields requires zero dashboard changes.
const configSchema = z.object({
  channelId: z.string().min(1, "Channel ID is required"),
  botToken: z.string().min(1, "Bot token is required"),
});

Packages

PackagePurposeBuilt-in plugins
@supaproxy/consumersUser-facing entry pointsSlack, API
@supaproxy/connectionsMCP transport and authHTTP, STDIO, Authenticated
@supaproxy/providersAI model backendsAnthropic, OpenAI
@supaproxy/knowledge-sourcesContent ingestionURL, Confluence, Inline