AGENTS.md · git:20260928.3c869f7 · 2026-09-28 · sha256 001c5dd04047da5e
AGENTS.md git:20260928.3c869f7A
Immutable. This exact content never changes and is served at /api/v1/blob/001c5dd04047da5e.
# AGENTS.md — dcc-mcp-unreal
> Unreal Engine adapter for the DCC Model Context Protocol — an MCP server that
> runs inside Unreal (embedded Python) or beside it (native standalone sidecar).
> Navigation map for AI agents, not a reference manual. Follow the links; do not
> read everything up front.
## Build & test
```bash
vx just doctor # print the UE / toolchain paths packaging will use
vx just test # run the pytest suite
vx just check # everything CI gates on: lint + test + validate-skills
```
The task runner is the capitalised `Justfile`; list every recipe with
`vx just`. Verified recipes: `lint` (`lint_skills.py` + `ruff check .`),
`validate-skills`, `uplugin` (distributable `.uplugin` zip), `uplugin-source`,
`uplugin-python-only`, `download-core-wheel`,
`install-engine` / `install-project <project>`, `ue-smoke`,
`ue-smoke-python`, `ue-niagara-smoke`, `ue-niagara-commandlet`.
Packaging is driven by environment variables, not by editing the `Justfile`:
| Variable | Default | Role |
|---|---|---|
| `UE_VERSION` | `5.7` | Selects `UE_ROOT` when that is unset |
| `UE_ROOT` | `C:\Program Files\Epic Games\UE_<UE_VERSION>` | Engine to package against |
| `DCC_MCP_UNREAL_PACKAGE_MODE` | `native` | `native` / `source` / `python-only` |
| `DCC_MCP_CORE_WHEEL` / `_URL` | empty | Reuse a built core wheel instead of a source build |
| `DCC_MCP_UNREAL_PYTHON_PLUGIN` | `PythonScriptPlugin` | Python plugin name (override on internal forks) |
`vx.toml` also pins `UE_5_ROOT`, `UE_5_2_ROOT`, `UE_4_ROOT`, `UE_4_26_ROOT` and
`VCTOOLCHAIN_VERSION`, and exposes `build-ue5.7` / `build-ue5.2` /
`build-ue4.18` / `build-ue4.26` scripts over `packaging/build_distributable.py`.
## Agent control path
AI agents drive Unreal through the shared gateway using the `dcc-mcp` skill and
`dcc-mcp-cli` REST commands:
```bash
dcc-mcp-cli list # live sessions
dcc-mcp-cli dcc-types # release-catalog support
dcc-mcp-cli search --query "<task>" --dcc-type unreal
dcc-mcp-cli describe <tool-slug>
dcc-mcp-cli call <tool-slug> --json '{"key":"value"}'
```
If a tool belongs to an inactive progressive skill, load it first:
`dcc-mcp-cli load-skill <skill-name> --dcc-type unreal`.
If `dcc-mcp-cli` is missing, obtain user consent before running the official
install commands in the README Agent workflow. Keep an official build current
with `dcc-mcp-cli update check` / `dcc-mcp-cli update apply` — `update apply`
stages the CLI for the next launch and does not update a running
`dcc-mcp-server`.
IDE users may configure the gateway MCP endpoint instead; adapter-local Python
start APIs are for host bootstrap and tests.
## Runtime chain
```
Agent (Claude / Cursor / Codex)
│ dcc-mcp-cli or MCP
▼
Shared gateway → Unreal MCP instance ← SkillCatalog
│
▼
Embedded Python | native sidecar | optional Epic MCP bridge
│
▼
Unreal main thread → Unreal Editor API / Toolset Registry
```
Each skill is a standalone Python file that uses Unreal's `unreal` module.
Scripts are discovered from `SKILL.md` plus a sibling `tools.yaml` and exposed
as MCP tools automatically — prefer typed skills over raw scripting.
## Repo layout
| Path | Role |
|---|---|
| `src/dcc_mcp_unreal/` | Python package — server, install CLI, capability and compatibility layers |
| `src/dcc_mcp_unreal/skills/` | One directory per skill (`SKILL.md` + `tools.yaml` + scripts) |
| `tests/` | pytest suite; `tests/native/` holds the C++ shim and native cases |
| `packaging/` | `build_distributable.py`, `build_plugin.py`, install/uninstall scripts |
| `unreal/plugin/` | The `DccMcpUnreal` Unreal plugin (`Config`, `Content`, `Source`, `.uplugin`) |
| `tools/` | `lint_skills.py`, `build_binary.py` |
| `scripts/` | `run_ue_smoke.ps1`, `install-standalone.ps1`, `scripts/ci/` digest check |
| `docs/` | `installation.md`, `unreal-version-compatibility.md`, `msvc-kit-guide.md`, PRD |
## Release
- release-please drives versioning from Conventional Commits on `main`.
- `feat:` → minor, `fix:` → patch, `chore:`/`docs:`/`ci:` → **no release**.
- The version is mirrored into `pyproject.toml`,
`src/dcc_mcp_unreal/__version__.py`, and
`unreal/plugin/DccMcpUnreal.uplugin` (`$.VersionName`); do not edit those by
hand.
- Use `chore:`/`docs:` for config and doc work so release-please does not cut a
valueless version.
## Do / Don't
- **Do** single-source agent instructions here — this is the only agent contract
file at the repo root. Rebase onto `main` before merging (no merge commits);
CI must pass before review.
- **Do** target Python `>=3.9`; CI runs the suite on 3.9–3.12 across
Linux, Windows, and macOS, plus a `core-latest` compatibility job against the
newest published `dcc-mcp-core`.
- **Don't** add `CLAUDE.md` / `GEMINI.md` / `CURSOR.md` / `ANTHROPIC.md` /
`OPENAI.md` / `COPILOT.md` / `CODEBUDDY.md` / `.cursorrules` / `.clinerules` /
`.windsurfrules` at the root. Vendor-specific notes live under
`docs/integrations/`, linked from here.
- **Don't** hardcode an exact version in tests (`assert __version__ == "X.Y.Z"`)
— release-please bumps will break it. Use `>=` or read package metadata.
- **Don't** commit build artifacts to the repo root (`dist/`, `build/`,
`coverage.json`); `dist/` is where packaging and `download-core-wheel` write.
- **Don't** add AI-attribution footers to PR bodies or commit messages.