Skip to content

Integrations and providers

Profile-owned connectors, catalog discovery, installation and provider authentication. A catalog result does not imply installation consent or deployment support.

Choose your client · Reliability · All public exports

AsyncHermesConnectors

AsyncHermesConnectors(
    rpc: ConnectorRPC,
    *,
    profile: str,
    capabilities: ConnectorCapabilities | None = None,
)

Bases: _ScopedNativeRPC

Native hosted accounts, policies and authorization operations for one profile.

Persist operation references with the profile AND owner that opened them. op_id is not a session ID, and a hosted account's connection_id is not an EDITH transport connection ID. Responses keep native snapshots and seq.

list async

list(
    *, owner: ConnectorOwner | None = None
) -> ConnectorsList

catalog async

catalog() -> ConnectorCatalog

tools async

tools(
    slug: str, *, refresh: bool = False
) -> ConnectorTools

connect async

connect(
    connectors: list[str],
    *,
    owner: ConnectorOwner | None = None,
    reconnect: bool = False,
    alias: str | None = None,
    connection_id: str | None = None,
) -> ConnectionOperation

accounts async

accounts(
    *, connector: str | None = None
) -> ConnectorAccounts

rename_account async

rename_account(
    connection_id: str, alias: str
) -> ConnectorAccount

remove_account async

remove_account(
    connection_id: str,
) -> ConnectorAccountRemoval

policy async

policy() -> ConnectorPolicy

set_policy async

set_policy(
    change: ConnectorPolicyChange, *, expected_revision: str
) -> ConnectorPolicyUpdate

operation_status async

operation_status(
    op_id: str, *, owner: ConnectorOwner | None = None
) -> ConnectionOperation

wake_operation async

wake_operation(
    op_id: str, *, owner: ConnectorOwner | None = None
) -> ConnectionWakeReceipt

Read accounts promptly after the browser returns; this is not connect retry.

respond async

respond(
    op_id: str,
    result: ConnectionAnswer,
    *,
    owner: ConnectorOwner | None = None,
) -> ConnectionAnswerReceipt

Answer the owning operation; credential fields go directly to its backend.

This does not approve an agent tool call. Cancelling this coroutine only stops waiting: reconcile operation_status before any further action.

ConnectorCapabilities

Bases: TypedDict

Live discovery supplied by the owner, never inferred from a version string.

An omitted field means unknown. methods must be the actual native RPC inventory; action/parameter support needs the corresponding explicit flag. Hermes's gateway.capabilities does not advertise this inventory.

methods instance-attribute

methods: list[str]

named_accounts instance-attribute

named_accounts: bool

plugin_presence instance-attribute

plugin_presence: bool

UnsupportedConnectorOperation

UnsupportedConnectorOperation(method: str)

Bases: RemoteError

The owner's live capability inventory explicitly excludes an operation.

method instance-attribute

method = method

AsyncPluginCatalog

AsyncPluginCatalog(
    rpc: ConnectorRPC,
    *,
    profile: str,
    capabilities: ConnectorCapabilities | None = None,
)

Bases: _ScopedNativeRPC

lookup async

lookup(name: str) -> PluginCatalogLookup

Resolve the backend's current exact SHA, including its kill list.

unknown and unavailable remain distinct outcomes. This never bypasses install review or falls back to an unpinned repository.

presence async

presence(names: list[str]) -> PluginCatalogPresence

Native host requirements, in requested order; unknown names omitted.

onboarding async

onboarding() -> PluginCatalogOnboarding

Curated onboarding subset; this is not the complete plugin catalog.

AsyncIntegrationMutations

AsyncIntegrationMutations(
    connection: ExtensionTransport, *, profile: str
)

remove_mcp async

remove_mcp(
    name: str, *, revision: str, request_id: str
) -> IntegrationReceipt

Dispatch once. On a lost reply, read the same operation receipt.

operation async

operation(request_id: str) -> IntegrationReceipt

AsyncProviderEndpoints

AsyncProviderEndpoints(
    transport: ExtensionTransport, *, profile: str
)

inventory async

inventory() -> EndpointInventory

change async

change(
    identity: str,
    *,
    revision: str,
    request_id: str,
    kind: EndpointKind,
    changes: EndpointChanges,
    confirmed: bool = False,
) -> EndpointReceipt

operation async

operation(request_id: str) -> EndpointReceipt

test async

test(
    identity: str, changes: EndpointChanges
) -> EndpointValidation

CustomEndpoint

Bases: TypedDict

id instance-attribute

id: str

name instance-attribute

name: str

base_url instance-attribute

base_url: str

model instance-attribute

model: str

models instance-attribute

models: list[str]

api_mode instance-attribute

api_mode: EndpointMode

context_length instance-attribute

