mcptoon-0.7.22
checks.aarch64-darwin.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/qmli4gwqi36clrxc1i29q6mnf8sizlbc-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/qmli4gwqi36clrxc1i29q6mnf8sizlbc-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/qmli4gwqi36clrxc1i29q6mnf8sizlbc-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/qmli4gwqi36clrxc1i29q6mnf8sizlbc-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/qmli4gwqi36clrxc1i29q6mnf8sizlbc-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/qmli4gwqi36clrxc1i29q6mnf8sizlbc-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/sync.py -> build/lib/mcptoon122copying src/mcptoon/config.py -> build/lib/mcptoon123copying src/mcptoon/skills.py -> build/lib/mcptoon124copying src/mcptoon/manifest.py -> build/lib/mcptoon125copying src/mcptoon/health.py -> build/lib/mcptoon126copying src/mcptoon/discover.py -> build/lib/mcptoon127copying src/mcptoon/client.py -> build/lib/mcptoon128copying src/mcptoon/cache.py -> build/lib/mcptoon129copying src/mcptoon/__init__.py -> build/lib/mcptoon130copying src/mcptoon/serve.py -> build/lib/mcptoon131copying src/mcptoon/native_tools.py -> build/lib/mcptoon132copying src/mcptoon/bench.py -> build/lib/mcptoon133copying src/mcptoon/installer.py -> build/lib/mcptoon134copying src/mcptoon/cli.py -> build/lib/mcptoon135copying src/mcptoon/footer.py -> build/lib/mcptoon136copying src/mcptoon/toon_vendored.py -> build/lib/mcptoon137copying src/mcptoon/plugin.py -> build/lib/mcptoon138copying src/mcptoon/errors.py -> build/lib/mcptoon139copying src/mcptoon/watch.py -> build/lib/mcptoon140copying src/mcptoon/demo_server.py -> build/lib/mcptoon141copying src/mcptoon/welcome.py -> build/lib/mcptoon142copying src/mcptoon/router.py -> build/lib/mcptoon143copying src/mcptoon/demo.py -> build/lib/mcptoon144copying src/mcptoon/schema_simplifier.py -> build/lib/mcptoon145copying src/mcptoon/usage.py -> build/lib/mcptoon146copying src/mcptoon/packs.py -> build/lib/mcptoon147copying src/mcptoon/__main__.py -> build/lib/mcptoon148copying src/mcptoon/output.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.macosx-14.0-arm64/wheel161running install162running install_lib163creating build/bdist.macosx-14.0-arm64/wheel164creating build/bdist.macosx-14.0-arm64/wheel/mcptoon165copying build/lib/mcptoon/sync.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon166copying build/lib/mcptoon/config.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon167copying build/lib/mcptoon/skills.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon168copying build/lib/mcptoon/manifest.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon169copying build/lib/mcptoon/health.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon170copying build/lib/mcptoon/discover.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon171copying build/lib/mcptoon/client.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon172copying build/lib/mcptoon/packs.json -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon173copying build/lib/mcptoon/cache.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon174copying build/lib/mcptoon/__init__.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon175copying build/lib/mcptoon/serve.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon176copying build/lib/mcptoon/native_tools.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon177copying build/lib/mcptoon/bench.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon178copying build/lib/mcptoon/installer.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon179copying build/lib/mcptoon/cli.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon180copying build/lib/mcptoon/footer.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon181copying build/lib/mcptoon/toon_vendored.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon182copying build/lib/mcptoon/plugin.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon183copying build/lib/mcptoon/errors.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon184copying build/lib/mcptoon/watch.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon185copying build/lib/mcptoon/demo_server.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon186copying build/lib/mcptoon/welcome.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon187copying build/lib/mcptoon/router.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon188copying build/lib/mcptoon/demo.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon189copying build/lib/mcptoon/schema_simplifier.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon190copying build/lib/mcptoon/usage.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon191copying build/lib/mcptoon/packs.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon192copying build/lib/mcptoon/__main__.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon193copying build/lib/mcptoon/output.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon194running install_egg_info195Copying src/mcptoon.egg-info to build/bdist.macosx-14.0-arm64/wheel/./mcptoon-0.7.22-py3.14.egg-info196running install_scripts197creating build/bdist.macosx-14.0-arm64/wheel/mcptoon-0.7.22.dist-info/WHEEL198creating '/nix/var/nix/builds/nix-54374-1089934027/source/dist/.tmp-pna55hk0/mcptoon-0.7.22-py3-none-any.whl' and adding 'build/bdist.macosx-14.0-arm64/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.macosx-14.0-arm64/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
247checking for references to /nix/var/nix/builds/nix-54374-1089934027/ in /nix/store/5n98lxzbpqp42lp7f19fd401y06w9x5w-mcptoon-0.7.22...248patching script interpreter paths in /nix/store/5n98lxzbpqp42lp7f19fd401y06w9x5w-mcptoon-0.7.22249stripping (with command strip and flags -S) in /nix/store/5n98lxzbpqp42lp7f19fd401y06w9x5w-mcptoon-0.7.22/lib /nix/store/5n98lxzbpqp42lp7f19fd401y06w9x5w-mcptoon-0.7.22/bin250checking for references to /nix/var/nix/builds/nix-54374-1089934027/ in /nix/store/i86yhgfvv5wa13qrwv77gvlakzclzr83-mcptoon-0.7.22-dist...251patching script interpreter paths in /nix/store/i86yhgfvv5wa13qrwv77gvlakzclzr83-mcptoon-0.7.22-dist252Rewriting #!/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/bin/python3.14 to #!/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7253wrapping `/nix/store/5n98lxzbpqp42lp7f19fd401y06w9x5w-mcptoon-0.7.22/bin/mcptoon'...254Executing pythonRemoveTestsDir255Finished executing pythonRemoveTestsDirinstallCheckPhase
256no Makefile or custom installCheckPhase, doing nothingpythonImportsCheckPhase
257Executing pythonImportsCheckPhase258Check whether the following modules can be imported: mcptoonpytestCheckPhase
259Executing pytestCheckPhase260pytest flags: -m pytest261============================= test session starts ==============================262platform darwin -- Python 3.14.7, pytest-9.1.1, pluggy-1.6.0263rootdir: /nix/var/nix/builds/nix-54374-1089934027/source264configfile: pyproject.toml265testpaths: tests266collected 1327 items 267268tests/test_bench.py ............. [ 0%]269tests/test_cache.py .... [ 1%]270tests/test_calculator.py .......................... [ 3%]271tests/test_claude_plugin_package.py ............. [ 4%]272tests/test_cli_flags.py ........... [ 5%]273tests/test_client.py .............................. [ 7%]274tests/test_command_coverage.py ......... [ 7%]275tests/test_completion.py ........ [ 8%]276tests/test_config.py ......... [ 9%]277tests/test_dead_server_diagnostics.py ... [ 9%]278tests/test_demo.py ..................... [ 11%]279tests/test_demo_dead_package.py ........ [ 11%]280tests/test_demo_server.py .............................................. [ 15%]281..... [ 15%]282tests/test_discover.py .................................... [ 18%]283tests/test_doctor_star_hint.py ..... [ 18%]284tests/test_envelope.py ........ [ 19%]285tests/test_fallback_json.py ...... [ 19%]286tests/test_footprint_claims.py ............ [ 20%]287tests/test_gemini_manifest.py ...... [ 21%]288tests/test_health.py ............. [ 22%]289tests/test_help_shortcircuit.py ......... [ 22%]290tests/test_http_user_agent.py ......... [ 23%]291tests/test_installer_registry.py ............................ [ 25%]292tests/test_lang.py .......................... [ 27%]293tests/test_llms_txt.py ...... [ 27%]294tests/test_native_tools.py ................................. [ 30%]295tests/test_output.py ................................................... [ 34%]296........................................................................ [ 39%]297................ [ 40%]298tests/test_plugin_install.py .......... [ 41%]299tests/test_plugin_scan.py ............................... [ 43%]300tests/test_policy_overrides.py ................ [ 45%]301tests/test_presence.py .............................................. [ 48%]302tests/test_readme_links.py ... [ 48%]303tests/test_registry_sync.py ............ [ 49%]304tests/test_reversible.py ............................................... [ 53%]305................. [ 54%]306tests/test_router.py .............................................. [ 58%]307tests/test_search.py ................................ [ 60%]308tests/test_serve.py .................................................... [ 64%]309FFF [ 64%]310tests/test_serve_perf.py .......... [ 65%]311tests/test_serve_prompts.py ........ [ 65%]312tests/test_skill_packs.py ............... [ 67%]313tests/test_skill_search.py .......... [ 67%]314tests/test_skills.py ................................................... [ 71%]315........................................................................ [ 77%]316.............. [ 78%]317tests/test_stats_toggle.py ......... [ 78%]318tests/test_stderr_pipe_deadlock.py .... [ 79%]319tests/test_sync.py ................ [ 80%]320tests/test_tier_claims_consistent.py .... [ 80%]321tests/test_toml_config.py .......................... [ 82%]322tests/test_toon_cross_validate.py ............................... [ 84%]323tests/test_uninstall_end_to_end.py .......... [ 85%]324tests/test_v02_features.py .................................... [ 88%]325tests/test_v04_features.py ................ [ 89%]326tests/test_v05_features.py ...................... [ 91%]327tests/test_v072_delight.py .............s.. [ 92%]328tests/test_v073_http_security.py .............................. [ 94%]329tests/test_v074_stdio_timeout.py ............ [ 95%]330tests/test_v076_stateless_serve.py ................... [ 97%]331tests/test_v07_spec2026.py ..................... [ 98%]332tests/test_watch.py .................. [100%]333334=================================== FAILURES ===================================335_____________ TestInstallByName.test_search_registry_returns_list ______________336337self = <tests.test_serve.TestInstallByName object at 0x109ce6d50>338339 def test_search_registry_returns_list(self):340 """search_registry returns a list (even on network error)."""341 from mcptoon.installer import search_registry342> result = search_registry("nonexistent_test_keyword_xyz123")343 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^344345tests/test_serve.py:633: 346_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 347348keyword = 'nonexistent_test_keyword_xyz123', limit = 10, strict = False349350 def search_registry(keyword, limit=10, strict=False):351 """Search MCP registries for available servers.352 353 Queries both sources and merges them, best matches first — Smithery holds the354 hosted half, the official registry the installable-package half, and a query355 like "filesystem" has good answers in both.356 357 Returns:358 list: [{name, description, command, args, env, source, url}, ...]359 360 Raises:361 RegistryError: only when *every* source failed at the network level362 (DNS, TLS, timeout, 5xx). A genuine "no matches" still returns [].363 The distinction matters: the old code returned [] for both, so a dead364 registry was indistinguishable from an empty result.365 """366 errors = []367 merged, seen = [], set()368 369 for label, fn in (("smithery", _search_smithery),370 ("registry", _search_mcp_registry)):371 try:372 results = fn(keyword, limit)373 except Exception as e:374 errors.append(f"{label}: {type(e).__name__}: {str(e)[:120]}")375 continue376 for r in results:377 key = (r.get("name") or "").lower()378 if not key or key in seen or not _relevant(keyword, r):379 continue380 seen.add(key)381 merged.append(r)382 383 if merged:384 merged.sort(key=lambda r: _relevance_score(keyword, r), reverse=True)385 return merged[:limit]386 387 # Nothing relevant. If some source was reachable, this is a real empty result;388 # if none was, the network is the problem and we say so.389 if len(errors) == 2:390> raise RegistryError(391 "No MCP registry reachable (" + "; ".join(errors) + "). "392 "Check your connection, or install directly with "393 "`mcptoon install <name> --npm <pkg>`."394 )395E mcptoon.installer.RegistryError: No MCP registry reachable (smithery: URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.; registry: URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.). Check your connection, or install directly with `mcptoon install <name> --npm <pkg>`.396397src/mcptoon/installer.py:171: RegistryError398_____________ TestInstallByName.test_search_smithery_returns_list ______________399400self = <urllib.request.HTTPSHandler object at 0x109dfb4d0>401http_class = <class 'http.client.HTTPSConnection'>402req = <urllib.request.Request object at 0x1099974d0>403http_conn_args = {'context': <ssl.SSLContext object at 0x109c0f5f0>}404405 def do_open(self, http_class, req, **http_conn_args):406 """Return an HTTPResponse object for the request, using http_class.407 408 http_class must implement the HTTPConnection API from http.client.409 """410 host = req.host411 if not host:412 raise URLError('no host given')413 414 # will parse host:port415 h = http_class(host, timeout=req.timeout, **http_conn_args)416 h.set_debuglevel(self._debuglevel)417 418 headers = dict(req.unredirected_hdrs)419 headers.update(req.headers)420 421 # TODO(jhylton): Should this be redesigned to handle422 # persistent connections?423 424 # We want to make an HTTP/1.1 request, but the addinfourl425 # class isn't prepared to deal with a persistent connection.426 # It will try to read all remaining data from the socket,427 # which will block while the server waits for the next request.428 # So make sure the connection gets closed after the (only)429 # request.430 headers["Connection"] = "close"431 headers = {name.title(): val for name, val in headers.items()}432 433 if req._tunnel_host:434 tunnel_headers = {}435 proxy_auth_hdr = "Proxy-Authorization"436 if proxy_auth_hdr in headers:437 tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr]438 # Proxy-Authorization should not be sent to origin439 # server.440 del headers[proxy_auth_hdr]441 h.set_tunnel(req._tunnel_host, headers=tunnel_headers)442 443 try:444 try:445> h.request(req.get_method(), req.selector, req.data, headers,446 encode_chunked=req.has_header('Transfer-encoding'))447448/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:1320: 449_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 450/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/http/client.py:1386: in request451 self._send_request(method, url, body, headers, encode_chunked)452/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/http/client.py:1432: in _send_request453 self.endheaders(body, encode_chunked=encode_chunked)454/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/http/client.py:1381: in endheaders455 self._send_output(message_body, encode_chunked=encode_chunked)456/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/http/client.py:1141: in _send_output457 self.send(msg)458/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/http/client.py:1085: in send459 self.connect()460/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/http/client.py:1527: in connect461 self.sock = self._context.wrap_socket(self.sock,462/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/ssl.py:455: in wrap_socket463 return self.sslsocket_class._create(464/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/ssl.py:1076: in _create465 self.do_handshake()466_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 467468self = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=0>, block = False469470 @_sslcopydoc471 def do_handshake(self, block=False):472 self._check_connected()473 timeout = self.gettimeout()474 try:475 if timeout == 0.0 and block:476 self.settimeout(None)477> self._sslobj.do_handshake()478E ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1082)479480/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/ssl.py:1372: SSLCertVerificationError481482During handling of the above exception, another exception occurred:483484self = <tests.test_serve.TestInstallByName object at 0x109ca3bb0>485486 def test_search_smithery_returns_list(self):487 """_search_smithery returns a list."""488 from mcptoon.installer import _search_smithery489> result = _search_smithery("test")490 ^^^^^^^^^^^^^^^^^^^^^^^^491492tests/test_serve.py:639: 493_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 494src/mcptoon/installer.py:194: in _search_smithery495 data = _fetch_json(f"{SMITHERY_API_URL}/servers?{params}")496 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^497src/mcptoon/installer.py:186: in _fetch_json498 with urllib.request.urlopen(req, timeout=timeout) as resp:499 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^500/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:187: in urlopen501 return opener.open(url, data, timeout)502 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^503/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:487: in open504 response = self._open(req, data)505 ^^^^^^^^^^^^^^^^^^^^^506/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:504: in _open507 result = self._call_chain(self.handle_open, protocol, protocol +508/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:464: in _call_chain509 result = func(*args)510 ^^^^^^^^^^^511/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:1368: in https_open512 return self.do_open(http.client.HTTPSConnection, req,513_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 514515self = <urllib.request.HTTPSHandler object at 0x109dfb4d0>516http_class = <class 'http.client.HTTPSConnection'>517req = <urllib.request.Request object at 0x1099974d0>518http_conn_args = {'context': <ssl.SSLContext object at 0x109c0f5f0>}519520 def do_open(self, http_class, req, **http_conn_args):521 """Return an HTTPResponse object for the request, using http_class.522 523 http_class must implement the HTTPConnection API from http.client.524 """525 host = req.host526 if not host:527 raise URLError('no host given')528 529 # will parse host:port530 h = http_class(host, timeout=req.timeout, **http_conn_args)531 h.set_debuglevel(self._debuglevel)532 533 headers = dict(req.unredirected_hdrs)534 headers.update(req.headers)535 536 # TODO(jhylton): Should this be redesigned to handle537 # persistent connections?538 539 # We want to make an HTTP/1.1 request, but the addinfourl540 # class isn't prepared to deal with a persistent connection.541 # It will try to read all remaining data from the socket,542 # which will block while the server waits for the next request.543 # So make sure the connection gets closed after the (only)544 # request.545 headers["Connection"] = "close"546 headers = {name.title(): val for name, val in headers.items()}547 548 if req._tunnel_host:549 tunnel_headers = {}550 proxy_auth_hdr = "Proxy-Authorization"551 if proxy_auth_hdr in headers:552 tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr]553 # Proxy-Authorization should not be sent to origin554 # server.555 del headers[proxy_auth_hdr]556 h.set_tunnel(req._tunnel_host, headers=tunnel_headers)557 558 try:559 try:560 h.request(req.get_method(), req.selector, req.data, headers,561 encode_chunked=req.has_header('Transfer-encoding'))562 except OSError as err: # timeout error563> raise URLError(err)564E urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1082)>565566/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:1323: URLError567___________ TestInstallByName.test_search_mcp_registry_returns_list ____________568569self = <urllib.request.HTTPSHandler object at 0x109dfb4d0>570http_class = <class 'http.client.HTTPSConnection'>571req = <urllib.request.Request object at 0x10a52fe10>572http_conn_args = {'context': <ssl.SSLContext object at 0x109c0f5f0>}573574 def do_open(self, http_class, req, **http_conn_args):575 """Return an HTTPResponse object for the request, using http_class.576 577 http_class must implement the HTTPConnection API from http.client.578 """579 host = req.host580 if not host:581 raise URLError('no host given')582 583 # will parse host:port584 h = http_class(host, timeout=req.timeout, **http_conn_args)585 h.set_debuglevel(self._debuglevel)586 587 headers = dict(req.unredirected_hdrs)588 headers.update(req.headers)589 590 # TODO(jhylton): Should this be redesigned to handle591 # persistent connections?592 593 # We want to make an HTTP/1.1 request, but the addinfourl594 # class isn't prepared to deal with a persistent connection.595 # It will try to read all remaining data from the socket,596 # which will block while the server waits for the next request.597 # So make sure the connection gets closed after the (only)598 # request.599 headers["Connection"] = "close"600 headers = {name.title(): val for name, val in headers.items()}601 602 if req._tunnel_host:603 tunnel_headers = {}604 proxy_auth_hdr = "Proxy-Authorization"605 if proxy_auth_hdr in headers:606 tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr]607 # Proxy-Authorization should not be sent to origin608 # server.609 del headers[proxy_auth_hdr]610 h.set_tunnel(req._tunnel_host, headers=tunnel_headers)611 612 try:613 try:614> h.request(req.get_method(), req.selector, req.data, headers,615 encode_chunked=req.has_header('Transfer-encoding'))616617/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:1320: 618_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 619/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/http/client.py:1386: in request620 self._send_request(method, url, body, headers, encode_chunked)621/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/http/client.py:1432: in _send_request622 self.endheaders(body, encode_chunked=encode_chunked)623/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/http/client.py:1381: in endheaders624 self._send_output(message_body, encode_chunked=encode_chunked)625/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/http/client.py:1141: in _send_output626 self.send(msg)627/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/http/client.py:1085: in send628 self.connect()629/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/http/client.py:1527: in connect630 self.sock = self._context.wrap_socket(self.sock,631/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/ssl.py:455: in wrap_socket632 return self.sslsocket_class._create(633/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/ssl.py:1076: in _create634 self.do_handshake()635_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 636637self = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=0>, block = False638639 @_sslcopydoc640 def do_handshake(self, block=False):641 self._check_connected()642 timeout = self.gettimeout()643 try:644 if timeout == 0.0 and block:645 self.settimeout(None)646> self._sslobj.do_handshake()647E ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1082)648649/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/ssl.py:1372: SSLCertVerificationError650651During handling of the above exception, another exception occurred:652653self = <tests.test_serve.TestInstallByName object at 0x109ca3ce0>654655 def test_search_mcp_registry_returns_list(self):656 """_search_mcp_registry returns a list."""657 from mcptoon.installer import _search_mcp_registry658> result = _search_mcp_registry("test")659 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^660661tests/test_serve.py:645: 662_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 663src/mcptoon/installer.py:235: in _search_mcp_registry664 data = _fetch_json(f"{MCP_REGISTRY_URL}/servers?{params}")665 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^666src/mcptoon/installer.py:186: in _fetch_json667 with urllib.request.urlopen(req, timeout=timeout) as resp:668 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^669/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:187: in urlopen670 return opener.open(url, data, timeout)671 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^672/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:487: in open673 response = self._open(req, data)674 ^^^^^^^^^^^^^^^^^^^^^675/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:504: in _open676 result = self._call_chain(self.handle_open, protocol, protocol +677/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:464: in _call_chain678 result = func(*args)679 ^^^^^^^^^^^680/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:1368: in https_open681 return self.do_open(http.client.HTTPSConnection, req,682_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 683684self = <urllib.request.HTTPSHandler object at 0x109dfb4d0>685http_class = <class 'http.client.HTTPSConnection'>686req = <urllib.request.Request object at 0x10a52fe10>687http_conn_args = {'context': <ssl.SSLContext object at 0x109c0f5f0>}688689 def do_open(self, http_class, req, **http_conn_args):690 """Return an HTTPResponse object for the request, using http_class.691 692 http_class must implement the HTTPConnection API from http.client.693 """694 host = req.host695 if not host:696 raise URLError('no host given')697 698 # will parse host:port699 h = http_class(host, timeout=req.timeout, **http_conn_args)700 h.set_debuglevel(self._debuglevel)701 702 headers = dict(req.unredirected_hdrs)703 headers.update(req.headers)704 705 # TODO(jhylton): Should this be redesigned to handle706 # persistent connections?707 708 # We want to make an HTTP/1.1 request, but the addinfourl709 # class isn't prepared to deal with a persistent connection.710 # It will try to read all remaining data from the socket,711 # which will block while the server waits for the next request.712 # So make sure the connection gets closed after the (only)713 # request.714 headers["Connection"] = "close"715 headers = {name.title(): val for name, val in headers.items()}716 717 if req._tunnel_host:718 tunnel_headers = {}719 proxy_auth_hdr = "Proxy-Authorization"720 if proxy_auth_hdr in headers:721 tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr]722 # Proxy-Authorization should not be sent to origin723 # server.724 del headers[proxy_auth_hdr]725 h.set_tunnel(req._tunnel_host, headers=tunnel_headers)726 727 try:728 try:729 h.request(req.get_method(), req.selector, req.data, headers,730 encode_chunked=req.has_header('Transfer-encoding'))731 except OSError as err: # timeout error732> raise URLError(err)733E urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1082)>734735/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/urllib/request.py:1323: URLError736=========================== short test summary info ============================737FAILED tests/test_serve.py::TestInstallByName::test_search_registry_returns_list - mcptoon.installer.RegistryError: No MCP registry reachable (smithery: URLEr...738FAILED tests/test_serve.py::TestInstallByName::test_search_smithery_returns_list - urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] cert...739FAILED tests/test_serve.py::TestInstallByName::test_search_mcp_registry_returns_list - urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] cert...740============= 3 failed, 1323 passed, 1 skipped in 80.72s (0:01:20) =============