The Omni Connector SDKs enable you to build custom connectors that integrate any data source with Omni’s search and AI capabilities. Whether you’re connecting an internal database, a SaaS application, or a proprietary system, the SDKs provide everything you need.Documentation Index
Fetch the complete documentation index at: https://docs.getomni.co/llms.txt
Use this file to discover all available pages before exploring further.
Why Build a Custom Connector?
While Omni includes connectors for popular platforms (Google Workspace, Slack, Atlassian, HubSpot), you may need to integrate:- Internal systems — Databases, wikis, or custom applications
- Niche SaaS tools — Industry-specific platforms not yet supported
- Proprietary data sources — File formats or APIs unique to your organization
- Legacy systems — Older systems with custom APIs
SDK Features
Both SDKs provide the same core capabilities:| Feature | Description |
|---|---|
| Connector Base Class | Abstract base with sync lifecycle management |
| Sync Context | Utilities for emitting documents and tracking progress |
| Content Storage | Store document content for indexing |
| SDK Client | Communication with the connector-manager service |
| HTTP Server | Built-in server exposing standard connector endpoints |
| Data Models | Type-safe models for documents, events, and metadata |
Available SDKs
Python SDK
Build connectors in Python with FastAPI
TypeScript SDK
Build connectors in TypeScript with Express
Rust SDK
Build connectors in Rust with Axum (
omni-connector-sdk crate at sdk/rust/)google, slack, atlassian, imap, nextcloud, fireflies, filesystem, and web connectors are all built against it and serve as the canonical reference.
The SDKs are not published to PyPI or npm. All connector development happens inside the Omni monorepo, with the SDK consumed as a local path dependency (
{ path = "../../sdk/python" } for Python, "file:../../sdk/typescript" for TypeScript). To build a connector, clone omni and add a new directory under connectors/. This keeps connectors and the SDK versioned together, so you never have to chase a mismatched release.Scaffolding with the /build-connector skill
The omni repository ships with a Claude Code skill called build-connector that scaffolds an entire new connector — sync logic, manifest, Dockerfile, package config, frontend wiring (icon, setup dialog, source type enum), Docker Compose service, AWS and GCP Terraform, and integration tests — following the conventions of the built-in connectors.
To use it, install Claude Code, open the omni repo, and run:
- Choose a language (Python, TypeScript, or Rust) and read the matching reference connector
- Implement sync, manifest, and any custom actions
- Add a database migration for the new source type
- Add the variant to the Rust
SourceTypeenum inshared/src/models.rs - Wire up the frontend (icon, setup dialog, integrations page entry)
- Add the service to
docker/docker-compose.ymland.env.example - Add AWS ECS and GCP Cloud Run definitions
- Write integration tests against a real ParadeDB + Redis + connector-manager via testcontainers
Architecture
Custom connectors integrate with Omni exclusively through HTTP communication with the connector-manager service. Connectors have no direct database access — all document emission, state management, and content storage is handled via the SDK client which communicates with connector-manager over HTTP.Connector Lifecycle
- omni-connector-manager triggers a sync via HTTP
POST /sync - Your connector receives the request with source configuration and credentials
- Your connector fetches data from the external source
- Documents are emitted through the SDK, which sends them to connector-manager
- connector-manager queues events for the indexer
- Your connector reports completion or failure
HTTP Endpoints
The SDK automatically exposes these endpoints:| Endpoint | Method | Purpose |
|---|---|---|
/health | GET | Health check for container orchestration |
/manifest | GET | Returns connector metadata and capabilities |
/sync | POST | Triggers a sync operation |
/sync/{sync_run_id} | GET | Reports whether a given sync run is still active in this process. connector-manager polls this to detect connector restarts and auto-resume interrupted syncs from the last checkpoint. |
/cancel | POST | Cancels a running sync |
/action | POST | Executes connector-specific actions |
Document Conversion (Docling)
Binary documents (PDFs, Word, Excel, PowerPoint, images) are converted to text via the centralized Docling service rather than per-connector logic. The SDK exposes this throughctx.content_storage.extract_text(data, mime_type, filename) (and extract_and_store_content(...) when you want to extract and persist in one call). Under the hood the SDK calls POST /sdk/extract-text on connector-manager, which routes to Docling when the admin has enabled it and falls back to lightweight built-in extractors otherwise. All built-in connectors (IMAP, Gmail, Filesystem, Nextcloud, etc.) use this pathway — custom connectors should too.
Quick Start Example
Here’s a minimal connector implementation in Python:Wrapping an MCP Server
All three SDKs can expose tools from a Model Context Protocol server to Omni’s AI assistant. Override themcp_server property on your connector to return either a StdioMcpServer (subprocess transport) or an HttpMcpServer (Streamable HTTP transport for remote MCP servers). The SDK opens a session per call, discovers the tools, and registers them with the connector-manager.
Stdio (local subprocess):
github connector is a reference implementation that wraps the official GitHub MCP server over stdio. Return None (the default) to disable MCP support entirely for your connector.
Example Connectors
Both SDKs include an RSS connector example that demonstrates:- Fetching data from an external API
- Parsing and transforming content
- Emitting documents with metadata
- Implementing incremental sync
- Handling errors and cancellation
- Implementing custom actions
Deploying Your Connector
Docker Deployment
Each connector ships its ownDockerfile. Copy from a reference connector in your chosen language (e.g. connectors/notion/Dockerfile for Python, connectors/linear/Dockerfile for TypeScript, connectors/google/Dockerfile for Rust).
Add the connector as a service in docker/docker-compose.yml, gated by a Compose profile so it only starts when the user opts in via ENABLED_CONNECTORS:
.env.example and document the new profile name in the ENABLED_CONNECTORS comment.
Registration with Connector Manager
You don’t need to set per-connector URLs in connector-manager’s environment. Connectors auto-register their manifest with connector-manager on a 30-second heartbeat (90s TTL) — as long as the container is reachable on the Docker network andCONNECTOR_MANAGER_URL is set, it will appear automatically.
What’s Next
Python SDK
Detailed Python SDK documentation
TypeScript SDK
Detailed TypeScript SDK documentation