github) ships a manifest plus a set of tools — the callable actions you run from a workflow’s Tool node or from the Assistant. The full set of integrations lives in one installable Python distribution, modulex-integrations, which the ModuleX backend loads at startup.
This page is for people running or extending the ModuleX backend: it covers how integrations are discovered at runtime, how to install the package and the per-tool SDK dependencies you actually need, and how a tool call is authenticated either with ModuleX-managed credentials or your own key. If you only want to connect a service in the app, see Authentication & credentials and Connect an integration instead — you do not install anything for that.
The hosted ModuleX service already runs
modulex-integrations for you. You install the package yourself only when you self-host the backend or develop integrations locally. To author a new integration, start at Build an integration.How integrations load at runtime
Integrations are not configured by hand or read from a directory you point at. They are discovered through standard Python entry points in the groupmodulex.tools. Every integration in the package declares one entry point that maps its catalog name to its module:
pyproject.toml
The integration’s manifest — name, display name, categories, actions, and auth schemas. Defined in
manifest.py and re-exported from the package __init__.py. See the manifest & schema contract.A tuple of LangChain tool objects, one per action. See the
@tool function contract.github) is the integration’s catalog and credential name. The mapping value (for example modulex_integrations.tools.github) is the package module, not the tools module — the runtime appends .tools to it when it needs to import the callable (resolving to modulex_integrations.tools.github.tools).
Enumerate
The backend calls
entry_points(group="modulex.tools") to list every registered integration.Two catalog sources
The runtime resolves tools from two places, and entry points are not the only one:- Package entry points — the
modulex.toolsgroup described above. This is the primary source and wins on a name collision. - Legacy on-disk JSON — a small set of integrations not yet migrated to the package, loaded from
*_integration.jsonfiles in the backend. The Model Context Protocol connector (mcp_server) is handled this way rather than as a package entry point. See Custom MCP servers.
modulex-integrations” is almost true — treat the legacy JSON integrations as documented exceptions.
There are two distinct discovery mechanisms in this system, and they are not interchangeable. The runtime uses entry points (above). The documentation and CI pipeline that generates the integration catalog instead walks the filesystem for
tools/*/manifest.py, using the entry-point table only as a cross-check. If you are reading manifests for tooling, match the mechanism to your goal.Install the package
modulex-integrations requires Python 3.12 or newer. The base install pulls in only three core dependencies — pydantic, httpx, and langchain-core — which is everything most integrations need.
>=), because the manifest schema can change between minor versions and the runtime rejects unknown manifest fields at import time. When self-hosting, install the version that matches the backend you are running rather than the latest release.
Do not rely on install extras
The package declares anall extra and the README advertises per-tool extras such as [github,slack]. Do not use them. They do not work as written today:
This limitation is also recorded in Known limitations and the Help known-limitations page.
Install tool SDK dependencies manually
Because extras are inert, the working path is: install the base package, then install whatever client SDK each integration you intend to use needs. Many integrations need nothing extra — they call their service over plain HTTP through the corehttpx dependency. For example, both github and slack declare no additional dependencies.
Others do need a vendor SDK. Each integration declares what it needs in a dependencies.toml file in its source directory:
src/modulex_integrations/tools/aws/dependencies.toml
There is no REST endpoint that runs a tool directly. Tools execute only inside workflow runs and Assistant/Composer turns. Installing the package makes the catalog available to the backend; you call individual tools through the Tool node, the Assistant, or the AI Composer.
Managed usage vs bring-your-own-key
Whether a tool needs an SDK installed is separate from how it is authenticated and billed. Every tool call resolves a credential for the integration in your organization, and that credential is one of two kinds.ModuleX-managed
The call runs through a ModuleX-provisioned key from a managed pool. Usage is metered in credits and is subject to the billing gate. The managed providers appear on the wire as
modulexai (models) and modulexdb (knowledge); managed tool calls draw from your credit balance.Bring your own key (BYOK)
You connect your own provider account. Usage is billed directly by that provider with no ModuleX markup, and BYOK calls are not charged in ModuleX credits — they are tracked for analytics only. BYOK is available on every plan; there is no entitlement that gates it.
Before the call runs, the runtime checks the organization’s credit limit (without recording yet). If the monthly budget is exhausted and no wallet overage is available, the call is denied. On success it records the per-call tool cost. See Credits & metering.
The runtime decrypts your stored credential, refreshes the OAuth2 token if it is close to expiry, and runs the call. There is no credit check or credit charge — only usage tracking.
Verify the catalog loaded
After installing the package and restarting your workers, confirm the integrations you expect are present. The catalog the backend exposes reflects the entry points found at startup.🎬 MEDIA PLACEHOLDER · MX-MEDIA-4010 · [SCREENSHOT]
[SCREENSHOT_DESCRIPTION]: The integrations catalog in the ModuleX app after the package has loaded, showing connected and available integrations.
[SCREENSHOT_DETAILS]: Capture the integrations catalog page in the live ModuleX app. Show the grid of integrations with a few connected (credential present) and the rest available to connect. Dark theme, full-width, no personal data. Highlight that the count reflects the installed package, not a hardcoded list.
The worker was not restarted
The worker was not restarted
The catalog is cached per process. Restart all backend workers after installing or upgrading
modulex-integrations.The package version is wrong
The package version is wrong
The backend pins an exact version. A mismatched install can fail to import a manifest with an unknown field, because the schema rejects unknown fields at import time. Install the version that matches your backend.
A tool SDK is not installed
A tool SDK is not installed
An integration whose
dependencies.toml lists a vendor SDK will fail to load its tools if that SDK is missing, because extras do not install it for you. Install the SDK manually (see above). The integration’s manifest may still appear while individual actions fail to load.It is a legacy JSON integration
It is a legacy JSON integration
A few integrations (such as
mcp_server) load from legacy on-disk JSON, not from the package entry points. See Custom MCP servers.Next steps
Authentication & credentials
Connect a service with an API key or OAuth2 and store the credential.
Browse the catalog
See every integration ModuleX can connect to, grouped by category.
Use a tool in a workflow
Call an integration’s action from the Tool node.
Build an integration
Author your own integration and expose its tools.