Product
Product12 min readBy The Data Workers Team

You're on OpenCode: give it governed data context and approved data changes

Your engineers already work in OpenCode with the model they chose. Add Data Workers to opencode.json and OpenCode answers from governed data context, while every data change goes through approvals and receipts.

Your engineers already work in OpenCode. They run opencode in the terminal, press Tab to switch between the Build agent and the Plan agent, and hand searches to subagents like Explore. They pick the model: a frontier model through their own API key, a local model, or your company's AI gateway. The project's opencode.json sits in Git next to AGENTS.md, so the whole team shares the same agents, MCP servers and permission rules, and your platform team can pin settings in managed config that nobody can override. OpenCode, the open-source coding agent from Anomaly (the team behind SST; the repository moved from sst/opencode to anomalyco/opencode), is good at the job it was built for: reading a repository, writing the change and running it, asking before the actions you mark. Data Workers is the agentic data platform that sits behind it. Connected over MCP, OpenCode answers from your governed data context, and every change to production data goes through Data Workers' approvals and leaves a receipt.

Key takeaways

  • •OpenCode is the coding agent. Data Workers is the data team it calls. OpenCode writes and runs the code with any model; Data Workers brings the context, owns the change in production and proves it worked.
  • •One file wires it in. Data Workers agents are local MCP servers in the mcp block of opencode.json, and OpenCode is one of the four clients Data Workers tests against.
  • •Two locks on every write. OpenCode's allow, ask and deny rules decide which Data Workers tools run without a prompt; Data Workers applies its per-domain guardrail, keeps a rollback point and writes the receipt.
  • •A data agent for data work. Define a data agent in opencode.json with read tools allowed and change tools on ask, and engineers Tab into it when the question is about data, not code.
  • •Nothing to migrate. OpenCode, your model provider, your repositories, Airbyte, Databricks, Dagster and Looker all stay. Data Workers works through each system's own API.

OpenCode is the coding agent. Data Workers is the data team it calls.

OpenCode reads your dbt project, your Dagster assets and your SQL, and writes the change you ask for. What it doesn't hold is the state of the estate: which table is canonical, when it last loaded, who owns it, what reads it downstream and who must approve a fix to sales data. That is what Data Workers holds. The Data Context Wizard keeps one governed context graph across ingestion, the lakehouse, orchestration and BI. The Data-Agents Swarm (20+ specialist agents) does the data work. The Autonomous Data-Conductor runs each fix end to end: detect, diagnose, fix, review, verify, remember. Spellbook Data Catalog (in preview) is where people review, approve, roll back and audit.

Here is one request, end to end. It is an illustration, not a customer case.

TimeSystemWhat happens
23:40HubSpotThe RevOps admin rotates the private-app token, as the security policy requires every quarter
00:15AirbyteThe scheduled hubspot_to_databricks sync fails authentication, exhausts its retries and pauses
00:15Databricksbronze.hubspot_deals stops at its 23:12 load
02:00DagsterThe deals_daily job succeeds on stale data; gold.pipeline_by_stage misses a day
08:20LookerThe pipeline dashboard shows zero new deals for yesterday
08:31OpenCodeAn analytics engineer presses Tab to the data agent and asks: "Why are yesterday's deals missing?"
08:32OpenCodeThe agent calls Data Workers over MCP (trace_cross_platform_lineage, diagnose_incident); read tools are allowed, so no prompt
08:33Data WorkersTraces the gap to the paused Airbyte connection; blast_radius_analysis finds 2 Dagster assets and 3 Looker tiles; diagnose_incident names the failed auth
08:40AirbyteData Workers routes the credential update to the RevOps admin, who owns the secret, and she updates the connection
08:44OpenCodeThe agent asks to run remediate with the backfill_data playbook; the engineer approves once
08:52SpellbookThe sales data owner approves the backfill, as the sales domain requires
08:55DatabricksData Workers starts the backfill of the missed window into bronze.hubspot_deals through the orchestrator, with the undo recorded first
09:20DagsterThe assets rematerialize; row counts match the Airbyte sync record; checks pass; receipt written
09:30LookerThe dashboard is right before the 10:00 pipeline review
Incident timeline across the stack: what OpenCode, your team and Data Workers each do, step by step

