# Dough Docs > Dough exposes typed tools over MCP for data lake integrations and organization files. This file is generated from the same docs registry as the Dough UI. Tool schemas from `tools.describe` remain the source of truth for exact inputs. ## Entry Points - MCP server: https://app.usedough.ai/api/mcp - OAuth protected resource metadata: https://app.usedough.ai/.well-known/oauth-protected-resource/api/mcp - Human docs: https://app.usedough.com/docs - LLM docs: https://app.usedough.com/llms.txt ## Pages - [Dough Docs](https://app.usedough.com/docs): Use Dough from AI clients through MCP, typed tools, data lake tables, and the team filesystem. - [Install Dough](https://app.usedough.com/docs/install): One command installs the dough CLI, its dependencies, the Dough plugin, and signs you in. - [Dough CLI](https://app.usedough.com/docs/dough-cli): Log in, run and update agents, and publish your own agents and skills from the terminal. ## Dough Docs Use Dough from AI clients through MCP, typed tools, data lake tables, and the team filesystem. Related: [Install Dough](https://app.usedough.com/docs/install), [Dough CLI](https://app.usedough.com/docs/dough-cli) ### What Dough exposes Dough publishes one typed tool registry across the web app, MCP clients, the local CLI, and sandboxed TypeScript. Agents can discover tools, inspect schemas, and compose finance workflows without a transport-specific action schema. The core surfaces are data lake tables read through `integrations.*`, and a DB-backed team filesystem. All organization-scoped tools default to the current WorkOS organization when one is available, and to `default` in local development. - Connect AI clients through `/api/mcp` using Streamable HTTP and OAuth. - Discover tools with `tools.list` and inspect one tool at a time with `tools.describe`. - Read synced source data through `integrations.*`, and work with organization files through `files.*` and `unix.*`. - Use `/llms.txt` for an LLM-readable version of these docs. ### LLM-readable docs `/llms.txt` renders the same docs registry as plain text. Point coding agents, custom GPT instructions, or MCP client context loaders at that URL when they need a compact reference without scraping the UI. - Open llms.txt: https://app.usedough.com/llms.txt ## Install Dough One command installs the dough CLI, its dependencies, the Dough plugin, and signs you in. Related: [Dough CLI](https://app.usedough.com/docs/dough-cli) ### Install on macOS Open Terminal and run the one command below. On macOS this is the whole setup, not just the CLI: it also installs the dependencies Claude Code needs, installs the Dough plugin, and signs you in. - Makes sure **python3** and **git** are usable. The CLI binary itself needs no runtime, but the hooks it registers in Claude Code are Python, so a machine without it runs a broken hook in every session. On macOS both tools come from Apple's Command Line Tools, so if those are missing the installer opens Apple's installer and waits for it to finish. - Detects your chip (Apple Silicon or Intel), downloads the matching binary to `/usr/local/bin/dough` — or `~/.local/bin/dough` if the former is not writable, which is the normal case on a stock Mac — and checks it runs. - Adds that folder to your `PATH` in your shell profile if it is not already there, choosing the file your login shell actually reads. `DOUGH_SKIP_PROFILE=1` opts out. - Registers the Claude Code hooks and verifies they landed, then installs the Dough plugin and signs you in (skipped if you already have a session). - Safe to re-run: every step checks before it acts, so the same command installs, repairs, and updates. It stops at the first thing it cannot fix and prints what to do. - **When it finishes, fully quit Claude Code and reopen it.** Closing the window is not enough — use Cmd+Q, or right-click the Dock icon and Quit. Claude Code reads the plugin and hooks at startup. - **Open a new terminal before using the `dough` command.** `curl | sh` runs in its own shell and cannot change the `PATH` of the window you started it from. ```shell curl -fsSL https://raw.githubusercontent.com/Dough-AI/dough-installer/main/install.sh | sh ``` ### Install on Windows Open PowerShell (or Windows Terminal) and run the one command below. On Windows this is the whole setup, not just the CLI: it also installs the dependencies Claude Code needs, installs the Dough plugin, and signs you in. - Installs **Python 3** if `python` is not already a working interpreter. The CLI binary itself needs no runtime, but the hooks it registers in Claude Code are Python, so a machine without it runs a broken hook in every session. - Installs **Git for Windows** if `bash.exe` is missing. The Claude Code desktop app refuses local sessions without its Git Bash, and `git` being on `PATH` does not imply it — a minimal git passes `git --version` and leaves the app blocked. - Downloads `dough.exe` to `%LOCALAPPDATA%\dough\bin`, adds that folder to your user `PATH`, and checks it runs. Usable right away in the same window; new terminals pick it up automatically. - Registers the Claude Code hooks and verifies they landed, then installs the Dough plugin. - Points Claude Code at Git Bash by setting `CLAUDE_CODE_GIT_BASH_PATH`, so the app does not refuse local sessions on a machine that has Git installed. Then signs you in (skipped if you already have a session). - Safe to re-run: every step checks before it acts, so the same command installs, repairs, and updates. It stops at the first thing it cannot fix and prints what to do. - **When it finishes, fully quit Claude Code and reopen it.** Closing the window is not enough — use Alt+F4 or quit from the system tray. Claude Code reads the plugin and hooks at startup. - The binary is currently unsigned, so the first run may show a SmartScreen prompt — choose More info, then Run anyway. ```shell irm https://raw.githubusercontent.com/Dough-AI/dough-installer/main/install.ps1 | iex ``` ## Dough CLI Log in, run and update agents, and publish your own agents and skills from the terminal. Related: [Install Dough](https://app.usedough.com/docs/install) ### Overview The `dough` CLI publishes and installs Dough agents from your terminal. It is a single self-contained binary — no Node, Python, or other runtime required. Agents are versioned bundles: an `agent.yaml` manifest plus skills, instructions, and supporting files. Publishing uploads a new version to your organization's registry; installing downloads a bundle into a local folder. The CLI is self-describing — run `dough --help` for the command map, and `dough agent --help` or `dough skill --help` for the full subcommands, flags, and notes. This makes it easy for coding agents like Claude Code to discover the right command on demand. ### Update the CLI Re-run the installer for your platform — it always fetches the latest release, so install, reinstall, and update are the same command. Check your current version with `dough --version`. - If a command fails with an out-of-date message (HTTP 426), the server is rejecting your CLI version — re-run the installer, then retry. The CLI prints the reinstall command automatically on a 426. ```shell curl -fsSL https://raw.githubusercontent.com/Dough-AI/dough-installer/main/install.sh | sh ``` ```shell irm https://raw.githubusercontent.com/Dough-AI/dough-installer/main/install.ps1 | iex ``` ### Log in Authenticate before using the registry. `dough login` opens your browser to complete SSO and saves the session locally. It defaults to https://app.usedough.ai; pass `--url` to target another deployment. - `dough status` verifies the saved session with Dough and prints its email and organization id, so you can compare it with the orgId shown by proposal tools. - `dough evidence upload` prints that same organization id beside the evidence id; evidence cannot be consumed by an MCP session authenticated to another organization. - `dough logout` clears the saved session. ```shell dough login ``` ```shell dough status ``` ```shell dough logout ``` ### Run and update agents Browse the agents published in your organization, then open one. `run` fetches the agent and starts a Claude Code session already inside it — being in that directory is what loads the agent's instructions and skills, and what lets its scripts reach their credentials. - Without `--version`, both fetch the latest published version. - `sync ` fetches the files without opening a session, and prints the path. It also removes files the new version dropped, leaving anything you created untouched. - Both overwrite the agent directory whether or not it already exists, so there is no separate install or upgrade step. ```shell dough agent list ``` ```shell dough agent run [--version X.Y.Z] ``` ```shell dough agent sync [--version X.Y.Z] ``` ### Write query results to CSV Use `dough query run` when an agent or build script needs a large governed Data Lake result on disk. The command uses the organization from `dough login`, follows every result cursor itself, and writes rows straight to the output file instead of sending them through an agent's context. Prefer `--saved` for recurring work. The saved query is fetched again on every run, so an updated organization definition takes effect without copying SQL into an agent folder. Every parameter declared by a saved query must be supplied explicitly as `--param name=value`; missing or undeclared parameters fail before the query runs. - `--sql` and `--sql-file` are available for ad-hoc work. Their named parameters are passed through, but the CLI has no saved declaration to check for missing names; the governed query tool still rejects invalid or non-read-only SQL. - `dough query get --saved ` prints a saved query's SQL, its declared parameters and a `sha256` of the two, without running it. The hash changes only when the SQL or a parameter's name, type or default changes, so a script can record it and notice later that the query was edited. - Rows go only to `--out`. Progress and the final row and byte counts go to stderr, so stdout never fills with query data. - The output is replaced only after every page succeeds. A query, paging, or file error exits non-zero without leaving a partial CSV behind. ```shell dough query run --saved --param period=2026-01 --out balance_activity.csv ``` ```shell dough query run --sql-file tieout.sql --param period=2026-01 --out tieout.csv ``` ```shell dough query get --saved --json ``` ### Publish an agent Run `publish` pointing at a bundle directory that contains an `agent.yaml`. The CLI packs the folder and uploads it; the server assigns the next patch version. On a **first** publish there is usually no `agent.yaml` or `skill.yaml` yet. Rather than failing on the missing file, `publish` writes one from the markdown that is already there — `CLAUDE.md` for an agent, `SKILL.md` for a skill — and stops so you can read it before anything is sent. A first publish fixes the `name` and the `owner` permanently, and an agent still needs its `examples` written by hand. - `agent.yaml` requires `name`, `version` (semver `x.y.z`), `owner` (your email), `description`, and a non-empty `examples` list of prompt strings. - Each skill in `.claude/skills//` carries a `skill.yaml`; on publish the CLI resolves every skill to a published version and writes a lock, so the agent pins exact skill versions instead of vendoring files. Publish a skill first if it has unpublished changes (see below). - The first publish uses the version in `agent.yaml`; every later publish gets the next patch version, assigned by the server and written back to `agent.yaml`. `publish` takes no `--version` — it is derived, not chosen. - Publishing is refused when the version in your yaml is not the registry's latest, because that means someone published while your copy sat here and publishing now would drop their work. Run `dough agent sync ` (or `dough skill sync `) first — but read the warning it prints: sync is destructive, and what it destroys differs between agents and skills. - A published version can never be replaced, and can never go backwards: the server rejects any version that is not strictly greater than the current latest. - Published versions are immutable — you cannot overwrite a version that already exists. - Only the owner can publish. The first publish must declare you (the `agent.yaml` owner must match your logged-in account), and only that owner can publish later versions. - `dough agent draft ` pushes a **draft** instead of publishing. Any org member can push one (the agent must already have a published version, and your `agent.yaml` version must be the current head). A draft gets its own version number, is never deleted, and never becomes what `sync ` or `run ` resolve — fetch one with `dough agent sync --draft` (the head) or `--version `. Attach an evaluation report with `--report ` or `dough agent report @ `. - The owner promotes the head draft with `dough agent publish @`, adding `--release-notes ""` for what version history shows (or the Publish box on the agent page); the owner can edit them later on the version page. Older open drafts are archived as superseded. To publish an older draft, archive the ones above it first with `dough agent archive @` (the owner or the draft's author can archive). `dough agent info ` lists versions, drafts, the head, and the report summary; `dough agent list` shows `head ( drafts)`. - While drafts are open, a direct `dough agent publish ` is refused — publish or archive the drafts first. The owner can send a draft back with `dough agent review request-changes --note "..."` (the `--note` is required and is what the author sees); the author pushes a new draft on top. ```shell dough agent publish ``` ```shell dough agent draft ``` ```shell dough agent info ``` ```shell dough agent publish @ ``` ```shell dough agent archive @ ``` ```shell dough agent report @ ``` ```shell dough agent sync --draft ``` ```shell dough agent review show ``` ```shell dough agent review request-changes --note "..." ``` ### Publish, review, and install skills Skills are first-class, independently versioned registry entities. A skill bundle has a `skill.yaml` (`name`, `version`, `owner`, `description`) plus its `SKILL.md`, and follows the same immutable, owner-only rules as agents. - `--draft` submits a candidate version for the skill's owner to review; it is not promoted to latest until approved. `dough skill review show ` prints the candidate and a plain-English summary of what changed. - The owner approves or requests changes with `dough skill review approve|request-changes ` — also available as buttons on the skill's registry page. - `dough skill sync ` assembles a skill into `~/.claude/skills//` — user scope, not the current directory. Claude Code discovers that folder in every session, so a synced skill is available wherever you are. Override with `DOUGH_SKILL_DIR`, or `skillsDir` in the CLI config. - Downloads land first in a shared cache at `~/.dough/skills///`, so a skill pinned by several agents is fetched once. The sync is a copy out of that cache, and it REPLACES `~/.claude/skills//` — anything you edited in place there is overwritten, which is why it is `sync` and not `install`. - A published agent pins the exact skill versions it was built against; `dough agent sync` resolves those pins from the same cache and assembles the agent's own `.claude/skills/`. ```shell dough skill list ``` ```shell dough skill publish ``` ```shell dough skill publish --draft ``` ```shell dough skill review show ``` ```shell dough skill review approve ``` ```shell dough skill sync [@version] ``` ### Keep the CLI up to date The registry requires a current CLI. If yours is older than the deployed version, registry commands fail with an upgrade message — re-run the install command for your platform to update to the latest release.