Zum Hauptinhalt springen
connic

Agenten erreichen deine privaten Systeme.
Ohne eingehende Ports und ohne öffentliche IP.

Ein kleiner Bridge-Container in deinem Netzwerk verbindet sich von innen mit connic. Über ihn erreichen Verbindungen, Tools, MCP-Server und eigene KI-Modelle deine Datenbanken, Queues und APIs.

Bridges
Add bridge

erp-network

7c1e9a4b-2d3f-4e8a-9b6c-1f2a3b4c5d6e

Custom-tool host:<target>.cnc-bridge-7c1e9a4b-2d3f-4e8a-9b6c-1f2a3b4c5d6e

Last connected: 10/13/2026, 9:14:02 AM

Connected

Automatic routing

2 routes configured

Edit routes
Regenerate Token

staging-vpc

e4b2d8f1-6a3c-4f9e-8d7b-2c5a1e9f0b3d

Custom-tool host:<target>.cnc-bridge-e4b2d8f1-6a3c-4f9e-8d7b-2c5a1e9f0b3d

Disconnected

Automatic routing

0 routes configured

Add routes
Regenerate Token

Einen Container starten. Er verbindet sich nur nach außen.

Starte die Bridge dort, wo sie deine Dienste und das Internet erreicht. Sie hält eine ausgehende Verbindung zu relay.connic.co offen.

Ein Token pro Bridge
Erzeugst du ihn unter Projekt-Settings › Bridge neu, trennt connic die alte Verbindung binnen Sekunden.
Optionale Allowlist
ALLOWED_HOSTS beschränkt die Bridge auf exakte host:port-Paare und protokolliert jeden blockierten Versuch. Ohne die Variable erreicht sie alles, was ihr Netzwerk erreicht.
Verschlüsselt übertragen
Der Datenverkehr zwischen Bridge und connic läuft über WSS, also WebSocket über TLS.
ops@erp-gateway
Starten
$ docker run -d --name connic-bridge \
-e BRIDGE_TOKEN=cbr_•••••••••••••••• \
-e ALLOWED_HOSTS=erp-db:5432,erp-mcp:8080 \
connicorg/bridge:latest
Logs
$ docker logs connic-bridge
connic bridge starting...
Relay: wss://relay.connic.co
Allowed hosts: erp-db:5432, erp-mcp:8080
2026-10-13 09:14:01,904 | INFO | connic-bridge | Connecting to relay: relay.connic.co
2026-10-13 09:14:02,118 | INFO | connic-bridge | Connected to relay
2026-10-13 09:14:02,131 | INFO | connic-bridge | Bridge authenticated (bridge_id=7c1e9a4b-2d3f-4e8a-9b6c-1f2a3b4c5d6e)
2026-10-13 09:21:47,560 | INFO | connic-bridge | Channel 3f9a1c2e... opened to erp-db:5432
2026-10-13 09:22:10,377 | WARNING | connic-bridge | Blocked connection to erp-api:8443 (not in allowed hosts)

Eine Zeile leitet den Traffic über die Bridge.

Verbindungsdateien und MCP-Server nennen die Bridge im YAML. Python-Code erreicht einen privaten Host unter <target>.cnc-bridge-<bridge_id>.

