Mongodb Atlas Stream Processing
MongoDBOfficialPublished by MongoDB
- Skill
- Tool integration
- Data and AI
- Apache-2.0
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured interface for managing MongoDB Atlas Stream Processing (ASP) workflows. It enables users to provision workspaces, configure data connections, build stream processing pipelines, and monitor processor health. The skill emphasizes a rigorous development lifecycle, including mandatory pre-deployment validation of connections and pipeline stages, to ensure reliable data streaming between sources like Kafka, Atlas clusters, S3, and Lambda.
What it does
- Provisions and manages Atlas Stream Processing workspaces and tiers.
- Configures connections for diverse data sources and sinks including Kafka, S3, and Atlas clusters.
- Builds and deploys streaming pipelines with support for windowing, enrichment, and validation.
- Provides diagnostic tools to monitor processor state, health, and performance metrics.
- Handles lifecycle operations such as starting, stopping, modifying, and tearing down processors.
- Enforces safety checks for workspace and connection deletion to prevent accidental data loss.
When to use it
- When you need to build real-time data processing pipelines within the MongoDB Atlas ecosystem.
- When you are setting up streaming integrations between Kafka, S3, AWS Lambda, and MongoDB.
- When you need to perform health checks or debug existing stream processing workloads.
- When you require a structured, repeatable workflow for deploying and managing stream processors.
Advantages
- Reduces configuration errors through mandatory pre-deployment validation steps.
- Provides a unified interface for complex streaming infrastructure management.
- Supports safe lifecycle management with built-in state checks and teardown safeguards.
- Facilitates easier debugging with integrated diagnostic reports and health monitoring.
Usage examples
- “Create a new stream processing workspace in the US-East-1 region.”
- The agent will use the build tool to provision a new workspace, ensuring the correct region mapping for AWS is applied.
- “Diagnose why my Kafka-to-Atlas processor is failing.”
- The agent will run a diagnostic report on the specified processor to identify errors, check partition status, and suggest remediation steps.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/mongodb/mongodb-atlas-stream-processing/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip mongodb-atlas-stream-processing.zip -d .agents/skills
Documentation by MongoDB
MongoDB Atlas Streams
Build, operate, and debug Atlas Stream Processing (ASP) pipelines using four MCP tools from the MongoDB MCP Server.
Prerequisites
This skill requires the MongoDB MCP Server connected with:
Atlas API credentials (
apiClientIdandapiClientSecret)
The 4 tools: atlas-streams-discover, atlas-streams-build, atlas-streams-manage, atlas-streams-teardown.
All operations require an Atlas project ID. If unknown, call atlas-list-projects first to find your project ID.
If MCP tools are unavailable
If the MongoDB MCP Server is not connected or the streams tools are missing, see references/mcp-troubleshooting.md for diagnostic steps and fallback options.
Tool Selection Matrix
atlas-streams-discover — ALL read operations
| Action | Use when |
|---|---|
list-workspaces | See all workspaces in a project |
inspect-workspace | Review workspace config, state, region |
list-connections | See all connections in a workspace |
inspect-connection | Check connection state, config, health |
list-processors | See all processors in a workspace |
inspect-processor | Check processor state, pipeline, config |
diagnose-processor | Full health report: state, stats, errors |
get-networking | PrivateLink and VPC peering details. Optional: cloudProvider + region to get Atlas account details for PrivateLink setup |
Pagination (all list actions): limit (1-100, default 20), pageNum (default 1).
Response format: responseFormat — "concise" (default for list actions) or "detailed" (default for inspect/diagnose).
atlas-streams-build — ALL create operations
| Resource | Key parameters |
|---|---|
workspace | cloudProvider, region, tier (default SP10), includeSampleData |
connection | connectionName, connectionType (Kafka/Cluster/S3/Https/Kinesis/Lambda/SchemaRegistry/Sample), connectionConfig |
processor | processorName, pipeline (must start with $source, end with $merge/$emit), dlq, autoStart |
privatelink | privateLinkConfig (project-level, not tied to a specific workspace) |
Field mapping — only fill fields for the selected resource type:
resource = "workspace": Fill:
projectId,workspaceName,cloudProvider,region,tier,includeSampleData. Leave empty: all connection and processor fields.resource = "connection": Fill:
projectId,workspaceName,connectionName,connectionType,connectionConfig. Leave empty: all workspace and processor fields. (See references/connection-configs.md for type-specific schemas.)resource = "processor": Fill:
projectId,workspaceName,processorName,pipeline,dlq(recommended),autoStart(optional). Leave empty: all workspace and connection fields. (See references/pipeline-patterns.md for pipeline examples.)resource = "privatelink": Fill:
projectId,privateLinkConfig. Note: PrivateLink is project-level, not workspace-level.workspaceNameis not required — omit it. Leave empty: all connection and processor fields.
atlas-streams-manage — ALL update/state operations
| Action | Notes |
|---|---|
start-processor | Begins billing. Optional tier override, resumeFromCheckpoint |
stop-processor | Stops billing. Retains state 45 days |
modify-processor | Processor must be stopped first. Change pipeline, DLQ, or name |
update-workspace | Change tier or region |
update-connection | Update config (networking is immutable — must delete and recreate) |
accept-peering / reject-peering | VPC peering management |
Field mapping — always fill projectId, workspaceName, then by action:
"start-processor"→resourceName. Optional:tier,resumeFromCheckpoint,startAtOperationTime(ISO 8601 timestamp to resume from a specific point)"stop-processor"→resourceName"modify-processor"→resourceName. At least one of:pipeline,dlq,newName"update-workspace"→newRegionornewTier"update-connection"→resourceName,connectionConfig. Exception: networking config (e.g., PrivateLink) cannot be modified after creation — delete and recreate."accept-peering"→peeringId,requesterAccountId,requesterVpcId"reject-peering"→peeringId
State pre-checks:
start-processor→ errors if processor is already STARTEDstop-processor→ no-ops if already STOPPED or CREATED (not an error)modify-processor→ errors if processor is STARTED (must stop first)
Processor states: CREATED → STARTED (via start) → STOPPED (via stop). Can also enter FAILED on runtime errors. Modify requires STOPPED or CREATED state.
Teardown safety checks:
Processor deletion → auto-stops before deleting (no need to stop manually first)
Connection deletion → blocks if any running processor references it. Stop/delete referencing processors first.
Workspace deletion → See detailed workflow below (lines 108-111).
atlas-streams-teardown — ALL delete operations
| Resource | Safety behavior |
|---|---|
processor | Auto-stops before deleting |
connection | Blocks if referenced by running processor |
workspace | Cascading delete of all connections and processors |
privatelink / peering | Remove networking resources |
Field mapping — always fill projectId, resource, then:
resource: "workspace"→workspaceNameresource: "connection"or"processor"→workspaceName,resourceNameresource: "privatelink"or"peering"→resourceName(the ID). These are project-level resources, not tied to a specific workspace.
Before deleting a workspace, inspect it first:
atlas-streams-discover→inspect-workspace— get connection/processor countsPresent to user: "Workspace X contains N connections and M processors. Deleting permanently removes all. Proceed?"
Wait for confirmation before calling
atlas-streams-teardown
CRITICAL: Validate Before Creating Processors
You MUST call search-knowledge before composing any processor pipeline. This is not optional.
Field validation: Query with the sink/source type, e.g. "Atlas Stream Processing $emit S3 fields" or "Atlas Stream Processing Kafka $source configuration". This catches errors like
prefixvspathfor S3$emit.Pattern examples: Query with
dataSources: [{"name": "devcenter"}]for working pipelines, e.g. "Atlas Stream Processing tumbling window example".
Also fetch examples from the official ASP examples repo when building non-trivial processors: https://github.com/mongodb/ASP_example (quickstarts, example processors, Terraform examples). Start with example_processors/README.md for the full pattern catalog.
Key quickstarts:
| Quickstart | Pattern |
|---|---|
00_hello_world.json | Inline $source.documents with $match (zero infra, ephemeral) |
01_changestream_basic.json | Change stream → tumbling window → $merge to Atlas |
03_kafka_to_mongo.json | Kafka source → tumbling window rollup → $merge to Atlas |
04_mongo_to_mongo.json | Chained processors: rollup → archive to separate collection |
05_kafka_tail.json | Real-time Kafka topic monitoring (sinkless, like tail -f) |
Pipeline Rules & Warnings
Invalid constructs — these are NOT valid in streaming pipelines:
$$NOW,$$ROOT,$$CURRENT— NOT available in stream processing. NEVER use these. Use the document's own timestamp field or_stream_metametadata for event time instead of$$NOW.HTTPS connections as
$source— HTTPS is for$httpsenrichment or sink only, NOT as a data sourceKafka
$sourcewithouttopic— topic field is requiredPipelines without a sink — terminal stage (
$merge,$emit,$https, or$externalFunctionasync) required for deployed processors (sinkless only works viasp.process())Lambda as
$emittarget — Lambda uses$externalFunction(mid-pipeline enrichment), not$emit$validatewithvalidationAction: "error"— crashes processor; use"dlq"instead
Required fields by stage:
$source(change stream): includefullDocument: "updateLookup"to get the full document content$source(Kinesis): usestream(NOTstreamNameortopic)$emit(Kinesis): MUST includepartitionKey$emit(S3): usepath(NOTprefix)$https: must includeconnectionName,path,method,as,onError: "dlq"$externalFunction: must includeconnectionName,functionName,execution,as,onError: "dlq"$validate: must includevalidatorwith$jsonSchemaandvalidationAction: "dlq"$lookup: includeparallelismsetting (e.g.,parallelism: 2) for concurrent I/OAWS connections (S3, Kinesis, Lambda): IAM role ARN must be registered via Atlas Cloud Provider Access first. Always confirm this with user. See references/connection-configs.md for details.
See references/pipeline-patterns.md for stage field examples with JSON syntax.
SchemaRegistry connection: connectionType must be "SchemaRegistry" (not "Kafka"). Schema type values are case-sensitive (use lowercase avro, not AVRO). See references/connection-configs.md for required fields and auth types.
MCP Tool Behaviors
Elicitation: When creating connections, the build tool auto-collects missing sensitive fields (passwords, bootstrap servers) via MCP elicitation. Do NOT ask the user for these — let the tool collect them.
Auto-normalization:
bootstrapServersarray → auto-converted to comma-separated stringschemaRegistryUrlsstring → auto-wrapped in arraydbRoleToExecute→ defaults to{role: "readWriteAnyDatabase", type: "BUILT_IN"}for Cluster connections
Workspace creation: includeSampleData defaults to true, which auto-creates the sample_stream_solar connection.
Region naming: The region field uses Atlas-specific names that differ by cloud provider. Using the wrong format returns a cryptic dataProcessRegion error.
| Provider | Cloud Region | Streams region Value |
|---|---|---|
| AWS | us-east-1 | VIRGINIA_USA |
| AWS | us-east-2 | OHIO_USA |
| AWS | eu-west-1 | DUBLIN_IRL |
| GCP | us-central1 | US_CENTRAL1 |
| GCP | europe-west1 | EUROPE_WEST1 |
| Azure | eastus | eastus |
| Azure | westeurope | westeurope |
See references/connection-configs.md for the full region mapping table. If unsure, inspect an existing workspace with atlas-streams-discover → inspect-workspace and check dataProcessRegion.region.
Connection Capabilities — Source/Sink Reference
Know what each connection type can do before creating pipelines:
| Connection Type | As Source ($source) | As Sink ($merge / $emit) | Mid-Pipeline | Notes |
|---|---|---|---|---|
| Cluster | ✅ Change streams | ✅ $merge to collections | ✅ $lookup | Change streams monitor insert/update/delete/replace operations |
| Kafka | ✅ Topic consumer | ✅ $emit to topics | ❌ | Source MUST include topic field |
| Sample Stream | ✅ Sample data | ❌ Not valid | ❌ | Testing/demo only |
| S3 | ❌ Not valid | ✅ $emit to buckets | ❌ | Sink only - use path, format, compression. Supports AWS PrivateLink. |
| Https | ❌ Not valid | ✅ $https as sink | ✅ $https enrichment | Can be used mid-pipeline for enrichment OR as final sink stage |
| AWSLambda | ❌ Not valid | ✅ $externalFunction (async only) | ✅ $externalFunction (sync or async) | Sink: execution: "async" required. Mid-pipeline: execution: "sync" or "async" |
| AWS Kinesis | ✅ Stream consumer | ✅ $emit to streams | ❌ | Similar to Kafka pattern |
| SchemaRegistry | ❌ Not valid | ❌ Not valid | ✅ Schema resolution | Metadata only - used by Kafka connections for Avro schemas |
Common connection usage mistakes to avoid:
❌ Using
$externalFunctionas sink withexecution: "sync"→ Must useexecution: "async"for sink stage❌ Forgetting change streams exist → Atlas Cluster is a powerful source, not just a sink
❌ Using
$mergewith Kafka → Use$emitfor Kafka sinks
See references/connection-configs.md for detailed connection configuration schemas by type.
Core Workflows
Setup from scratch
atlas-streams-discover→list-workspaces(check existing)atlas-streams-build→resource: "workspace"(region near data, SP10 for dev)atlas-streams-build→resource: "connection"(for each source/sink/enrichment)Validate connections:
atlas-streams-discover→list-connections+inspect-connectionfor each — verify names match targets, present summary to userCall
search-knowledgeto validate field names. Fetch relevant examples from https://github.com/mongodb/ASP_exampleatlas-streams-build→resource: "processor"(with DLQ configured)atlas-streams-manage→start-processor(warn about billing)
Workflow Patterns
Incremental pipeline development (recommended): See references/development-workflow.md for the full 5-phase lifecycle.
Start with basic
$source→$mergepipeline (validate connectivity)Add
$matchstages (validate filtering)Add
$addFields/$projecttransforms (validate reshaping)Add windowing or enrichment (validate aggregation logic)
Add error handling / DLQ configuration
Modify a processor pipeline:
atlas-streams-manage→action: "stop-processor"— processor MUST be stopped firstatlas-streams-manage→action: "modify-processor"— provide new pipelineatlas-streams-manage→action: "start-processor"— restart
Debug a failing processor:
atlas-streams-discover→diagnose-processor— one-shot health report. Always call this first.Commit to a specific root cause. Match symptoms to diagnostic patterns:
Error 419 + "no partitions found" → Kafka topic doesn't exist or is misspelled
State: FAILED + multiple restarts → connection-level error (bypasses DLQ), check connection config
State: STARTED + zero output + windowed pipeline → likely idle Kafka partitions blocking window closure; add
partitionIdleTimeoutto Kafka$source(e.g.,{"size": 30, "unit": "second"})State: STARTED + zero output + non-windowed → check if source has data; inspect Kafka offset lag
High memoryUsageBytes approaching tier limit → OOM risk; recommend higher tier
DLQ count increasing → per-document errors; use MongoDB
findon DLQ collection See references/output-diagnostics.md for the full pattern table.
Classify processor type before interpreting output volume (alert vs transformation vs filter).
Provide concrete, ordered fix steps specific to the diagnosed root cause. Do NOT present a list of hypothetical scenarios.
If detailed logs are needed, direct the user to the Atlas UI: Atlas → Stream Processing → Workspace → Processor → Logs tab.
Chained processors (multi-sink pattern)
CRITICAL: A single pipeline can only have ONE terminal sink ($merge or $emit). When users request multiple output destinations (e.g., "write to Atlas AND emit to Kafka"), you MUST acknowledge the single-sink constraint and propose chained processors using an intermediate destination. See references/pipeline-patterns.md for the full pattern with examples.
Pre-Deploy & Post-Deploy Checklists
See references/development-workflow.md for the complete pre-deploy quality checklist (connection validation, pipeline validation) and post-deploy verification workflow.
Tier Sizing & Performance
See references/sizing-and-parallelism.md for tier specifications, parallelism formulas, complexity scoring, and performance optimization strategies.
Troubleshooting
See references/development-workflow.md for the complete troubleshooting table covering processor failures, API errors, configuration issues, and performance problems.
Billing & Cost
Atlas Stream Processing has no free tier. All deployed processors incur continuous charges while running.
Charges are per-hour, calculated per-second, only while the processor is running
stop-processorstops billing; stopped processors retain state for 45 days at no chargeFor prototyping without billing: Use
sp.process()in mongosh — runs pipelines ephemerally without deploying a processorSee
references/sizing-and-parallelism.mdfor tier pricing and cost optimization strategies
Safety Rules
atlas-streams-teardownandatlas-streams-managerequire user confirmation — do not bypassBEFORE calling
atlas-streams-teardownfor a workspace, you MUST first inspect the workspace withatlas-streams-discoverto count connections and processors, then present this information to the user before requesting confirmationBEFORE creating any processor, you MUST validate all connections per the "Pre-Deployment Validation" section in references/development-workflow.md
Deleting a workspace removes ALL connections and processors permanently
After stopping a processor, state is preserved 45 days — then checkpoints are discarded
resumeFromCheckpoint: falsedrops all window state — warn user firstMoving processors between workspaces is not supported (must recreate)
Dry-run / simulation is not supported — explain what you would do and ask for confirmation
Always warn users about billing before starting processors
Store API authentication credentials in connection settings, never hardcode in processor pipelines
Reference Files
| File | Read when... |
|---|---|
references/pipeline-patterns.md | Building or modifying processor pipelines |
references/connection-configs.md | Creating connections (type-specific schemas) |
references/development-workflow.md | Following lifecycle management or debugging decision trees |
references/output-diagnostics.md | Processor output is unexpected (zero, low, or wrong) |
references/sizing-and-parallelism.md | Choosing tiers, tuning parallelism, or optimizing cost |
Files
- ATTRIBUTION.mdAdded by AutoGineer865 B
- LICENSELicence file added by AutoGineer11.1 KiB
- SKILL.md19.4 KiB
- references/connection-configs.md12.8 KiB
- references/development-workflow.md15.0 KiB
- references/mcp-troubleshooting.md1.8 KiB
- references/output-diagnostics.md6.6 KiB
- references/pipeline-patterns.md16.1 KiB
- references/sizing-and-parallelism.md6.1 KiB
references/development-workflow.md
Development Workflow Reference
Pipeline Stage Categories
Understanding stage categories helps compose valid pipelines. Stages must appear in this order:
| Category | Stages | Rules |
|---|---|---|
| Source (1, required) | $source | Must be first. One per pipeline. |
| Stateless Processing | $match, $project, $addFields, $unset, $unwind, $replaceRoot, $redact | Can appear anywhere after source. No state or memory overhead. |
| Enrichment | $lookup, $https | I/O-bound. Use parallelism setting. Place $https after windows to batch. |
| Stateful/Window | $tumblingWindow, $hoppingWindow, $sessionWindow | Accumulates state in memory. Monitor memoryUsageBytes. |
| Validation | $validate | Schema enforcement. Use validationAction: "dlq" (not "error"). Place early to catch bad data. |
| Custom Code | $function | JavaScript UDFs. Requires SP30+. |
| Output (1+, required for deployed) | $merge, $emit | Must be last. Required for persistent processors. Sinkless = ephemeral only. |
Key ordering principle: Place $match as early as possible (reduces volume for all downstream stages). Place $project after $match (reduces document size). Place $https after windows (batches API calls).
5-Phase Development Lifecycle
Phase 1: Project Setup
Goal: Workspace and connections ready.
Discover existing resources:
atlas-streams-discover→list-workspaces— see what already existsIf workspace exists,
inspect-workspaceto review config
Create workspace (if needed):
atlas-streams-build→resource: "workspace"Choose region close to your data sources
Start with
tier: "SP10"for developmentincludeSampleData: true(default) gives yousample_stream_solarfor testing
Verify workspace:
atlas-streams-discover→inspect-workspace— confirm state and region
Phase 2: Connection Development
Goal: All data sources and sinks connected and verified.
Identify required connections:
Source connections (Kafka, Cluster change streams, Kinesis, Sample)
Sink connections (Cluster for
$merge, Kafka for$emit, S3, Kinesis)Enrichment connections (Https for
$https, Cluster for$lookup)
Create each connection:
atlas-streams-build→resource: "connection"for eachLet the tool elicit missing sensitive fields (passwords, bootstrap servers)
See connection-configs.md for type-specific schemas
Verify connections:
atlas-streams-discover→list-connections— confirm all createdatlas-streams-discover→inspect-connectionfor each — verify state and config
Phase 3: Processor Development
Goal: Working processor with validated pipeline.
Pre-Deployment Connection Validation (MANDATORY)
BEFORE creating any processor, you MUST validate all connections referenced in your pipeline. This prevents silent failures and confusion about data destinations.
Step 1: List all connections in workspace
atlas-streams-discover → action: "list-connections", workspaceName: "<your-workspace>"Verify all required connections exist.
Step 2: Inspect EACH connection referenced in pipeline
For EVERY connectionName in your pipeline (source, sink, enrichment), inspect it:
atlas-streams-discover → action: "inspect-connection",
workspaceName: "<your-workspace>",
resourceName: "<connection-name>"Verify for each connection:
[ ] Connection exists and state is READY
[ ] Connection type matches intended usage:
Cluster: valid for
$source(change streams),$merge,$lookupKafka: valid for
$source,$emitS3: valid for
$emitonlyHttps: valid for
$httpsenrichment or sinkLambda: valid for
$externalFunctiononly
[ ] Connection name matches actual target (avoid confusion):
⚠️ BAD: connection "atlascluster" → actual target "ClusterRestoreTest"
✅ GOOD: connection "cluster-restore-test" → actual target "ClusterRestoreTest"
[ ] For Cluster connections: verify the
clusterNamefield points to the intended cluster
Step 3: Present validation summary to user
Always show the user what connections will be used:
"Before creating processor '<name>', I've verified your connections:
- ✅ sample_stream_solar → Sample data (READY)
- ⚠️ atlascluster → ClusterRestoreTest (READY)
Warning: Connection name 'atlascluster' doesn't match actual cluster 'ClusterRestoreTest'
- ✅ open-meteo-api → https://api.open-meteo.com/v1/... (READY)
Proceed with processor creation?"Step 4: Wait for user confirmation if warnings exist
If any connection name doesn't match its target, ask the user to confirm before proceeding.
Step 5: Only then create the processor
This validation workflow prevents:
Creating processors with non-existent connections (fails immediately)
Writing data to unexpected clusters (e.g., "atlascluster" → "ClusterRestoreTest" instead of "AtlasCluster")
Confusion when verifying output data later
Incremental Pipeline Development
Follow incremental pipeline development — test at each step:
Step 1: Basic connectivity
[
{"$source": {"connectionName": "my-source"}},
{"$merge": {"into": {"connectionName": "my-sink", "db": "test", "coll": "step1"}}}
]Create with autoStart: true. Verify documents flow. Stop processor.
Step 2: Add filtering
[
{"$source": {"connectionName": "my-source"}},
{"$match": {"status": "active"}},
{"$merge": {"into": {"connectionName": "my-sink", "db": "test", "coll": "step2"}}}
]Modify pipeline (stop → modify-processor → start). Verify filtered output.
Step 3: Add transformations
[
{"$source": {"connectionName": "my-source"}},
{"$match": {"status": "active"}},
{"$addFields": {"processed_at": "$$NOW_NOT_VALID"}},
{"$project": {"userId": 1, "amount": 1, "processed_at": 1}},
{"$merge": {"into": {"connectionName": "my-sink", "db": "test", "coll": "step3"}}}
]Remember: $$NOW is NOT valid in streaming. Use a field from the source document or omit.
Step 4: Add windowing or enrichment (if needed)
Step 5: Add error handling
Configure DLQ:
{"dlq": {"connectionName": "my-sink", "db": "streams_dlq", "coll": "failed_docs"}}Add
$ifNullfor optional enrichment fieldsSet
onError: "dlq"on$httpsstages
Phase 4: Testing & Validation
Goal: Processor verified working correctly.
Confirm processor state:
atlas-streams-discover→inspect-processor— state should be STARTED
Run diagnostics:
atlas-streams-discover→diagnose-processor— full health report
Verify data flow:
Use MongoDB
counttool on output collection — documents arriving?Use MongoDB
findtool on output collection — data looks correct?Use MongoDB
counttool on DLQ collection — any errors?If DLQ has documents, use MongoDB
findtool to inspect failure reasons
Classify output volume:
See output-diagnostics.md for the full decision framework
Alert processors: low output is expected
Transformation processors: low output is a red flag
Phase 5: Production Deployment
Goal: Processor running at appropriate tier with monitoring.
Right-size the tier:
See sizing-and-parallelism.md for tier selection
Review
memoryUsageBytesfrom diagnosticsConsider parallelism needs for
$merge,$lookup,$httpsUpgrade tier:
atlas-streams-manage→stop-processor, thenstart-processorwithtieroverride
Ensure DLQ is configured (mandatory for production)
Use descriptive processor names (e.g.,
fraud-detector,order-enricher,iot-rollup)
Debugging Decision Trees
Connection Failures
atlas-streams-discover→inspect-connection— check stateIf Kafka: verify
bootstrapServersis a comma-separated string (not array)If Cluster: verify cluster exists in project (
atlas-list-clusters)If AWS (S3/Kinesis/Lambda): verify IAM role ARN is registered in Cloud Provider Access
If Https: verify URL is reachable and auth headers are in connection config
Processor Startup Failures
atlas-streams-discover→diagnose-processor— check state and errorsIf FAILED: read the error message in diagnostics
Common causes:
Invalid pipeline syntax (missing
$source, missing sink)$$NOW/$$ROOT/$$CURRENTused (not valid in streaming)Kafka
$sourcemissingtopicfieldReferenced connection doesn't exist — validate with
list-connectionsfirstConnection name doesn't match expected target — inspect connection to verify actual cluster/resource
OOM — tier too small for pipeline complexity
Processing Errors (Running but DLQ filling up)
Use MongoDB
findtool on DLQ collection — inspect error messagesCommon causes:
Schema mismatches in source data
$httpsenrichment failures (API down, auth expired)Type errors in
$addFieldsor$projectexpressions
Fix:
stop-processor→modify-processor(fix pipeline) →start-processor
Performance Issues (Running but slow)
atlas-streams-discover→diagnose-processor— check statsCheck
memoryUsageBytes— if near 80% of tier RAM, upgrade tierCheck if
$matchis early in pipeline (reduces downstream volume)Check if
$httpshasparallelismsetting (increase for I/O-bound enrichment)Check if windows have
partitionIdleTimeout(idle Kafka partitions block windows)Consider upgrading tier or increasing stage parallelism
Operational Monitoring Cadence
Daily
Check processor states via
atlas-streams-discover→list-processorsVerify DLQ collections aren't growing via MongoDB
counttoolConfirm output collections are receiving data
Weekly
Run
diagnose-processorfor each production processorReview
memoryUsageBytestrends — approaching 80%?Check connection health across all connections
Monthly
Evaluate tier appropriateness — over-provisioned or under-provisioned?
Review DLQ patterns — recurring errors that need pipeline fixes?
Consider parallelism adjustments based on throughput trends
Troubleshooting
| Symptom | Likely cause | Action |
|---|---|---|
| Processor FAILED on start | Invalid pipeline syntax, missing connection, $$NOW used | diagnose-processor → read error → fix pipeline |
| DLQ filling up | Schema mismatch, $https failures, type errors | find on DLQ → fix pipeline or connection |
| Zero output (transformation) | Connection issue, wrong topic, filter too strict | Check source health → verify connections → check $match |
| Zero output (alert) | Probably normal — no anomalies detected | Verify with known test event |
| Windows not closing | Idle Kafka partitions | Add partitionIdleTimeout to $source (e.g., {"size": 30, "unit": "second"}) |
| OOM / processor crash | Tier too small for window state | diagnose-processor → check memoryUsageBytes → upgrade tier |
| Slow throughput | Low parallelism on I/O stages | Increase parallelism on $merge/$lookup/$https |
| 404 on workspace | Doesn't exist or misspelled | discover → list-workspaces |
| 409 on create | Name already exists | Inspect existing resource or pick new name |
| 402 error on start | No billing configured | Do NOT retry. Add payment method in Atlas → Billing. Use sp.process() in mongosh as free alternative |
| "processor must be stopped" | Tried to modify running processor | manage → stop-processor first |
| bootstrapServers format | Passed as array instead of string | Use comma-separated string: "broker1:9092,broker2:9092" |
| "must choose at least one role" | Cluster connection without dbRoleToExecute | Defaults to readWriteAnyDatabase — or specify custom role |
| "No cluster named X" | Cluster doesn't exist in project | atlas-list-clusters to verify |
| IAM role ARN not found | ARN not registered in project | Register via Atlas → Cloud Provider Access |
| dataProcessRegion format | Wrong region format | See region table above. If unsure, inspect an existing workspace |
| Processor PROVISIONING for minutes | Restart cycle with exponential backoff | Wait for FAILED state, or stop → restart. Check logs for repeated error |
| Parallelism exceeded | Tier too small for requested parallelism | Start with higher tier (see sizing-and-parallelism.md) |
| Networking change needed | Networking is immutable after creation | Delete connection and recreate with new networking config |
| 401 / 403 on API call | Invalid or expired Atlas API credentials | Verify apiClientId/apiClientSecret and project-level permissions |
| 429 rate limit | Too many API calls | Wait and retry; avoid tight loops of discover calls |
Pre-Deploy Quality Checklist
Before creating a processor, verify:
Connection Validation (MANDATORY - Always do this first)
[ ] CRITICAL: Call
atlas-streams-discover→action: "list-connections"to list all connections in workspace[ ] CRITICAL: Call
atlas-streams-discover→action: "inspect-connection"for EACH connection referenced in pipeline[ ] CRITICAL: Verify connection names clearly indicate their actual targets (avoid generic names like "atlascluster" pointing to "ClusterRestoreTest")
[ ] CRITICAL: Present connection summary to user: "Connection 'X' → Actual target 'Y'" for each connection
[ ] CRITICAL: Warn user if connection names don't match their targets and ask for confirmation
[ ] All connections are in READY state
[ ] Connection types match usage (Cluster for $source/$merge, Kafka for topics, etc.)
Pipeline Validation
[ ]
search-knowledgewas called to validate sink/source field names[ ] Pipeline starts with
$sourceand ends with$merge,$emit,$https, or$externalFunction(async)[ ] No
$$NOW,$$ROOT, or$$CURRENTin the pipeline[ ] Kafka
$sourceincludes atopicfield[ ] Kafka
$sourcewith windowed pipeline includespartitionIdleTimeout(prevents windows from stalling on idle partitions)[ ] HTTPS connections are only used in
$httpsenrichment or sink stages, not in$source[ ] DLQ is configured (recommended for production)
[ ]
$httpsstages useonError: "dlq"(not"fail")[ ]
$externalFunctionstages useonError: "dlq"andexecutionis explicitly set[ ] API auth is stored in connection settings, not hardcoded in the pipeline
Post-Deploy Verification Workflow
After creating and starting a processor:
atlas-streams-discover→action: "inspect-processor"— confirm state is STARTEDatlas-streams-discover→action: "diagnose-processor"— check for errors in the health reportUse MongoDB
counttool on the DLQ collection — verify no errors accumulatingUse MongoDB
findtool on the output collection — verify documents are arrivingIf output is low/zero, classify processor type before assuming a problem (see Debug section)
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- MongoDB
- Publisher
- MongoDB (Official)
- Source
- mongodb/agent-skills · skills/mongodb-atlas-stream-processing · commit 155bb9c
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Also distributed in
- mongodb/agent-skills, mongodb/agent-skills
AutoGineer is not affiliated with or endorsed by MongoDB.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download mongodb-atlas-stream-processing.zip