diff --git a/multiconfparse/__init__.py b/multiconfparse/__init__.py
index f1b5483..fe0f30f 100644
--- a/multiconfparse/__init__.py
+++ b/multiconfparse/__init__.py
@@ -5,7 +5,6 @@
 
 import abc
 import argparse
-import copy
 import json
 import operator
 import os
@@ -1590,7 +1589,7 @@ class ConfigParser:
         __repr__ = __str__
 
     def __init__(self, config_default=NOT_GIVEN):
-        self._config_specs = []
+        self._config_specs = {}
         self._sources = []
         self._parsed_values = {}
         self._global_default = config_default
@@ -1747,10 +1746,12 @@ class ConfigParser:
           raised if the config item is mentioned in a source with an argument
           that is not in ``choices``.
         """
+        if name in self._config_specs:
+            raise ValueError(f"Config item with name '{name}' already exists")
         if "default" not in kwargs and self._global_default is not NOT_GIVEN:
             kwargs["default"] = self._global_default
         spec = Action.create(name=name, **kwargs)
-        self._config_specs.append(spec)
+        self._config_specs[name] = spec
         return spec
 
     def add_source(self, source, *args, **kwargs):
@@ -1783,13 +1784,13 @@ class ConfigParser:
         Return the created config source object.
         """
         source_obj = Source.create(
-            source, copy.copy(self._config_specs), *args, **kwargs,
+            source, list(self._config_specs.values()), *args, **kwargs,
         )
         self._sources.append(source_obj)
         return source
 
     def _add_parsed_values(self, values, new_values, source):
-        for spec in self._config_specs:
+        for spec in self._config_specs.values():
             if not hasattr(new_values, spec.name):
                 continue
             if self._ignore_config_for_source(spec, source):
@@ -1802,7 +1803,7 @@ class ConfigParser:
             )
 
     def _accumulate_parsed_values(self, namespace, parsed_values):
-        for spec in self._config_specs:
+        for spec in self._config_specs.values():
             if not hasattr(parsed_values, spec.name):
                 continue
             # Sort the values according to the priorities of the sources,
@@ -1838,7 +1839,7 @@ class ConfigParser:
             self._add_parsed_values(ns, new_values, source)
 
     def _collect_defaults(self, ns):
-        for spec in self._config_specs:
+        for spec in self._config_specs.values():
             if spec.default is NOT_GIVEN or spec.default is SUPPRESS:
                 continue
             setattr(ns, spec.name, spec.default)
@@ -1862,7 +1863,7 @@ class ConfigParser:
         return self._parse_config(check_required=True)
 
     def _process_missing(self, parsed_values):
