A Lego-style agent system template built from agent, MCP, CLI, and skills. Two harness stacks, a shared workspace, and catalogs on NeuralDeep.
Based on the Lego approach to agent systems post.
| Block | In this template |
|---|---|
| Agent | Stack A - OpenCode + ACP + ACPBox. Stack B - Coddy Agent HTTP |
| LLM | NeuralDeep Hub API at https://api.neuraldeep.ru/v1 (gpt-oss-120b, qwen3.6-35b-a3b, ...) |
| MCP | mcp-atlassian (Confluence + Jira). Catalog - neuraldeep.ru/mcp |
| CLI | gh, glab, aws-cli, yt-dlp, skillsbd - see workspace/INSTRUCTIONS.md, catalog - neuraldeep.ru/tools |
| Skills | Git submodules in skills_cache/ + symlinks in workspace/ - neuraldeep.ru/skills |
| UI (optional) | Open WebUI on top of ACPBox |
Full architecture - docs/architecture.md.
git clone <this-repo> agent-template &&cd agent-template
git submodule update --init --recursive
cp .env.example .env
# Edit .env: NEURALDEEP_API_KEY from https://hub.neuraldeep.ru/# Optional: CONFLUENCE_* and JIRA_* for Atlassian MCP
mkdir -p atlassian_data coddy_home open-webui_dataRegister at hub.neuraldeep.ru, copy your sk- key into .env as NEURALDEEP_API_KEY.
Pick one stack below (or run both on different ports if you need both).
OpenCode runs as an ACP agent inside ACPBox. Any OpenAI-compatible client talks to ACPBox; ACPBox spawns OpenCode over stdio.
Compose file - docker-compose.acpbox.yaml
Config files
| File | Role |
|---|---|
workspace/.opencode/opencode.json | Model provider (NeuralDeep), MCP, permissions |
workspace/INSTRUCTIONS.md | System instructions for the agent |
.env | NEURALDEEP_API_KEY, ports, Atlassian tokens |
Set provider.neuraldeep.options.apiKey in workspace/.opencode/opencode.json if ${NEURALDEEP_API_KEY} is not expanded inside the container.
Models (NeuralDeep Hub)
| Hub model id | OpenCode id | Notes |
|---|---|---|
gpt-oss-120b | neuraldeep/gpt-oss-120b | Default, tools + reasoning |
qwen3.6-35b-a3b | neuraldeep/qwen3.6-35b-a3b | Tools + reasoning + vision |
qwen3.6-35b-a3b-noreason | neuraldeep/qwen3.6-35b-a3b-noreason | Faster, no reasoning |
Start and stop
docker compose -f docker-compose.acpbox.yaml up -d
docker compose -f docker-compose.acpbox.yaml downEndpoints
| URL | Purpose |
|---|---|
http://localhost:9080/v1/models | List modes |
http://localhost:9080/v1/chat/completions | Chat API |
http://localhost:9999/mcp | Atlassian MCP (same compose file) |
HTTP examples - examples/acpbox-openai.http.
Browser chat UI that uses ACPBox as the OpenAI backend.
docker compose -f docker-compose.acpbox.yaml --profile openwebui up -d| URL | Purpose |
|---|---|
http://localhost:3000 | Open WebUI |
Data is stored in ./open-webui_data/ (gitignored bind mount). Create it before the first run: mkdir -p open-webui_data.
Inside Compose, Open WebUI uses OPENAI_API_BASE_URL=http://acpbox:8080/v1.
Coddy Agent in HTTP mode - embedded web UI, OpenAI-compatible /v1 API, MCP, skills, and CLI tools in one binary.
Compose file - docker-compose.coddy.yaml
Config files
| File | Role |
|---|---|
config.yaml | Providers, models, MCP, skills dirs, CLI allowlist |
.env | NEURALDEEP_API_KEY, ports, Atlassian tokens |
coddy_home/ | Sessions and runtime state (gitignored) |
Models (NeuralDeep Hub)
| Config model id | Hub API name |
|---|---|
neuraldeep/gpt-oss-120b | gpt-oss-120b (default) |
neuraldeep/qwen3.6-35b-a3b | qwen3.6-35b-a3b |
neuraldeep/qwen3.6-35b-a3b-noreason | qwen3.6-35b-a3b-noreason |
Change the default in config.yaml under agent.model.
Start and stop
docker compose -f docker-compose.coddy.yaml up -d
docker compose -f docker-compose.coddy.yaml downEndpoints
| URL | Purpose |
|---|---|
http://localhost:12345/ | Embedded web UI |
http://localhost:12345/v1/models | OpenAI-compatible API |
http://localhost:12345/v1/chat/completions | Chat |
http://localhost:9999/mcp | Atlassian MCP (same compose file) |
HTTP examples - examples/coddy-openai.http.
git submodule update --init --recursiveLayout
skills_cache/- git submodules at repo root (sources, agents do not scan repo roots)workspace/.opencode/skills/<name>/- symlinks for OpenCode (../../../skills_cache/...)workspace/.coddy/skills/<name>/- symlinks for Coddy (../../../skills_cache/...)
rpa-skills is a multi-skill repo - link each skill separately, not the repo root.
| Skill link name | Target in skills_cache/ | Harness |
|---|---|---|
rpa-init | rpa-skills/rpa-init/ | both |
rpa-feat | rpa-skills/rpa-feat/ | both |
rpa-bugfix | rpa-skills/rpa-bugfix/ | both |
rpa-gen-rules | rpa-skills/rpa-gen-rules/ | both |
logika | rpa-skills/logika/ | both |
humanizer-ru | humanizer-ru/skills/humanizer-ru/ | both |
ru-text | ru-text/skills/ru-text/ | both |
stop-slop | stop-slop/ | both |
Docker mounts
- Both stacks -
./skills_cache:/skills_cache:ro(outside/workspace, noskills_cachefolder inside workspace) - Symlinks
../../../skills_cache/...resolve to/skills_cache/...in the container
Coddy config.yaml -> skills.dirs: [/workspace/.coddy/skills].
Add a submodule under skills_cache/, then symlink each SKILL.md folder into both .opencode/skills/ and .coddy/skills/.
Add a skill from the NeuralDeep catalog:
npx skillsbd search yandex
npx skillsbd add <owner/repo>Both compose files include mcp-atlassian for Confluence and Jira.
- Set
CONFLUENCE_*andJIRA_*in.env. - MCP endpoint -
http://localhost:9999/mcp(streamable HTTP). - Persistent cache -
atlassian_data/(gitignored).
Wiring
| Client | Config |
|---|---|
| OpenCode | workspace/.opencode/opencode.json -> mcp.atlassian |
| Coddy | config.yaml -> mcp_servers |
| Cursor | workspace/.cursor/mcp.json |
More MCP servers - neuraldeep.ru/mcp.
The agent uses console tools from the host (not bundled in containers). Tool list and pipeline examples - workspace/INSTRUCTIONS.md. Catalog - neuraldeep.ru/tools.
agent-template/
├── docker-compose.acpbox.yaml # OpenCode + ACPBox (+ optional openwebui profile)
├── docker-compose.coddy.yaml # Coddy HTTP
├── config.yaml # Coddy stack config
├── open-webui_data/ # Open WebUI state (gitignored)
├── coddy_home/ # Coddy sessions (gitignored)
├── atlassian_data/ # mcp-atlassian cache (gitignored)
├── skills_cache/ # git submodules (sources)
├── workspace/ # .opencode/opencode.json, .opencode/skills/, .coddy/skills/
├── docs/architecture.md
└── AGENTS.md
- MCP - frequent operations with external systems, bounded access, tool always available.
- CLI - rare or heavy jobs, easy to wrap in a script and skill.
- Skills - complex MCP + CLI chains with project rules without overloading the base agent.
Do not grow the stack without need (Lusser's law).
This project is licensed under the MIT License, see the LICENSE file in the repository root for details.