The engineer never left the terminal. OpenCode took the question, picked the tools, showed what it wanted to run and asked where the rules said to ask. Data Workers did the data work: it traced the stale table back through Dagster to the paused Airbyte connection, measured the blast radius into Looker, sent the secret to its owner, routed the backfill to the sales data owner, made the change reversibly and proved it with row counts. Meanwhile the Build agent can write the lasting fix, a freshness check on the Dagster asset, as a pull request your team reviews as usual.

What OpenCode doesWhat Data Workers does
Takes the question in the terminal, the desktop app or the IDE extension, with the model you choseAnswers it from governed context: freshness, lineage, ownership, definitions, recent changes
Reads and edits the repository with its Build agent; plans without edits in PlanWorks across Airbyte, Databricks, Dagster and Looker through each system's own API or MCP server
Applies allow, ask and deny rules per tool and per agentApplies per-domain guardrails and routes the change to the data owner
Writes the code fix and opens the pull requestOwns the production change, keeps a rollback point and verifies downstream
Lets you /undo file changes in the sessionWrites a receipt that outlives the session: who, why, what changed, how to undo it in the data

Why doesn't OpenCode just do this itself?

Focus and risk. Anomaly built OpenCode as an open, model-agnostic coding agent, and its design is right for that job. It runs where the engineer runs it, talks to whichever model provider you configure and, in its own words, does not store your code or context data. Its permission system decides whether each tool call runs, asks or is blocked, per tool and per agent, and admins can lock those rules in managed config. Every one of those controls is about the session: what this agent, in this project, on this machine, may do.

Changing production data is a different product. A backfill into bronze.hubspot_deals touches systems OpenCode doesn't run, owned by people outside the session, with downstream readers nobody in the repository can see. Doing it safely takes context about every other system, a blast radius, an approver per domain, a rollback plan, verification and a receipt an auditor can read next quarter, plus liability for changes in tools Anomaly doesn't own, across whatever model each engineer picked. A general coding agent is right not to take that on. That is the product Data Workers is, and OpenCode is a great place for your engineers to ask for it.

Every tool owns a slice. Data Workers covers the whole lifecycle

Each point tool adds another console, another contract and another handoff. Data Workers covers the whole data lifecycle with one context, one approval flow and one audit trail. OpenCode owns a valuable slice of it: writing and running code with any model. It leads where that is the work: pipeline code.

Spider chart of ten jobs a data team does: Data Workers covers the whole list, OpenCode goes deep on its own area
StageData WorkersOpenCodeWhy we scored it this way
Catalog & Context94OpenCode reads the repository, AGENTS.md and LSP context; it doesn't keep a catalog. Data Workers keeps one governed context graph across warehouses, dbt, orchestration and BI.
Analytics & Insights85OpenCode explains code and query results in the session. Data Workers answers business questions from governed definitions, lineage and ownership.
Data Quality85OpenCode writes dbt tests and SQL checks when you ask. Data Workers writes, runs and repairs checks across platforms and keeps them running.
Observability & Incidents8.53OpenCode debugs the error in front of it; it doesn't watch production. Data Workers detects, traces and closes incidents across systems with a receipt.
Pipelines & Ingestion8.59OpenCode leads. Its Build agent writes pipeline code, dbt models and Dagster assets with any model, runs them in the terminal and can open the pull request. Data Workers owns the run in production behind approval.
Schema & Migration86OpenCode writes migrations and refactors well. Data Workers checks the blast radius across every downstream system before a schema change lands.
Governance & Access8.53OpenCode governs OpenCode: allow, ask and deny rules per tool and per agent, plus admin-managed config. Data Workers proposes least-privilege grants on your data platforms behind approvals.
Security & Privacy85OpenCode stores no code or context data, guards .env reads by default and runs on the model gateway you choose. Data Workers flags sensitive column names in pull request review across the estate.
Cost / FinOps82OpenCode doesn't work on your warehouse bill. Data Workers traces Snowflake credits to the dbt model behind them and drafts the fix for its owner.
MLOps & Models7.55OpenCode writes training, feature and evaluation code when you ask; its docs describe no model registry, serving or drift monitoring. Data Workers keeps the features and training data under every model healthy and traced.

