Created on 06-10-2026 01:06 AM
In the GenAI era, I’ve really enjoyed how tools like LLMs can boost productivity in day-to-day operations. However, I found that NiFi’s Web UI doesn’t integrate very naturally with GenAI workflows. I also explored options like MCP Server to bridge that gap, but it requires additional setup and a specific skillset.
Recently, I discovered a much simpler approach—leveraging NiFi’s REST APIs directly. Without any MCP setup, we can use LLMs as an operations co-pilot to extract, audit, and document NiFi flows and Ranger policies.
Vibe coding means you describe your intent in natural language and let AI write the code. Applied to CDP NiFi flow development, it looks like this:
curl commands, calls the NiFi REST API, parses the JSON, and returns a clean summary tableAs a NiFi flow developer, you spend most of your time designing data pipelines -- not memorizing API paths. By pairing an AI assistant (like Claude) with the NiFi & Ranger REST APIs, you can:
This article provides ready-to-use prompt templates to get started.
curl commandsStore your endpoints and credentials as environment variables. Never hardcode credentials in scripts or documents.
# --- Credentials (store in a separate file, e.g. .cdp-creds, and gitignore it) ---
WORKLOAD_USERNAME=<your-workload-username>
WORKLOAD_PASSWORD=<your-workload-password>
# --- NiFi Endpoints ---
# Find these in CDP > Data Hub > your NiFi cluster > Endpoints tab
NIFI_BASE_HOST=<nifi-management-host>.cloudera.site
NIFI_BASE_URL=https://$NIFI_BASE_HOST/<cluster-name>/cdp-proxy-api/nifi-app/nifi-api/
# --- Ranger Endpoints ---
# Find these in CDP > Data Lake > Endpoints tab
DATA_LAKE_GATEWAY=<datalake-gateway-host>.cloudera.site
RANGER_BASE_URL=https://$DATA_LAKE_GATEWAY/<datalake-name>/cdp-proxy-api/ranger/
Tip: Create a
.cdp-credsfile withchmod 600, add it to.gitignore, andsourceit before running commands.
# Test NiFi connectivity
curl -s "${NIFI_BASE_URL}system-diagnostics" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" \
-o /dev/null -w "NiFi: HTTP %{http_code}\n"
# Test Ranger connectivity
curl -s "${RANGER_BASE_URL}service/public/v2/api/service" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" \
-o /dev/null -w "Ranger: HTTP %{http_code}\n"
# Expected output:
# NiFi: HTTP 200
# Ranger: HTTP 200
If your CDP cluster is in a private subnet, use SSH dynamic forwarding through a jump host:
# Architecture: Local Machine --> Bastion/Jump Host --> CDP Cluster Internal Network
# Step 1: Set up SOCKS5 proxy via SSH tunnel to your jump host
ssh -D 1084 -N -f user@jump-host
# Step 2: Use socks5h:// (the 'h' means remote DNS resolution)
curl -s --proxy socks5h://127.0.0.1:1084 \
"${NIFI_BASE_URL}system-diagnostics" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" \
-o /dev/null -w "NiFi: HTTP %{http_code}\n"
# socks5h:// resolves hostnames on the proxy side (jump host)
# No need for --resolve hacks or /etc/hosts modifications
Below are ready-to-use prompt templates. Copy one to your AI assistant, replace {{ }} placeholders, and let it do the heavy lifting.
"I just joined the project -- give me a map of what's running."
You are a NiFi flow developer assistant. Help me understand the current flow
topology via the NiFi REST API.
## Connection Info
- NiFi API Base URL: {{ NIFI_BASE_URL }}
- Authentication: Basic Auth
- Username/Password: {{ WORKLOAD_USERNAME }} / {{ WORKLOAD_PASSWORD }}
## Tasks
Use curl to complete the following and output results as structured Markdown:
1. Get all Process Group list (name, ID, status)
GET /process-groups/root/process-groups
2. Get the complete flow configuration of a specific Process Group
GET /process-groups/{id}/flow
3. List all Controller Services (type, name, status, properties)
GET /flow/controller/controller-services
4. Export a specific Process Group as template JSON
POST /process-groups/{id}/templates/export
## Output Format
- Summarize Processor list in a Markdown table (name, type, status, scheduling strategy)
- Save complete JSON configuration in code blocks
- Flag sensitive properties that require manual review (passwords, keys, etc.)
"Which flows are version-controlled? What changed in the last release?"
You are a NiFi flow developer assistant. Help me inspect Registry and version
control configuration via the NiFi REST API.
## Connection Info
- NiFi API Base URL: {{ NIFI_BASE_URL }}
- Authentication: Basic Auth ({{ WORKLOAD_USERNAME }})
## Tasks
1. List all Registry Client configurations
GET /controller/registry-clients
2. View versioned Process Group list
GET /flow/registries/{registryId}/buckets/{bucketId}/flows
3. Get a specific version's Flow snapshot
GET /buckets/{bucketId}/flows/{flowId}/versions/{versionNumber}
## Output
- Registry inventory (name, URL, type)
- Version history table for each Flow
"Who has access to what? Are there any overly permissive policies?"
You are a NiFi flow developer assistant. Help me review the Ranger security
policies that govern my NiFi flows.
## Connection Info
- Ranger API Base URL: {{ RANGER_BASE_URL }}
- Authentication: Basic Auth ({{ WORKLOAD_USERNAME }})
## Tasks
1. Get all Service (plugin) list
GET /service/public/v2/api/service
2. Get all Policies for a specific Service
GET /service/public/v2/api/policy?serviceName={{ SERVICE_NAME }}
3. Get all users and user groups
GET /service/xusers/users
GET /service/xusers/groups
4. Get role list
GET /service/roles/roles
## Output Format
- Policy summary table: Policy Name | Resource Path | Allowed Users/Groups | Permissions | Enabled
- User-Role mapping table
- Flag high-privilege policies (containing * wildcard or admin permissions)
"My processor is getting 'access denied' -- what Ranger policies apply to my flow?"
You are a NiFi flow developer assistant. Help me find and audit the Ranger
policies specific to NiFi.
## Connection Info
- Ranger API Base URL: {{ RANGER_BASE_URL }}
- Authentication: Basic Auth ({{ WORKLOAD_USERNAME }})
## Tasks
1. Find NiFi Service definition
GET /service/public/v2/api/service?serviceType=nifi
2. Get all policies under that Service
GET /service/public/v2/api/policy?serviceName={{ NIFI_SERVICE_NAME }}
3. Export policies as JSON file (for backup or migration)
## Output
- NiFi resource path permission inventory
- Access control policies for each Process Group
- Flag entries that conflict with or duplicate NiFi built-in policies
"We're migrating to a new environment -- generate the complete inventory."
You are a NiFi flow developer assistant. Generate a complete configuration
inventory of NiFi flows and Ranger policies for documentation and migration.
## Connection Info
- NiFi API Base URL: {{ NIFI_BASE_URL }}
- Ranger API Base URL: {{ RANGER_BASE_URL }}
- Authentication: Basic Auth ({{ WORKLOAD_USERNAME }})
## Execution Steps (in order)
### Step 1: NiFi Flow Inventory
- Get all Process Groups (including hierarchy)
- Count Processor quantities and type distribution in each Group
### Step 2: NiFi Controller Services
- List all Controller Services (type, name, status)
- Flag critical services such as DBCPConnectionPool, SSLContextService, etc.
### Step 3: Ranger Policy Inventory
- Get all NiFi-related Services and Policies
- Output Policy permission matrix
### Step 4: Summary Report
Generate a Markdown report containing:
- NiFi flow architecture overview (Mermaid diagram)
- Controller Service configuration table
- Ranger permission matrix
- Discovered issues or recommendations
## Output Files
- nifi-flow-inventory.md
- ranger-policy-matrix.md
- full-config-report.md
Operation Method Path
| Get root Process Group | GET | /process-groups/root |
| List child Process Groups | GET | /process-groups/{id}/process-groups |
| Get Flow details | GET | /process-groups/{id}/flow |
| List Processors | GET | /process-groups/{id}/processors |
| List Connections | GET | /process-groups/{id}/connections |
| List Controller Services | GET | /flow/controller/controller-services |
| Get system diagnostics | GET | /system-diagnostics |
| Get cluster status | GET | /controller/cluster |
| Token authentication | POST | /access/token |
Operation Method Path
| List all Services | GET | /service/public/v2/api/service |
| List all Policies | GET | /service/public/v2/api/policy |
| Query Policies by Service | GET | /service/public/v2/api/policy?serviceName={name} |
| Create Policy | POST | /service/public/v2/api/policy |
| List users | GET | /service/xusers/users |
| List user groups | GET | /service/xusers/groups |
| List roles | GET | /service/roles/roles |
| Service type definitions | GET | /service/public/v2/api/servicedef |
.cdp-creds file)curl test against /system-diagnosticscurl commands targeting NiFi/Ranger APIsHere's what vibe coding NiFi development looks like in practice. Instead of dragging processors in the UI and manually configuring each one, you have a conversation with AI:
You:
I need to build a flow that picks up CSV files from a local directory, validates the schema, converts them to Parquet, and writes to S3. Set it up in my "Data-Ingestion" Process Group.
AI responds with the exact REST API calls:
# Step 1: Find the target Process Group
curl -s "${NIFI_BASE_URL}process-groups/root/process-groups" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" | jq '.processGroups[] | {name: .component.name, id: .id}'
# Step 2: Create a GetFile processor
curl -s -X POST "${NIFI_BASE_URL}process-groups/<pg-id>/processors" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"revision": {"version": 0},
"component": {
"type": "org.apache.nifi.processors.standard.GetFile",
"name": "Pick up CSV files",
"config": {
"properties": {
"Input Directory": "/data/incoming/csv",
"File Filter": "[^\\.].*\\.csv",
"Keep Source File": "false"
}
}
}
}'
# Step 3: Create a ValidateRecord processor for schema validation
curl -s -X POST "${NIFI_BASE_URL}process-groups/<pg-id>/processors" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"revision": {"version": 0},
"component": {
"type": "org.apache.nifi.processors.standard.ValidateRecord",
"name": "Validate CSV Schema",
"config": {
"properties": {
"Record Reader": "<csv-reader-controller-service-id>",
"Record Writer": "<csv-writer-controller-service-id>"
}
}
}
}'
# Step 4: Create a ConvertRecord processor (CSV -> Parquet)
curl -s -X POST "${NIFI_BASE_URL}process-groups/<pg-id>/processors" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"revision": {"version": 0},
"component": {
"type": "org.apache.nifi.processors.standard.ConvertRecord",
"name": "Convert CSV to Parquet",
"config": {
"properties": {
"Record Reader": "<csv-reader-controller-service-id>",
"Record Writer": "<parquet-writer-controller-service-id>"
}
}
}
}'
# Step 5: Create a PutS3Object processor
curl -s -X POST "${NIFI_BASE_URL}process-groups/<pg-id>/processors" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"revision": {"version": 0},
"component": {
"type": "org.apache.nifi.processors.aws.s3.PutS3Object",
"name": "Write Parquet to S3",
"config": {
"properties": {
"Bucket": "my-data-lake-bucket",
"Object Key": "ingested/${now():format('\''yyyy/MM/dd'\'')}/${filename}.parquet"
}
}
}
}'
# Step 6: Connect the processors in sequence
# GetFile -> ValidateRecord -> ConvertRecord -> PutS3Object
curl -s -X POST "${NIFI_BASE_URL}process-groups/<pg-id>/connections" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"revision": {"version": 0},
"component": {
"source": {"id": "<getfile-id>", "type": "PROCESSOR"},
"destination": {"id": "<validate-id>", "type": "PROCESSOR"},
"selectedRelationships": ["success"]
}
}'
# ... (AI generates the remaining connections)
You: "Add error handling -- route validation failures to a separate PutFile that writes to /data/rejected/"
AI generates the additional processor and connection API calls.
You: "What Controller Services do I need for the CSV reader and Parquet writer?"
AI creates the CSVReader and ParquetRecordSetWriter Controller Services:
# Create CSVReader Controller Service
curl -s -X POST "${NIFI_BASE_URL}process-groups/<pg-id>/controller-services" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"revision": {"version": 0},
"component": {
"type": "org.apache.nifi.csv.CSVReader",
"name": "CSV Reader",
"properties": {
"Schema Access Strategy": "Use String Fields From Header",
"Date Format": "yyyy-MM-dd",
"Timestamp Format": "yyyy-MM-dd HH:mm:ss"
}
}
}'
# Create ParquetRecordSetWriter Controller Service
curl -s -X POST "${NIFI_BASE_URL}process-groups/<pg-id>/controller-services" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"revision": {"version": 0},
"component": {
"type": "org.apache.nifi.parquet.ParquetRecordSetWriter",
"name": "Parquet Writer",
"properties": {
"Schema Access Strategy": "Inherit Record Schema",
"Compression Type": "SNAPPY"
}
}
}'
# Enable the Controller Services
curl -s -X PUT "${NIFI_BASE_URL}controller-services/<service-id>/run-status" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" \
-H "Content-Type: application/json" \
-d '{"revision": {"version": 1}, "state": "ENABLED"}'
You: "Now start the entire Process Group."
# Start all processors in the Process Group
curl -s -X PUT "${NIFI_BASE_URL}flow/process-groups/<pg-id>" \
-u "$WORKLOAD_USERNAME:$WORKLOAD_PASSWORD" \
-H "Content-Type: application/json" \
-d '{"id": "<pg-id>", "state": "RUNNING"}'
In a few minutes of conversation, you built a complete ingestion pipeline:
No UI clicking. No API doc searching. No API doc searching. Just describing, reviewing, and iterating.
chmod 600 on credential files to restrict read access.Vibe coding flips the NiFi development workflow: instead of navigating the UI or looking up REST API docs, you describe your intent and let AI handle the plumbing. Whether you're onboarding to an existing project, debugging access control issues, or preparing a migration inventory, these prompt templates let you stay in the flow -- pun intended.
Applicable to: Cloudera Data Platform (CDP) Public Cloud -- Data Hub NiFi clusters and Data Lake Ranger services.