After generating the connector code, six files must be edited and two assets must be added to fully wire the connector through the stack. Miss any of them and the connector will either not appear in the UI, render with the default database icon, or fail to install its driver.
File: openmetadata-spec/src/main/resources/json/schema/entity/services/{serviceType}Service.json
Add the connector to the serviceType enum:
"serviceType": {
"enum": [..., "MyDb"]
}Add a $ref to the connection in the oneOf:
"config": {
"oneOf": [
...,
{ "$ref": "../../connections/{service_type}/myDbConnection.json" }
]
}File: ingestion/setup.py
Add the connector's pip extras so pip install "openmetadata-ingestion[mydb]" (and the Docker ingestion image) pulls the right SDK/driver:
"mydb": {
"mydb-sdk>=1.0.0",
"other-driver",
},Keep the block alphabetically ordered. Without this, the connector runs locally in the dev venv but fails in the shipped ingestion container.
File: ingestion/src/metadata/examples/workflows/{name}.yaml
A runnable workflow config showing how to ingest metadata from the source via metadata ingest -c. This is what users copy into their own deployments and what QA uses for ad-hoc smoke tests.
Use this template (replace {Name}, {name}, credentials, and hostPort):
source:
type: {name}
serviceName: local_{name}
serviceConnection:
config:
type: {Name}
username: username
authType:
password: password
hostPort: localhost:5432
# Add any other required fields from the connection schema
sourceConfig:
config:
type: DatabaseMetadata
sink:
type: metadata-rest
config: {}
workflowConfig:
openMetadataServerConfig:
hostPort: http://localhost:8585/api
authProvider: openmetadata
securityConfig:
jwtToken: "<ingestion-bot-jwt>"Keep the structure identical across connectors — users recognize the pattern. Only the source.* block changes per connector. Use the canned dev JWT token from cockroach.yaml as the placeholder so the example runs against a local OpenMetadata server out of the box.
File: openmetadata-ui/src/main/resources/ui/src/utils/{ServiceType}ServiceUtils.tsx
Import the resolved connection schema and add a switch case so the Add Service form renders:
import myDbConnection from '../jsons/connectionSchemas/connections/{serviceType}/myDbConnection.json';case {ServiceType}Type.MyDb: {
schema = myDbConnection;
break;
}File: openmetadata-ui/src/main/resources/ui/src/assets/img/service-icon-{name}.png (.svg is also fine)
Drop the logo in place. Prefer SVG when available; otherwise a square PNG ≥ 128×128.
File: openmetadata-ui/src/main/resources/ui/src/utils/ServiceIconUtils.ts
Import the asset and add an entry to SERVICE_ICON_LOADERS. The lookup key is the service type lowercased with underscores/hyphens stripped (getServiceIcon() normalizes with toLowerCase().replaceAll(/[_-]/g, '')).
import mydb from '../assets/img/service-icon-mydb.png';const SERVICE_ICON_LOADERS: Record<string, string> = {
// Database services
...
mydb: mydb,
};Without this step the connector renders with the generic databasedefault icon instead of its own logo.
Note:
openmetadata-ui/.../constants/Services.constant.tsis deprecated as of PR #26906 (April 2026) — it is now a re-export shim. Register icons inServiceIconUtils.ts, not there.
File: openmetadata-ui/src/main/resources/ui/public/locales/en-US/{ServiceType}/{Name}.md
(e.g. Database/MyDb.md) This renders the inline help next to each field in the Add Service form. Use $$section blocks keyed to field ids from the JSON Schema:
# MyDb
In this section, we provide guides and references to use the MyDb connector.
## Requirements
...
## Connection Details
$$section
### Host and Port $(id="hostPort")
Host and port of the MyDb service.
$$
$$section
### Username $(id="username")
Username to connect to MyDb.
$$Without this, form fields have no contextual help.
File: openmetadata-ui/src/main/resources/ui/src/constants/ServiceType.constant.ts
New connectors always ship as Beta. Add the service type to BETA_SERVICES so the UI renders the "Beta" tag next to it in the service picker and detail pages:
export const BETA_SERVICES = [
...,
DatabaseServiceType.MyDb,
];Only remove an entry from this list in a later PR, once the connector has been battle-tested in production. Do not skip this step for a new connector — shipping without the Beta tag sets wrong user expectations about stability.
- i18n locale files (
src/locale/languages/*.json): display names are derived from the generated{ServiceType}Typeenum values. Recent connector PRs (IOMETE, Informix, Timescale) did not touch locale files. Only add keys here if you reference a custom translation key from code. Services.constant.ts: deprecated, see note in step 5.- Generated TypeScript types (
src/generated/): these are produced byyarn parse-schema— never edit by hand.
After editing schemas, regenerate derived code so models/types match:
make generate # Python Pydantic models
mvn clean install -pl openmetadata-spec # Java models
cd openmetadata-ui/src/main/resources/ui && \
yarn parse-schema # UI connection/ingestion schemasmake py_format # Python: black + isort + pycln
mvn spotless:apply # Java- Service schema enum and
oneOfupdated -
ingestion/setup.pyhas connector extras - CLI workflow YAML example added under
ingestion/src/metadata/examples/workflows/ -
{ServiceType}ServiceUtils.tsximports and switches on the schema - Service icon asset added under
assets/img/ -
ServiceIconUtils.tsimports asset and registers it inSERVICE_ICON_LOADERS - Docs markdown added under
public/locales/en-US/{ServiceType}/ -
BETA_SERVICESupdated (new connectors always ship as Beta) -
make generate,mvn clean install -pl openmetadata-spec,yarn parse-schemaall succeed - Connector appears with its own logo in the Add Service flow and shows inline field help