context_length: int | None

discover_models instance-attribute

discover_models: bool

has_api_key instance-attribute

has_api_key: bool

is_current instance-attribute

is_current: bool

source instance-attribute

source: str

editable instance-attribute

editable: bool

EndpointChanges

Bases: TypedDict

name instance-attribute

name: str

base_url instance-attribute

base_url: str

model instance-attribute

model: str

api_key instance-attribute

api_key: str

api_mode instance-attribute

api_mode: EndpointMode

context_length instance-attribute

context_length: int | None

discover_models instance-attribute

discover_models: bool

EndpointInventory

Bases: TypedDict

profileId instance-attribute

profileId: str

revision instance-attribute

revision: str

endpoints instance-attribute

endpoints: list[CustomEndpoint]

EndpointReceipt

Bases: TypedDict

id instance-attribute

id: str

profileId instance-attribute

profileId: str

resourceId instance-attribute

resourceId: str

kind instance-attribute

kind: EndpointKind

status instance-attribute

status: Literal[
    "pending",
    "applied",
    "uncertain",
    "confirmation-required",
]

revision instance-attribute

revision: str

message instance-attribute

message: str

EndpointValidation

Bases: TypedDict

ok instance-attribute

ok: bool

reachable instance-attribute

reachable: bool

message instance-attribute

message: str

models instance-attribute

models: list[str]

transport_checked instance-attribute

transport_checked: str

resolved_base_url instance-attribute

resolved_base_url: str

AsyncProviderAdministration

AsyncProviderAdministration(
    transport: ExtensionTransport, *, profile: str
)

keys async

keys() -> list[ProviderKey]

save_key async

save_key(
    identity: str,
    *,
    revision: str,
    value: str,
    request_id: str,
) -> ProviderKeyReceipt

remove_key async

remove_key(
    identity: str, *, revision: str, request_id: str
) -> ProviderKeyReceipt

operation async

operation(request_id: str) -> ProviderKeyReceipt

AsyncProviderOAuth

AsyncProviderOAuth(
    transport: ExtensionTransport, *, profile: str
)

start async

start(
    provider: str, *, request_id: str
) -> ProviderOAuthFlow

flow async

flow(request_id: str) -> ProviderOAuthFlow

AsyncPluginAdministration

AsyncPluginAdministration(
    transport: ExtensionTransport, *, profile: str
)

review async

review(
    resource: str,
    kind: PluginAction,
    *,
    enabled: bool | None = None,
) -> PluginReview

change async

change(
    resource: str,
    kind: PluginAction,
    *,
    review_id: str,
    digest: str,
    request_id: str,
    accepted: bool,
    enabled: bool | None = None,
) -> PluginActionReceipt

operation async

operation(request_id: str) -> PluginActionReceipt

PluginActionReceipt

Bases: TypedDict

id instance-attribute

id: str

profileId instance-attribute

profileId: str

resourceId instance-attribute

resourceId: str

kind instance-attribute

kind: PluginAction

status instance-attribute

status: Literal[
    "pending", "applied", "rejected", "uncertain"
]

revision instance-attribute

revision: str | None

restartRequired instance-attribute

restartRequired: bool

message instance-attribute

message: str | None

PluginReview

Bases: TypedDict

id instance-attribute

id: str

profileId instance-attribute

profileId: str

resourceId instance-attribute

resourceId: str

kind instance-attribute

kind: PluginAction

revision instance-attribute

revision: str

digest instance-attribute

digest: str

sha instance-attribute

sha: str | None

changes instance-attribute

changes: list[str]

expiresAt instance-attribute

expiresAt: float

consentRequired instance-attribute

consentRequired: bool

AsyncChannelAdministration

AsyncChannelAdministration(
    transport: ExtensionTransport, *, profile: str
)

channels async

channels() -> list[dict[str, Any]]

configure async

configure(
    identity: str,
    *,
    revision: str,
    request_id: str,
    changes: ChannelChanges,
) -> ChannelReceipt

operation async

operation(request_id: str) -> ChannelReceipt

AsyncChannelPairings

AsyncChannelPairings(
    transport: ExtensionTransport, *, profile: str
)

start async

start(
    platform: Literal["telegram", "whatsapp"],
    *,
    request_id: str,
) -> ChannelPairing

poll async

poll(request_id: str) -> ChannelPairing

cancel async

cancel(request_id: str) -> ChannelPairing

apply async

apply(
    request_id: str,
    *,
    revision: str,
    apply_request_id: str,
    allowed_users: list[str],
) -> ChannelPairing

ProviderLoginError

ProviderLoginError(login: ProviderLogin)

Bases: EdithHermesError

A login ended without approval; login contains its safe public state.

login instance-attribute

login = login