How OpenCode and Data Workers work together

OpenCode stays on top, where engineers ask, plan, build and approve. Data Workers sits underneath as MCP servers: the Context Wizard, the Swarm, the Conductor and the guardrails. Spellbook is where people look: data owners review and approve changes, roll them back and read the audit trail.

How Data Workers fits with OpenCode: your coding agent on top, Data Workers in the middle, your estate underneath

Setup over MCP today. Every Data Workers agent is a standard MCP stdio server. Following the client setup docs, clone the repository and add the agents you need to the mcp block of opencode.json; in OpenCode's format, command is one array rather than a command plus args. OpenCode names each MCP tool <server>_<tool>, so remediate on the dw-incidents server is dw-incidents_remediate, and permission rules can target a whole server (dw-incidents_*) or a single tool. Example, in the OpenCode 1.x config format (opencode-ai 1.18.34, Sep 30, 2026):

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "dw-context-catalog": {
      "type": "local",
      "command": ["/path/to/dataworkers-claw-community/start-agent.sh", "dw-context-catalog"],
      "enabled": true,
      "timeout": 20000
    },
    "dw-incidents": {
      "type": "local",
      "command": ["/path/to/dataworkers-claw-community/start-agent.sh", "dw-incidents"],
      "enabled": true,
      "timeout": 20000
    }
  },
  "permission": {
    "dw-*": "ask"
  },
  "agent": {
    "data": {
      "description": "Data questions and data changes through Data Workers",
      "mode": "primary",
      "permission": {
        "edit": "ask",
        "dw-context-catalog_trace_cross_platform_lineage": "allow",
        "dw-context-catalog_blast_radius_analysis": "allow",
        "dw-incidents_diagnose_incident": "allow"
      }
    }
  }
}

Read it from the top. Every Data Workers tool asks by default in every agent, including Build and Plan. The data agent allows three read tools by name (trace_cross_platform_lineage, blast_radius_analysis and diagnose_incident) and still asks before remediate or any tool that changes something. Name read tools one by one rather than allowing a whole server, because a server like dw-context-catalog also carries tools that write. When the prompt appears, the engineer can approve once, approve for the rest of the session or reject. Keep remediate on approve once: Data Workers adds its own per-domain approval on top either way.

On OpenCode v2 (the @opencode/cli package, first released Sep 11, 2026), the same setup takes a new shape: servers go under mcp.servers, agents under agents, and rules become an ordered permissions list of action, resource and effect, where the last match wins. Tool names keep the <server>_<tool> form, so a rule like action dw-incidents_remediate, resource *, effect ask carries straight over.

Where the config lives is a rollout choice. A project opencode.json in Git gives everyone in the dbt repository the same agent and rules; a global ~/.config/opencode/opencode.json covers one engineer across projects. For a rule nobody can loosen, your platform team puts the Data Workers entries and dw-* permissions in managed config (/etc/opencode/ on Linux, /Library/Application Support/opencode/ on macOS, or an MDM profile), which OpenCode loads at the highest priority. For a shared Data Workers deployment, OpenCode also connects to remote MCP servers by url, with headers or OAuth through opencode mcp auth. The Data Workers on OpenCode page covers the open-source agents on OpenCode, and Data Workers + Claude Code, Cursor and Codex covers the same wiring in other coding agents.

The same request on the autonomy ladder. Autonomy is set per domain, on the ladder L0 manual, L1 observe, L2 propose, L3 act reversibly, L4 autonomous.

The autonomy ladder: L0 manual, L1 observe, L2 propose, L3 act reversibly, L4 autonomous
  • •L0 manual. The engineer queries Databricks by hand and reads Airbyte and Dagster logs. OpenCode helps with the SQL; nobody has the lineage.
  • •L1 observe. The data agent calls Data Workers and gets the stale table, the paused connection, the blast radius and the owners. Nothing changes.
  • •L2 propose. Data Workers drafts the backfill with its blast radius and rollback plan. The sales owner approves in Spellbook; OpenCode asks the engineer before the tool call.
  • •L3 act reversibly. For a domain you trust, Data Workers backfills missed sync windows on its own with the undo recorded first and writes the receipt. The engineer reads it in OpenCode.
  • •L4 autonomous. The Conductor sees bronze.hubspot_deals go stale at 00:15, before Dagster runs, routes the credential to its owner, backfills once the connection is healthy and verifies it. An engineer reads the receipt in OpenCode the next morning.

