{"record":{"id":"cb72c91a1a5dff3a","repo":"OpenBB-finance/OpenBB","slug":"argument-name-v-must-be-a-valid-python-identif","errorCode":null,"errorMessage":"Argument name '{v}' must be a valid Python identifier","messagePattern":"Argument name '(.+?)' must be a valid Python identifier","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"openbb_platform/extensions/mcp_server/openbb_mcp_server/models/mcp_config.py","lineNumber":57,"sourceCode":"    \"\"\"Model for validating prompt argument definitions.\"\"\"\n\n    name: str = Field(..., description=\"Name of the argument\")\n    type: str = Field(default=\"str\", description=\"Type of the argument\")\n    default: Any | None = Field(\n        default=None, description=\"Default value for the argument\"\n    )\n    description: str | None = Field(\n        default=None, description=\"Description of the argument\"\n    )\n\n    @field_validator(\"name\")\n    @classmethod\n    def validate_name(cls, v: str) -> str:\n        \"\"\"Validate argument name is a valid identifier.\"\"\"\n        if not v:\n            raise ValueError(\"Argument name cannot be empty\")\n        if not re.match(r\"^[a-zA-Z_][a-zA-Z0-9_]*$\", v):\n            raise ValueError(f\"Argument name '{v}' must be a valid Python identifier\")\n        return v\n\n    @field_validator(\"type\")\n    @classmethod\n    def validate_type(cls, v: str) -> str:\n        \"\"\"Validate type is a recognized type string.\"\"\"\n        valid_types = {\n            \"str\",\n            \"string\",\n            \"int\",\n            \"integer\",\n            \"float\",\n            \"bool\",\n            \"boolean\",\n            \"list\",\n            \"dict\",\n            \"any\",\n            \"Any\",","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/OpenBB-finance/OpenBB/blob/3e071fcc2cd9f891cac6040ae60296dba76dab46/openbb_platform/extensions/mcp_server/openbb_mcp_server/models/mcp_config.py#L39-L75","documentation":"Pydantic validation error on ArgumentDefinitionModel.name: the name fails the regex ^[a-zA-Z_][a-zA-Z0-9_]*$ — it must be a valid Python identifier. Names are used as Python kwargs and template placeholders, so dashes, spaces, leading digits, or unicode characters are rejected at config load time.","triggerScenarios":"Naming an argument 'start-date', '1st_arg', 'stock symbol', or 'café' in an MCP config; converting a CLI flag (--start-date) directly into an argument name without normalizing; JSON configs generated from user-facing labels.","commonSituations":"Configs authored from REST query-parameter names that contain hyphens; migrating configs between tools with different naming rules; non-ASCII names from localized configs.","solutions":["Rename the argument to snake_case: 'start-date' → 'start_date'.","Start the name with a letter or underscore, never a digit.","Use only [a-zA-Z0-9_] characters after the first character."],"exampleFix":"# before\narguments:\n  - name: start-date\n    type: str\n\n# after\narguments:\n  - name: start_date\n    type: str","handlingStrategy":"validation","validationCode":"import re\n\nIDENT = re.compile(r\"^[a-zA-Z_][a-zA-Z0-9_]*$\")\n\ndef normalize_arg_name(name: str) -> str:\n    snake = re.sub(r\"[^a-zA-Z0-9_]+\", \"_\", name.strip()).strip(\"_\")\n    if not snake or snake[0].isdigit():\n        snake = f\"_{snake}\"\n    if not IDENT.match(snake):\n        raise ValueError(f\"cannot normalize {name!r}\")\n    return snake","typeGuard":"def is_identifier(name: str) -> bool:\n    return isinstance(name, str) and bool(re.match(r\"^[a-zA-Z_][a-zA-Z0-9_]*$\", name))","tryCatchPattern":null,"preventionTips":["Normalize hyphenated names to snake_case before writing configs.","Validate names with the same identifier regex used by the model.","Never derive argument names directly from CLI flags or labels."],"tags":["openbb","mcp","pydantic","naming"],"backgroundTag":null,"analyzedSha":"3e071fcc2cd9f891cac6040ae60296dba76dab46","analyzedAt":"2026-08-14T23:40:48.960Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}