Forge needs a header row to name the columns — the header IS the vendor tag list that gets mapped to canonical fields. A file with no header, or a header and nothing else, cannot be normalized.
The header row is doing the real work: each column name is looked up as a vendor tag. Without it there is nothing to resolve, so Forge rejects the file rather than positionally guessing — a positional guess would silently mislabel every column.
One MCP endpoint serves every protocol adapter. 16,908 curated mappings, 366 canonical fields.
Other CSV ingest codes: too_many_fields mixed types in a column timestamp not recognized
Other protocols: Modbus OPC UA MQTT / Sparkplug B FANUC FOCAS EtherNet/IP PROFINET / S7 BACnet/IP J1939 (CAN) MTConnect ROS 2 (DDS) SNMP MAVLink HTTP / REST