these 2 derivations will be built: /nix/store/3n5pam4ylqpqh2a9zhjx0hkyc73bpkc8-mcptoon-0.7.22.drv /nix/store/zfiykhk5xn87y1i65dz7p196qxbv17hp-check-mcptoon.drv building '/nix/store/3n5pam4ylqpqh2a9zhjx0hkyc73bpkc8-mcptoon-0.7.22.drv' mcptoon-0.7.22> Sourcing python-remove-tests-dir-hook mcptoon-0.7.22> Sourcing python-catch-conflicts-hook.sh mcptoon-0.7.22> Sourcing python-remove-bin-bytecode-hook.sh mcptoon-0.7.22> Sourcing pypa-build-hook mcptoon-0.7.22> Using pypaBuildPhase mcptoon-0.7.22> Sourcing python-runtime-deps-check-hook mcptoon-0.7.22> Using pythonRuntimeDepsCheckHook mcptoon-0.7.22> Sourcing pypa-install-hook mcptoon-0.7.22> Using pypaInstallPhase mcptoon-0.7.22> Sourcing python-imports-check-hook.sh mcptoon-0.7.22> Using pythonImportsCheckPhase mcptoon-0.7.22> Sourcing python-namespaces-hook mcptoon-0.7.22> Sourcing python-catch-conflicts-hook.sh mcptoon-0.7.22> Sourcing pytest-check-hook mcptoon-0.7.22> Using pytestCheckPhase mcptoon-0.7.22> Running phase: unpackPhase mcptoon-0.7.22> unpacking source archive /nix/store/gyc4j4ir5ssmqclfbg1rn4p62a9dd9a3-source mcptoon-0.7.22> source root is source mcptoon-0.7.22> setting SOURCE_DATE_EPOCH to timestamp 315619200 of file "source/tests/test_watch.py" mcptoon-0.7.22> Running phase: patchPhase mcptoon-0.7.22> Running phase: updateAutotoolsGnuConfigScriptsPhase mcptoon-0.7.22> Running phase: configurePhase mcptoon-0.7.22> no configure script, doing nothing mcptoon-0.7.22> Running phase: buildPhase mcptoon-0.7.22> Executing pypaBuildPhase mcptoon-0.7.22> Creating a wheel... mcptoon-0.7.22> pypa build flags: --no-isolation --outdir dist/ --wheel mcptoon-0.7.22> * Getting build dependencies for wheel... mcptoon-0.7.22> /nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated mcptoon-0.7.22> !! mcptoon-0.7.22> mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0). mcptoon-0.7.22> mcptoon-0.7.22> By 2027-Feb-18, you need to update your project and remove deprecated calls mcptoon-0.7.22> or your builds will no longer be supported. mcptoon-0.7.22> mcptoon-0.7.22> See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> mcptoon-0.7.22> !! mcptoon-0.7.22> corresp(dist, value, root_dir) mcptoon-0.7.22> /nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated. mcptoon-0.7.22> !! mcptoon-0.7.22> mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> Please consider removing the following classifiers in favor of a SPDX license expression: mcptoon-0.7.22> mcptoon-0.7.22> License :: OSI Approved :: Apache Software License mcptoon-0.7.22> mcptoon-0.7.22> See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> mcptoon-0.7.22> !! mcptoon-0.7.22> dist._finalize_license_expression() mcptoon-0.7.22> /nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated. mcptoon-0.7.22> !! mcptoon-0.7.22> mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> Please consider removing the following classifiers in favor of a SPDX license expression: mcptoon-0.7.22> mcptoon-0.7.22> License :: OSI Approved :: Apache Software License mcptoon-0.7.22> mcptoon-0.7.22> See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> mcptoon-0.7.22> !! mcptoon-0.7.22> self._finalize_license_expression() mcptoon-0.7.22> running egg_info mcptoon-0.7.22> creating src/mcptoon.egg-info mcptoon-0.7.22> writing src/mcptoon.egg-info/PKG-INFO mcptoon-0.7.22> writing dependency_links to src/mcptoon.egg-info/dependency_links.txt mcptoon-0.7.22> writing entry points to src/mcptoon.egg-info/entry_points.txt mcptoon-0.7.22> writing requirements to src/mcptoon.egg-info/requires.txt mcptoon-0.7.22> writing top-level names to src/mcptoon.egg-info/top_level.txt mcptoon-0.7.22> writing manifest file 'src/mcptoon.egg-info/SOURCES.txt' mcptoon-0.7.22> reading manifest file 'src/mcptoon.egg-info/SOURCES.txt' mcptoon-0.7.22> adding license file 'LICENSE' mcptoon-0.7.22> adding license file 'NOTICE' mcptoon-0.7.22> writing manifest file 'src/mcptoon.egg-info/SOURCES.txt' mcptoon-0.7.22> * Building wheel... mcptoon-0.7.22> /nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated mcptoon-0.7.22> !! mcptoon-0.7.22> mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0). mcptoon-0.7.22> mcptoon-0.7.22> By 2027-Feb-18, you need to update your project and remove deprecated calls mcptoon-0.7.22> or your builds will no longer be supported. mcptoon-0.7.22> mcptoon-0.7.22> See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> mcptoon-0.7.22> !! mcptoon-0.7.22> corresp(dist, value, root_dir) mcptoon-0.7.22> /nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated. mcptoon-0.7.22> !! mcptoon-0.7.22> mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> Please consider removing the following classifiers in favor of a SPDX license expression: mcptoon-0.7.22> mcptoon-0.7.22> License :: OSI Approved :: Apache Software License mcptoon-0.7.22> mcptoon-0.7.22> See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> mcptoon-0.7.22> !! mcptoon-0.7.22> dist._finalize_license_expression() mcptoon-0.7.22> /nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated. mcptoon-0.7.22> !! mcptoon-0.7.22> mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> Please consider removing the following classifiers in favor of a SPDX license expression: mcptoon-0.7.22> mcptoon-0.7.22> License :: OSI Approved :: Apache Software License mcptoon-0.7.22> mcptoon-0.7.22> See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> mcptoon-0.7.22> !! mcptoon-0.7.22> self._finalize_license_expression() mcptoon-0.7.22> running bdist_wheel mcptoon-0.7.22> running build mcptoon-0.7.22> running build_py mcptoon-0.7.22> creating build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/footer.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/bench.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/watch.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/health.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/installer.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/demo_server.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/cache.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/native_tools.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/config.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/__init__.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/welcome.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/router.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/schema_simplifier.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/skills.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/client.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/serve.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/packs.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/usage.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/manifest.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/sync.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/cli.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/toon_vendored.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/demo.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/__main__.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/errors.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/output.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/plugin.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/discover.py -> build/lib/mcptoon mcptoon-0.7.22> running egg_info mcptoon-0.7.22> writing src/mcptoon.egg-info/PKG-INFO mcptoon-0.7.22> writing dependency_links to src/mcptoon.egg-info/dependency_links.txt mcptoon-0.7.22> writing entry points to src/mcptoon.egg-info/entry_points.txt mcptoon-0.7.22> writing requirements to src/mcptoon.egg-info/requires.txt mcptoon-0.7.22> writing top-level names to src/mcptoon.egg-info/top_level.txt mcptoon-0.7.22> reading manifest file 'src/mcptoon.egg-info/SOURCES.txt' mcptoon-0.7.22> adding license file 'LICENSE' mcptoon-0.7.22> adding license file 'NOTICE' mcptoon-0.7.22> writing manifest file 'src/mcptoon.egg-info/SOURCES.txt' mcptoon-0.7.22> copying src/mcptoon/packs.json -> build/lib/mcptoon mcptoon-0.7.22> installing to build/bdist.linux-x86_64/wheel mcptoon-0.7.22> running install mcptoon-0.7.22> running install_lib mcptoon-0.7.22> creating build/bdist.linux-x86_64/wheel mcptoon-0.7.22> creating build/bdist.linux-x86_64/wheel/mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/router.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/native_tools.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/config.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/welcome.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/bench.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/footer.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/watch.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/cache.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/toon_vendored.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/health.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/demo_server.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/__init__.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/errors.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/manifest.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/sync.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/output.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/plugin.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/installer.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/cli.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/client.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/discover.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/schema_simplifier.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/serve.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/packs.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/packs.json -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/skills.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/usage.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/__main__.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/demo.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> running install_egg_info mcptoon-0.7.22> Copying src/mcptoon.egg-info to build/bdist.linux-x86_64/wheel/./mcptoon-0.7.22-py3.14.egg-info mcptoon-0.7.22> running install_scripts mcptoon-0.7.22> creating build/bdist.linux-x86_64/wheel/mcptoon-0.7.22.dist-info/WHEEL mcptoon-0.7.22> creating '/build/source/dist/.tmp-5f9plv2v/mcptoon-0.7.22-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it mcptoon-0.7.22> adding 'mcptoon/__init__.py' mcptoon-0.7.22> adding 'mcptoon/__main__.py' mcptoon-0.7.22> adding 'mcptoon/bench.py' mcptoon-0.7.22> adding 'mcptoon/cache.py' mcptoon-0.7.22> adding 'mcptoon/cli.py' mcptoon-0.7.22> adding 'mcptoon/client.py' mcptoon-0.7.22> adding 'mcptoon/config.py' mcptoon-0.7.22> adding 'mcptoon/demo.py' mcptoon-0.7.22> adding 'mcptoon/demo_server.py' mcptoon-0.7.22> adding 'mcptoon/discover.py' mcptoon-0.7.22> adding 'mcptoon/errors.py' mcptoon-0.7.22> adding 'mcptoon/footer.py' mcptoon-0.7.22> adding 'mcptoon/health.py' mcptoon-0.7.22> adding 'mcptoon/installer.py' mcptoon-0.7.22> adding 'mcptoon/manifest.py' mcptoon-0.7.22> adding 'mcptoon/native_tools.py' mcptoon-0.7.22> adding 'mcptoon/output.py' mcptoon-0.7.22> adding 'mcptoon/packs.json' mcptoon-0.7.22> adding 'mcptoon/packs.py' mcptoon-0.7.22> adding 'mcptoon/plugin.py' mcptoon-0.7.22> adding 'mcptoon/router.py' mcptoon-0.7.22> adding 'mcptoon/schema_simplifier.py' mcptoon-0.7.22> adding 'mcptoon/serve.py' mcptoon-0.7.22> adding 'mcptoon/skills.py' mcptoon-0.7.22> adding 'mcptoon/sync.py' mcptoon-0.7.22> adding 'mcptoon/toon_vendored.py' mcptoon-0.7.22> adding 'mcptoon/usage.py' mcptoon-0.7.22> adding 'mcptoon/watch.py' mcptoon-0.7.22> adding 'mcptoon/welcome.py' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/licenses/LICENSE' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/licenses/NOTICE' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/METADATA' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/WHEEL' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/entry_points.txt' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/top_level.txt' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/RECORD' mcptoon-0.7.22> removing build/bdist.linux-x86_64/wheel mcptoon-0.7.22> Successfully built mcptoon-0.7.22-py3-none-any.whl mcptoon-0.7.22> Finished creating a wheel... mcptoon-0.7.22> Finished executing pypaBuildPhase mcptoon-0.7.22> Running phase: pythonRuntimeDepsCheckHook mcptoon-0.7.22> Executing pythonRuntimeDepsCheck mcptoon-0.7.22> Checking runtime dependencies for mcptoon-0.7.22-py3-none-any.whl mcptoon-0.7.22> Finished executing pythonRuntimeDepsCheck mcptoon-0.7.22> Running phase: installPhase mcptoon-0.7.22> Executing pypaInstallPhase mcptoon-0.7.22> Successfully installed mcptoon-0.7.22-py3-none-any.whl mcptoon-0.7.22> Finished executing pypaInstallPhase mcptoon-0.7.22> Running phase: pythonOutputDistPhase mcptoon-0.7.22> Executing pythonOutputDistPhase mcptoon-0.7.22> Finished executing pythonOutputDistPhase mcptoon-0.7.22> Running phase: fixupPhase mcptoon-0.7.22> shrinking RPATHs of ELF executables and libraries in /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22 mcptoon-0.7.22> checking for references to /build/ in /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22... mcptoon-0.7.22> patching script interpreter paths in /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22 mcptoon-0.7.22> stripping (with command strip and flags -S -p) in /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22/lib /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22/bin mcptoon-0.7.22> shrinking RPATHs of ELF executables and libraries in /nix/store/bcbmr2dybsqljpsgwgcfnc6sp1bja6js-mcptoon-0.7.22-dist mcptoon-0.7.22> checking for references to /build/ in /nix/store/bcbmr2dybsqljpsgwgcfnc6sp1bja6js-mcptoon-0.7.22-dist... mcptoon-0.7.22> patching script interpreter paths in /nix/store/bcbmr2dybsqljpsgwgcfnc6sp1bja6js-mcptoon-0.7.22-dist mcptoon-0.7.22> Rewriting #!/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/bin/python3.14 to #!/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7 mcptoon-0.7.22> wrapping `/nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22/bin/mcptoon'... mcptoon-0.7.22> Executing pythonRemoveTestsDir mcptoon-0.7.22> Finished executing pythonRemoveTestsDir mcptoon-0.7.22> Running phase: installCheckPhase mcptoon-0.7.22> no Makefile or custom installCheckPhase, doing nothing mcptoon-0.7.22> Running phase: pythonCatchConflictsPhase mcptoon-0.7.22> Running phase: pythonRemoveBinBytecodePhase mcptoon-0.7.22> Running phase: pythonImportsCheckPhase mcptoon-0.7.22> Executing pythonImportsCheckPhase mcptoon-0.7.22> Check whether the following modules can be imported: mcptoon mcptoon-0.7.22> Running phase: pytestCheckPhase mcptoon-0.7.22> Executing pytestCheckPhase mcptoon-0.7.22> pytest flags: -m pytest mcptoon-0.7.22> ============================= test session starts ============================== mcptoon-0.7.22> platform linux -- Python 3.14.7, pytest-9.1.1, pluggy-1.6.0 mcptoon-0.7.22> rootdir: /build/source mcptoon-0.7.22> configfile: pyproject.toml mcptoon-0.7.22> testpaths: tests mcptoon-0.7.22> collected 1327 items mcptoon-0.7.22> mcptoon-0.7.22> tests/test_bench.py ............. [ 0%] mcptoon-0.7.22> tests/test_cache.py .... [ 1%] mcptoon-0.7.22> tests/test_calculator.py .......................... [ 3%] mcptoon-0.7.22> tests/test_claude_plugin_package.py ............. [ 4%] mcptoon-0.7.22> tests/test_cli_flags.py ........... [ 5%] mcptoon-0.7.22> tests/test_client.py .............................. [ 7%] mcptoon-0.7.22> tests/test_command_coverage.py ......... [ 7%] mcptoon-0.7.22> tests/test_completion.py ........ [ 8%] mcptoon-0.7.22> tests/test_config.py ......... [ 9%] mcptoon-0.7.22> tests/test_dead_server_diagnostics.py ... [ 9%] mcptoon-0.7.22> tests/test_demo.py ..................... [ 11%] mcptoon-0.7.22> tests/test_demo_dead_package.py ........ [ 11%] mcptoon-0.7.22> tests/test_demo_server.py .............................................. [ 15%] mcptoon-0.7.22> ..... [ 15%] mcptoon-0.7.22> tests/test_discover.py .................................... [ 18%] mcptoon-0.7.22> tests/test_doctor_star_hint.py ..... [ 18%] mcptoon-0.7.22> tests/test_envelope.py ........ [ 19%] mcptoon-0.7.22> tests/test_fallback_json.py ...... [ 19%] mcptoon-0.7.22> tests/test_footprint_claims.py ............ [ 20%] mcptoon-0.7.22> tests/test_gemini_manifest.py ...... [ 21%] mcptoon-0.7.22> tests/test_health.py ............. [ 22%] mcptoon-0.7.22> tests/test_help_shortcircuit.py ......... [ 22%] mcptoon-0.7.22> tests/test_http_user_agent.py ......... [ 23%] mcptoon-0.7.22> tests/test_installer_registry.py ............................ [ 25%] mcptoon-0.7.22> tests/test_lang.py .......................... [ 27%] mcptoon-0.7.22> tests/test_llms_txt.py ...... [ 27%] mcptoon-0.7.22> tests/test_native_tools.py ................................. [ 30%] mcptoon-0.7.22> tests/test_output.py ................................................... [ 34%] mcptoon-0.7.22> ........................................................................ [ 39%] mcptoon-0.7.22> ................ [ 40%] mcptoon-0.7.22> tests/test_plugin_install.py .......... [ 41%] mcptoon-0.7.22> tests/test_plugin_scan.py ............................... [ 43%] mcptoon-0.7.22> tests/test_policy_overrides.py ................ [ 45%] mcptoon-0.7.22> tests/test_presence.py .............................................. [ 48%] mcptoon-0.7.22> tests/test_readme_links.py ... [ 48%] mcptoon-0.7.22> tests/test_registry_sync.py ............ [ 49%] mcptoon-0.7.22> tests/test_reversible.py ............................................... [ 53%] mcptoon-0.7.22> ................. [ 54%] mcptoon-0.7.22> tests/test_router.py .............................................. [ 58%] mcptoon-0.7.22> tests/test_search.py ................................ [ 60%] mcptoon-0.7.22> tests/test_serve.py .................................................... [ 64%] mcptoon-0.7.22> FFF [ 64%] mcptoon-0.7.22> tests/test_serve_perf.py .......... [ 65%] mcptoon-0.7.22> tests/test_serve_prompts.py ........ [ 65%] mcptoon-0.7.22> tests/test_skill_packs.py ............... [ 67%] mcptoon-0.7.22> tests/test_skill_search.py .......... [ 67%] mcptoon-0.7.22> tests/test_skills.py ................................................... [ 71%] mcptoon-0.7.22> ........................................................................ [ 77%] mcptoon-0.7.22> .............. [ 78%] mcptoon-0.7.22> tests/test_stats_toggle.py ......... [ 78%] mcptoon-0.7.22> tests/test_stderr_pipe_deadlock.py .... [ 79%] mcptoon-0.7.22> tests/test_sync.py ................ [ 80%] mcptoon-0.7.22> tests/test_tier_claims_consistent.py .... [ 80%] mcptoon-0.7.22> tests/test_toml_config.py .......................... [ 82%] mcptoon-0.7.22> tests/test_toon_cross_validate.py ............................... [ 84%] mcptoon-0.7.22> tests/test_uninstall_end_to_end.py .......... [ 85%] mcptoon-0.7.22> tests/test_v02_features.py .................................... [ 88%] mcptoon-0.7.22> tests/test_v04_features.py ................ [ 89%] mcptoon-0.7.22> tests/test_v05_features.py ...................... [ 91%] mcptoon-0.7.22> tests/test_v072_delight.py .............s.. [ 92%] mcptoon-0.7.22> tests/test_v073_http_security.py .............................. [ 94%] mcptoon-0.7.22> tests/test_v074_stdio_timeout.py ............ [ 95%] mcptoon-0.7.22> tests/test_v076_stateless_serve.py ................... [ 97%] mcptoon-0.7.22> tests/test_v07_spec2026.py ..................... [ 98%] mcptoon-0.7.22> tests/test_watch.py .................. [100%] mcptoon-0.7.22> mcptoon-0.7.22> =================================== FAILURES =================================== mcptoon-0.7.22> _____________ TestInstallByName.test_search_registry_returns_list ______________ mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> mcptoon-0.7.22> def test_search_registry_returns_list(self): mcptoon-0.7.22> """search_registry returns a list (even on network error).""" mcptoon-0.7.22> from mcptoon.installer import search_registry mcptoon-0.7.22> > result = search_registry("nonexistent_test_keyword_xyz123") mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> mcptoon-0.7.22> tests/test_serve.py:633: mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> mcptoon-0.7.22> keyword = 'nonexistent_test_keyword_xyz123', limit = 10, strict = False mcptoon-0.7.22> mcptoon-0.7.22> def search_registry(keyword, limit=10, strict=False): mcptoon-0.7.22> """Search MCP registries for available servers. mcptoon-0.7.22> mcptoon-0.7.22> Queries both sources and merges them, best matches first — Smithery holds the mcptoon-0.7.22> hosted half, the official registry the installable-package half, and a query mcptoon-0.7.22> like "filesystem" has good answers in both. mcptoon-0.7.22> mcptoon-0.7.22> Returns: mcptoon-0.7.22> list: [{name, description, command, args, env, source, url}, ...] mcptoon-0.7.22> mcptoon-0.7.22> Raises: mcptoon-0.7.22> RegistryError: only when *every* source failed at the network level mcptoon-0.7.22> (DNS, TLS, timeout, 5xx). A genuine "no matches" still returns []. mcptoon-0.7.22> The distinction matters: the old code returned [] for both, so a dead mcptoon-0.7.22> registry was indistinguishable from an empty result. mcptoon-0.7.22> """ mcptoon-0.7.22> errors = [] mcptoon-0.7.22> merged, seen = [], set() mcptoon-0.7.22> mcptoon-0.7.22> for label, fn in (("smithery", _search_smithery), mcptoon-0.7.22> ("registry", _search_mcp_registry)): mcptoon-0.7.22> try: mcptoon-0.7.22> results = fn(keyword, limit) mcptoon-0.7.22> except Exception as e: mcptoon-0.7.22> errors.append(f"{label}: {type(e).__name__}: {str(e)[:120]}") mcptoon-0.7.22> continue mcptoon-0.7.22> for r in results: mcptoon-0.7.22> key = (r.get("name") or "").lower() mcptoon-0.7.22> if not key or key in seen or not _relevant(keyword, r): mcptoon-0.7.22> continue mcptoon-0.7.22> seen.add(key) mcptoon-0.7.22> merged.append(r) mcptoon-0.7.22> mcptoon-0.7.22> if merged: mcptoon-0.7.22> merged.sort(key=lambda r: _relevance_score(keyword, r), reverse=True) mcptoon-0.7.22> return merged[:limit] mcptoon-0.7.22> mcptoon-0.7.22> # Nothing relevant. If some source was reachable, this is a real empty result; mcptoon-0.7.22> # if none was, the network is the problem and we say so. mcptoon-0.7.22> if len(errors) == 2: mcptoon-0.7.22> > raise RegistryError( mcptoon-0.7.22> "No MCP registry reachable (" + "; ".join(errors) + "). " mcptoon-0.7.22> "Check your connection, or install directly with " mcptoon-0.7.22> "`mcptoon install --npm `." mcptoon-0.7.22> ) mcptoon-0.7.22> E mcptoon.installer.RegistryError: No MCP registry reachable (smithery: URLError: ; registry: URLError: ). Check your connection, or install directly with `mcptoon install --npm `. mcptoon-0.7.22> mcptoon-0.7.22> src/mcptoon/installer.py:171: RegistryError mcptoon-0.7.22> _____________ TestInstallByName.test_search_smithery_returns_list ______________ mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> http_class = mcptoon-0.7.22> req = mcptoon-0.7.22> http_conn_args = {'context': } mcptoon-0.7.22> mcptoon-0.7.22> def do_open(self, http_class, req, **http_conn_args): mcptoon-0.7.22> """Return an HTTPResponse object for the request, using http_class. mcptoon-0.7.22> mcptoon-0.7.22> http_class must implement the HTTPConnection API from http.client. mcptoon-0.7.22> """ mcptoon-0.7.22> host = req.host mcptoon-0.7.22> if not host: mcptoon-0.7.22> raise URLError('no host given') mcptoon-0.7.22> mcptoon-0.7.22> # will parse host:port mcptoon-0.7.22> h = http_class(host, timeout=req.timeout, **http_conn_args) mcptoon-0.7.22> h.set_debuglevel(self._debuglevel) mcptoon-0.7.22> mcptoon-0.7.22> headers = dict(req.unredirected_hdrs) mcptoon-0.7.22> headers.update(req.headers) mcptoon-0.7.22> mcptoon-0.7.22> # TODO(jhylton): Should this be redesigned to handle mcptoon-0.7.22> # persistent connections? mcptoon-0.7.22> mcptoon-0.7.22> # We want to make an HTTP/1.1 request, but the addinfourl mcptoon-0.7.22> # class isn't prepared to deal with a persistent connection. mcptoon-0.7.22> # It will try to read all remaining data from the socket, mcptoon-0.7.22> # which will block while the server waits for the next request. mcptoon-0.7.22> # So make sure the connection gets closed after the (only) mcptoon-0.7.22> # request. mcptoon-0.7.22> headers["Connection"] = "close" mcptoon-0.7.22> headers = {name.title(): val for name, val in headers.items()} mcptoon-0.7.22> mcptoon-0.7.22> if req._tunnel_host: mcptoon-0.7.22> tunnel_headers = {} mcptoon-0.7.22> proxy_auth_hdr = "Proxy-Authorization" mcptoon-0.7.22> if proxy_auth_hdr in headers: mcptoon-0.7.22> tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr] mcptoon-0.7.22> # Proxy-Authorization should not be sent to origin mcptoon-0.7.22> # server. mcptoon-0.7.22> del headers[proxy_auth_hdr] mcptoon-0.7.22> h.set_tunnel(req._tunnel_host, headers=tunnel_headers) mcptoon-0.7.22> mcptoon-0.7.22> try: mcptoon-0.7.22> try: mcptoon-0.7.22> > h.request(req.get_method(), req.selector, req.data, headers, mcptoon-0.7.22> encode_chunked=req.has_header('Transfer-encoding')) mcptoon-0.7.22> mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1320: mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1386: in request mcptoon-0.7.22> self._send_request(method, url, body, headers, encode_chunked) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1432: in _send_request mcptoon-0.7.22> self.endheaders(body, encode_chunked=encode_chunked) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1381: in endheaders mcptoon-0.7.22> self._send_output(message_body, encode_chunked=encode_chunked) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1141: in _send_output mcptoon-0.7.22> self.send(msg) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1085: in send mcptoon-0.7.22> self.connect() mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1520: in connect mcptoon-0.7.22> super().connect() mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1051: in connect mcptoon-0.7.22> self.sock = self._create_connection( mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/socket.py:850: in create_connection mcptoon-0.7.22> for res in getaddrinfo(host, port, 0, SOCK_STREAM): mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> mcptoon-0.7.22> host = 'registry.smithery.ai', port = 443, family = 0 mcptoon-0.7.22> type = , proto = 0, flags = 0 mcptoon-0.7.22> mcptoon-0.7.22> def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0): mcptoon-0.7.22> """Resolve host and port into list of address info entries. mcptoon-0.7.22> mcptoon-0.7.22> Translate the host/port argument into a sequence of 5-tuples that contain mcptoon-0.7.22> all the necessary arguments for creating a socket connected to that service. mcptoon-0.7.22> host is a domain name, a string representation of an IPv4/v6 address or mcptoon-0.7.22> None. port is a string service name such as 'http', a numeric port number or mcptoon-0.7.22> None. By passing None as the value of host and port, you can pass NULL to mcptoon-0.7.22> the underlying C API. mcptoon-0.7.22> mcptoon-0.7.22> The family, type and proto arguments can be optionally specified in order to mcptoon-0.7.22> narrow the list of addresses returned. Passing zero as a value for each of mcptoon-0.7.22> these arguments selects the full range of results. mcptoon-0.7.22> """ mcptoon-0.7.22> # We override this function since we want to translate the numeric family mcptoon-0.7.22> # and socket type values to enum constants. mcptoon-0.7.22> addrlist = [] mcptoon-0.7.22> > for res in _socket.getaddrinfo(host, port, family, type, proto, flags): mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> E socket.gaierror: [Errno -3] Temporary failure in name resolution mcptoon-0.7.22> mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/socket.py:989: gaierror mcptoon-0.7.22> mcptoon-0.7.22> During handling of the above exception, another exception occurred: mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> mcptoon-0.7.22> def test_search_smithery_returns_list(self): mcptoon-0.7.22> """_search_smithery returns a list.""" mcptoon-0.7.22> from mcptoon.installer import _search_smithery mcptoon-0.7.22> > result = _search_smithery("test") mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> mcptoon-0.7.22> tests/test_serve.py:639: mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> src/mcptoon/installer.py:194: in _search_smithery mcptoon-0.7.22> data = _fetch_json(f"{SMITHERY_API_URL}/servers?{params}") mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> src/mcptoon/installer.py:186: in _fetch_json mcptoon-0.7.22> with urllib.request.urlopen(req, timeout=timeout) as resp: mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:187: in urlopen mcptoon-0.7.22> return opener.open(url, data, timeout) mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:487: in open mcptoon-0.7.22> response = self._open(req, data) mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:504: in _open mcptoon-0.7.22> result = self._call_chain(self.handle_open, protocol, protocol + mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:464: in _call_chain mcptoon-0.7.22> result = func(*args) mcptoon-0.7.22> ^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1368: in https_open mcptoon-0.7.22> return self.do_open(http.client.HTTPSConnection, req, mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> http_class = mcptoon-0.7.22> req = mcptoon-0.7.22> http_conn_args = {'context': } mcptoon-0.7.22> mcptoon-0.7.22> def do_open(self, http_class, req, **http_conn_args): mcptoon-0.7.22> """Return an HTTPResponse object for the request, using http_class. mcptoon-0.7.22> mcptoon-0.7.22> http_class must implement the HTTPConnection API from http.client. mcptoon-0.7.22> """ mcptoon-0.7.22> host = req.host mcptoon-0.7.22> if not host: mcptoon-0.7.22> raise URLError('no host given') mcptoon-0.7.22> mcptoon-0.7.22> # will parse host:port mcptoon-0.7.22> h = http_class(host, timeout=req.timeout, **http_conn_args) mcptoon-0.7.22> h.set_debuglevel(self._debuglevel) mcptoon-0.7.22> mcptoon-0.7.22> headers = dict(req.unredirected_hdrs) mcptoon-0.7.22> headers.update(req.headers) mcptoon-0.7.22> mcptoon-0.7.22> # TODO(jhylton): Should this be redesigned to handle mcptoon-0.7.22> # persistent connections? mcptoon-0.7.22> mcptoon-0.7.22> # We want to make an HTTP/1.1 request, but the addinfourl mcptoon-0.7.22> # class isn't prepared to deal with a persistent connection. mcptoon-0.7.22> # It will try to read all remaining data from the socket, mcptoon-0.7.22> # which will block while the server waits for the next request. mcptoon-0.7.22> # So make sure the connection gets closed after the (only) mcptoon-0.7.22> # request. mcptoon-0.7.22> headers["Connection"] = "close" mcptoon-0.7.22> headers = {name.title(): val for name, val in headers.items()} mcptoon-0.7.22> mcptoon-0.7.22> if req._tunnel_host: mcptoon-0.7.22> tunnel_headers = {} mcptoon-0.7.22> proxy_auth_hdr = "Proxy-Authorization" mcptoon-0.7.22> if proxy_auth_hdr in headers: mcptoon-0.7.22> tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr] mcptoon-0.7.22> # Proxy-Authorization should not be sent to origin mcptoon-0.7.22> # server. mcptoon-0.7.22> del headers[proxy_auth_hdr] mcptoon-0.7.22> h.set_tunnel(req._tunnel_host, headers=tunnel_headers) mcptoon-0.7.22> mcptoon-0.7.22> try: mcptoon-0.7.22> try: mcptoon-0.7.22> h.request(req.get_method(), req.selector, req.data, headers, mcptoon-0.7.22> encode_chunked=req.has_header('Transfer-encoding')) mcptoon-0.7.22> except OSError as err: # timeout error mcptoon-0.7.22> > raise URLError(err) mcptoon-0.7.22> E urllib.error.URLError: mcptoon-0.7.22> mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1323: URLError mcptoon-0.7.22> ___________ TestInstallByName.test_search_mcp_registry_returns_list ____________ mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> http_class = mcptoon-0.7.22> req = mcptoon-0.7.22> http_conn_args = {'context': } mcptoon-0.7.22> mcptoon-0.7.22> def do_open(self, http_class, req, **http_conn_args): mcptoon-0.7.22> """Return an HTTPResponse object for the request, using http_class. mcptoon-0.7.22> mcptoon-0.7.22> http_class must implement the HTTPConnection API from http.client. mcptoon-0.7.22> """ mcptoon-0.7.22> host = req.host mcptoon-0.7.22> if not host: mcptoon-0.7.22> raise URLError('no host given') mcptoon-0.7.22> mcptoon-0.7.22> # will parse host:port mcptoon-0.7.22> h = http_class(host, timeout=req.timeout, **http_conn_args) mcptoon-0.7.22> h.set_debuglevel(self._debuglevel) mcptoon-0.7.22> mcptoon-0.7.22> headers = dict(req.unredirected_hdrs) mcptoon-0.7.22> headers.update(req.headers) mcptoon-0.7.22> mcptoon-0.7.22> # TODO(jhylton): Should this be redesigned to handle mcptoon-0.7.22> # persistent connections? mcptoon-0.7.22> mcptoon-0.7.22> # We want to make an HTTP/1.1 request, but the addinfourl mcptoon-0.7.22> # class isn't prepared to deal with a persistent connection. mcptoon-0.7.22> # It will try to read all remaining data from the socket, mcptoon-0.7.22> # which will block while the server waits for the next request. mcptoon-0.7.22> # So make sure the connection gets closed after the (only) mcptoon-0.7.22> # request. mcptoon-0.7.22> headers["Connection"] = "close" mcptoon-0.7.22> headers = {name.title(): val for name, val in headers.items()} mcptoon-0.7.22> mcptoon-0.7.22> if req._tunnel_host: mcptoon-0.7.22> tunnel_headers = {} mcptoon-0.7.22> proxy_auth_hdr = "Proxy-Authorization" mcptoon-0.7.22> if proxy_auth_hdr in headers: mcptoon-0.7.22> tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr] mcptoon-0.7.22> # Proxy-Authorization should not be sent to origin mcptoon-0.7.22> # server. mcptoon-0.7.22> del headers[proxy_auth_hdr] mcptoon-0.7.22> h.set_tunnel(req._tunnel_host, headers=tunnel_headers) mcptoon-0.7.22> mcptoon-0.7.22> try: mcptoon-0.7.22> try: mcptoon-0.7.22> > h.request(req.get_method(), req.selector, req.data, headers, mcptoon-0.7.22> encode_chunked=req.has_header('Transfer-encoding')) mcptoon-0.7.22> mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1320: mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1386: in request mcptoon-0.7.22> self._send_request(method, url, body, headers, encode_chunked) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1432: in _send_request mcptoon-0.7.22> self.endheaders(body, encode_chunked=encode_chunked) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1381: in endheaders mcptoon-0.7.22> self._send_output(message_body, encode_chunked=encode_chunked) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1141: in _send_output mcptoon-0.7.22> self.send(msg) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1085: in send mcptoon-0.7.22> self.connect() mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1520: in connect mcptoon-0.7.22> super().connect() mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1051: in connect mcptoon-0.7.22> self.sock = self._create_connection( mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/socket.py:850: in create_connection mcptoon-0.7.22> for res in getaddrinfo(host, port, 0, SOCK_STREAM): mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> mcptoon-0.7.22> host = 'registry.modelcontextprotocol.io', port = 443, family = 0 mcptoon-0.7.22> type = , proto = 0, flags = 0 mcptoon-0.7.22> mcptoon-0.7.22> def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0): mcptoon-0.7.22> """Resolve host and port into list of address info entries. mcptoon-0.7.22> mcptoon-0.7.22> Translate the host/port argument into a sequence of 5-tuples that contain mcptoon-0.7.22> all the necessary arguments for creating a socket connected to that service. mcptoon-0.7.22> host is a domain name, a string representation of an IPv4/v6 address or mcptoon-0.7.22> None. port is a string service name such as 'http', a numeric port number or mcptoon-0.7.22> None. By passing None as the value of host and port, you can pass NULL to mcptoon-0.7.22> the underlying C API. mcptoon-0.7.22> mcptoon-0.7.22> The family, type and proto arguments can be optionally specified in order to mcptoon-0.7.22> narrow the list of addresses returned. Passing zero as a value for each of mcptoon-0.7.22> these arguments selects the full range of results. mcptoon-0.7.22> """ mcptoon-0.7.22> # We override this function since we want to translate the numeric family mcptoon-0.7.22> # and socket type values to enum constants. mcptoon-0.7.22> addrlist = [] mcptoon-0.7.22> > for res in _socket.getaddrinfo(host, port, family, type, proto, flags): mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> E socket.gaierror: [Errno -3] Temporary failure in name resolution mcptoon-0.7.22> mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/socket.py:989: gaierror mcptoon-0.7.22> mcptoon-0.7.22> During handling of the above exception, another exception occurred: mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> mcptoon-0.7.22> def test_search_mcp_registry_returns_list(self): mcptoon-0.7.22> """_search_mcp_registry returns a list.""" mcptoon-0.7.22> from mcptoon.installer import _search_mcp_registry mcptoon-0.7.22> > result = _search_mcp_registry("test") mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> mcptoon-0.7.22> tests/test_serve.py:645: mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> src/mcptoon/installer.py:235: in _search_mcp_registry mcptoon-0.7.22> data = _fetch_json(f"{MCP_REGISTRY_URL}/servers?{params}") mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> src/mcptoon/installer.py:186: in _fetch_json mcptoon-0.7.22> with urllib.request.urlopen(req, timeout=timeout) as resp: mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:187: in urlopen mcptoon-0.7.22> return opener.open(url, data, timeout) mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:487: in open mcptoon-0.7.22> response = self._open(req, data) mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:504: in _open mcptoon-0.7.22> result = self._call_chain(self.handle_open, protocol, protocol + mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:464: in _call_chain mcptoon-0.7.22> result = func(*args) mcptoon-0.7.22> ^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1368: in https_open mcptoon-0.7.22> return self.do_open(http.client.HTTPSConnection, req, mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> http_class = mcptoon-0.7.22> req = mcptoon-0.7.22> http_conn_args = {'context': } mcptoon-0.7.22> mcptoon-0.7.22> def do_open(self, http_class, req, **http_conn_args): mcptoon-0.7.22> """Return an HTTPResponse object for the request, using http_class. mcptoon-0.7.22> mcptoon-0.7.22> http_class must implement the HTTPConnection API from http.client. mcptoon-0.7.22> """ mcptoon-0.7.22> host = req.host mcptoon-0.7.22> if not host: mcptoon-0.7.22> raise URLError('no host given') mcptoon-0.7.22> mcptoon-0.7.22> # will parse host:port mcptoon-0.7.22> h = http_class(host, timeout=req.timeout, **http_conn_args) mcptoon-0.7.22> h.set_debuglevel(self._debuglevel) mcptoon-0.7.22> mcptoon-0.7.22> headers = dict(req.unredirected_hdrs) mcptoon-0.7.22> headers.update(req.headers) mcptoon-0.7.22> mcptoon-0.7.22> # TODO(jhylton): Should this be redesigned to handle mcptoon-0.7.22> # persistent connections? mcptoon-0.7.22> mcptoon-0.7.22> # We want to make an HTTP/1.1 request, but the addinfourl mcptoon-0.7.22> # class isn't prepared to deal with a persistent connection. mcptoon-0.7.22> # It will try to read all remaining data from the socket, mcptoon-0.7.22> # which will block while the server waits for the next request. mcptoon-0.7.22> # So make sure the connection gets closed after the (only) mcptoon-0.7.22> # request. mcptoon-0.7.22> headers["Connection"] = "close" mcptoon-0.7.22> headers = {name.title(): val for name, val in headers.items()} mcptoon-0.7.22> mcptoon-0.7.22> if req._tunnel_host: mcptoon-0.7.22> tunnel_headers = {} mcptoon-0.7.22> proxy_auth_hdr = "Proxy-Authorization" mcptoon-0.7.22> if proxy_auth_hdr in headers: mcptoon-0.7.22> tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr] mcptoon-0.7.22> # Proxy-Authorization should not be sent to origin mcptoon-0.7.22> # server. mcptoon-0.7.22> del headers[proxy_auth_hdr] mcptoon-0.7.22> h.set_tunnel(req._tunnel_host, headers=tunnel_headers) mcptoon-0.7.22> mcptoon-0.7.22> try: mcptoon-0.7.22> try: mcptoon-0.7.22> h.request(req.get_method(), req.selector, req.data, headers, mcptoon-0.7.22> encode_chunked=req.has_header('Transfer-encoding')) mcptoon-0.7.22> except OSError as err: # timeout error mcptoon-0.7.22> > raise URLError(err) mcptoon-0.7.22> E urllib.error.URLError: mcptoon-0.7.22> mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1323: URLError mcptoon-0.7.22> =========================== short test summary info ============================ mcptoon-0.7.22> FAILED tests/test_serve.py::TestInstallByName::test_search_registry_returns_list - mcptoon.installer.RegistryError: No MCP registry reachable (smithery: URLEr... mcptoon-0.7.22> FAILED tests/test_serve.py::TestInstallByName::test_search_smithery_returns_list - urllib.error.URLError: FAILED tests/test_serve.py::TestInstallByName::test_search_mcp_registry_returns_list - urllib.error.URLError: ============= 3 failed, 1323 passed, 1 skipped in 68.17s (0:01:08) ============= error: Cannot build '/nix/store/3n5pam4ylqpqh2a9zhjx0hkyc73bpkc8-mcptoon-0.7.22.drv'. Reason: builder failed with exit code 1. Output paths: /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22 /nix/store/bcbmr2dybsqljpsgwgcfnc6sp1bja6js-mcptoon-0.7.22-dist Last 25 log lines: > > if req._tunnel_host: > tunnel_headers = {} > proxy_auth_hdr = "Proxy-Authorization" > if proxy_auth_hdr in headers: > tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr] > # Proxy-Authorization should not be sent to origin > # server. > del headers[proxy_auth_hdr] > h.set_tunnel(req._tunnel_host, headers=tunnel_headers) > > try: > try: > h.request(req.get_method(), req.selector, req.data, headers, > encode_chunked=req.has_header('Transfer-encoding')) > except OSError as err: # timeout error > > raise URLError(err) > E urllib.error.URLError: > > /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1323: URLError > =========================== short test summary info ============================ > FAILED tests/test_serve.py::TestInstallByName::test_search_registry_returns_list - mcptoon.installer.RegistryError: No MCP registry reachable (smithery: URLEr... > FAILED tests/test_serve.py::TestInstallByName::test_search_smithery_returns_list - urllib.error.URLError: FAILED tests/test_serve.py::TestInstallByName::test_search_mcp_registry_returns_list - urllib.error.URLError: ============= 3 failed, 1323 passed, 1 skipped in 68.17s (0:01:08) ============= For full logs, run: nix log /nix/store/3n5pam4ylqpqh2a9zhjx0hkyc73bpkc8-mcptoon-0.7.22.drv error: Cannot build '/nix/store/zfiykhk5xn87y1i65dz7p196qxbv17hp-check-mcptoon.drv'. Reason: 1 dependency failed. Output paths: /nix/store/3wi2g6yfi8afwidngy24kg0a2mxb9g0m-check-mcptoon nixbot: transient error detected, retrying once these 2 derivations will be built: /nix/store/3n5pam4ylqpqh2a9zhjx0hkyc73bpkc8-mcptoon-0.7.22.drv /nix/store/zfiykhk5xn87y1i65dz7p196qxbv17hp-check-mcptoon.drv building '/nix/store/3n5pam4ylqpqh2a9zhjx0hkyc73bpkc8-mcptoon-0.7.22.drv' mcptoon-0.7.22> Sourcing python-remove-tests-dir-hook mcptoon-0.7.22> Sourcing python-catch-conflicts-hook.sh mcptoon-0.7.22> Sourcing python-remove-bin-bytecode-hook.sh mcptoon-0.7.22> Sourcing pypa-build-hook mcptoon-0.7.22> Using pypaBuildPhase mcptoon-0.7.22> Sourcing python-runtime-deps-check-hook mcptoon-0.7.22> Using pythonRuntimeDepsCheckHook mcptoon-0.7.22> Sourcing pypa-install-hook mcptoon-0.7.22> Using pypaInstallPhase mcptoon-0.7.22> Sourcing python-imports-check-hook.sh mcptoon-0.7.22> Using pythonImportsCheckPhase mcptoon-0.7.22> Sourcing python-namespaces-hook mcptoon-0.7.22> Sourcing python-catch-conflicts-hook.sh mcptoon-0.7.22> Sourcing pytest-check-hook mcptoon-0.7.22> Using pytestCheckPhase mcptoon-0.7.22> Running phase: unpackPhase mcptoon-0.7.22> unpacking source archive /nix/store/gyc4j4ir5ssmqclfbg1rn4p62a9dd9a3-source mcptoon-0.7.22> source root is source mcptoon-0.7.22> setting SOURCE_DATE_EPOCH to timestamp 315619200 of file "source/tests/test_watch.py" mcptoon-0.7.22> Running phase: patchPhase mcptoon-0.7.22> Running phase: updateAutotoolsGnuConfigScriptsPhase mcptoon-0.7.22> Running phase: configurePhase mcptoon-0.7.22> no configure script, doing nothing mcptoon-0.7.22> Running phase: buildPhase mcptoon-0.7.22> Executing pypaBuildPhase mcptoon-0.7.22> Creating a wheel... mcptoon-0.7.22> pypa build flags: --no-isolation --outdir dist/ --wheel mcptoon-0.7.22> * Getting build dependencies for wheel... mcptoon-0.7.22> /nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated mcptoon-0.7.22> !! mcptoon-0.7.22> mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0). mcptoon-0.7.22> mcptoon-0.7.22> By 2027-Feb-18, you need to update your project and remove deprecated calls mcptoon-0.7.22> or your builds will no longer be supported. mcptoon-0.7.22> mcptoon-0.7.22> See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> mcptoon-0.7.22> !! mcptoon-0.7.22> corresp(dist, value, root_dir) mcptoon-0.7.22> /nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated. mcptoon-0.7.22> !! mcptoon-0.7.22> mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> Please consider removing the following classifiers in favor of a SPDX license expression: mcptoon-0.7.22> mcptoon-0.7.22> License :: OSI Approved :: Apache Software License mcptoon-0.7.22> mcptoon-0.7.22> See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> mcptoon-0.7.22> !! mcptoon-0.7.22> dist._finalize_license_expression() mcptoon-0.7.22> /nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated. mcptoon-0.7.22> !! mcptoon-0.7.22> mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> Please consider removing the following classifiers in favor of a SPDX license expression: mcptoon-0.7.22> mcptoon-0.7.22> License :: OSI Approved :: Apache Software License mcptoon-0.7.22> mcptoon-0.7.22> See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> mcptoon-0.7.22> !! mcptoon-0.7.22> self._finalize_license_expression() mcptoon-0.7.22> running egg_info mcptoon-0.7.22> creating src/mcptoon.egg-info mcptoon-0.7.22> writing src/mcptoon.egg-info/PKG-INFO mcptoon-0.7.22> writing dependency_links to src/mcptoon.egg-info/dependency_links.txt mcptoon-0.7.22> writing entry points to src/mcptoon.egg-info/entry_points.txt mcptoon-0.7.22> writing requirements to src/mcptoon.egg-info/requires.txt mcptoon-0.7.22> writing top-level names to src/mcptoon.egg-info/top_level.txt mcptoon-0.7.22> writing manifest file 'src/mcptoon.egg-info/SOURCES.txt' mcptoon-0.7.22> reading manifest file 'src/mcptoon.egg-info/SOURCES.txt' mcptoon-0.7.22> adding license file 'LICENSE' mcptoon-0.7.22> adding license file 'NOTICE' mcptoon-0.7.22> writing manifest file 'src/mcptoon.egg-info/SOURCES.txt' mcptoon-0.7.22> * Building wheel... mcptoon-0.7.22> /nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated mcptoon-0.7.22> !! mcptoon-0.7.22> mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0). mcptoon-0.7.22> mcptoon-0.7.22> By 2027-Feb-18, you need to update your project and remove deprecated calls mcptoon-0.7.22> or your builds will no longer be supported. mcptoon-0.7.22> mcptoon-0.7.22> See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> mcptoon-0.7.22> !! mcptoon-0.7.22> corresp(dist, value, root_dir) mcptoon-0.7.22> /nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated. mcptoon-0.7.22> !! mcptoon-0.7.22> mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> Please consider removing the following classifiers in favor of a SPDX license expression: mcptoon-0.7.22> mcptoon-0.7.22> License :: OSI Approved :: Apache Software License mcptoon-0.7.22> mcptoon-0.7.22> See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> mcptoon-0.7.22> !! mcptoon-0.7.22> dist._finalize_license_expression() mcptoon-0.7.22> /nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated. mcptoon-0.7.22> !! mcptoon-0.7.22> mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> Please consider removing the following classifiers in favor of a SPDX license expression: mcptoon-0.7.22> mcptoon-0.7.22> License :: OSI Approved :: Apache Software License mcptoon-0.7.22> mcptoon-0.7.22> See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. mcptoon-0.7.22> ******************************************************************************** mcptoon-0.7.22> mcptoon-0.7.22> !! mcptoon-0.7.22> self._finalize_license_expression() mcptoon-0.7.22> running bdist_wheel mcptoon-0.7.22> running build mcptoon-0.7.22> running build_py mcptoon-0.7.22> creating build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/packs.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/serve.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/usage.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/cli.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/client.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/__init__.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/skills.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/plugin.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/output.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/errors.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/installer.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/sync.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/bench.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/health.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/schema_simplifier.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/watch.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/discover.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/toon_vendored.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/native_tools.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/cache.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/footer.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/__main__.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/manifest.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/router.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/demo_server.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/demo.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/welcome.py -> build/lib/mcptoon mcptoon-0.7.22> copying src/mcptoon/config.py -> build/lib/mcptoon mcptoon-0.7.22> running egg_info mcptoon-0.7.22> writing src/mcptoon.egg-info/PKG-INFO mcptoon-0.7.22> writing dependency_links to src/mcptoon.egg-info/dependency_links.txt mcptoon-0.7.22> writing entry points to src/mcptoon.egg-info/entry_points.txt mcptoon-0.7.22> writing requirements to src/mcptoon.egg-info/requires.txt mcptoon-0.7.22> writing top-level names to src/mcptoon.egg-info/top_level.txt mcptoon-0.7.22> reading manifest file 'src/mcptoon.egg-info/SOURCES.txt' mcptoon-0.7.22> adding license file 'LICENSE' mcptoon-0.7.22> adding license file 'NOTICE' mcptoon-0.7.22> writing manifest file 'src/mcptoon.egg-info/SOURCES.txt' mcptoon-0.7.22> copying src/mcptoon/packs.json -> build/lib/mcptoon mcptoon-0.7.22> installing to build/bdist.linux-x86_64/wheel mcptoon-0.7.22> running install mcptoon-0.7.22> running install_lib mcptoon-0.7.22> creating build/bdist.linux-x86_64/wheel mcptoon-0.7.22> creating build/bdist.linux-x86_64/wheel/mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/errors.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/output.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/plugin.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/demo.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/manifest.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/packs.json -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/client.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/__main__.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/toon_vendored.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/watch.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/sync.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/bench.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/skills.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/cache.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/discover.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/installer.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/router.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/cli.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/config.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/schema_simplifier.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/demo_server.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/welcome.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/__init__.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/native_tools.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/serve.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/packs.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/footer.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/usage.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> copying build/lib/mcptoon/health.py -> build/bdist.linux-x86_64/wheel/./mcptoon mcptoon-0.7.22> running install_egg_info mcptoon-0.7.22> Copying src/mcptoon.egg-info to build/bdist.linux-x86_64/wheel/./mcptoon-0.7.22-py3.14.egg-info mcptoon-0.7.22> running install_scripts mcptoon-0.7.22> creating build/bdist.linux-x86_64/wheel/mcptoon-0.7.22.dist-info/WHEEL mcptoon-0.7.22> creating '/build/source/dist/.tmp-dyf9s626/mcptoon-0.7.22-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it mcptoon-0.7.22> adding 'mcptoon/__init__.py' mcptoon-0.7.22> adding 'mcptoon/__main__.py' mcptoon-0.7.22> adding 'mcptoon/bench.py' mcptoon-0.7.22> adding 'mcptoon/cache.py' mcptoon-0.7.22> adding 'mcptoon/cli.py' mcptoon-0.7.22> adding 'mcptoon/client.py' mcptoon-0.7.22> adding 'mcptoon/config.py' mcptoon-0.7.22> adding 'mcptoon/demo.py' mcptoon-0.7.22> adding 'mcptoon/demo_server.py' mcptoon-0.7.22> adding 'mcptoon/discover.py' mcptoon-0.7.22> adding 'mcptoon/errors.py' mcptoon-0.7.22> adding 'mcptoon/footer.py' mcptoon-0.7.22> adding 'mcptoon/health.py' mcptoon-0.7.22> adding 'mcptoon/installer.py' mcptoon-0.7.22> adding 'mcptoon/manifest.py' mcptoon-0.7.22> adding 'mcptoon/native_tools.py' mcptoon-0.7.22> adding 'mcptoon/output.py' mcptoon-0.7.22> adding 'mcptoon/packs.json' mcptoon-0.7.22> adding 'mcptoon/packs.py' mcptoon-0.7.22> adding 'mcptoon/plugin.py' mcptoon-0.7.22> adding 'mcptoon/router.py' mcptoon-0.7.22> adding 'mcptoon/schema_simplifier.py' mcptoon-0.7.22> adding 'mcptoon/serve.py' mcptoon-0.7.22> adding 'mcptoon/skills.py' mcptoon-0.7.22> adding 'mcptoon/sync.py' mcptoon-0.7.22> adding 'mcptoon/toon_vendored.py' mcptoon-0.7.22> adding 'mcptoon/usage.py' mcptoon-0.7.22> adding 'mcptoon/watch.py' mcptoon-0.7.22> adding 'mcptoon/welcome.py' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/licenses/LICENSE' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/licenses/NOTICE' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/METADATA' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/WHEEL' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/entry_points.txt' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/top_level.txt' mcptoon-0.7.22> adding 'mcptoon-0.7.22.dist-info/RECORD' mcptoon-0.7.22> removing build/bdist.linux-x86_64/wheel mcptoon-0.7.22> Successfully built mcptoon-0.7.22-py3-none-any.whl mcptoon-0.7.22> Finished creating a wheel... mcptoon-0.7.22> Finished executing pypaBuildPhase mcptoon-0.7.22> Running phase: pythonRuntimeDepsCheckHook mcptoon-0.7.22> Executing pythonRuntimeDepsCheck mcptoon-0.7.22> Checking runtime dependencies for mcptoon-0.7.22-py3-none-any.whl mcptoon-0.7.22> Finished executing pythonRuntimeDepsCheck mcptoon-0.7.22> Running phase: installPhase mcptoon-0.7.22> Executing pypaInstallPhase mcptoon-0.7.22> Successfully installed mcptoon-0.7.22-py3-none-any.whl mcptoon-0.7.22> Finished executing pypaInstallPhase mcptoon-0.7.22> Running phase: pythonOutputDistPhase mcptoon-0.7.22> Executing pythonOutputDistPhase mcptoon-0.7.22> Finished executing pythonOutputDistPhase mcptoon-0.7.22> Running phase: fixupPhase mcptoon-0.7.22> shrinking RPATHs of ELF executables and libraries in /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22 mcptoon-0.7.22> checking for references to /build/ in /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22... mcptoon-0.7.22> patching script interpreter paths in /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22 mcptoon-0.7.22> stripping (with command strip and flags -S -p) in /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22/lib /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22/bin mcptoon-0.7.22> shrinking RPATHs of ELF executables and libraries in /nix/store/bcbmr2dybsqljpsgwgcfnc6sp1bja6js-mcptoon-0.7.22-dist mcptoon-0.7.22> checking for references to /build/ in /nix/store/bcbmr2dybsqljpsgwgcfnc6sp1bja6js-mcptoon-0.7.22-dist... mcptoon-0.7.22> patching script interpreter paths in /nix/store/bcbmr2dybsqljpsgwgcfnc6sp1bja6js-mcptoon-0.7.22-dist mcptoon-0.7.22> Rewriting #!/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/bin/python3.14 to #!/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7 mcptoon-0.7.22> wrapping `/nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22/bin/mcptoon'... mcptoon-0.7.22> Executing pythonRemoveTestsDir mcptoon-0.7.22> Finished executing pythonRemoveTestsDir mcptoon-0.7.22> Running phase: installCheckPhase mcptoon-0.7.22> no Makefile or custom installCheckPhase, doing nothing mcptoon-0.7.22> Running phase: pythonCatchConflictsPhase mcptoon-0.7.22> Running phase: pythonRemoveBinBytecodePhase mcptoon-0.7.22> Running phase: pythonImportsCheckPhase mcptoon-0.7.22> Executing pythonImportsCheckPhase mcptoon-0.7.22> Check whether the following modules can be imported: mcptoon mcptoon-0.7.22> Running phase: pytestCheckPhase mcptoon-0.7.22> Executing pytestCheckPhase mcptoon-0.7.22> pytest flags: -m pytest mcptoon-0.7.22> ============================= test session starts ============================== mcptoon-0.7.22> platform linux -- Python 3.14.7, pytest-9.1.1, pluggy-1.6.0 mcptoon-0.7.22> rootdir: /build/source mcptoon-0.7.22> configfile: pyproject.toml mcptoon-0.7.22> testpaths: tests mcptoon-0.7.22> collected 1327 items mcptoon-0.7.22> mcptoon-0.7.22> tests/test_bench.py ............. [ 0%] mcptoon-0.7.22> tests/test_cache.py .... [ 1%] mcptoon-0.7.22> tests/test_calculator.py .......................... [ 3%] mcptoon-0.7.22> tests/test_claude_plugin_package.py ............. [ 4%] mcptoon-0.7.22> tests/test_cli_flags.py ........... [ 5%] mcptoon-0.7.22> tests/test_client.py .............................. [ 7%] mcptoon-0.7.22> tests/test_command_coverage.py ......... [ 7%] mcptoon-0.7.22> tests/test_completion.py ........ [ 8%] mcptoon-0.7.22> tests/test_config.py ......... [ 9%] mcptoon-0.7.22> tests/test_dead_server_diagnostics.py ... [ 9%] mcptoon-0.7.22> tests/test_demo.py ..................... [ 11%] mcptoon-0.7.22> tests/test_demo_dead_package.py ........ [ 11%] mcptoon-0.7.22> tests/test_demo_server.py .............................................. [ 15%] mcptoon-0.7.22> ..... [ 15%] mcptoon-0.7.22> tests/test_discover.py .................................... [ 18%] mcptoon-0.7.22> tests/test_doctor_star_hint.py ..... [ 18%] mcptoon-0.7.22> tests/test_envelope.py ........ [ 19%] mcptoon-0.7.22> tests/test_fallback_json.py ...... [ 19%] mcptoon-0.7.22> tests/test_footprint_claims.py ............ [ 20%] mcptoon-0.7.22> tests/test_gemini_manifest.py ...... [ 21%] mcptoon-0.7.22> tests/test_health.py ............. [ 22%] mcptoon-0.7.22> tests/test_help_shortcircuit.py ......... [ 22%] mcptoon-0.7.22> tests/test_http_user_agent.py ......... [ 23%] mcptoon-0.7.22> tests/test_installer_registry.py ............................ [ 25%] mcptoon-0.7.22> tests/test_lang.py .......................... [ 27%] mcptoon-0.7.22> tests/test_llms_txt.py ...... [ 27%] mcptoon-0.7.22> tests/test_native_tools.py ................................. [ 30%] mcptoon-0.7.22> tests/test_output.py ................................................... [ 34%] mcptoon-0.7.22> ........................................................................ [ 39%] mcptoon-0.7.22> ................ [ 40%] mcptoon-0.7.22> tests/test_plugin_install.py .......... [ 41%] mcptoon-0.7.22> tests/test_plugin_scan.py ............................... [ 43%] mcptoon-0.7.22> tests/test_policy_overrides.py ................ [ 45%] mcptoon-0.7.22> tests/test_presence.py .............................................. [ 48%] mcptoon-0.7.22> tests/test_readme_links.py ... [ 48%] mcptoon-0.7.22> tests/test_registry_sync.py ............ [ 49%] mcptoon-0.7.22> tests/test_reversible.py ............................................... [ 53%] mcptoon-0.7.22> ................. [ 54%] mcptoon-0.7.22> tests/test_router.py .............................................. [ 58%] mcptoon-0.7.22> tests/test_search.py ................................ [ 60%] mcptoon-0.7.22> tests/test_serve.py .................................................... [ 64%] mcptoon-0.7.22> FFF [ 64%] mcptoon-0.7.22> tests/test_serve_perf.py .......... [ 65%] mcptoon-0.7.22> tests/test_serve_prompts.py ........ [ 65%] mcptoon-0.7.22> tests/test_skill_packs.py ............... [ 67%] mcptoon-0.7.22> tests/test_skill_search.py .......... [ 67%] mcptoon-0.7.22> tests/test_skills.py ................................................... [ 71%] mcptoon-0.7.22> ........................................................................ [ 77%] mcptoon-0.7.22> .............. [ 78%] mcptoon-0.7.22> tests/test_stats_toggle.py ......... [ 78%] mcptoon-0.7.22> tests/test_stderr_pipe_deadlock.py .... [ 79%] mcptoon-0.7.22> tests/test_sync.py ................ [ 80%] mcptoon-0.7.22> tests/test_tier_claims_consistent.py .... [ 80%] mcptoon-0.7.22> tests/test_toml_config.py .......................... [ 82%] mcptoon-0.7.22> tests/test_toon_cross_validate.py ............................... [ 84%] mcptoon-0.7.22> tests/test_uninstall_end_to_end.py .......... [ 85%] mcptoon-0.7.22> tests/test_v02_features.py .................................... [ 88%] mcptoon-0.7.22> tests/test_v04_features.py ................ [ 89%] mcptoon-0.7.22> tests/test_v05_features.py ...................... [ 91%] mcptoon-0.7.22> tests/test_v072_delight.py .............s.. [ 92%] mcptoon-0.7.22> tests/test_v073_http_security.py .............................. [ 94%] mcptoon-0.7.22> tests/test_v074_stdio_timeout.py ............ [ 95%] mcptoon-0.7.22> tests/test_v076_stateless_serve.py ................... [ 97%] mcptoon-0.7.22> tests/test_v07_spec2026.py ..................... [ 98%] mcptoon-0.7.22> tests/test_watch.py .................. [100%] mcptoon-0.7.22> mcptoon-0.7.22> =================================== FAILURES =================================== mcptoon-0.7.22> _____________ TestInstallByName.test_search_registry_returns_list ______________ mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> mcptoon-0.7.22> def test_search_registry_returns_list(self): mcptoon-0.7.22> """search_registry returns a list (even on network error).""" mcptoon-0.7.22> from mcptoon.installer import search_registry mcptoon-0.7.22> > result = search_registry("nonexistent_test_keyword_xyz123") mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> mcptoon-0.7.22> tests/test_serve.py:633: mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> mcptoon-0.7.22> keyword = 'nonexistent_test_keyword_xyz123', limit = 10, strict = False mcptoon-0.7.22> mcptoon-0.7.22> def search_registry(keyword, limit=10, strict=False): mcptoon-0.7.22> """Search MCP registries for available servers. mcptoon-0.7.22> mcptoon-0.7.22> Queries both sources and merges them, best matches first — Smithery holds the mcptoon-0.7.22> hosted half, the official registry the installable-package half, and a query mcptoon-0.7.22> like "filesystem" has good answers in both. mcptoon-0.7.22> mcptoon-0.7.22> Returns: mcptoon-0.7.22> list: [{name, description, command, args, env, source, url}, ...] mcptoon-0.7.22> mcptoon-0.7.22> Raises: mcptoon-0.7.22> RegistryError: only when *every* source failed at the network level mcptoon-0.7.22> (DNS, TLS, timeout, 5xx). A genuine "no matches" still returns []. mcptoon-0.7.22> The distinction matters: the old code returned [] for both, so a dead mcptoon-0.7.22> registry was indistinguishable from an empty result. mcptoon-0.7.22> """ mcptoon-0.7.22> errors = [] mcptoon-0.7.22> merged, seen = [], set() mcptoon-0.7.22> mcptoon-0.7.22> for label, fn in (("smithery", _search_smithery), mcptoon-0.7.22> ("registry", _search_mcp_registry)): mcptoon-0.7.22> try: mcptoon-0.7.22> results = fn(keyword, limit) mcptoon-0.7.22> except Exception as e: mcptoon-0.7.22> errors.append(f"{label}: {type(e).__name__}: {str(e)[:120]}") mcptoon-0.7.22> continue mcptoon-0.7.22> for r in results: mcptoon-0.7.22> key = (r.get("name") or "").lower() mcptoon-0.7.22> if not key or key in seen or not _relevant(keyword, r): mcptoon-0.7.22> continue mcptoon-0.7.22> seen.add(key) mcptoon-0.7.22> merged.append(r) mcptoon-0.7.22> mcptoon-0.7.22> if merged: mcptoon-0.7.22> merged.sort(key=lambda r: _relevance_score(keyword, r), reverse=True) mcptoon-0.7.22> return merged[:limit] mcptoon-0.7.22> mcptoon-0.7.22> # Nothing relevant. If some source was reachable, this is a real empty result; mcptoon-0.7.22> # if none was, the network is the problem and we say so. mcptoon-0.7.22> if len(errors) == 2: mcptoon-0.7.22> > raise RegistryError( mcptoon-0.7.22> "No MCP registry reachable (" + "; ".join(errors) + "). " mcptoon-0.7.22> "Check your connection, or install directly with " mcptoon-0.7.22> "`mcptoon install --npm `." mcptoon-0.7.22> ) mcptoon-0.7.22> E mcptoon.installer.RegistryError: No MCP registry reachable (smithery: URLError: ; registry: URLError: ). Check your connection, or install directly with `mcptoon install --npm `. mcptoon-0.7.22> mcptoon-0.7.22> src/mcptoon/installer.py:171: RegistryError mcptoon-0.7.22> _____________ TestInstallByName.test_search_smithery_returns_list ______________ mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> http_class = mcptoon-0.7.22> req = mcptoon-0.7.22> http_conn_args = {'context': } mcptoon-0.7.22> mcptoon-0.7.22> def do_open(self, http_class, req, **http_conn_args): mcptoon-0.7.22> """Return an HTTPResponse object for the request, using http_class. mcptoon-0.7.22> mcptoon-0.7.22> http_class must implement the HTTPConnection API from http.client. mcptoon-0.7.22> """ mcptoon-0.7.22> host = req.host mcptoon-0.7.22> if not host: mcptoon-0.7.22> raise URLError('no host given') mcptoon-0.7.22> mcptoon-0.7.22> # will parse host:port mcptoon-0.7.22> h = http_class(host, timeout=req.timeout, **http_conn_args) mcptoon-0.7.22> h.set_debuglevel(self._debuglevel) mcptoon-0.7.22> mcptoon-0.7.22> headers = dict(req.unredirected_hdrs) mcptoon-0.7.22> headers.update(req.headers) mcptoon-0.7.22> mcptoon-0.7.22> # TODO(jhylton): Should this be redesigned to handle mcptoon-0.7.22> # persistent connections? mcptoon-0.7.22> mcptoon-0.7.22> # We want to make an HTTP/1.1 request, but the addinfourl mcptoon-0.7.22> # class isn't prepared to deal with a persistent connection. mcptoon-0.7.22> # It will try to read all remaining data from the socket, mcptoon-0.7.22> # which will block while the server waits for the next request. mcptoon-0.7.22> # So make sure the connection gets closed after the (only) mcptoon-0.7.22> # request. mcptoon-0.7.22> headers["Connection"] = "close" mcptoon-0.7.22> headers = {name.title(): val for name, val in headers.items()} mcptoon-0.7.22> mcptoon-0.7.22> if req._tunnel_host: mcptoon-0.7.22> tunnel_headers = {} mcptoon-0.7.22> proxy_auth_hdr = "Proxy-Authorization" mcptoon-0.7.22> if proxy_auth_hdr in headers: mcptoon-0.7.22> tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr] mcptoon-0.7.22> # Proxy-Authorization should not be sent to origin mcptoon-0.7.22> # server. mcptoon-0.7.22> del headers[proxy_auth_hdr] mcptoon-0.7.22> h.set_tunnel(req._tunnel_host, headers=tunnel_headers) mcptoon-0.7.22> mcptoon-0.7.22> try: mcptoon-0.7.22> try: mcptoon-0.7.22> > h.request(req.get_method(), req.selector, req.data, headers, mcptoon-0.7.22> encode_chunked=req.has_header('Transfer-encoding')) mcptoon-0.7.22> mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1320: mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1386: in request mcptoon-0.7.22> self._send_request(method, url, body, headers, encode_chunked) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1432: in _send_request mcptoon-0.7.22> self.endheaders(body, encode_chunked=encode_chunked) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1381: in endheaders mcptoon-0.7.22> self._send_output(message_body, encode_chunked=encode_chunked) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1141: in _send_output mcptoon-0.7.22> self.send(msg) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1085: in send mcptoon-0.7.22> self.connect() mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1520: in connect mcptoon-0.7.22> super().connect() mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1051: in connect mcptoon-0.7.22> self.sock = self._create_connection( mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/socket.py:850: in create_connection mcptoon-0.7.22> for res in getaddrinfo(host, port, 0, SOCK_STREAM): mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> mcptoon-0.7.22> host = 'registry.smithery.ai', port = 443, family = 0 mcptoon-0.7.22> type = , proto = 0, flags = 0 mcptoon-0.7.22> mcptoon-0.7.22> def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0): mcptoon-0.7.22> """Resolve host and port into list of address info entries. mcptoon-0.7.22> mcptoon-0.7.22> Translate the host/port argument into a sequence of 5-tuples that contain mcptoon-0.7.22> all the necessary arguments for creating a socket connected to that service. mcptoon-0.7.22> host is a domain name, a string representation of an IPv4/v6 address or mcptoon-0.7.22> None. port is a string service name such as 'http', a numeric port number or mcptoon-0.7.22> None. By passing None as the value of host and port, you can pass NULL to mcptoon-0.7.22> the underlying C API. mcptoon-0.7.22> mcptoon-0.7.22> The family, type and proto arguments can be optionally specified in order to mcptoon-0.7.22> narrow the list of addresses returned. Passing zero as a value for each of mcptoon-0.7.22> these arguments selects the full range of results. mcptoon-0.7.22> """ mcptoon-0.7.22> # We override this function since we want to translate the numeric family mcptoon-0.7.22> # and socket type values to enum constants. mcptoon-0.7.22> addrlist = [] mcptoon-0.7.22> > for res in _socket.getaddrinfo(host, port, family, type, proto, flags): mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> E socket.gaierror: [Errno -3] Temporary failure in name resolution mcptoon-0.7.22> mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/socket.py:989: gaierror mcptoon-0.7.22> mcptoon-0.7.22> During handling of the above exception, another exception occurred: mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> mcptoon-0.7.22> def test_search_smithery_returns_list(self): mcptoon-0.7.22> """_search_smithery returns a list.""" mcptoon-0.7.22> from mcptoon.installer import _search_smithery mcptoon-0.7.22> > result = _search_smithery("test") mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> mcptoon-0.7.22> tests/test_serve.py:639: mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> src/mcptoon/installer.py:194: in _search_smithery mcptoon-0.7.22> data = _fetch_json(f"{SMITHERY_API_URL}/servers?{params}") mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> src/mcptoon/installer.py:186: in _fetch_json mcptoon-0.7.22> with urllib.request.urlopen(req, timeout=timeout) as resp: mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:187: in urlopen mcptoon-0.7.22> return opener.open(url, data, timeout) mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:487: in open mcptoon-0.7.22> response = self._open(req, data) mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:504: in _open mcptoon-0.7.22> result = self._call_chain(self.handle_open, protocol, protocol + mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:464: in _call_chain mcptoon-0.7.22> result = func(*args) mcptoon-0.7.22> ^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1368: in https_open mcptoon-0.7.22> return self.do_open(http.client.HTTPSConnection, req, mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> http_class = mcptoon-0.7.22> req = mcptoon-0.7.22> http_conn_args = {'context': } mcptoon-0.7.22> mcptoon-0.7.22> def do_open(self, http_class, req, **http_conn_args): mcptoon-0.7.22> """Return an HTTPResponse object for the request, using http_class. mcptoon-0.7.22> mcptoon-0.7.22> http_class must implement the HTTPConnection API from http.client. mcptoon-0.7.22> """ mcptoon-0.7.22> host = req.host mcptoon-0.7.22> if not host: mcptoon-0.7.22> raise URLError('no host given') mcptoon-0.7.22> mcptoon-0.7.22> # will parse host:port mcptoon-0.7.22> h = http_class(host, timeout=req.timeout, **http_conn_args) mcptoon-0.7.22> h.set_debuglevel(self._debuglevel) mcptoon-0.7.22> mcptoon-0.7.22> headers = dict(req.unredirected_hdrs) mcptoon-0.7.22> headers.update(req.headers) mcptoon-0.7.22> mcptoon-0.7.22> # TODO(jhylton): Should this be redesigned to handle mcptoon-0.7.22> # persistent connections? mcptoon-0.7.22> mcptoon-0.7.22> # We want to make an HTTP/1.1 request, but the addinfourl mcptoon-0.7.22> # class isn't prepared to deal with a persistent connection. mcptoon-0.7.22> # It will try to read all remaining data from the socket, mcptoon-0.7.22> # which will block while the server waits for the next request. mcptoon-0.7.22> # So make sure the connection gets closed after the (only) mcptoon-0.7.22> # request. mcptoon-0.7.22> headers["Connection"] = "close" mcptoon-0.7.22> headers = {name.title(): val for name, val in headers.items()} mcptoon-0.7.22> mcptoon-0.7.22> if req._tunnel_host: mcptoon-0.7.22> tunnel_headers = {} mcptoon-0.7.22> proxy_auth_hdr = "Proxy-Authorization" mcptoon-0.7.22> if proxy_auth_hdr in headers: mcptoon-0.7.22> tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr] mcptoon-0.7.22> # Proxy-Authorization should not be sent to origin mcptoon-0.7.22> # server. mcptoon-0.7.22> del headers[proxy_auth_hdr] mcptoon-0.7.22> h.set_tunnel(req._tunnel_host, headers=tunnel_headers) mcptoon-0.7.22> mcptoon-0.7.22> try: mcptoon-0.7.22> try: mcptoon-0.7.22> h.request(req.get_method(), req.selector, req.data, headers, mcptoon-0.7.22> encode_chunked=req.has_header('Transfer-encoding')) mcptoon-0.7.22> except OSError as err: # timeout error mcptoon-0.7.22> > raise URLError(err) mcptoon-0.7.22> E urllib.error.URLError: mcptoon-0.7.22> mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1323: URLError mcptoon-0.7.22> ___________ TestInstallByName.test_search_mcp_registry_returns_list ____________ mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> http_class = mcptoon-0.7.22> req = mcptoon-0.7.22> http_conn_args = {'context': } mcptoon-0.7.22> mcptoon-0.7.22> def do_open(self, http_class, req, **http_conn_args): mcptoon-0.7.22> """Return an HTTPResponse object for the request, using http_class. mcptoon-0.7.22> mcptoon-0.7.22> http_class must implement the HTTPConnection API from http.client. mcptoon-0.7.22> """ mcptoon-0.7.22> host = req.host mcptoon-0.7.22> if not host: mcptoon-0.7.22> raise URLError('no host given') mcptoon-0.7.22> mcptoon-0.7.22> # will parse host:port mcptoon-0.7.22> h = http_class(host, timeout=req.timeout, **http_conn_args) mcptoon-0.7.22> h.set_debuglevel(self._debuglevel) mcptoon-0.7.22> mcptoon-0.7.22> headers = dict(req.unredirected_hdrs) mcptoon-0.7.22> headers.update(req.headers) mcptoon-0.7.22> mcptoon-0.7.22> # TODO(jhylton): Should this be redesigned to handle mcptoon-0.7.22> # persistent connections? mcptoon-0.7.22> mcptoon-0.7.22> # We want to make an HTTP/1.1 request, but the addinfourl mcptoon-0.7.22> # class isn't prepared to deal with a persistent connection. mcptoon-0.7.22> # It will try to read all remaining data from the socket, mcptoon-0.7.22> # which will block while the server waits for the next request. mcptoon-0.7.22> # So make sure the connection gets closed after the (only) mcptoon-0.7.22> # request. mcptoon-0.7.22> headers["Connection"] = "close" mcptoon-0.7.22> headers = {name.title(): val for name, val in headers.items()} mcptoon-0.7.22> mcptoon-0.7.22> if req._tunnel_host: mcptoon-0.7.22> tunnel_headers = {} mcptoon-0.7.22> proxy_auth_hdr = "Proxy-Authorization" mcptoon-0.7.22> if proxy_auth_hdr in headers: mcptoon-0.7.22> tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr] mcptoon-0.7.22> # Proxy-Authorization should not be sent to origin mcptoon-0.7.22> # server. mcptoon-0.7.22> del headers[proxy_auth_hdr] mcptoon-0.7.22> h.set_tunnel(req._tunnel_host, headers=tunnel_headers) mcptoon-0.7.22> mcptoon-0.7.22> try: mcptoon-0.7.22> try: mcptoon-0.7.22> > h.request(req.get_method(), req.selector, req.data, headers, mcptoon-0.7.22> encode_chunked=req.has_header('Transfer-encoding')) mcptoon-0.7.22> mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1320: mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1386: in request mcptoon-0.7.22> self._send_request(method, url, body, headers, encode_chunked) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1432: in _send_request mcptoon-0.7.22> self.endheaders(body, encode_chunked=encode_chunked) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1381: in endheaders mcptoon-0.7.22> self._send_output(message_body, encode_chunked=encode_chunked) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1141: in _send_output mcptoon-0.7.22> self.send(msg) mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1085: in send mcptoon-0.7.22> self.connect() mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1520: in connect mcptoon-0.7.22> super().connect() mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1051: in connect mcptoon-0.7.22> self.sock = self._create_connection( mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/socket.py:850: in create_connection mcptoon-0.7.22> for res in getaddrinfo(host, port, 0, SOCK_STREAM): mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> mcptoon-0.7.22> host = 'registry.modelcontextprotocol.io', port = 443, family = 0 mcptoon-0.7.22> type = , proto = 0, flags = 0 mcptoon-0.7.22> mcptoon-0.7.22> def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0): mcptoon-0.7.22> """Resolve host and port into list of address info entries. mcptoon-0.7.22> mcptoon-0.7.22> Translate the host/port argument into a sequence of 5-tuples that contain mcptoon-0.7.22> all the necessary arguments for creating a socket connected to that service. mcptoon-0.7.22> host is a domain name, a string representation of an IPv4/v6 address or mcptoon-0.7.22> None. port is a string service name such as 'http', a numeric port number or mcptoon-0.7.22> None. By passing None as the value of host and port, you can pass NULL to mcptoon-0.7.22> the underlying C API. mcptoon-0.7.22> mcptoon-0.7.22> The family, type and proto arguments can be optionally specified in order to mcptoon-0.7.22> narrow the list of addresses returned. Passing zero as a value for each of mcptoon-0.7.22> these arguments selects the full range of results. mcptoon-0.7.22> """ mcptoon-0.7.22> # We override this function since we want to translate the numeric family mcptoon-0.7.22> # and socket type values to enum constants. mcptoon-0.7.22> addrlist = [] mcptoon-0.7.22> > for res in _socket.getaddrinfo(host, port, family, type, proto, flags): mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> E socket.gaierror: [Errno -3] Temporary failure in name resolution mcptoon-0.7.22> mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/socket.py:989: gaierror mcptoon-0.7.22> mcptoon-0.7.22> During handling of the above exception, another exception occurred: mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> mcptoon-0.7.22> def test_search_mcp_registry_returns_list(self): mcptoon-0.7.22> """_search_mcp_registry returns a list.""" mcptoon-0.7.22> from mcptoon.installer import _search_mcp_registry mcptoon-0.7.22> > result = _search_mcp_registry("test") mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> mcptoon-0.7.22> tests/test_serve.py:645: mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> src/mcptoon/installer.py:235: in _search_mcp_registry mcptoon-0.7.22> data = _fetch_json(f"{MCP_REGISTRY_URL}/servers?{params}") mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> src/mcptoon/installer.py:186: in _fetch_json mcptoon-0.7.22> with urllib.request.urlopen(req, timeout=timeout) as resp: mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:187: in urlopen mcptoon-0.7.22> return opener.open(url, data, timeout) mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:487: in open mcptoon-0.7.22> response = self._open(req, data) mcptoon-0.7.22> ^^^^^^^^^^^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:504: in _open mcptoon-0.7.22> result = self._call_chain(self.handle_open, protocol, protocol + mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:464: in _call_chain mcptoon-0.7.22> result = func(*args) mcptoon-0.7.22> ^^^^^^^^^^^ mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1368: in https_open mcptoon-0.7.22> return self.do_open(http.client.HTTPSConnection, req, mcptoon-0.7.22> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ mcptoon-0.7.22> mcptoon-0.7.22> self = mcptoon-0.7.22> http_class = mcptoon-0.7.22> req = mcptoon-0.7.22> http_conn_args = {'context': } mcptoon-0.7.22> mcptoon-0.7.22> def do_open(self, http_class, req, **http_conn_args): mcptoon-0.7.22> """Return an HTTPResponse object for the request, using http_class. mcptoon-0.7.22> mcptoon-0.7.22> http_class must implement the HTTPConnection API from http.client. mcptoon-0.7.22> """ mcptoon-0.7.22> host = req.host mcptoon-0.7.22> if not host: mcptoon-0.7.22> raise URLError('no host given') mcptoon-0.7.22> mcptoon-0.7.22> # will parse host:port mcptoon-0.7.22> h = http_class(host, timeout=req.timeout, **http_conn_args) mcptoon-0.7.22> h.set_debuglevel(self._debuglevel) mcptoon-0.7.22> mcptoon-0.7.22> headers = dict(req.unredirected_hdrs) mcptoon-0.7.22> headers.update(req.headers) mcptoon-0.7.22> mcptoon-0.7.22> # TODO(jhylton): Should this be redesigned to handle mcptoon-0.7.22> # persistent connections? mcptoon-0.7.22> mcptoon-0.7.22> # We want to make an HTTP/1.1 request, but the addinfourl mcptoon-0.7.22> # class isn't prepared to deal with a persistent connection. mcptoon-0.7.22> # It will try to read all remaining data from the socket, mcptoon-0.7.22> # which will block while the server waits for the next request. mcptoon-0.7.22> # So make sure the connection gets closed after the (only) mcptoon-0.7.22> # request. mcptoon-0.7.22> headers["Connection"] = "close" mcptoon-0.7.22> headers = {name.title(): val for name, val in headers.items()} mcptoon-0.7.22> mcptoon-0.7.22> if req._tunnel_host: mcptoon-0.7.22> tunnel_headers = {} mcptoon-0.7.22> proxy_auth_hdr = "Proxy-Authorization" mcptoon-0.7.22> if proxy_auth_hdr in headers: mcptoon-0.7.22> tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr] mcptoon-0.7.22> # Proxy-Authorization should not be sent to origin mcptoon-0.7.22> # server. mcptoon-0.7.22> del headers[proxy_auth_hdr] mcptoon-0.7.22> h.set_tunnel(req._tunnel_host, headers=tunnel_headers) mcptoon-0.7.22> mcptoon-0.7.22> try: mcptoon-0.7.22> try: mcptoon-0.7.22> h.request(req.get_method(), req.selector, req.data, headers, mcptoon-0.7.22> encode_chunked=req.has_header('Transfer-encoding')) mcptoon-0.7.22> except OSError as err: # timeout error mcptoon-0.7.22> > raise URLError(err) mcptoon-0.7.22> E urllib.error.URLError: mcptoon-0.7.22> mcptoon-0.7.22> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1323: URLError mcptoon-0.7.22> =========================== short test summary info ============================ mcptoon-0.7.22> FAILED tests/test_serve.py::TestInstallByName::test_search_registry_returns_list - mcptoon.installer.RegistryError: No MCP registry reachable (smithery: URLEr... mcptoon-0.7.22> FAILED tests/test_serve.py::TestInstallByName::test_search_smithery_returns_list - urllib.error.URLError: FAILED tests/test_serve.py::TestInstallByName::test_search_mcp_registry_returns_list - urllib.error.URLError: ============= 3 failed, 1323 passed, 1 skipped in 69.88s (0:01:09) ============= error: Cannot build '/nix/store/3n5pam4ylqpqh2a9zhjx0hkyc73bpkc8-mcptoon-0.7.22.drv'. Reason: builder failed with exit code 1. Output paths: /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22 /nix/store/bcbmr2dybsqljpsgwgcfnc6sp1bja6js-mcptoon-0.7.22-dist Last 25 log lines: > > if req._tunnel_host: > tunnel_headers = {} > proxy_auth_hdr = "Proxy-Authorization" > if proxy_auth_hdr in headers: > tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr] > # Proxy-Authorization should not be sent to origin > # server. > del headers[proxy_auth_hdr] > h.set_tunnel(req._tunnel_host, headers=tunnel_headers) > > try: > try: > h.request(req.get_method(), req.selector, req.data, headers, > encode_chunked=req.has_header('Transfer-encoding')) > except OSError as err: # timeout error > > raise URLError(err) > E urllib.error.URLError: > > /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1323: URLError > =========================== short test summary info ============================ > FAILED tests/test_serve.py::TestInstallByName::test_search_registry_returns_list - mcptoon.installer.RegistryError: No MCP registry reachable (smithery: URLEr... > FAILED tests/test_serve.py::TestInstallByName::test_search_smithery_returns_list - urllib.error.URLError: FAILED tests/test_serve.py::TestInstallByName::test_search_mcp_registry_returns_list - urllib.error.URLError: ============= 3 failed, 1323 passed, 1 skipped in 69.88s (0:01:09) ============= For full logs, run: nix log /nix/store/3n5pam4ylqpqh2a9zhjx0hkyc73bpkc8-mcptoon-0.7.22.drv error: Cannot build '/nix/store/zfiykhk5xn87y1i65dz7p196qxbv17hp-check-mcptoon.drv'. Reason: 1 dependency failed. Output paths: /nix/store/3wi2g6yfi8afwidngy24kg0a2mxb9g0m-check-mcptoon