tools: add physics-sanity + Docker MCP scaffolding + tools/README

- tools/physics-sanity/ — JS library of cross-node balance helpers
  (mass / hydraulic / hydraulic-power / oxygen-transfer / energy) with
  7 unit tests + a CLI demo. Designed for `require()` from per-node
  integration tests where shape-based unit tests miss physically-
  impossible plant states.
- tools/docker-compose.yml + tools/mcp/{node-red-admin,influxdb,browser}
  scaffolding — placeholder Dockerfiles + a ROADMAP.md for the Node-RED
  admin MCP. Compose file is the target shape for the Q3-2026 migration
  to the central MCP server; the per-service Dockerfile stays in this
  repo as the canonical definition either way. Implementations are TODO.
- tools/README.md — top-level tooling index; documents the CI order for
  running every tool on a PR.
- .gitignore: ignore tools/.env (developer-specific MCP endpoints).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
znetsixe
2026-05-19 10:16:47 +02:00
parent edef1cecbf
commit 6e6699c763
13 changed files with 548 additions and 0 deletions

46
tools/docker-compose.yml Normal file
View File

@@ -0,0 +1,46 @@
name: evolv-tools
services:
# ----------------------------------------------------------------------
# Local MCP services for the Claude Code tooling stack.
# Migration note (2026-05): these are deliberately local. When the
# central MCP server comes online (target Q3 2026), each service moves
# to the shared infra; this compose file becomes the spec for what to
# provision there. The build context + Dockerfile in tools/mcp/<name>/
# stays in this repo as the canonical definition.
# ----------------------------------------------------------------------
mcp-node-red-admin:
build:
context: ./mcp/node-red-admin
container_name: evolv-mcp-node-red-admin
environment:
NODE_RED_HOST: ${NODE_RED_HOST:-http://host.docker.internal:1880}
NODE_RED_TOKEN: ${NODE_RED_TOKEN:-}
stdin_open: true
tty: true
profiles: ["mcp"]
mcp-influxdb:
build:
context: ./mcp/influxdb
container_name: evolv-mcp-influxdb
environment:
INFLUX_URL: ${INFLUX_URL:-http://host.docker.internal:8086}
INFLUX_TOKEN: ${INFLUX_TOKEN:-}
INFLUX_ORG: ${INFLUX_ORG:-wbd}
INFLUX_BUCKET: ${INFLUX_BUCKET:-telemetry}
stdin_open: true
tty: true
profiles: ["mcp"]
mcp-browser:
build:
context: ./mcp/browser
container_name: evolv-mcp-browser
environment:
DASHBOARD_URL: ${DASHBOARD_URL:-http://host.docker.internal:1880/dashboard}
HEADLESS: ${HEADLESS:-true}
stdin_open: true
tty: true
profiles: ["mcp"]