mcptoon-0.7.22
checks.x86_64-linux.pkgs-mcptoon
· build #5505
· raw
1Sourcing python-remove-tests-dir-hook2Sourcing python-catch-conflicts-hook.sh3Sourcing python-remove-bin-bytecode-hook.sh4Sourcing pypa-build-hook5Using pypaBuildPhase6Sourcing python-runtime-deps-check-hook7Using pythonRuntimeDepsCheckHook8Sourcing pypa-install-hook9Using pypaInstallPhase10Sourcing python-imports-check-hook.sh11Using pythonImportsCheckPhase12Sourcing python-namespaces-hook13Sourcing python-catch-conflicts-hook.sh14Sourcing pytest-check-hook15Using pytestCheckPhase
unpackPhase
16unpacking source archive /nix/store/gyc4j4ir5ssmqclfbg1rn4p62a9dd9a3-source17source root is source18setting SOURCE_DATE_EPOCH to timestamp 315619200 of file "source/tests/test_watch.py"configurePhase
19no configure script, doing nothingbuildPhase
20Executing pypaBuildPhase21Creating a wheel...22pypa build flags: --no-isolation --outdir dist/ --wheel23* Getting build dependencies for wheel...24/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 deprecated25!!2627 ********************************************************************************28 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).2930 By 2027-Feb-18, you need to update your project and remove deprecated calls31 or your builds will no longer be supported.3233 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.34 ********************************************************************************3536!!37 corresp(dist, value, root_dir)38/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.39!!4041 ********************************************************************************42 Please consider removing the following classifiers in favor of a SPDX license expression:4344 License :: OSI Approved :: Apache Software License4546 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.47 ********************************************************************************4849!!50 dist._finalize_license_expression()51/nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated.52!!5354 ********************************************************************************55 Please consider removing the following classifiers in favor of a SPDX license expression:5657 License :: OSI Approved :: Apache Software License5859 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.60 ********************************************************************************6162!!63 self._finalize_license_expression()64running egg_info65creating src/mcptoon.egg-info66writing src/mcptoon.egg-info/PKG-INFO67writing dependency_links to src/mcptoon.egg-info/dependency_links.txt68writing entry points to src/mcptoon.egg-info/entry_points.txt69writing requirements to src/mcptoon.egg-info/requires.txt70writing top-level names to src/mcptoon.egg-info/top_level.txt71writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'72reading manifest file 'src/mcptoon.egg-info/SOURCES.txt'73adding license file 'LICENSE'74adding license file 'NOTICE'75writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'76* Building wheel...77/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 deprecated78!!7980 ********************************************************************************81 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).8283 By 2027-Feb-18, you need to update your project and remove deprecated calls84 or your builds will no longer be supported.8586 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.87 ********************************************************************************8889!!90 corresp(dist, value, root_dir)91/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.92!!9394 ********************************************************************************95 Please consider removing the following classifiers in favor of a SPDX license expression:9697 License :: OSI Approved :: Apache Software License9899 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.100 ********************************************************************************101102!!103 dist._finalize_license_expression()104/nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated.105!!106107 ********************************************************************************108 Please consider removing the following classifiers in favor of a SPDX license expression:109110 License :: OSI Approved :: Apache Software License111112 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.113 ********************************************************************************114115!!116 self._finalize_license_expression()117running bdist_wheel118running build119running build_py120creating build/lib/mcptoon121copying src/mcptoon/packs.py -> build/lib/mcptoon122copying src/mcptoon/serve.py -> build/lib/mcptoon123copying src/mcptoon/usage.py -> build/lib/mcptoon124copying src/mcptoon/cli.py -> build/lib/mcptoon125copying src/mcptoon/client.py -> build/lib/mcptoon126copying src/mcptoon/__init__.py -> build/lib/mcptoon127copying src/mcptoon/skills.py -> build/lib/mcptoon128copying src/mcptoon/plugin.py -> build/lib/mcptoon129copying src/mcptoon/output.py -> build/lib/mcptoon130copying src/mcptoon/errors.py -> build/lib/mcptoon131copying src/mcptoon/installer.py -> build/lib/mcptoon132copying src/mcptoon/sync.py -> build/lib/mcptoon133copying src/mcptoon/bench.py -> build/lib/mcptoon134copying src/mcptoon/health.py -> build/lib/mcptoon135copying src/mcptoon/schema_simplifier.py -> build/lib/mcptoon136copying src/mcptoon/watch.py -> build/lib/mcptoon137copying src/mcptoon/discover.py -> build/lib/mcptoon138copying src/mcptoon/toon_vendored.py -> build/lib/mcptoon139copying src/mcptoon/native_tools.py -> build/lib/mcptoon140copying src/mcptoon/cache.py -> build/lib/mcptoon141copying src/mcptoon/footer.py -> build/lib/mcptoon142copying src/mcptoon/__main__.py -> build/lib/mcptoon143copying src/mcptoon/manifest.py -> build/lib/mcptoon144copying src/mcptoon/router.py -> build/lib/mcptoon145copying src/mcptoon/demo_server.py -> build/lib/mcptoon146copying src/mcptoon/demo.py -> build/lib/mcptoon147copying src/mcptoon/welcome.py -> build/lib/mcptoon148copying src/mcptoon/config.py -> build/lib/mcptoon149running egg_info150writing src/mcptoon.egg-info/PKG-INFO151writing dependency_links to src/mcptoon.egg-info/dependency_links.txt152writing entry points to src/mcptoon.egg-info/entry_points.txt153writing requirements to src/mcptoon.egg-info/requires.txt154writing top-level names to src/mcptoon.egg-info/top_level.txt155reading manifest file 'src/mcptoon.egg-info/SOURCES.txt'156adding license file 'LICENSE'157adding license file 'NOTICE'158writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'159copying src/mcptoon/packs.json -> build/lib/mcptoon160installing to build/bdist.linux-x86_64/wheel161running install162running install_lib163creating build/bdist.linux-x86_64/wheel164creating build/bdist.linux-x86_64/wheel/mcptoon165copying build/lib/mcptoon/errors.py -> build/bdist.linux-x86_64/wheel/./mcptoon166copying build/lib/mcptoon/output.py -> build/bdist.linux-x86_64/wheel/./mcptoon167copying build/lib/mcptoon/plugin.py -> build/bdist.linux-x86_64/wheel/./mcptoon168copying build/lib/mcptoon/demo.py -> build/bdist.linux-x86_64/wheel/./mcptoon169copying build/lib/mcptoon/manifest.py -> build/bdist.linux-x86_64/wheel/./mcptoon170copying build/lib/mcptoon/packs.json -> build/bdist.linux-x86_64/wheel/./mcptoon171copying build/lib/mcptoon/client.py -> build/bdist.linux-x86_64/wheel/./mcptoon172copying build/lib/mcptoon/__main__.py -> build/bdist.linux-x86_64/wheel/./mcptoon173copying build/lib/mcptoon/toon_vendored.py -> build/bdist.linux-x86_64/wheel/./mcptoon174copying build/lib/mcptoon/watch.py -> build/bdist.linux-x86_64/wheel/./mcptoon175copying build/lib/mcptoon/sync.py -> build/bdist.linux-x86_64/wheel/./mcptoon176copying build/lib/mcptoon/bench.py -> build/bdist.linux-x86_64/wheel/./mcptoon177copying build/lib/mcptoon/skills.py -> build/bdist.linux-x86_64/wheel/./mcptoon178copying build/lib/mcptoon/cache.py -> build/bdist.linux-x86_64/wheel/./mcptoon179copying build/lib/mcptoon/discover.py -> build/bdist.linux-x86_64/wheel/./mcptoon180copying build/lib/mcptoon/installer.py -> build/bdist.linux-x86_64/wheel/./mcptoon181copying build/lib/mcptoon/router.py -> build/bdist.linux-x86_64/wheel/./mcptoon182copying build/lib/mcptoon/cli.py -> build/bdist.linux-x86_64/wheel/./mcptoon183copying build/lib/mcptoon/config.py -> build/bdist.linux-x86_64/wheel/./mcptoon184copying build/lib/mcptoon/schema_simplifier.py -> build/bdist.linux-x86_64/wheel/./mcptoon185copying build/lib/mcptoon/demo_server.py -> build/bdist.linux-x86_64/wheel/./mcptoon186copying build/lib/mcptoon/welcome.py -> build/bdist.linux-x86_64/wheel/./mcptoon187copying build/lib/mcptoon/__init__.py -> build/bdist.linux-x86_64/wheel/./mcptoon188copying build/lib/mcptoon/native_tools.py -> build/bdist.linux-x86_64/wheel/./mcptoon189copying build/lib/mcptoon/serve.py -> build/bdist.linux-x86_64/wheel/./mcptoon190copying build/lib/mcptoon/packs.py -> build/bdist.linux-x86_64/wheel/./mcptoon191copying build/lib/mcptoon/footer.py -> build/bdist.linux-x86_64/wheel/./mcptoon192copying build/lib/mcptoon/usage.py -> build/bdist.linux-x86_64/wheel/./mcptoon193copying build/lib/mcptoon/health.py -> build/bdist.linux-x86_64/wheel/./mcptoon194running install_egg_info195Copying src/mcptoon.egg-info to build/bdist.linux-x86_64/wheel/./mcptoon-0.7.22-py3.14.egg-info196running install_scripts197creating build/bdist.linux-x86_64/wheel/mcptoon-0.7.22.dist-info/WHEEL198creating '/build/source/dist/.tmp-dyf9s626/mcptoon-0.7.22-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it199adding 'mcptoon/__init__.py'200adding 'mcptoon/__main__.py'201adding 'mcptoon/bench.py'202adding 'mcptoon/cache.py'203adding 'mcptoon/cli.py'204adding 'mcptoon/client.py'205adding 'mcptoon/config.py'206adding 'mcptoon/demo.py'207adding 'mcptoon/demo_server.py'208adding 'mcptoon/discover.py'209adding 'mcptoon/errors.py'210adding 'mcptoon/footer.py'211adding 'mcptoon/health.py'212adding 'mcptoon/installer.py'213adding 'mcptoon/manifest.py'214adding 'mcptoon/native_tools.py'215adding 'mcptoon/output.py'216adding 'mcptoon/packs.json'217adding 'mcptoon/packs.py'218adding 'mcptoon/plugin.py'219adding 'mcptoon/router.py'220adding 'mcptoon/schema_simplifier.py'221adding 'mcptoon/serve.py'222adding 'mcptoon/skills.py'223adding 'mcptoon/sync.py'224adding 'mcptoon/toon_vendored.py'225adding 'mcptoon/usage.py'226adding 'mcptoon/watch.py'227adding 'mcptoon/welcome.py'228adding 'mcptoon-0.7.22.dist-info/licenses/LICENSE'229adding 'mcptoon-0.7.22.dist-info/licenses/NOTICE'230adding 'mcptoon-0.7.22.dist-info/METADATA'231adding 'mcptoon-0.7.22.dist-info/WHEEL'232adding 'mcptoon-0.7.22.dist-info/entry_points.txt'233adding 'mcptoon-0.7.22.dist-info/top_level.txt'234adding 'mcptoon-0.7.22.dist-info/RECORD'235removing build/bdist.linux-x86_64/wheel236Successfully built mcptoon-0.7.22-py3-none-any.whl237Finished creating a wheel...238Finished executing pypaBuildPhasepythonRuntimeDepsCheckHook
239Executing pythonRuntimeDepsCheck240Checking runtime dependencies for mcptoon-0.7.22-py3-none-any.whl241Finished executing pythonRuntimeDepsCheckinstallPhase
242Executing pypaInstallPhase243Successfully installed mcptoon-0.7.22-py3-none-any.whl244Finished executing pypaInstallPhasepythonOutputDistPhase
245Executing pythonOutputDistPhase246Finished executing pythonOutputDistPhasefixupPhase
247shrinking RPATHs of ELF executables and libraries in /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22248checking for references to /build/ in /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22...249patching script interpreter paths in /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22250stripping (with command strip and flags -S -p) in /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22/lib /nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22/bin251shrinking RPATHs of ELF executables and libraries in /nix/store/bcbmr2dybsqljpsgwgcfnc6sp1bja6js-mcptoon-0.7.22-dist252checking for references to /build/ in /nix/store/bcbmr2dybsqljpsgwgcfnc6sp1bja6js-mcptoon-0.7.22-dist...253patching script interpreter paths in /nix/store/bcbmr2dybsqljpsgwgcfnc6sp1bja6js-mcptoon-0.7.22-dist254Rewriting #!/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/bin/python3.14 to #!/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7255wrapping `/nix/store/5k7gb9kfh6l8cirhfbxmip87zjckzk5k-mcptoon-0.7.22/bin/mcptoon'...256Executing pythonRemoveTestsDir257Finished executing pythonRemoveTestsDirinstallCheckPhase
258no Makefile or custom installCheckPhase, doing nothingpythonImportsCheckPhase
259Executing pythonImportsCheckPhase260Check whether the following modules can be imported: mcptoonpytestCheckPhase
261Executing pytestCheckPhase262pytest flags: -m pytest263============================= test session starts ==============================264platform linux -- Python 3.14.7, pytest-9.1.1, pluggy-1.6.0265rootdir: /build/source266configfile: pyproject.toml267testpaths: tests268collected 1327 items 269270tests/test_bench.py ............. [ 0%]271tests/test_cache.py .... [ 1%]272tests/test_calculator.py .......................... [ 3%]273tests/test_claude_plugin_package.py ............. [ 4%]274tests/test_cli_flags.py ........... [ 5%]275tests/test_client.py .............................. [ 7%]276tests/test_command_coverage.py ......... [ 7%]277tests/test_completion.py ........ [ 8%]278tests/test_config.py ......... [ 9%]279tests/test_dead_server_diagnostics.py ... [ 9%]280tests/test_demo.py ..................... [ 11%]281tests/test_demo_dead_package.py ........ [ 11%]282tests/test_demo_server.py .............................................. [ 15%]283..... [ 15%]284tests/test_discover.py .................................... [ 18%]285tests/test_doctor_star_hint.py ..... [ 18%]286tests/test_envelope.py ........ [ 19%]287tests/test_fallback_json.py ...... [ 19%]288tests/test_footprint_claims.py ............ [ 20%]289tests/test_gemini_manifest.py ...... [ 21%]290tests/test_health.py ............. [ 22%]291tests/test_help_shortcircuit.py ......... [ 22%]292tests/test_http_user_agent.py ......... [ 23%]293tests/test_installer_registry.py ............................ [ 25%]294tests/test_lang.py .......................... [ 27%]295tests/test_llms_txt.py ...... [ 27%]296tests/test_native_tools.py ................................. [ 30%]297tests/test_output.py ................................................... [ 34%]298........................................................................ [ 39%]299................ [ 40%]300tests/test_plugin_install.py .......... [ 41%]301tests/test_plugin_scan.py ............................... [ 43%]302tests/test_policy_overrides.py ................ [ 45%]303tests/test_presence.py .............................................. [ 48%]304tests/test_readme_links.py ... [ 48%]305tests/test_registry_sync.py ............ [ 49%]306tests/test_reversible.py ............................................... [ 53%]307................. [ 54%]308tests/test_router.py .............................................. [ 58%]309tests/test_search.py ................................ [ 60%]310tests/test_serve.py .................................................... [ 64%]311FFF [ 64%]312tests/test_serve_perf.py .......... [ 65%]313tests/test_serve_prompts.py ........ [ 65%]314tests/test_skill_packs.py ............... [ 67%]315tests/test_skill_search.py .......... [ 67%]316tests/test_skills.py ................................................... [ 71%]317........................................................................ [ 77%]318.............. [ 78%]319tests/test_stats_toggle.py ......... [ 78%]320tests/test_stderr_pipe_deadlock.py .... [ 79%]321tests/test_sync.py ................ [ 80%]322tests/test_tier_claims_consistent.py .... [ 80%]323tests/test_toml_config.py .......................... [ 82%]324tests/test_toon_cross_validate.py ............................... [ 84%]325tests/test_uninstall_end_to_end.py .......... [ 85%]326tests/test_v02_features.py .................................... [ 88%]327tests/test_v04_features.py ................ [ 89%]328tests/test_v05_features.py ...................... [ 91%]329tests/test_v072_delight.py .............s.. [ 92%]330tests/test_v073_http_security.py .............................. [ 94%]331tests/test_v074_stdio_timeout.py ............ [ 95%]332tests/test_v076_stateless_serve.py ................... [ 97%]333tests/test_v07_spec2026.py ..................... [ 98%]334tests/test_watch.py .................. [100%]335336=================================== FAILURES ===================================337_____________ TestInstallByName.test_search_registry_returns_list ______________338339self = <tests.test_serve.TestInstallByName object at 0x7ffff4c2ec10>340341 def test_search_registry_returns_list(self):342 """search_registry returns a list (even on network error)."""343 from mcptoon.installer import search_registry344> result = search_registry("nonexistent_test_keyword_xyz123")345 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^346347tests/test_serve.py:633: 348_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 349350keyword = 'nonexistent_test_keyword_xyz123', limit = 10, strict = False351352 def search_registry(keyword, limit=10, strict=False):353 """Search MCP registries for available servers.354 355 Queries both sources and merges them, best matches first — Smithery holds the356 hosted half, the official registry the installable-package half, and a query357 like "filesystem" has good answers in both.358 359 Returns:360 list: [{name, description, command, args, env, source, url}, ...]361 362 Raises:363 RegistryError: only when *every* source failed at the network level364 (DNS, TLS, timeout, 5xx). A genuine "no matches" still returns [].365 The distinction matters: the old code returned [] for both, so a dead366 registry was indistinguishable from an empty result.367 """368 errors = []369 merged, seen = [], set()370 371 for label, fn in (("smithery", _search_smithery),372 ("registry", _search_mcp_registry)):373 try:374 results = fn(keyword, limit)375 except Exception as e:376 errors.append(f"{label}: {type(e).__name__}: {str(e)[:120]}")377 continue378 for r in results:379 key = (r.get("name") or "").lower()380 if not key or key in seen or not _relevant(keyword, r):381 continue382 seen.add(key)383 merged.append(r)384 385 if merged:386 merged.sort(key=lambda r: _relevance_score(keyword, r), reverse=True)387 return merged[:limit]388 389 # Nothing relevant. If some source was reachable, this is a real empty result;390 # if none was, the network is the problem and we say so.391 if len(errors) == 2:392> raise RegistryError(393 "No MCP registry reachable (" + "; ".join(errors) + "). "394 "Check your connection, or install directly with "395 "`mcptoon install <name> --npm <pkg>`."396 )397E mcptoon.installer.RegistryError: No MCP registry reachable (smithery: URLError: <urlopen error [Errno -3] Temporary failure in name resolution>; registry: URLError: <urlopen error [Errno -3] Temporary failure in name resolution>). Check your connection, or install directly with `mcptoon install <name> --npm <pkg>`.398399src/mcptoon/installer.py:171: RegistryError400_____________ TestInstallByName.test_search_smithery_returns_list ______________401402self = <urllib.request.HTTPSHandler object at 0x7ffff4bdb390>403http_class = <class 'http.client.HTTPSConnection'>404req = <urllib.request.Request object at 0x7ffff50b8670>405http_conn_args = {'context': <ssl.SSLContext object at 0x7ffff4e5b2b0>}406407 def do_open(self, http_class, req, **http_conn_args):408 """Return an HTTPResponse object for the request, using http_class.409 410 http_class must implement the HTTPConnection API from http.client.411 """412 host = req.host413 if not host:414 raise URLError('no host given')415 416 # will parse host:port417 h = http_class(host, timeout=req.timeout, **http_conn_args)418 h.set_debuglevel(self._debuglevel)419 420 headers = dict(req.unredirected_hdrs)421 headers.update(req.headers)422 423 # TODO(jhylton): Should this be redesigned to handle424 # persistent connections?425 426 # We want to make an HTTP/1.1 request, but the addinfourl427 # class isn't prepared to deal with a persistent connection.428 # It will try to read all remaining data from the socket,429 # which will block while the server waits for the next request.430 # So make sure the connection gets closed after the (only)431 # request.432 headers["Connection"] = "close"433 headers = {name.title(): val for name, val in headers.items()}434 435 if req._tunnel_host:436 tunnel_headers = {}437 proxy_auth_hdr = "Proxy-Authorization"438 if proxy_auth_hdr in headers:439 tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr]440 # Proxy-Authorization should not be sent to origin441 # server.442 del headers[proxy_auth_hdr]443 h.set_tunnel(req._tunnel_host, headers=tunnel_headers)444 445 try:446 try:447> h.request(req.get_method(), req.selector, req.data, headers,448 encode_chunked=req.has_header('Transfer-encoding'))449450/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1320: 451_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 452/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1386: in request453 self._send_request(method, url, body, headers, encode_chunked)454/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1432: in _send_request455 self.endheaders(body, encode_chunked=encode_chunked)456/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1381: in endheaders457 self._send_output(message_body, encode_chunked=encode_chunked)458/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1141: in _send_output459 self.send(msg)460/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1085: in send461 self.connect()462/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1520: in connect463 super().connect()464/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1051: in connect465 self.sock = self._create_connection(466/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/socket.py:850: in create_connection467 for res in getaddrinfo(host, port, 0, SOCK_STREAM):468 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^469_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 470471host = 'registry.smithery.ai', port = 443, family = 0472type = <SocketKind.SOCK_STREAM: 1>, proto = 0, flags = 0473474 def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):475 """Resolve host and port into list of address info entries.476 477 Translate the host/port argument into a sequence of 5-tuples that contain478 all the necessary arguments for creating a socket connected to that service.479 host is a domain name, a string representation of an IPv4/v6 address or480 None. port is a string service name such as 'http', a numeric port number or481 None. By passing None as the value of host and port, you can pass NULL to482 the underlying C API.483 484 The family, type and proto arguments can be optionally specified in order to485 narrow the list of addresses returned. Passing zero as a value for each of486 these arguments selects the full range of results.487 """488 # We override this function since we want to translate the numeric family489 # and socket type values to enum constants.490 addrlist = []491> for res in _socket.getaddrinfo(host, port, family, type, proto, flags):492 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^493E socket.gaierror: [Errno -3] Temporary failure in name resolution494495/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/socket.py:989: gaierror496497During handling of the above exception, another exception occurred:498499self = <tests.test_serve.TestInstallByName object at 0x7ffff4d8fbb0>500501 def test_search_smithery_returns_list(self):502 """_search_smithery returns a list."""503 from mcptoon.installer import _search_smithery504> result = _search_smithery("test")505 ^^^^^^^^^^^^^^^^^^^^^^^^506507tests/test_serve.py:639: 508_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 509src/mcptoon/installer.py:194: in _search_smithery510 data = _fetch_json(f"{SMITHERY_API_URL}/servers?{params}")511 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^512src/mcptoon/installer.py:186: in _fetch_json513 with urllib.request.urlopen(req, timeout=timeout) as resp:514 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^515/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:187: in urlopen516 return opener.open(url, data, timeout)517 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^518/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:487: in open519 response = self._open(req, data)520 ^^^^^^^^^^^^^^^^^^^^^521/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:504: in _open522 result = self._call_chain(self.handle_open, protocol, protocol +523/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:464: in _call_chain524 result = func(*args)525 ^^^^^^^^^^^526/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1368: in https_open527 return self.do_open(http.client.HTTPSConnection, req,528_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 529530self = <urllib.request.HTTPSHandler object at 0x7ffff4bdb390>531http_class = <class 'http.client.HTTPSConnection'>532req = <urllib.request.Request object at 0x7ffff50b8670>533http_conn_args = {'context': <ssl.SSLContext object at 0x7ffff4e5b2b0>}534535 def do_open(self, http_class, req, **http_conn_args):536 """Return an HTTPResponse object for the request, using http_class.537 538 http_class must implement the HTTPConnection API from http.client.539 """540 host = req.host541 if not host:542 raise URLError('no host given')543 544 # will parse host:port545 h = http_class(host, timeout=req.timeout, **http_conn_args)546 h.set_debuglevel(self._debuglevel)547 548 headers = dict(req.unredirected_hdrs)549 headers.update(req.headers)550 551 # TODO(jhylton): Should this be redesigned to handle552 # persistent connections?553 554 # We want to make an HTTP/1.1 request, but the addinfourl555 # class isn't prepared to deal with a persistent connection.556 # It will try to read all remaining data from the socket,557 # which will block while the server waits for the next request.558 # So make sure the connection gets closed after the (only)559 # request.560 headers["Connection"] = "close"561 headers = {name.title(): val for name, val in headers.items()}562 563 if req._tunnel_host:564 tunnel_headers = {}565 proxy_auth_hdr = "Proxy-Authorization"566 if proxy_auth_hdr in headers:567 tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr]568 # Proxy-Authorization should not be sent to origin569 # server.570 del headers[proxy_auth_hdr]571 h.set_tunnel(req._tunnel_host, headers=tunnel_headers)572 573 try:574 try:575 h.request(req.get_method(), req.selector, req.data, headers,576 encode_chunked=req.has_header('Transfer-encoding'))577 except OSError as err: # timeout error578> raise URLError(err)579E urllib.error.URLError: <urlopen error [Errno -3] Temporary failure in name resolution>580581/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1323: URLError582___________ TestInstallByName.test_search_mcp_registry_returns_list ____________583584self = <urllib.request.HTTPSHandler object at 0x7ffff4bdb390>585http_class = <class 'http.client.HTTPSConnection'>586req = <urllib.request.Request object at 0x7fffef744e20>587http_conn_args = {'context': <ssl.SSLContext object at 0x7ffff4e5b2b0>}588589 def do_open(self, http_class, req, **http_conn_args):590 """Return an HTTPResponse object for the request, using http_class.591 592 http_class must implement the HTTPConnection API from http.client.593 """594 host = req.host595 if not host:596 raise URLError('no host given')597 598 # will parse host:port599 h = http_class(host, timeout=req.timeout, **http_conn_args)600 h.set_debuglevel(self._debuglevel)601 602 headers = dict(req.unredirected_hdrs)603 headers.update(req.headers)604 605 # TODO(jhylton): Should this be redesigned to handle606 # persistent connections?607 608 # We want to make an HTTP/1.1 request, but the addinfourl609 # class isn't prepared to deal with a persistent connection.610 # It will try to read all remaining data from the socket,611 # which will block while the server waits for the next request.612 # So make sure the connection gets closed after the (only)613 # request.614 headers["Connection"] = "close"615 headers = {name.title(): val for name, val in headers.items()}616 617 if req._tunnel_host:618 tunnel_headers = {}619 proxy_auth_hdr = "Proxy-Authorization"620 if proxy_auth_hdr in headers:621 tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr]622 # Proxy-Authorization should not be sent to origin623 # server.624 del headers[proxy_auth_hdr]625 h.set_tunnel(req._tunnel_host, headers=tunnel_headers)626 627 try:628 try:629> h.request(req.get_method(), req.selector, req.data, headers,630 encode_chunked=req.has_header('Transfer-encoding'))631632/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1320: 633_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 634/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1386: in request635 self._send_request(method, url, body, headers, encode_chunked)636/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1432: in _send_request637 self.endheaders(body, encode_chunked=encode_chunked)638/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1381: in endheaders639 self._send_output(message_body, encode_chunked=encode_chunked)640/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1141: in _send_output641 self.send(msg)642/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1085: in send643 self.connect()644/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1520: in connect645 super().connect()646/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/http/client.py:1051: in connect647 self.sock = self._create_connection(648/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/socket.py:850: in create_connection649 for res in getaddrinfo(host, port, 0, SOCK_STREAM):650 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^651_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 652653host = 'registry.modelcontextprotocol.io', port = 443, family = 0654type = <SocketKind.SOCK_STREAM: 1>, proto = 0, flags = 0655656 def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):657 """Resolve host and port into list of address info entries.658 659 Translate the host/port argument into a sequence of 5-tuples that contain660 all the necessary arguments for creating a socket connected to that service.661 host is a domain name, a string representation of an IPv4/v6 address or662 None. port is a string service name such as 'http', a numeric port number or663 None. By passing None as the value of host and port, you can pass NULL to664 the underlying C API.665 666 The family, type and proto arguments can be optionally specified in order to667 narrow the list of addresses returned. Passing zero as a value for each of668 these arguments selects the full range of results.669 """670 # We override this function since we want to translate the numeric family671 # and socket type values to enum constants.672 addrlist = []673> for res in _socket.getaddrinfo(host, port, family, type, proto, flags):674 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^675E socket.gaierror: [Errno -3] Temporary failure in name resolution676677/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/socket.py:989: gaierror678679During handling of the above exception, another exception occurred:680681self = <tests.test_serve.TestInstallByName object at 0x7ffff4d8fce0>682683 def test_search_mcp_registry_returns_list(self):684 """_search_mcp_registry returns a list."""685 from mcptoon.installer import _search_mcp_registry686> result = _search_mcp_registry("test")687 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^688689tests/test_serve.py:645: 690_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 691src/mcptoon/installer.py:235: in _search_mcp_registry692 data = _fetch_json(f"{MCP_REGISTRY_URL}/servers?{params}")693 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^694src/mcptoon/installer.py:186: in _fetch_json695 with urllib.request.urlopen(req, timeout=timeout) as resp:696 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^697/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:187: in urlopen698 return opener.open(url, data, timeout)699 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^700/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:487: in open701 response = self._open(req, data)702 ^^^^^^^^^^^^^^^^^^^^^703/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:504: in _open704 result = self._call_chain(self.handle_open, protocol, protocol +705/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:464: in _call_chain706 result = func(*args)707 ^^^^^^^^^^^708/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1368: in https_open709 return self.do_open(http.client.HTTPSConnection, req,710_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 711712self = <urllib.request.HTTPSHandler object at 0x7ffff4bdb390>713http_class = <class 'http.client.HTTPSConnection'>714req = <urllib.request.Request object at 0x7fffef744e20>715http_conn_args = {'context': <ssl.SSLContext object at 0x7ffff4e5b2b0>}716717 def do_open(self, http_class, req, **http_conn_args):718 """Return an HTTPResponse object for the request, using http_class.719 720 http_class must implement the HTTPConnection API from http.client.721 """722 host = req.host723 if not host:724 raise URLError('no host given')725 726 # will parse host:port727 h = http_class(host, timeout=req.timeout, **http_conn_args)728 h.set_debuglevel(self._debuglevel)729 730 headers = dict(req.unredirected_hdrs)731 headers.update(req.headers)732 733 # TODO(jhylton): Should this be redesigned to handle734 # persistent connections?735 736 # We want to make an HTTP/1.1 request, but the addinfourl737 # class isn't prepared to deal with a persistent connection.738 # It will try to read all remaining data from the socket,739 # which will block while the server waits for the next request.740 # So make sure the connection gets closed after the (only)741 # request.742 headers["Connection"] = "close"743 headers = {name.title(): val for name, val in headers.items()}744 745 if req._tunnel_host:746 tunnel_headers = {}747 proxy_auth_hdr = "Proxy-Authorization"748 if proxy_auth_hdr in headers:749 tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr]750 # Proxy-Authorization should not be sent to origin751 # server.752 del headers[proxy_auth_hdr]753 h.set_tunnel(req._tunnel_host, headers=tunnel_headers)754 755 try:756 try:757 h.request(req.get_method(), req.selector, req.data, headers,758 encode_chunked=req.has_header('Transfer-encoding'))759 except OSError as err: # timeout error760> raise URLError(err)761E urllib.error.URLError: <urlopen error [Errno -3] Temporary failure in name resolution>762763/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/urllib/request.py:1323: URLError764=========================== short test summary info ============================765FAILED tests/test_serve.py::TestInstallByName::test_search_registry_returns_list - mcptoon.installer.RegistryError: No MCP registry reachable (smithery: URLEr...766FAILED tests/test_serve.py::TestInstallByName::test_search_smithery_returns_list - urllib.error.URLError: <urlopen error [Errno -3] Temporary failure in name ...767FAILED tests/test_serve.py::TestInstallByName::test_search_mcp_registry_returns_list - urllib.error.URLError: <urlopen error [Errno -3] Temporary failure in name ...768============= 3 failed, 1323 passed, 1 skipped in 69.88s (0:01:09) =============