connectors/*.yaml
Kafka und SQS in beide Richtungen, PostgreSQL, E-Mail, S3-Downloads und ausgehende Webhooks, über Name oder ID der Bridge.
tools/, middleware/, hooks/, guardrails/
Jede TCP-Verbindung aus deinem Python, mit Clients wie psycopg, httpx oder aiokafka.
Projekt-Settings › LLM Provider
Jede Anfrage an einen eigenen OpenAI-kompatiblen Endpoint wie vLLM, Ollama oder einen LiteLLM-Proxy.
Projekt-Settings › Notifications
Webhook- und OpenTelemetry-Kanäle, für Drains, Benachrichtigungen und Freigabeanfragen.
connectors/stock-movements.yaml
type: postgres
name: Stock movements
connection: erp-db
bridge: erp-network
config:
  channel: stock_movements
agents:
  - stock-checker
agents/stock-checker.yaml
version: "1.0"
name: stock-checker
description: Answers stock questions from the ERP
model: connic/glm-5.3
system_prompt: |
  Answer stock and delivery questions with ERP data.
tools:
  - stock.stock_level
mcp_servers:
  - name: erp
    url: http://erp-mcp:8080/mcp
    bridge: ${ERP_BRIDGE_ID}
tools/stock.py
import os
import psycopg
from connic import bridge_host

def stock_level(sku: str) -> dict:
    """Available stock for one article, read from the ERP database.

    Args:
        sku: Article number, for example A-1042
    """
    host = bridge_host(os.environ["ERP_BRIDGE_ID"], "erp-db")
    with psycopg.connect(host=host, port=5432, dbname="erp", user="reader",
                         password=os.environ["ERP_DB_PASSWORD"]) as conn:
        on_hand, reserved = conn.execute(
            "SELECT on_hand, reserved FROM stock WHERE sku = %s", (sku,)
        ).fetchone()
    return {"sku": sku, "available": on_hand - reserved}

Auch normale Hostnamen laufen über die Bridge.

Kafka, Redis Sentinel und Failover-Clients für Datenbanken verbinden sich mit einem Host und erfahren dort von weiteren. Automatische Routen schicken auch diese Folgeverbindungen über die richtige Bridge.

Gewohnte Hostnamen
Eine Route passt auf einen Hostnamen oder eine IP und genau einen TCP-Port. Auch die Broker, die Kafka zurückmeldet, werden geroutet.
Klare Reihenfolge
Explizite Bridge-Hostnamen gehen vor, dann exakte Routen, dann Regex. Passt ein Ziel auf zwei Bridges, wird die Verbindung abgelehnt.
Die Allowlist gilt weiter
Eine Route wählt nur die Bridge. Ist ALLOWED_HOSTS gesetzt, muss dort auch jeder Broker stehen.
erp-network
Connected

Automatic routing

2/32 routesAdd route
Exacterp-kafka9092
Regex^erp-kafka-[0-9]+$9092
CancelSave routes
tools/reorders.py
from aiokafka import AIOKafkaProducer

async def request_reorder(sku: str, quantity: int) -> str:
    """Ask purchasing to reorder an article.

    Args:
        sku: Article number, for example A-1042
        quantity: Units to order
    """
    producer = AIOKafkaProducer(bootstrap_servers="erp-kafka:9092")
    await producer.start()
    try:
        await producer.send_and_wait("reorders", f"{sku}:{quantity}".encode())
    finally:
        await producer.stop()
    return "queued"

Häufig gestellte Fragen

Starte das Docker-Image connicorg/bridge:latest oder installiere die Bridge mit pip install connic-bridge, auf einem Host mit Zugang zu deinen privaten Diensten und zum Internet. Den Token aus Projekt-Settings › Bridge übergibst du als BRIDGE_TOKEN. ALLOWED_HOSTS ist optional, und die Dokumentation enthält ein Beispiel für Docker Compose.

Nein. Die Bridge baut nur ausgehende Verbindungen auf: eine WSS-Verbindung zu relay.connic.co, über die connic den Traffic zu deinen Diensten schickt. Eingehende Verbindungen nimmt sie nie an, du brauchst also weder Firewall-Regel noch öffentliche Adresse.

Kafka und SQS in beide Richtungen, PostgreSQL eingehend per LISTEN/NOTIFY, E-Mail über IMAP und SMTP, S3-Downloads und ausgehende HTTP-Webhooks. Du wählst die Bridge unter Network Access › Bridge oder setzt bridge in connectors/*.yaml. Dienste mit öffentlichem Endpoint, etwa ein gehosteter Kafka-Cluster, brauchen keine.

Ja, jede Bridge hat einen eigenen Token, du kannst also eine pro Netzwerk oder pro Environment betreiben. Verbindungen, LLM Provider, MCP-Server und Kanäle wählen ihre Bridge einzeln. Automatische Routen sind auf 32 pro Bridge und 256 pro Projekt begrenzt.

Mit der Variable erreicht die Bridge nur die aufgeführten host:port-Paare und protokolliert alles andere als blockiert. Fehlt sie oder ist sie leer, erreicht die Bridge jeden Host in ihrem Netzwerk. Automatische Routen umgehen eine gesetzte Liste nie.

Gängige Python-Clients wie psycopg, httpx, requests, aiokafka und redis-py funktionieren mit Hostnamen im Format <target>.cnc-bridge-<bridge_id>, und automatische Routen decken synchrone Standard-Sockets und asyncio-TCP-Verbindungen ab. Bibliotheken mit eigenem Resolver wie aiodns und Verbindungen, die später aus Hintergrund-Threads entstehen, brauchen den expliziten Hostnamen. Prüft der Client dabei Zertifikate, setze SNI oder server_hostname auf das echte Ziel.