Skip to content
Back to skills

Connector Doc Create

ASecurity

Create full documentation for a new OpenMetadata connector from scratch — generates main page, yaml.mdx, troubleshooting page, and registers in docs.json navigation. Derives features, permissions, and YAML config from JSON schema and source code.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 1, 2026
devopspythongobashsqlawsgcpazuregitapidatabase

Works with

  • cli
  • api

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned October 1, 2026

npx -y skills add open-metadata/docs-om --skill connector-doc-create --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Connector Doc Create?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Connector Doc Create
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/open-metadata-connector-doc-create/badge)](https://www.skillsdirectory.com/skills/open-metadata-connector-doc-create)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: connector-doc-create
description: Create full documentation for a new OpenMetadata connector from scratch — generates main page, yaml.mdx, troubleshooting page, and registers in docs.json navigation. Derives features, permissions, and YAML config from JSON schema and source code.
user-invocable: true
argument-hint: "<connector-name> [--display-name='Display Name'] [--service-type=database|pipeline|dashboard|messaging|storage|search|ml-model] [--stage=PROD|BETA] [--version=v1.13.x|v2.0.x|v2.1.x-SNAPSHOT|all] [--icon=/path/to/icon.svg] [--dry-run]"
allowed-tools:
  - Bash
  - Read
  - Glob
  - Grep
  - Edit
  - Write
  - Agent
---

# Connector Documentation Creation Skill

## When to Activate

When a user asks to create, generate, scaffold, or add documentation for a **new** connector — one that exists in source code but doesn't yet have docs pages.

## Arguments

- **connector-name** (required): Slug name of the connector (e.g., `redshift`, `dynamodb`, `bigquery`, `airflow`, `looker`, `kafka`). Must match the directory name in `${SOURCE_ROOT}/${service_type}/`.
- **--display-name** (optional): Human-readable name shown in docs (e.g., `"Amazon Redshift"`, `"Google BigQuery"`). Defaults to title-cased connector-name.
- **--service-type** (optional): One of `database`, `pipeline`, `dashboard`, `messaging`, `storage`, `search`, `ml-model`. Note: use `ml-model` (with hyphen) — this matches the actual directory name. Other types (`api`, `drive`, `metadata`) exist in the repo but are rare; treat them like `pipeline` if encountered. Default: auto-detect from connector name and schema.
- **--stage** (optional): `PROD` or `BETA`. Default: `BETA` for new connectors.
- **--version** (optional): Which version(s) to create docs for. Default: `all` (creates in v1.13.x, v2.0.x).
- **--icon** (optional): Path to icon file under `/public/images/connectors/`. If not given, uses `/public/images/connectors/{connector-name}.svg` as a placeholder.
- **--dry-run** (optional): Only show the plan and generated content — don't write any files.

## Directory References

```
DOCS_ROOT     = .                          # The docs-om repo (current working directory)
OM_ROOT       = ../OpenMetadata            # Sibling directory to docs-om
SCHEMA_ROOT   = ${OM_ROOT}/openmetadata-spec/src/main/resources/json/schema/entity/services
SOURCE_ROOT   = ${OM_ROOT}/ingestion/src/metadata/ingestion/source
```

---

## Creation Process

### Phase 1: Read Ground Truth from Source Code

#### Step 1.1: Read the JSON Schema

```
Schema file: ${SCHEMA_ROOT}/connections/${service_type}/${connectorName}Connection.json
```

Extract:
1. **All properties** — field names, types, descriptions, required fields, defaults
2. **`supports*` boolean flags** — determines available/unavailable features
3. **Filter pattern fields** — `schemaFilterPattern`, `tableFilterPattern`, `storedProcedureFilterPattern`, etc.
4. **`sampleDataStorageConfig`** — presence indicates Sample Data support
5. **Authentication types** — `authType` property's `oneOf`/`anyOf` references:
   - `basicAuth.json` → **Basic Auth**
   - `iamAuthConfig.json` → **IAM Auth**
   - `awsCredentials.json` → **AWS Credentials**
   - `gcpCredentials.json` → **GCP Credentials**
   - `azureCredentials.json` → **Azure Credentials**
6. **SSL fields** — `sslMode`, `sslConfig`, `verifySSL`
7. **Required fields** — the `required` array

Also check the parent service schema to confirm registration:
```
${SCHEMA_ROOT}/${serviceType}Service.json
```

#### Step 1.2: Read the Source Code

Read these files:

```
${SOURCE_ROOT}/${service_type}/${connector_name}/metadata.py    — Source class, capabilities
${SOURCE_ROOT}/${service_type}/${connector_name}/connection.py  — Connection logic, test steps, permissions
${SOURCE_ROOT}/${service_type}/${connector_name}/service_spec.py — Registered source classes
```

Also check if these exist:
```
${SOURCE_ROOT}/${service_type}/${connector_name}/queries.py     — SQL queries (reveals permission requirements)
${SOURCE_ROOT}/${service_type}/${connector_name}/client.py      — REST API client
```

Extract:
1. **Test connection steps** — `test_fn` dict keys in `test_connection()` → permission names
2. **Service spec classes** — lineage_source_class, usage_source_class, profiler_class (confirm feature support)
3. **Mixin/base classes** — what the source extends (e.g., `LifeCycleQueryMixin`, `MultiDBSource`)
4. **Owner/Tag extraction** — search for `yield_tag`, `yield_table_tag`, `get_tag_labels`, owner-related methods
5. **Permission hints** — SQL grants, IAM actions, API scopes in docstrings or comments
6. **Python package name** — `pip install "openmetadata-ingestion[{package}]"` (check pyproject.toml or setup.py if unsure)

#### Step 1.3: Build the Feature Truth Table

Using schema + code, build the definitive feature map:

**For Database Connectors:**

| Signal | Feature |
|---|---|
| `supportsMetadataExtraction: true` (default) | "Metadata" → available |
| `supportsUsageExtraction: true` | "Query Usage" → available |
| `supportsLineageExtraction: true` | "Lineage" or "View Lineage" → available |
| `supportsViewLineageExtraction: true` | "Column-level Lineage" → available |
| `supportsProfiler: true` | "Data Profiler" → available |
| `supportsProfiler: true` (implicit) | "Auto-Classification" → available |
| `supportsDBTExtraction: true` | "dbt" → available |
| `supportsDataDiff: true` | "Data Quality" → available |
| `storedProcedureFilterPattern` present | "Stored Procedures" → available |
| `sampleDataStorageConfig` present | "Sample Data" → available |
| Owner extraction code found | "Owners" → available |
| Tag extraction code found | "Tags" → available |

**For Pipeline Connectors:**

| Signal | Feature |
|---|---|
| Always | "Pipelines" → available |
| Status extraction code found | "Pipeline Status" → available |
| lineage_source_class in service_spec | "Lineage" → available |
| Owner extraction code found | "Owners" → available |
| Tag extraction code found | "Tags" → available |

**For Dashboard Connectors:**

| Signal | Feature |
|---|---|
| Always | "Dashboards", "Charts" → available |
| Datamodel extraction code found | "Datamodels" → available |
| Project extraction code found | "Projects" → available |
| lineage_source_class in service_spec | "Lineage" → available |
| Column lineage code found | "Column Lineage" → available |
| Owner extraction code found | "Owners" → available |
| usage_source_class in service_spec | "Usage" → available |
| Tag extraction code found | "Tags" → available |

**For Messaging Connectors:**

| Signal | Feature |
|---|---|
| Always | "Topics" → available |
| `sampleDataStorageConfig` present | "Sample Data" → available |

**For Storage Connectors:**

| Signal | Feature |
|---|---|
| Always | "Metadata" → available |
| Structured container code found | "Structured Containers" → available |
| Unstructured container code found | "Unstructured Containers" → available |

**For Search Connectors:**

| Signal | Feature |
|---|---|
| Always | "Search Indexes" → available |
| Sample data code found | "Sample Data" → available |

**For ML Model Connectors:**

| Signal | Feature |
|---|---|
| Always | "ML Features" → available |
| Hyperparameter code found | "Hyperparameters" → available |
| ML store code found | "ML Store" → available |

#### Step 1.4: Build the Permissions List

From the extracted code, derive the permission requirements:

- **Database connectors**: Map SQL queries to required GRANT statements. Common pattern:
  - Reading system views/tables → `SELECT` on those views
  - `information_schema` reads → `USAGE` on schema
  - Query history access → specific grants (e.g., `pg_read_all_stats`)
- **AWS connectors**: Map API calls to IAM actions (e.g., `dynamodb:ListTables`, `s3:GetObject`)
- **GCP connectors**: Map API calls to GCP roles/permissions
- **REST API connectors**: Map endpoints to required API scopes/roles

Group permissions by capability:
1. Metadata Ingestion
2. Profiler & Data Quality (if supported)
3. Usage & Lineage (if supported)

#### Step 1.5: Extract YAML Configuration Fields

From the JSON schema `properties`, build a YAML config template:

1. Start with `required` fields — these MUST appear, no comments
2. Add important optional fields with commented-out examples
3. Use placeholder values: `<username>`, `<password>`, `<hostname>`, `<database>`
4. For auth type fields (`oneOf`/`anyOf`): show the most common auth type uncommented, others as commented blocks
5. For filter patterns: show commented-out example with `includes`/`excludes`
6. For SSL: show commented-out block

Build ContentSection entries for each field shown in YAML:
- Match the YAML key name exactly
- Use the schema `description` as the base, expand if needed
- For complex fields (auth, SSL), add links to relevant docs pages

---

### Phase 2: Check for Existing Files

Before creating anything, check:

1. Does `${DOCS_ROOT}/{version}/connectors/${service_type}/${connector_name}.mdx` already exist?
2. Does `${DOCS_ROOT}/{version}/connectors/${service_type}/${connector_name}/yaml.mdx` already exist?
3. Is the connector already registered in `docs.json`?

If files exist, **stop and warn the user** — use the `connector-doc-review` skill instead to update existing docs.

---

### Phase 3: Generate Documentation Files

For each target version (v1.13.x, v2.0.x):

#### Step 3.1: Generate the Main Page (`{connector_name}.mdx`)

**File path:** `${DOCS_ROOT}/{version}/connectors/${service_type}/${connector_name}.mdx`

**Template — varies by service type. Use the correct imports and structure for the connector's service type:**

**Shared imports (all service types):**
```mdx
import { ConnectorDetailsHeader } from '/snippets/components/ConnectorDetailsHeader/ConnectorDetailsHeader.jsx'
import TestConnection from '/snippets/connectors/test-connection.mdx'
import IngestionScheduleAndDeploy from '/snippets/connectors/ingestion-schedule-and-deploy.mdx'
import { MetadataIngestionUi } from '/snippets/components/MetadataIngestionUi.jsx'
```

**Service-type-specific imports for main page:**

| Service Type | ConfigureIngestion | Extra imports |
|---|---|---|
| `database` | `/snippets/connectors/database/configure-ingestion.mdx` | `AdvancedConfiguration` from `/snippets/connectors/database/advanced-configuration.mdx`; `Related` from `/snippets/{version}/connectors/database/related.mdx` |
| `pipeline` | `/snippets/connectors/pipeline/configure-ingestion.mdx` | — |
| `dashboard` | `/snippets/connectors/dashboard/configure-ingestion.mdx` | — |
| `messaging` | `/snippets/connectors/messaging/configure-ingestion.mdx` | — |
| `storage` | `/snippets/connectors/storage/configure-ingestion.mdx` | `Manifest` from `/snippets/connectors/storage/manifest.mdx`; **do NOT use MetadataIngestionUi** |
| `search` | `/snippets/connectors/search/configure-ingestion.mdx` | — |
| `ml-model` | `/snippets/connectors/ml-model/configure-ingestion.mdx` | — |

**Steps block — varies by service type:**

- **Database only**: include `<AdvancedConfiguration />` between Connection Details Step and `<TestConnection />`
- **All types**: include `<TestConnection />`, `<ConfigureIngestion />`, `<IngestionScheduleAndDeploy />`
- **Database only**: include `<Related />` at bottom of page
- **Storage only**: include `<Manifest />` in requirements section (OpenMetadata manifest file is required)

**MetadataIngestionUi**: Used by database, pipeline, dashboard, search, ml-model. **NOT used by storage** (storage uses manual step descriptions instead).

**Full template:**

```mdx
---
title: "{DisplayName} Connector | OpenMetadata {ServiceType} Integration"
description: "Connect {DisplayName} to OpenMetadata with our comprehensive {service_type} connector guide. Step-by-step setup, configuration examples, and metadata extraction tips."
sidebarTitle: Overview
---

{service-type-specific imports — see table above}

<ConnectorDetailsHeader
icon='/public/images/connectors/{connector_name}.svg'
name="{DisplayName}"
stage="{PROD|BETA}"
availableFeatures={[{availableFeatures}]}
unavailableFeatures={[{unavailableFeatures}]} />

In this section, we provide guides and references to use the {DisplayName} connector.

{IF multiple auth types: include <Info> callout listing them}

Configure and schedule {DisplayName} metadata workflows from the OpenMetadata UI:
- [Requirements](#requirements)
- [Metadata Ingestion](#metadata-ingestion)
{IF database AND Query Usage supported: - [Query Usage](/{version}/connectors/ingestion/workflows/usage)}
{IF database AND Profiler supported: - [Data Profiler](/{version}/how-to-guides/data-quality-observability/profiler/profiler-workflow)}
{IF database AND Data Quality supported: - [Data Quality](/{version}/how-to-guides/data-quality-observability/quality)}
{IF database AND Lineage supported: - [Lineage](/{version}/connectors/ingestion/lineage)}
{IF database AND dbt supported: - [dbt Integration](/{version}/connectors/database/dbt)}
- [Troubleshooting](/{version}/connectors/{service_type}/{connector_name}/troubleshooting)

## Requirements

{permissions section — derive from code analysis}
{For DB connectors: SQL GRANT statements}
{For cloud connectors: IAM policy JSON or GCP roles}
{For storage connectors: include Manifest requirement}

## Metadata Ingestion

{IF NOT storage:
<MetadataIngestionUi connector="{DisplayName}" selectServicePath="/public/images/connectors/{connector_name}/select-service.png" addNewServicePath="/public/images/connectors/{connector_name}/add-new-service.png" serviceConnectionPath="/public/images/connectors/{connector_name}/service-connection.png" />
}

# Connection Details

<Steps>
<Step title="Connection Details">

{field-by-field description of each connection property from schema}
{Group auth options under sub-headings if multiple auth types}

</Step>
{IF database: <AdvancedConfiguration />}
<TestConnection />
<ConfigureIngestion />
<IngestionScheduleAndDeploy />
</Steps>

{IF SSL supported:
## Securing {DisplayName} Connection with SSL in OpenMetadata
...SSL configuration instructions...
}

{IF database: <Related />}
```

**Authentication Info Callout** (add after intro paragraph if multiple auth types):

```jsx
<Info>
**Supported Authentication Types:**
- **{Auth Type 1}** — {description}
- **{Auth Type 2}** — {description}
</Info>
```

**Auth type labels:**
- `basicAuth.json` → **Basic Auth** — Username and password authentication
- `iamAuthConfig.json` → **IAM Auth** — AWS IAM-based authentication (supports Provisioned Clusters and Serverless Workgroups)
- `awsCredentials.json` → **AWS Credentials** — AWS access key, secret key, and optional session token
- `gcpCredentials.json` → **GCP Credentials** — Google Cloud service account authentication
- `azureCredentials.json` → **Azure Credentials** — Azure service principal or managed identity authentication

#### Step 3.2: Generate the YAML Page (`{connector_name}/yaml.mdx`)

**File path:** `${DOCS_ROOT}/{version}/connectors/${service_type}/${connector_name}/yaml.mdx`

**Template:**

```mdx
---
title: "Run the {DisplayName} Connector Externally"
description: "Use YAML to configure {DisplayName} {service_type} connections with metadata ingestion, profiling, and schema extraction."
sidebarTitle: Run Externally
mode: "wide"
---

import { ConnectorDetailsHeader } from '/snippets/components/ConnectorDetailsHeader/ConnectorDetailsHeader.jsx'
import { CodePreview, ContentPanel, ContentSection, CodePanel } from '/snippets/components/CodePreview.jsx'
import PythonRequirements from '/snippets/connectors/python-requirements.mdx'
import ExternalIngestionDeployment from '/snippets/{version}/connectors/external-ingestion-deployment.mdx'
import IngestionSinkDef from '/snippets/connectors/yaml/ingestion-sink-def.mdx'
import WorkflowConfigDef from '/snippets/connectors/yaml/workflow-config-def.mdx'
import IngestionCli from '/snippets/connectors/yaml/ingestion-cli.mdx'
import IngestionSink from '/snippets/connectors/yaml/ingestion-sink.mdx'
import WorkflowConfig from '/snippets/connectors/yaml/workflow-config.mdx'
import SourceConfigDef from '/snippets/connectors/yaml/database/source-config-def.mdx'
import SourceConfig from '/snippets/connectors/yaml/database/source-config.mdx'
{IF Query Usage: import QueryUsage from '/snippets/connectors/yaml/query-usage.mdx'}
{IF Lineage: import Lineage from '/snippets/connectors/yaml/lineage.mdx'}
{IF Data Profiler: import DataProfiler from '/snippets/{version}/connectors/yaml/data-profiler.mdx'}
{IF Auto-Classification: import AutoClassification from '/snippets/connectors/yaml/auto-classification.mdx'}
{IF Data Quality: import DataQuality from '/snippets/connectors/yaml/data-quality.mdx'}
{IF AWS auth: import AwsConfigDef from '/snippets/connectors/yaml/common/aws-config-def.mdx'}
{IF GCP auth: import GcpConfigDef from '/snippets/connectors/yaml/common/gcp-config-def.mdx'}

<ConnectorDetailsHeader
icon='/public/images/connectors/{connector_name}.svg'
name="{DisplayName}"
stage="{PROD|BETA}"
availableFeatures={[{same as main page}]}
unavailableFeatures={[{same as main page}]} />

In this section, we provide guides and references to use the {DisplayName} connector.

{same <Info> auth callout as main page if multiple auth types}

Configure and schedule {DisplayName} metadata and profiler workflows from the OpenMetadata UI:
- [Requirements](#requirements)
- [Metadata Ingestion](#metadata-ingestion)
{IF Query Usage: - [Query Usage](#query-usage)}
{IF Lineage: - [Lineage](#lineage)}
{IF Data Profiler: - [Data Profiler](#data-profiler)}
{IF Data Quality: - [Data Quality](#data-quality)}
{IF dbt: - [dbt Integration](#dbt-integration)}

<ExternalIngestionDeployment />

## Requirements

{same permissions section as main page}

### Python Requirements

<PythonRequirements />

To run the {DisplayName} ingestion, you will need to install:

```bash
pip3 install "openmetadata-ingestion[{package_name}]"
```

## Metadata Ingestion

All connectors are defined as JSON Schemas.
[Here](https://github.com/open-metadata/OpenMetadata/blob/main/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/{service_type}/{connectorName}Connection.json)
you can find the structure to create a connection to {DisplayName}.

In order to create and run a Metadata Ingestion workflow, we will follow
the steps to create a YAML configuration able to connect to the source,
process the Entities if needed, and reach the OpenMetadata server.

The workflow is modeled around the following
[JSON Schema](https://github.com/open-metadata/OpenMetadata/blob/main/openmetadata-spec/src/main/resources/json/schema/metadataIngestion/workflow.json)

### 1. Define the YAML Config

<CodePreview>

<ContentPanel>

<ContentSection id={1} title="Source Configuration" lines="1-3">

Configure the source type and service name for your {DisplayName} connector.

</ContentSection>

{one ContentSection per field group, derived from schema properties}

<ContentSection id={N} title="Source Config" lines="{lines}">

<SourceConfigDef />

</ContentSection>

<ContentSection id={N+1} title="Sink Configuration" lines="{lines}">

<IngestionSinkDef />

</ContentSection>

<ContentSection id={N+2} title="Workflow Configuration" lines="{lines}">

<WorkflowConfigDef />

</ContentSection>

</ContentPanel>

<CodePanel fileName="{connector_name}_config.yaml">

```yaml
{full YAML configuration derived from schema}
```

<SourceConfig />

<IngestionSink />

<WorkflowConfig />

</CodePanel>

</CodePreview>

<IngestionCli />

{IF Query Usage: <QueryUsage connector="{connector_name}" />}
{IF Lineage: <Lineage connector="{connector_name}" />}
{IF Data Profiler: <DataProfiler connector="{connector_name}" />}
{IF Auto-Classification: <AutoClassification connector="{connector_name}" />}
{IF Data Quality: <DataQuality />}

{IF dbt:
## dbt Integration

You can learn more about how to ingest dbt models' definitions and their lineage [here](/{version}/connectors/database/dbt).
}
```

**YAML Field Line Numbering**: Count actual YAML lines in your generated CodePanel and reference the correct line ranges in each ContentSection.

**ContentPanel structure differs by service type:**

- **Database connectors**: Wrap `SourceConfigDef`, `IngestionSinkDef`, `WorkflowConfigDef` inside their own `ContentSection` elements at the end of the ContentPanel.
- **Messaging, Pipeline, Dashboard connectors**: Place `SourceConfigDef`, `IngestionSinkDef`, `WorkflowConfigDef` **directly** in the ContentPanel (not in ContentSections), before all field-specific ContentSections. Do NOT give these Def snippets line refs — they render as general description, not tied to specific YAML lines.

Messaging/Pipeline/Dashboard pattern:
```mdx
<ContentPanel>

<SourceConfigDef />
<IngestionSinkDef />
<WorkflowConfigDef />

<ContentSection id={1} title="Source Configuration" lines="1-3">
...
</ContentSection>

{field-specific ContentSections only}

</ContentPanel>
```

#### Step 3.3: Generate the Troubleshooting Page (`{connector_name}/troubleshooting.mdx`)

**File path:** `${DOCS_ROOT}/{version}/connectors/${service_type}/${connector_name}/troubleshooting.mdx`

**Template:**

```mdx
---
title: "{DisplayName} Troubleshooting | OpenMetadata Connector"
description: "Troubleshoot common {DisplayName} connector issues in OpenMetadata — connection failures, permission errors, and ingestion problems."
sidebarTitle: Troubleshooting
---

import Troubleshooting from '/snippets/connectors/troubleshooting.mdx'

<Troubleshooting />
```

If code analysis reveals permission-sensitive operations or known failure modes, add connector-specific sections after `<Troubleshooting />`:

```mdx
## {DisplayName}-Specific Issues

### {Issue Title}
{Description of the issue and resolution}
```

---

### Phase 4: Register in Navigation (`docs.json`)

After generating files, register the connector in `docs.json` for each target version.

#### Step 4.1: Find the Right Insertion Point

Search `docs.json` for the version's connector group. For example, for `v2.0.x` database connectors, find the `"Database Connectors"` group and locate the alphabetically correct position among existing connector groups.

**Search pattern:** Look for the adjacent connector alphabetically (e.g., for `"mssql"`, look for `"mysql"` or `"mongodb"` groups).

#### Step 4.2: Insert the Navigation Group

Insert a new group object at the correct alphabetical position:

```json
{
  "group": "{DisplayName}",
  "pages": [
    "{version}/connectors/{service_type}/{connector_name}",
    "{version}/connectors/{service_type}/{connector_name}/yaml",
    "{version}/connectors/{service_type}/{connector_name}/troubleshooting"
  ]
}
```

Do this for **each** target version in `docs.json`.

---

### Phase 5: Present Plan and Confirm (unless --dry-run skipped)

Before writing any files, present the full plan:

```markdown
## New Connector Documentation: {DisplayName}

### Ground Truth
**Service Type**: {service_type}
**Stage**: {PROD|BETA}
**Python Package**: openmetadata-ingestion[{package}]
**Icon**: /public/images/connectors/{connector_name}.webp

### Feature Matrix
**Available**: {list}
**Unavailable**: {list}

### Auth Types
{list of supported auth types}

### Permissions Required
{summary}

### Files to Create (per version: {versions})
- {version}/connectors/{service_type}/{connector_name}.mdx         ← Main page
- {version}/connectors/{service_type}/{connector_name}/yaml.mdx    ← YAML guide
- {version}/connectors/{service_type}/{connector_name}/troubleshooting.mdx ← Troubleshooting

### Navigation
- docs.json: Add "{DisplayName}" group in {N} version sections

### Notes / Gaps
{any fields or sections that need manual attention — missing icon, unclear permissions, etc.}
```

If `--dry-run`, stop here and show the generated file contents as code blocks without writing.

---

### Phase 6: Write the Files

Write each file using the generated content:

1. Create the directory `{version}/connectors/{service_type}/{connector_name}/` if it doesn't exist
2. Write `{connector_name}.mdx` at the parent level
3. Write `{connector_name}/yaml.mdx`
4. Write `{connector_name}/troubleshooting.mdx`
5. Edit `docs.json` to insert the navigation group at the correct alphabetical position

Repeat for all target versions.

---

### Phase 7: Verify and Report

After writing all files:

1. Re-read each created file to confirm content looks correct
2. Grep `docs.json` to confirm the new pages are registered
3. Check that `availableFeatures` and `unavailableFeatures` are identical between main page and yaml.mdx
4. Check that YAML ContentSection line references are plausible given the YAML length
5. Verify all snippet imports resolve — **known exception**: `/snippets/v1.13.x/connectors/external-ingestion-deployment.mdx` does not exist on disk. This is intentional — all existing v1.13.x connectors use this same path as a placeholder for the snippet that will be created when the version is finalized. Do NOT flag this as an error.

Present a final summary:

```markdown
## Documentation Created: {DisplayName}

### Files Written
- ✓ v1.13.x/connectors/{service_type}/{connector_name}.mdx
- ✓ v1.13.x/connectors/{service_type}/{connector_name}/yaml.mdx
- ✓ v1.13.x/connectors/{service_type}/{connector_name}/troubleshooting.mdx
- ✓ v2.0.x/connectors/{service_type}/{connector_name}.mdx
- ✓ v2.0.x/connectors/{service_type}/{connector_name}/yaml.mdx
- ✓ v2.0.x/connectors/{service_type}/{connector_name}/troubleshooting.mdx
- ✓ docs.json (navigation registered in 2 version sections)

### Feature Matrix
**Available**: {list}
**Unavailable**: {list}

### Manual Follow-up Needed
- [ ] Add connector icon at /public/images/connectors/{connector_name}.webp
- [ ] Add UI screenshots at /public/images/connectors/{connector_name}/
- [ ] Review and refine permissions section with domain expert
- [ ] {any other gaps identified}
```

---

## Content Quality Guidelines

### Requirements Section (Permissions)

Write permissions so they are copy-pasteable and explain the "why":

**For database connectors (SQL):**
```markdown
## Requirements

To extract metadata, the database user needs the following privileges:

#### Metadata Ingestion
```sql
-- Grant usage on all schemas you want to ingest
GRANT USAGE ON SCHEMA <schema_name> TO <user>;
-- Grant select on all tables and views
GRANT SELECT ON ALL TABLES IN SCHEMA <schema_name> TO <user>;
```

#### Usage & Lineage
```sql
-- Required to read query history
GRANT SELECT ON <query_history_view> TO <user>;
```
```

**For AWS connectors (IAM):**
```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "service:ListX",       // Required for: listing resources during metadata extraction
        "service:DescribeX"    // Required for: reading resource details
      ],
      "Resource": "*"
    }
  ]
}
```

**For GCP connectors:**
```markdown
The service account needs these roles:
- `roles/viewer` — for metadata extraction
- `roles/bigquery.dataViewer` — for profiling and data sampling
```

### Connection Details Section (Main Page)

Each field description should:
- Lead with the field name in bold: `**Username**: ...`
- Explain what value to provide (not just repeat the field name)
- Note if a field is required vs. optional
- For complex fields (auth types), use nested sub-headings
- For enum fields (SSL modes), list each option with a short description

### YAML Configuration Best Practices

- All `required` fields: uncommented with placeholder values
- Important optional fields: uncommented with defaults or placeholders
- Sensitive values: use angle-bracket placeholders: `<password>`, `<api_key>`
- SSL/filter patterns: comment out with `# ` prefix
- Include inline comments for non-obvious fields
- Align `:` for readability within related field groups

---

## Service-Type Reference Tables

### Snippet Paths by Service Type

| Service Type | ConfigureIngestion (main page) | SourceConfigDef (yaml) | SourceConfig (yaml) |
|---|---|---|---|
| `database` | `/snippets/connectors/database/configure-ingestion.mdx` | `/snippets/connectors/yaml/database/source-config-def.mdx` | `/snippets/connectors/yaml/database/source-config.mdx` |
| `pipeline` | `/snippets/connectors/pipeline/configure-ingestion.mdx` | `/snippets/connectors/yaml/pipeline/source-config-def.mdx` | `/snippets/connectors/yaml/pipeline/source-config.mdx` |
| `dashboard` | `/snippets/connectors/dashboard/configure-ingestion.mdx` | `/snippets/connectors/yaml/dashboard/source-config-def.mdx` | `/snippets/connectors/yaml/dashboard/source-config.mdx` |
| `messaging` | `/snippets/connectors/messaging/configure-ingestion.mdx` | `/snippets/connectors/yaml/messaging/source-config-def.mdx` | `/snippets/connectors/yaml/messaging/source-config.mdx` |
| `storage` | `/snippets/connectors/storage/configure-ingestion.mdx` | `/snippets/connectors/yaml/storage/source-config-def.mdx` | `/snippets/connectors/yaml/storage/source-config.mdx` |
| `search` | `/snippets/connectors/search/configure-ingestion.mdx` | `/snippets/connectors/yaml/search/source-config-def.mdx` | `/snippets/connectors/yaml/search/source-config.mdx` |
| `ml-model` | `/snippets/connectors/ml-model/configure-ingestion.mdx` | `/snippets/connectors/yaml/ml-model/source-config-def.mdx` | `/snippets/connectors/yaml/ml-model/source-config.mdx` |

### Behaviour Differences by Service Type

| Feature | database | pipeline | dashboard | messaging | storage | search | ml-model |
|---|---|---|---|---|---|---|---|
| `<AdvancedConfiguration />` in Steps | **YES** | NO | NO | NO | NO | NO | NO |
| `<Related />` at page bottom | **YES** | NO | NO | NO | NO | NO | NO |
| `<MetadataIngestionUi />` | YES | YES | YES | YES | NO | YES | YES |
| `<Manifest />` in requirements | NO | NO | NO | NO | **YES** | NO | NO |
| Post-YAML workflow sections | **YES** (Lineage, DataProfiler, AutoClassification, DataQuality, QueryUsage) | NO | NO | NO | NO | NO | NO |
| Data Profiler import (version-specific) | **YES** — `/snippets/{version}/connectors/yaml/data-profiler.mdx` | NO | NO | NO | NO | NO | NO |
| ContentPanel: Defs in ContentSections | **YES** (database wraps Defs inside ContentSections) | NO (Defs before ContentSections) | NO | NO | NO | NO | NO |

### Post-YAML Workflow Sections (database only)

```mdx
<IngestionCli />
{IF Query Usage: <QueryUsage connector="{connector_name}" />}
{IF Lineage: <Lineage connector="{connector_name}" />}
{IF Data Profiler: <DataProfiler connector="{connector_name}" />}
{IF Auto-Classification: <AutoClassification connector="{connector_name}" />}
{IF Data Quality: <DataQuality />}
```

For all other service types, only `<IngestionCli />` follows the CodePreview block.

### Cloud Provider Config Snippets (for connectors with AWS/GCP/Azure auth)

```
AWS:   import AwsConfigDef from '/snippets/connectors/yaml/common/aws-config-def.mdx'
       import AwsConfig from '/snippets/connectors/yaml/common/aws-config.mdx'
GCP:   import GcpConfigDef from '/snippets/connectors/yaml/common/gcp-config-def.mdx'
       import GcpConfig from '/snippets/connectors/yaml/common/gcp-config.mdx'
Azure: import AzureConfigDef from '/snippets/connectors/yaml/common/azure-config-def.mdx'
       import AzureConfig from '/snippets/connectors/yaml/common/azure-config.mdx'
```

These are used in the CodePanel alongside SourceConfig when the connector authenticates via cloud credentials.

> **Note:** Always verify snippet paths exist in the repo before using them. The `ml-model` directory uses a hyphen — do not write `mlmodel`.

---

## Feature String Reference

### Database Connectors
```
All possible: "Metadata", "Query Usage", "Data Profiler", "Data Quality", "dbt",
              "Lineage", "View Lineage", "Column-level Lineage", "View Column-level Lineage",
              "Stored Procedures", "Stored Procedures Lineage", "Sample Data",
              "Auto-Classification", "Owners", "Tags"
```

### Pipeline Connectors
```
All possible: "Pipelines", "Pipeline Status", "Lineage", "Owners", "Usage", "Tags"
```

### Dashboard Connectors
```
All possible: "Dashboards", "Charts", "Datamodels", "Projects",
              "Lineage", "Column Lineage", "Owners", "Usage", "Tags"
```

### Messaging Connectors
```
All possible: "Topics", "Sample Data"
```

### Storage Connectors
```
All possible: "Metadata", "Structured Containers", "Unstructured Containers"
```

### Search Connectors
```
All possible: "Search Indexes", "Sample Data"
```

### ML Model Connectors (`ml-model`)
```
All possible: "ML Features", "Hyperparameters", "ML Store"
```

---

## Example Invocations

```
# Create docs for a new database connector
connector-doc-create clickhouse --service-type database --display-name "ClickHouse"

# Create docs for a new pipeline connector, BETA stage, only latest version
connector-doc-create airflow --service-type pipeline --stage BETA --version v2.0.x

# Preview what would be created without writing files
connector-doc-create snowflake --dry-run

# Create docs with a custom display name and icon path
connector-doc-create sap-hana --display-name "SAP HANA" --icon /public/images/connectors/sap-hana.webp
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…