Pieza 2 — schema (internal/config/schema.go):
- DeviceMeshConfig.ExposeViaMCP *bool: pointer para distinguir "no
establecido" vs "false explicito". Helper ShouldExposeViaMCP() devuelve
true cuando enabled && (nil || *true).
- ClaudeCodeCfg.MCPConfigPath y MCPServerName: poblados en runtime por
la launcher, NUNCA por YAML.
Pieza 3 — launcher wiring (devagents/mcp_bridge.go + cmd/launcher/main.go):
- ApplyMCPBridge(cfg, logger): si DeviceMesh.ShouldExposeViaMCP() y
provider=claude-code, resuelve binario devicemesh-mcp (junto al
launcher), URL device_agent (env override > YAML), lista tools allowed
(RegisterBuiltins + FilterByAllowed igual que registry_build.go), y
escribe /tmp/<agent_id>-mcp-config.json (0600).
- Aplica overrides a cfg.LLM.Primary.ClaudeCode: MCPConfigPath,
AllowedTools (formato mcp__<server>__<tool>), DisableTools=false
defensivo.
- Launcher main.go llama ApplyMCPBridge inmediatamente despues de
config.Load, ANTES de devagents.New (que es donde se construye el
CompleteFunc del provider).
Pieza 4 — claude args (shell/llm/claudecode.go):
- buildClaudeArgs ahora emite "--mcp-config <path>" cuando
cfg.MCPConfigPath no esta vacio.
- Guard defensivo: DisableTools=true + AllowedTools no vacio ahora
produce solo --allowedTools (efectivamente ignora DisableTools). El
launcher ya lo previene en ApplyMCPBridge, pero esto protege a
callers directos.
Build limpio con goolm.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>