OpenBMB/ChatDev · error · ConfigError

args entries must be strings

Error message

args entries must be strings

What it means

Raised by the stdio-process tooling config parser when the 'args' list contains an entry that is not a string. Args are the argv passed to the spawned command; only strings are accepted.

Source

Thrown at entity/configs/node/tooling.py:512

            name="cache_ttl",
            display_name="Tool Cache TTL",
            type_hint="float",
            required=False,
            description="Seconds to cache MCP tool list; 0 disables cache for hot updates",
            advance=True,
        ),
    }

    @classmethod
    def from_dict(cls, data: Mapping[str, Any], *, path: str) -> "McpLocalConfig":
        mapping = require_mapping(data, path)
        command = require_str(mapping, "command", path)
        args_raw = ensure_list(mapping.get("args"))
        normalized_args: List[str] = []
        for idx, arg in enumerate(args_raw):
            arg_path = extend_path(path, f"args[{idx}]")
            if not isinstance(arg, str):
                raise ConfigError("args entries must be strings", arg_path)
            normalized_args.append(arg)

        cwd = optional_str(mapping, "cwd", path)
        inherit_env = optional_bool(mapping, "inherit_env", path, default=True)
        if inherit_env is None:
            inherit_env = True

        env_mapping = mapping.get("env")
        if env_mapping is not None:
            if not isinstance(env_mapping, Mapping):
                raise ConfigError("env must be a mapping", extend_path(path, "env"))
            env = {str(k): str(v) for k, v in env_mapping.items()}
        else:
            env = {}

        timeout_value = mapping.get("startup_timeout", 10.0)
        if timeout_value is None:
            startup_timeout = 10.0

View on GitHub (pinned to 4fb2db0ea9)

Solutions

  1. Quote every arg: "--port", "8080"
  2. Express boolean flags as their flag string ("--verbose") not true/false
  3. Run [str(a) for a in args] before from_dict when args are programmatically built

Example fix

# before
args: ["--port", 8080]
# after
args: ["--port", "8080"]
Defensive patterns

Strategy: type-guard

Validate before calling

args = cfg.get("args", [])
assert all(isinstance(a, str) for a in args)

Type guard

def valid_args(v) -> bool:
    return isinstance(v, list) and all(isinstance(a, str) for a in v)

Try / catch

except ConfigError as e:
    if "args entries" in str(e):
        cfg["args"] = [str(a) for a in cfg["args"]]

Prevention

When it happens

Trigger: args: ["--port", 8080] in a tooling config with a command like 'npx'; booleans (true) intended as flags; nested lists.

Common situations: Writing args: [--verbose] in YAML (becomes bool or null); JSON configs generated from Python lists with ints; passing flags as true instead of "--verbose".

Related errors


AI-assisted analysis of OpenBMB/ChatDev@4fb2db0ea9 (2026-08-27). Data as JSON: /api/errors/d81fb3420325ee6f. Report an issue: GitHub.