What is deco Studio?
Studio packages the infrastructure behind an internal AI rollout: model routing, MCP authentication, agent configuration, SSO, RBAC, audit logs, and usage accounting. Your teams get chat. You keep control.
Under the hood it's one control plane for your AI agents — one MCP endpoint for all your agents, tools, and models. Agents package context, tools, and policy into something you publish to the organization. Connections give them governed access to your systems — GitHub, Slack, Postgres, Sentry, anything that speaks MCP — with tokens stored in an encrypted vault. Models stay interchangeable: OpenRouter or direct providers, chosen per agent and per tool.
Start with one team. Standardize approved models, tools, and context. Expand across the organization without copying secrets or rebuilding the platform. Install locally and it stays private; sync to the cloud for remote access, team roles, and shared billing.
┌─────────────────────────────────────────────────────────────────┐
│ Clients │
│ Cursor · Claude · VS Code · Custom Agents │
└───────────────────────────┬─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ DECO STUDIO │
│ Agents · Connections · Models · Vault · Observability │
└───────────────────────────┬─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Tools & MCP Servers │
│ GitHub · Slack · Postgres · OpenRouter · Your APIs │
└─────────────────────────────────────────────────────────────────┘
Quick Start
Install Docker with Compose, then run from source:
git clone https://github.com/decocms/studio.git
cd studio
docker compose up --build --watch
Open http://localhost:4000. Compose starts PostgreSQL, NATS, object storage, migrations, and the hot-reloading API and web app. See CONTRIBUTING.md for contributor setup and worktrees.
What you get
Agents
Package context, tools, and policy into an agent. Define instructions, add skills and files, grant approved MCP access, choose a model policy, then publish the agent to the organization. Each agent is its own MCP endpoint — callable from Cursor, Claude Desktop, your own code, or another agent. Agents compose, and every action is tracked with cost attribution.
Connections
Connect private systems once, securely. Register MCP servers at the organization level through a web UI with one-click OAuth — no JSON configs. Tokens live in the encrypted vault, and you grant tool-level access by organization, role, or agent. Share MCP capabilities — not credentials.
As tool surfaces grow, Studio exposes Virtual MCPs — one endpoint, different strategies for which tools to surface:
- Full-context: expose everything (simple, deterministic, good for small toolsets)
- Smart selection: narrow the toolset before execution
- Code execution: load tools on demand in a sandbox
Models
Keep the AI layer interchangeable. Use OpenRouter or connect Anthropic, OpenAI, Google, or any compatible provider directly — the best model for each agent and tool, behind one router. For coding work, engineers can link their own Claude Code or Codex session and use the subscription already authenticated on their machine.
Projects
Projects bring agents and connections together around a goal. The project's UI adapts to what's inside — add a content agent and a CMS connection, the sidebar shows content management; add an analytics agent and a database, it shows dashboards and queries. The UI you see is the UI that's relevant for operating that project.
Observability
Account for every model and tool call. Trace the user, agent, model, tools, latency, errors, tokens, and cost for every thread. Break usage down by agent, connection, organization, or teammate — one dashboard.
From your desktop to your org
Core Capabilities
Define Tools
Type-safe, audited, observable, callable via MCP.
import { z } from "zod";
import { defineTool } from "~/core/define-tool";
export const CONNECTION_CREATE = defineTool({
name: "CONNECTION_CREATE",
description: "Create a new MCP connection",
inputSchema: z.object({
name: z.string(),
connection: z.object({
type: z.enum(["HTTP", "SSE", "WebSocket"]),
url: z.string().url(),
token: z.string().optional(),
}),
}),
outputSchema: z.object({
id: z.string(),
scope: z.enum(["workspace", "project"]),
}),
handler: async (input, ctx) => {
await ctx.access.check();
const conn = await ctx.storage.connections.create({
projectId: ctx.project?.id ?? null,
...input,
createdById: ctx.auth.user!.id,
});
return { id: conn.id, scope: conn.projectId ? "project" : "workspace" };
},
});
Every tool call gets input/output validation, access control, audit logging, and OpenTelemetry traces automatically.
Documentation
Studio documentation lives in docs-tanstack, alongside the Storefront documentation. Update public product guides and architecture there. Workspace READMEs and engineering plans stay here with the implementation.
Project Structure
Applications
Packages
Development
bun install # Install dependencies
bun run dev # Docker Compose Watch: dependencies, migrations, API + web
bun test # Run tests
bun run check # Type check
bun run lint # Lint
bun run fmt # Format
App-specific commands
bun run --cwd=apps/web dev # Vite dev server (port 4000)
bun run --cwd=apps/api dev:server # Hono server with hot reload
bun run --cwd=apps/api migrate # Run database migrations
For parallel worktrees, Compose lifecycle commands, and frontend-only work, see CONTRIBUTING.md.
Deploy Anywhere
# Docker Compose: released Studio + PostgreSQL + NATS + object storage
docker compose -f selfhost/examples/docker-compose/compose.yaml up -d
# Kubernetes (Helm)
helm install deco-studio oci://ghcr.io/decocms/chart-deco-studio --version <version> -n deco-studio --create-namespace
Run Studio with Docker Compose or Kubernetes on your own infrastructure.
What you need to run it
Production topology
graph TB
clients["MCP clients — Cursor · Claude · VS Code · your code"]
clients -->|"one MCP endpoint · SSO · RBAC · audit"| api
subgraph k8s ["Kubernetes (Helm)"]
api["Studio API + Admin UI"]
api --> sandbox["Agent sandboxes<br/>(sandbox-operator)"]
api <-->|"streams and broadcasts"| nats["NATS"]
api -->|"traces · costs"| otel["OTel Collector"]
nats <-->|"streams and broadcasts"| worker["Workers<br/>DBOS runs"]
otel --> ch[("ClickHouse")]
end
pg[("PostgreSQL")]
api --> pg
worker <-->|"DBOS queues and journal"| pg
subgraph upstream ["Models & tools"]
models["Anthropic · OpenAI<br/>OpenRouter · Ollama"]
mcps["GitHub · Slack · Postgres<br/>your MCP servers"]
end
api -->|"model routing · vaulted credentials"| upstream
Every box is optional except Studio and PostgreSQL — start small, turn on the rest as the rollout grows.
Tech Stack
Roadmap
- Agent marketplace — discover, hire, and compose agents
- Declarative planning engine
- Cost analytics and spend caps
- Remote access from any browser
- Live tracing debugger
- Workflow orchestration with guardrails
License
MIT — see LICENSE.md.
Questions? [email protected]
Contributing
bun run fmt # Format
bun run lint # Lint
bun test # Test
See AGENTS.md for coding guidelines, CONTRIBUTING.md for the contribution workflow, and TESTING.md for the testing rules.
Good first steps: open an issue, pick one labeled good first issue, or ask in Discord.
Contributors
Studio is built in the open. Thanks to everyone who has shipped a commit.
Maintainers — see MAINTAINERS.txt:
@guitavano · @viktormarinho · @mcandeia · @pedrofrxncx · @JonasJesus42 · @aka-sacci-ccr · @vibegui · @tlgimenes · @vibe-dex · @nicacioliveira