-        for spec in self._config_specs:
+        for spec in self._config_specs.values():
             if (
                 not hasattr(parsed_values, spec.name)
                 and spec.default is not SUPPRESS
@@ -1870,7 +1871,7 @@ class ConfigParser:
                 setattr(parsed_values, spec.name, None)
 
     def _check_required_configs(self, namespace):
-        for spec in self._config_specs:
+        for spec in self._config_specs.values():
             if spec.required and not hasattr(namespace, spec.name):
                 raise RequiredConfigNotFoundError(
                     f"Did not find value for config item '{spec.name}'"

Add check that config names don't clash
diff --git a/tests/test_multiconfparse.py b/tests/test_multiconfparse.py
index e198070..823d145 100644
--- a/tests/test_multiconfparse.py
+++ b/tests/test_multiconfparse.py
@@ -528,6 +528,13 @@ def test_json_source_none_values():
     assert values == mcp._namespace_from_dict({"c": "cv"})
 
 
+def test_config_name_clash():
+    mcp_parser = mcp.ConfigParser()
+    mcp_parser.add_config("c")
+    with pytest.raises(ValueError):
+        mcp_parser.add_config("c")
+
+
 test_specs = []
 
 nargs_test_specs = []

pip install -e .[dev]
parse_log_pytest
pytest
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio pytest
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
coverage==7.8.0
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
execnet==2.1.1
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
-e git+https://github.com/jonathanhaigh/multiconfparse.git@ee64e03648d5306f3373c9f0b57d365177a15bd9#egg=multiconfparse
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
pytest-asyncio==0.26.0
pytest-cov==6.0.0
pytest-mock==3.14.0
pytest-xdist==3.6.1
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions==4.13.0

name: multiconfparse
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==7.8.0
      - execnet==2.1.1
      - pytest-asyncio==0.26.0
      - pytest-cov==6.0.0
      - pytest-mock==3.14.0
      - pytest-xdist==3.6.1
      - typing-extensions==4.13.0
prefix: /opt/conda/envs/multiconfparse

tests/test_multiconfparse.py::test_config_name_clash
tests/test_multiconfparse.py::test_partially_parse_config tests/test_multiconfparse.py::test_types tests/test_multiconfparse.py::test_file_opening tests/test_multiconfparse.py::test_valid_name[c1] tests/test_multiconfparse.py::test_valid_name[c_] tests/test_multiconfparse.py::test_valid_name[C] tests/test_multiconfparse.py::test_valid_name[_c] tests/test_multiconfparse.py::test_invalid_name[-c] tests/test_multiconfparse.py::test_invalid_name[c-] tests/test_multiconfparse.py::test_invalid_name[1c] tests/test_multiconfparse.py::test_validate_type tests/test_multiconfparse.py::test_custom_action tests/test_multiconfparse.py::test_source_as_class tests/test_multiconfparse.py::test_count tests/test_multiconfparse.py::test_count_with_default tests/test_multiconfparse.py::test_count_missing tests/test_multiconfparse.py::test_count_with_required tests/test_multiconfparse.py::test_count_missing_with_default tests/test_multiconfparse.py::test_priorities tests/test_multiconfparse.py::test_priorities_with_default tests/test_multiconfparse.py::test_priorities_with_multiple_values_from_source tests/test_multiconfparse.py::test_priorities_stable_sort tests/test_multiconfparse.py::test_dict_source_none_values tests/test_multiconfparse.py::test_env_source_none_values tests/test_multiconfparse.py::test_json_source_none_values tests/test_multiconfparse.py::test_spec_with_dict[nargs_with_valid_input, tests/test_multiconfparse.py::test_spec_with_dict[nargs_with_invalid_input, tests/test_multiconfparse.py::test_spec_with_dict[nargs_with_invalid_const, tests/test_multiconfparse.py::test_spec_with_dict[nargs_with_default, tests/test_multiconfparse.py::test_spec_with_dict[nargs_with_global_default, tests/test_multiconfparse.py::test_spec_with_dict[nargs_with_default_and_global_default, tests/test_multiconfparse.py::test_spec_with_dict[nargs_0_or_1_with_const, tests/test_multiconfparse.py::test_spec_with_dict[store_const, tests/test_multiconfparse.py::test_spec_with_dict[store_true, tests/test_multiconfparse.py::test_spec_with_dict[store_false, tests/test_multiconfparse.py::test_spec_with_dict[suppress, tests/test_multiconfparse.py::test_spec_with_dict[required, tests/test_multiconfparse.py::test_spec_with_dict[choices, tests/test_multiconfparse.py::test_spec_with_env[nargs_with_valid_input, tests/test_multiconfparse.py::test_spec_with_env[nargs_with_invalid_input, tests/test_multiconfparse.py::test_spec_with_env[nargs_with_invalid_const, tests/test_multiconfparse.py::test_spec_with_env[nargs_with_default, tests/test_multiconfparse.py::test_spec_with_env[nargs_with_global_default, tests/test_multiconfparse.py::test_spec_with_env[nargs_with_default_and_global_default, tests/test_multiconfparse.py::test_spec_with_env[nargs_0_or_1_with_const, tests/test_multiconfparse.py::test_spec_with_env[store_const, tests/test_multiconfparse.py::test_spec_with_env[store_true, tests/test_multiconfparse.py::test_spec_with_env[store_false, tests/test_multiconfparse.py::test_spec_with_env[suppress, tests/test_multiconfparse.py::test_spec_with_env[required, tests/test_multiconfparse.py::test_spec_with_env[choices, tests/test_multiconfparse.py::test_spec_with_json[nargs_with_valid_input, tests/test_multiconfparse.py::test_spec_with_json[nargs_with_invalid_input, tests/test_multiconfparse.py::test_spec_with_json[nargs_with_invalid_const, tests/test_multiconfparse.py::test_spec_with_json[nargs_with_default, tests/test_multiconfparse.py::test_spec_with_json[nargs_with_global_default, tests/test_multiconfparse.py::test_spec_with_json[nargs_with_default_and_global_default, tests/test_multiconfparse.py::test_spec_with_json[nargs_0_or_1_with_const, tests/test_multiconfparse.py::test_spec_with_json[store_const, tests/test_multiconfparse.py::test_spec_with_json[store_true, tests/test_multiconfparse.py::test_spec_with_json[store_false, tests/test_multiconfparse.py::test_spec_with_json[suppress, tests/test_multiconfparse.py::test_spec_with_json[required, tests/test_multiconfparse.py::test_spec_with_json[choices, tests/test_multiconfparse.py::test_spec_with_argparse[nargs_with_valid_input, tests/test_multiconfparse.py::test_spec_with_argparse[nargs_with_invalid_input, tests/test_multiconfparse.py::test_spec_with_argparse[nargs_with_invalid_const, tests/test_multiconfparse.py::test_spec_with_argparse[nargs_with_default, tests/test_multiconfparse.py::test_spec_with_argparse[nargs_with_global_default, tests/test_multiconfparse.py::test_spec_with_argparse[nargs_with_default_and_global_default, tests/test_multiconfparse.py::test_spec_with_argparse[nargs_0_or_1_with_const, tests/test_multiconfparse.py::test_spec_with_argparse[store_const, tests/test_multiconfparse.py::test_spec_with_argparse[store_true, tests/test_multiconfparse.py::test_spec_with_argparse[store_false, tests/test_multiconfparse.py::test_spec_with_argparse[suppress, tests/test_multiconfparse.py::test_spec_with_argparse[required, tests/test_multiconfparse.py::test_spec_with_argparse[choices, tests/test_multiconfparse.py::test_spec_against_argparse[nargs_with_valid_input, tests/test_multiconfparse.py::test_spec_against_argparse[nargs_with_invalid_input, tests/test_multiconfparse.py::test_spec_against_argparse[nargs_with_invalid_const, tests/test_multiconfparse.py::test_spec_against_argparse[nargs_with_default, tests/test_multiconfparse.py::test_spec_against_argparse[nargs_with_global_default, tests/test_multiconfparse.py::test_spec_against_argparse[nargs_with_default_and_global_default, tests/test_multiconfparse.py::test_spec_against_argparse[nargs_0_or_1_with_const, tests/test_multiconfparse.py::test_spec_against_argparse[store_const, tests/test_multiconfparse.py::test_spec_against_argparse[store_true, tests/test_multiconfparse.py::test_spec_against_argparse[store_false, tests/test_multiconfparse.py::test_spec_against_argparse[suppress, tests/test_multiconfparse.py::test_spec_against_argparse[required, tests/test_multiconfparse.py::test_spec_against_argparse[choices, tests/test_multiconfparse.py::test_simple_argparse_source_with_config_added_after_source tests/test_multiconfparse.py::test_simple_argparse_source_with_prog tests/test_multiconfparse.py::test_simple_argparse_source_with_count tests/test_multiconfparse.py::test_simple_argparse_source_with_count_with_default tests/test_multiconfparse.py::test_simple_argparse_source_with_count_missing tests/test_multiconfparse.py::test_simple_argparse_source_with_count_missing_with_default tests/test_multiconfparse.py::test_json_source_with_config_added_after_source tests/test_multiconfparse.py::test_multiple_sources tests/test_multiconfparse.py::test_include_exclude tests/test_multiconfparse.py::test_getattr_or_none tests/test_multiconfparse.py::test_has_nonnone_attr
multiconfparse/__init__.py
multiconfparse/__init__.py