OpenCode permissions and Data Workers guardrails stack. Turning one up never turns the other down, and an explicit deny in OpenCode holds even when an engineer starts a session with --auto.

What changes for your team

Engineers keep the agent and the model they already use. What changes is the work behind it: jobs that waited for a person with the right access and context now run through Data Workers, at the autonomy level each domain sets.

Six jobs that run on autopilot with Data Workers next to OpenCode, with a concrete example of each

Data owners stop being pinged in Slack for "is this table fresh?" and start approving scoped changes in Spellbook. On-call stops starting from zero, because the first question typed into OpenCode already returns the cause and the blast radius. The platform team stops hand-rolling MCP setups per team: one opencode.json pattern in Git or managed config, one set of permission rules, one audit trail.

Keep OpenCode, or consolidate?

Keep OpenCode if you love it; Data Workers works with it from day one. Many teams consolidate once Data Workers runs that slice too. With a coding agent, keeping it is the usual answer: OpenCode is where your engineers write code with the model they trust, and Data Workers governs every data question and data change they send from it. The same Data Workers servers also answer in Claude, Codex and Gemini CLI, so teams that use more than one agent share one context and one audit trail. For the whole category, see Your company just rolled out AI assistants. Now what?.

The case for your CFO

Your engineers chose OpenCode and already use it on data work. The outcome to buy is governed answers to their questions and safe execution of the changes they ask for: fewer wrong numbers reaching leadership, incidents closed the same morning, and an audit trail for every change to production data, whichever model sits behind the terminal.

The risk story is plain. At L1, Data Workers reads and explains. At L2, it proposes and a named owner approves. At L3, it acts only where a change is reversible and keeps the rollback point. L4 is for domains you've trusted on evidence. Every action leaves a receipt: who asked, who approved, what changed, what it touched and how to undo it. OpenCode keeps its own allow, ask and deny rules, so every write has two locks. Nothing migrates. The cost model is on the ROI page; deployment and data handling are on the security page.

Why now: coding agents are already the front door for data work, and open-source agents put any model in that door. Every week without governed context means engineers guessing which table is fresh and production changes made with personal credentials and no receipt. The safety page covers what agents may do at each level, and the build-vs-buy page what it takes to wire this yourself.

The first win is small and visible: read-only Data Workers tools allowed in a data agent for one domain, so "why is this number wrong?" gets a traced answer. Start with a pilot; pricing has the details, and the pilot is credited in full against the first year.

The sentence to repeat upstairs: "Our engineers keep OpenCode and their model of choice; Data Workers gives it our governed data context and routes every data change through one approval flow with a receipt."

Getting started

Start with a pilot. Pick one domain where engineers already ask OpenCode about data, often sales or product analytics, add the Data Workers servers and a data agent to the project's opencode.json with read tools on allow and change tools on ask, and run it at L1 for the first weeks. Move that domain to L2 when the answers hold up, and to L3 for the fixes your team approves every time. See pricing; the pilot is credited in full against the first year.

FAQ

Does Data Workers bypass OpenCode's permission rules? No. OpenCode still decides whether each Data Workers tool runs, asks or is blocked, using the rules you set globally, per agent and in managed config. Explicit deny rules hold even in auto mode. Data Workers adds its own per-domain guardrail on top, so a change needs both.

Does it matter which model our engineers use in OpenCode? No. The model decides which tool to call; Data Workers decides what is true about your data and what a change is allowed to do. Context, approvals and receipts are the same whether the session runs on a frontier model, a local model or your internal AI gateway.

Can our admins make the Data Workers setup and rules mandatory? Yes. On OpenCode 1.x, put the mcp entries and the dw-* permission rules in the managed config directory or an MDM profile, which users and projects can't override; organizations can also publish default MCP servers through their .well-known/opencode endpoint. On v2, global and Console-managed policies can hard-deny a tool that a repository would allow.

