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).
| Resource | URL |
|---|---|
| NeuralDeep | https://neuraldeep.ru/ |
| Skills | https://neuraldeep.ru/skills |
| MCP | https://neuraldeep.ru/mcp |
| CLI | https://neuraldeep.ru/tools |
| Hub (LLM) | https://hub.neuraldeep.ru/ |
| API | https://api.neuraldeep.ru/v1 |
| OpenCode | https://github.com/anomalyco/opencode |
| ACP | https://github.com/agentclientprotocol/agent-client-protocol |
| ACPBox | https://github.com/EvilFreelancer/acpbox |
| Coddy Agent | https://github.com/coddy-project/coddy-agent |
| mcp-atlassian | https://github.com/sooperset/mcp-atlassian |
| Open WebUI | https://github.com/open-webui/open-webui |
| acpbox-agent example | https://github.com/EvilFreelancer/acpbox-agent |
This project is licensed under the MIT License, see the LICENSE file in the repository root for details.