Won't more tools crowd OpenCode's context? OpenCode's docs note that every MCP server adds to the context. Enable only the Data Workers agents a team needs, and use permission rules to keep a server's tools to the data agent. Many teams start with the context and incident agents and add more as domains move up the ladder.

Whose credentials touch Databricks? Data Workers' own credentials, scoped per domain, so no personal lakehouse tokens sit in a terminal. The engineer's identity is recorded on the receipt as the person who asked and approved, and secrets like the HubSpot token stay with the people who own them.

We could wire a Databricks MCP server into OpenCode ourselves. Why buy? You can connect a lakehouse. The hard parts are the context across systems, the blast radius, the approvals by domain, the rollback and the receipts. The build-vs-buy page walks through it.

Does OpenCode's /undo roll back a data change? /undo reverts file changes in the OpenCode session, which is the right scope for code. Data changes roll back through Data Workers: every change keeps a rollback point, and the receipt says how to undo it. Owners can do that from Spellbook.

Sources

  • •Anomaly, OpenCode docs, "Intro" (open-source AI coding agent; terminal, desktop app, IDE extension; Build and Plan; /undo; AGENTS.md): https://opencode.ai/docs/ (checked Oct 2, 2026)
  • •OpenCode homepage (any model, 75+ providers, privacy): https://opencode.ai/ (checked Oct 2, 2026)
  • •OpenCode docs, "MCP servers" (mcp key, local and remote, command array, timeout, OAuth and opencode mcp auth, .well-known/opencode defaults, tools registered with the server name as prefix, e.g. my-mcp_search; context caveat): https://opencode.ai/docs/mcp-servers/ (checked Oct 2, 2026)
  • •OpenCode docs, "Permissions" (allow, ask, deny; once, always, reject; --auto keeps explicit deny; defaults): https://opencode.ai/docs/permissions/ (checked Oct 2, 2026)
  • •OpenCode docs, "Agents" (primary agents and subagents; per-agent permissions; permission keys match MCP tool names): https://opencode.ai/docs/agents/ (checked Oct 2, 2026)
  • •OpenCode docs, "Config" (precedence, managed config files, macOS managed preferences via MDM): https://opencode.ai/docs/config/ (checked Oct 2, 2026)
  • •OpenCode docs, "Enterprise" (does not store code or context data; share setting; central config with SSO and AI gateway): https://opencode.ai/docs/enterprise/ (checked Oct 2, 2026)
  • •OpenCode docs, "IDE": https://opencode.ai/docs/ide/ (checked Oct 2, 2026)
  • •OpenCode changelog (v1.18.31 to v1.18.34, Sep 14 to Sep 30, 2026): https://opencode.ai/changelog (checked Oct 2, 2026)
  • •OpenCode v2 docs, "MCP servers" and "Permissions" (mcp.servers, <server>_<tool> names, ordered permissions rules, policies): https://opencode.ai/v2/docs/mcp-servers and https://opencode.ai/v2/docs/permissions (checked Oct 2, 2026)
  • •npm, @opencode/cli (v2; 2.0.0 published Sep 11, 2026, 2.0.22 on Oct 2, 2026) and opencode-ai (1.18.34): https://www.npmjs.com/package/@opencode/cli (checked Oct 2, 2026)
  • •OpenCode repository (MIT; moved from sst/opencode): https://github.com/anomalyco/opencode (checked Oct 2, 2026)
  • •Data Workers, "Client Setup" (OpenCode is a tested client; mcp key; command array; agents start as MCP stdio servers via start-agent.sh): https://dataworkers.io/opensource-docs/client-setup/ (checked Oct 2, 2026)
  • •Data Workers, "Data Workers on OpenCode": https://dataworkers.io/on/opencode/ (checked Oct 2, 2026)
  • •Data Workers open-source repository (tool definitions diagnose_incident and remediate in agents/dw-incidents; trace_cross_platform_lineage and blast_radius_analysis in agents/dw-context-catalog; start-agent.sh): https://github.com/DataWorkersProject/dataworkers-claw-community (checked Oct 2, 2026)