hanzo-mcp 0.8.15__tar.gz → 0.9.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of hanzo-mcp might be problematic. Click here for more details.

Files changed (243) hide show
  1. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/PKG-INFO +1 -1
  2. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/__init__.py +1 -1
  3. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/cli.py +108 -4
  4. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/__init__.py +5 -0
  5. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/agent.py +5 -0
  6. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/agent_tool.py +3 -0
  7. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/agent_tool_v1_deprecated.py +5 -0
  8. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/clarification_tool.py +2 -0
  9. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/claude_desktop_auth.py +5 -0
  10. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/cli_agent_base.py +5 -0
  11. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/cli_tools.py +26 -0
  12. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/code_auth_tool.py +5 -0
  13. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/critic_tool.py +2 -0
  14. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/iching_tool.py +5 -0
  15. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/network_tool.py +5 -0
  16. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/review_tool.py +2 -0
  17. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/swarm_alias.py +5 -0
  18. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/swarm_tool.py +3 -0
  19. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/swarm_tool_v1_deprecated.py +5 -0
  20. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/unified_cli_tools.py +5 -0
  21. hanzo_mcp-0.9.1/hanzo_mcp/tools/common/auto_timeout.py +234 -0
  22. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/base.py +4 -0
  23. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/batch_tool.py +5 -0
  24. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/config_tool.py +5 -0
  25. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/critic_tool.py +5 -0
  26. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/paginated_base.py +4 -0
  27. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/stats.py +5 -0
  28. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/thinking_tool.py +5 -0
  29. hanzo_mcp-0.9.1/hanzo_mcp/tools/common/timeout_parser.py +103 -0
  30. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/tool_disable.py +5 -0
  31. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/tool_enable.py +5 -0
  32. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/tool_list.py +5 -0
  33. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/config/config_tool.py +5 -0
  34. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/config/mode_tool.py +5 -0
  35. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/graph.py +5 -0
  36. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/graph_add.py +5 -0
  37. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/graph_query.py +5 -0
  38. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/graph_remove.py +5 -0
  39. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/graph_search.py +5 -0
  40. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/graph_stats.py +5 -0
  41. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/sql.py +5 -0
  42. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/sql_query.py +2 -0
  43. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/sql_search.py +5 -0
  44. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/sql_stats.py +5 -0
  45. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/editor/neovim_command.py +5 -0
  46. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/editor/neovim_edit.py +5 -0
  47. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/editor/neovim_session.py +5 -0
  48. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/ast_tool.py +2 -0
  49. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/batch_search.py +5 -0
  50. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/content_replace.py +5 -0
  51. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/diff.py +5 -0
  52. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/directory_tree.py +5 -0
  53. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/directory_tree_paginated.py +5 -0
  54. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/edit.py +5 -0
  55. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/find.py +5 -0
  56. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/find_files.py +5 -0
  57. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/git_search.py +5 -0
  58. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/grep.py +5 -0
  59. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/multi_edit.py +5 -0
  60. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/read.py +5 -0
  61. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/rules_tool.py +5 -0
  62. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/search_tool.py +5 -0
  63. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/symbols_tool.py +5 -0
  64. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/tree.py +5 -0
  65. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/watch.py +5 -0
  66. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/write.py +5 -0
  67. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/jupyter/jupyter.py +5 -0
  68. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/jupyter/notebook_edit.py +5 -0
  69. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/jupyter/notebook_read.py +5 -0
  70. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/llm/consensus_tool.py +2 -0
  71. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/llm/llm_manage.py +5 -0
  72. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/llm/llm_tool.py +2 -0
  73. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/llm/llm_unified.py +5 -0
  74. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/llm/provider_tools.py +5 -0
  75. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/lsp/lsp_tool.py +5 -0
  76. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/mcp/mcp_add.py +5 -0
  77. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/mcp/mcp_remove.py +5 -0
  78. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/mcp/mcp_stats.py +5 -0
  79. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/mcp/mcp_tool.py +5 -0
  80. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/memory/knowledge_tools.py +14 -0
  81. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/memory/memory_tools.py +17 -0
  82. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/search/find_tool.py +3 -1
  83. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/search/unified_search.py +3 -1
  84. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/base_process.py +4 -2
  85. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/bash_tool.py +2 -0
  86. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/logs.py +5 -0
  87. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/npx.py +5 -0
  88. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/npx_background.py +5 -0
  89. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/npx_tool.py +5 -0
  90. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/open.py +5 -0
  91. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/pkill.py +5 -0
  92. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/process_tool.py +5 -0
  93. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/processes.py +5 -0
  94. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/run_background.py +5 -0
  95. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/run_command.py +2 -0
  96. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/run_command_windows.py +5 -0
  97. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/streaming_command.py +5 -0
  98. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/uvx.py +5 -0
  99. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/uvx_background.py +5 -0
  100. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/uvx_tool.py +5 -0
  101. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/zsh_tool.py +3 -0
  102. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/todo/todo.py +5 -0
  103. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/todo/todo_read.py +5 -0
  104. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/todo/todo_write.py +5 -0
  105. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/index_tool.py +5 -0
  106. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/vector.py +5 -0
  107. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/vector_index.py +5 -0
  108. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/vector_search.py +5 -0
  109. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp.egg-info/PKG-INFO +1 -1
  110. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp.egg-info/SOURCES.txt +2 -0
  111. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/pyproject.toml +1 -1
  112. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/README.md +0 -0
  113. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/__main__.py +0 -0
  114. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/analytics/__init__.py +0 -0
  115. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/analytics/posthog_analytics.py +0 -0
  116. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/bridge.py +0 -0
  117. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/cli_enhanced.py +0 -0
  118. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/cli_plugin.py +0 -0
  119. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/compute_nodes.py +0 -0
  120. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/config/__init__.py +0 -0
  121. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/config/settings.py +0 -0
  122. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/config/tool_config.py +0 -0
  123. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/core/base_agent.py +0 -0
  124. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/core/model_registry.py +0 -0
  125. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/dev_server.py +0 -0
  126. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/__init__.py +0 -0
  127. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/compact_conversation.py +0 -0
  128. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/create_release.py +0 -0
  129. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/enhanced_prompts.py +0 -0
  130. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/example_custom_prompt.py +0 -0
  131. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/project_system.py +0 -0
  132. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/project_todo_reminder.py +0 -0
  133. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/tool_explorer.py +0 -0
  134. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/utils.py +0 -0
  135. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/server.py +0 -0
  136. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/server_enhanced.py +0 -0
  137. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/__init__.py +0 -0
  138. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/clarification_protocol.py +0 -0
  139. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/claude_cli_tool.py +0 -0
  140. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/code_auth.py +0 -0
  141. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/codex_cli_tool.py +0 -0
  142. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/gemini_cli_tool.py +0 -0
  143. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/grok_cli_tool.py +0 -0
  144. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/prompt.py +0 -0
  145. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/tool_adapter.py +0 -0
  146. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/__init__.py +0 -0
  147. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/context.py +0 -0
  148. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/context_fix.py +0 -0
  149. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/decorators.py +0 -0
  150. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/enhanced_base.py +0 -0
  151. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/fastmcp_pagination.py +0 -0
  152. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/forgiving_edit.py +0 -0
  153. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/mode.py +0 -0
  154. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/mode_loader.py +0 -0
  155. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/paginated_response.py +0 -0
  156. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/pagination.py +0 -0
  157. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/permissions.py +0 -0
  158. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/personality.py +0 -0
  159. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/plugin_loader.py +0 -0
  160. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/test_helpers.py +0 -0
  161. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/truncate.py +0 -0
  162. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/validation.py +0 -0
  163. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/config/__init__.py +0 -0
  164. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/config/index_config.py +0 -0
  165. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/__init__.py +0 -0
  166. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/database_manager.py +0 -0
  167. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/editor/__init__.py +0 -0
  168. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/__init__.py +0 -0
  169. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/ast_multi_edit.py +0 -0
  170. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/base.py +0 -0
  171. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/unix_aliases.py +0 -0
  172. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/jupyter/__init__.py +0 -0
  173. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/jupyter/base.py +0 -0
  174. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/llm/__init__.py +0 -0
  175. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/lsp/__init__.py +0 -0
  176. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/mcp/__init__.py +0 -0
  177. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/memory/__init__.py +0 -0
  178. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/search/__init__.py +0 -0
  179. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/__init__.py +0 -0
  180. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/auto_background.py +0 -0
  181. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/base.py +0 -0
  182. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/bash_session.py +0 -0
  183. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/bash_session_executor.py +0 -0
  184. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/command_executor.py +0 -0
  185. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/session_manager.py +0 -0
  186. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/session_storage.py +0 -0
  187. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/todo/__init__.py +0 -0
  188. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/todo/base.py +0 -0
  189. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/__init__.py +0 -0
  190. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/ast_analyzer.py +0 -0
  191. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/git_ingester.py +0 -0
  192. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/infinity_store.py +0 -0
  193. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/mock_infinity.py +0 -0
  194. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/project_manager.py +0 -0
  195. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/types.py +0 -0
  196. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp.egg-info/dependency_links.txt +0 -0
  197. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp.egg-info/entry_points.txt +0 -0
  198. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp.egg-info/requires.txt +0 -0
  199. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp.egg-info/top_level.txt +0 -0
  200. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/setup.cfg +0 -0
  201. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_agent_tools_ci.py +0 -0
  202. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_async_support.py +0 -0
  203. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_batch_tool_edge_cases.py +0 -0
  204. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_cli.py +0 -0
  205. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_cli_agents_consolidated.py +0 -0
  206. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_cli_tools.py +0 -0
  207. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_e2e_demo.py +0 -0
  208. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_e2e_simple.py +0 -0
  209. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_failure_cases.py +0 -0
  210. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_find_tool_ffind.py +0 -0
  211. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_find_tool_integration.py +0 -0
  212. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_find_tool_registration.py +0 -0
  213. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_git_ingestion.py +0 -0
  214. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_hanzo_agents_integration.py +0 -0
  215. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_hanzo_mcp_integration.py +0 -0
  216. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_hanzo_mcp_local.py +0 -0
  217. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_hanzo_mcp_simple.py +0 -0
  218. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_hanzo_network_integration.py +0 -0
  219. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_litellm_warnings.py +0 -0
  220. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_lsp_tool.py +0 -0
  221. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_manual.py +0 -0
  222. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_memory_base.py +0 -0
  223. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_memory_basic.py +0 -0
  224. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_memory_consolidated.py +0 -0
  225. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_memory_simple.py +0 -0
  226. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_memory_utils.py +0 -0
  227. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_new_tools.py +0 -0
  228. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_no_stubs.py +0 -0
  229. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_performance.py +0 -0
  230. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_search.py +0 -0
  231. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_search_quality.py +0 -0
  232. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_shell_features.py +0 -0
  233. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_shell_tools.py +0 -0
  234. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_simple.py +0 -0
  235. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_stdio_protocol.py +0 -0
  236. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_stdio_simple.py +0 -0
  237. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_streaming_command.py +0 -0
  238. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_swarm_simple.py +0 -0
  239. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_tools_suite.py +0 -0
  240. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_unified_search.py +0 -0
  241. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_utils.py +0 -0
  242. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_vector_store.py +0 -0
  243. {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_web3_integration.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hanzo-mcp
3
- Version: 0.8.15
3
+ Version: 0.9.1
4
4
  Summary: The Zen of Hanzo MCP: One server to rule them all. The ultimate MCP that orchestrates all others.
5
5
  Author-email: Hanzo Industries Inc <dev@hanzo.ai>
6
6
  License: MIT
@@ -26,4 +26,4 @@ if os.environ.get("HANZO_MCP_TRANSPORT") == "stdio":
26
26
  except ImportError:
27
27
  pass
28
28
 
29
- __version__ = "0.8.13"
29
+ __version__ = "0.8.16"
@@ -15,6 +15,19 @@ import argparse
15
15
  from typing import Any, cast
16
16
  from pathlib import Path
17
17
 
18
+ # Import timeout parser (deferred to avoid early imports)
19
+ def _parse_timeout_arg(timeout_str: str) -> float:
20
+ """Parse timeout argument with human-readable format support."""
21
+ try:
22
+ from hanzo_mcp.tools.common.timeout_parser import parse_timeout
23
+ return parse_timeout(timeout_str)
24
+ except ImportError:
25
+ # Fallback if parser not available
26
+ try:
27
+ return float(timeout_str)
28
+ except ValueError:
29
+ raise ValueError(f"Invalid timeout format: '{timeout_str}'")
30
+
18
31
 
19
32
  def main() -> None:
20
33
  """Run the CLI for the Hanzo AI server."""
@@ -150,9 +163,37 @@ def main() -> None:
150
163
  _ = parser.add_argument(
151
164
  "--command-timeout",
152
165
  dest="command_timeout",
153
- type=float,
154
- default=120.0,
155
- help="Default timeout for command execution in seconds (default: 120.0)",
166
+ type=str,
167
+ default="120s",
168
+ help="Default timeout for command execution (default: 120s). Supports: 2min, 5m, 120s, 30sec, 1.5h",
169
+ )
170
+
171
+ _ = parser.add_argument(
172
+ "--timeout", "-t",
173
+ dest="tool_timeout",
174
+ type=str,
175
+ help="Default timeout for MCP tool operations (default: 2min). Supports: 2min, 5m, 120s, 30sec, 1.5h",
176
+ )
177
+
178
+ _ = parser.add_argument(
179
+ "--search-timeout",
180
+ dest="search_timeout",
181
+ type=str,
182
+ help="Timeout specifically for search operations. Supports: 2min, 5m, 120s, 30sec, 1.5h",
183
+ )
184
+
185
+ _ = parser.add_argument(
186
+ "--find-timeout",
187
+ dest="find_timeout",
188
+ type=str,
189
+ help="Timeout specifically for find operations. Supports: 2min, 5m, 120s, 30sec, 1.5h",
190
+ )
191
+
192
+ _ = parser.add_argument(
193
+ "--ast-timeout",
194
+ dest="ast_timeout",
195
+ type=str,
196
+ help="Timeout specifically for AST operations. Supports: 2min, 5m, 120s, 30sec, 1.5h",
156
197
  )
157
198
 
158
199
  _ = parser.add_argument(
@@ -206,6 +247,27 @@ def main() -> None:
206
247
  help="Run in development mode with hot reload",
207
248
  )
208
249
 
250
+ _ = parser.add_argument(
251
+ "--daemon",
252
+ action="store_true",
253
+ help="Run as daemon process for multiple agent connections",
254
+ )
255
+
256
+ _ = parser.add_argument(
257
+ "--socket-path",
258
+ dest="socket_path",
259
+ default="/tmp/hanzo-mcp.sock",
260
+ help="Unix socket path for daemon mode (default: /tmp/hanzo-mcp.sock)",
261
+ )
262
+
263
+ _ = parser.add_argument(
264
+ "--max-connections",
265
+ dest="max_connections",
266
+ type=int,
267
+ default=100,
268
+ help="Maximum number of concurrent connections in daemon mode (default: 100)",
269
+ )
270
+
209
271
  _ = parser.add_argument(
210
272
  "--install",
211
273
  action="store_true",
@@ -222,10 +284,33 @@ def main() -> None:
222
284
  pass
223
285
  sys.stdout = original_stdout
224
286
 
287
+ # Parse timeout arguments with human-readable format support
288
+ command_timeout = _parse_timeout_arg(str(args.command_timeout))
289
+
290
+ # Set timeout environment variables from CLI args
291
+ if hasattr(args, 'tool_timeout') and args.tool_timeout:
292
+ tool_timeout = _parse_timeout_arg(args.tool_timeout)
293
+ os.environ["HANZO_MCP_TOOL_TIMEOUT"] = str(tool_timeout)
294
+
295
+ if hasattr(args, 'search_timeout') and args.search_timeout:
296
+ search_timeout = _parse_timeout_arg(args.search_timeout)
297
+ os.environ["HANZO_MCP_SEARCH_TIMEOUT"] = str(search_timeout)
298
+
299
+ if hasattr(args, 'find_timeout') and args.find_timeout:
300
+ find_timeout = _parse_timeout_arg(args.find_timeout)
301
+ os.environ["HANZO_MCP_FIND_TIMEOUT"] = str(find_timeout)
302
+
303
+ if hasattr(args, 'ast_timeout') and args.ast_timeout:
304
+ ast_timeout = _parse_timeout_arg(args.ast_timeout)
305
+ os.environ["HANZO_MCP_AST_TIMEOUT"] = str(ast_timeout)
306
+
225
307
  # Cast args attributes to appropriate types to avoid 'Any' warnings
226
308
  name: str = cast(str, args.name)
227
309
  install: bool = cast(bool, args.install)
228
310
  dev: bool = cast(bool, args.dev)
311
+ daemon: bool = cast(bool, args.daemon)
312
+ socket_path: str = cast(str, args.socket_path)
313
+ max_connections: int = cast(int, args.max_connections)
229
314
  transport: str = cast(str, args.transport)
230
315
  agent_model: str | None = cast(str | None, args.agent_model)
231
316
  agent_max_tokens: int | None = cast(int | None, args.agent_max_tokens)
@@ -234,7 +319,6 @@ def main() -> None:
234
319
  agent_max_iterations: int = cast(int, args.agent_max_iterations)
235
320
  agent_max_tool_uses: int = cast(int, args.agent_max_tool_uses)
236
321
  enable_agent_tool: bool = cast(bool, args.enable_agent_tool)
237
- command_timeout: float = cast(float, args.command_timeout)
238
322
  disable_write_tools: bool = cast(bool, args.disable_write_tools)
239
323
  disable_search_tools: bool = cast(bool, args.disable_search_tools)
240
324
  host: str = cast(str, args.host)
@@ -285,6 +369,26 @@ def main() -> None:
285
369
  if not allowed_paths:
286
370
  allowed_paths = [os.path.expanduser("~")]
287
371
 
372
+ # Set daemon mode environment variables
373
+ if daemon:
374
+ os.environ["HANZO_MCP_DAEMON"] = "true"
375
+ os.environ["HANZO_MCP_SOCKET_PATH"] = socket_path
376
+ os.environ["HANZO_MCP_MAX_CONNECTIONS"] = str(max_connections)
377
+
378
+ if transport != "stdio":
379
+ logger.info(f"Starting Hanzo MCP daemon on {socket_path}")
380
+ logger.info(f"Max connections: {max_connections}")
381
+
382
+ # Ensure only one daemon runs per socket
383
+ try:
384
+ import fcntl
385
+ lock_file = f"{socket_path}.lock"
386
+ with open(lock_file, 'w') as f:
387
+ fcntl.flock(f.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
388
+ except (ImportError, IOError):
389
+ # Fallback for systems without fcntl or if lock fails
390
+ pass
391
+
288
392
  # Run in dev mode if requested
289
393
  if dev:
290
394
  from hanzo_mcp.dev_server import DevServer
@@ -6,6 +6,8 @@ enabling concurrent execution of multiple operations and specialized processing.
6
6
 
7
7
  from mcp.server import FastMCP
8
8
 
9
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
10
+
9
11
  from hanzo_mcp.tools.common.base import BaseTool, ToolRegistry
10
12
 
11
13
  # Import unified CLI tools (single source of truth)
@@ -78,6 +80,9 @@ def register_agent_tools(
78
80
  def __init__(self, agent_tool: AgentTool):
79
81
  self._agent = agent_tool
80
82
 
83
+ @auto_timeout("__init__")
84
+
85
+
81
86
  async def call(self, ctx, **params): # type: ignore[override]
82
87
  # Default to 5 agents unless explicitly provided
83
88
  params = dict(params)
@@ -30,6 +30,8 @@ from pydantic import Field
30
30
  from openai.types.chat import ChatCompletionMessageParam
31
31
  from mcp.server.fastmcp import Context as MCPContext
32
32
 
33
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
34
+
33
35
  from hanzo_mcp.tools.jupyter import get_read_only_jupyter_tools
34
36
  from hanzo_mcp.tools.filesystem import get_read_only_filesystem_tools
35
37
  from hanzo_mcp.tools.common.base import BaseTool
@@ -212,6 +214,9 @@ Modes:
212
214
  - rpc: Long-running agent for multiple calls (A2A support)"""
213
215
 
214
216
  @override
217
+ @auto_timeout("agent")
218
+
219
+
215
220
  async def call(
216
221
  self,
217
222
  ctx: MCPContext,
@@ -20,6 +20,8 @@ from typing import (
20
20
  from mcp.server import FastMCP
21
21
  from mcp.server.fastmcp import Context as MCPContext
22
22
 
23
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
24
+
23
25
  # Import hanzo-agents SDK
24
26
  try:
25
27
  from hanzo_agents import (
@@ -338,6 +340,7 @@ Usage notes:
338
340
  self.available_tools.append(BatchTool({t.name: t for t in self.available_tools}))
339
341
 
340
342
  @override
343
+ @auto_timeout("agent")
341
344
  async def call(
342
345
  self,
343
346
  ctx: MCPContext,
@@ -19,6 +19,8 @@ with warnings.catch_warnings():
19
19
  import litellm
20
20
  from pydantic import Field
21
21
  from mcp.server import FastMCP
22
+
23
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
22
24
  from openai.types.chat import ChatCompletionToolParam, ChatCompletionMessageParam
23
25
  from mcp.server.fastmcp import Context as MCPContext
24
26
 
@@ -177,6 +179,9 @@ Usage notes:
177
179
  self.review_protocol = ReviewProtocol()
178
180
 
179
181
  @override
182
+ @auto_timeout("agent_tool_v1_deprecated")
183
+
184
+
180
185
  async def call(
181
186
  self,
182
187
  ctx: MCPContext,
@@ -5,6 +5,7 @@ from typing import Any, Dict, List, Optional, override
5
5
  from mcp.server import FastMCP
6
6
  from mcp.server.fastmcp import Context as MCPContext
7
7
 
8
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
8
9
  from hanzo_mcp.tools.common.base import BaseTool
9
10
 
10
11
 
@@ -42,6 +43,7 @@ request_clarification(
42
43
  options=["github.com/luxfi/node/common", "github.com/project/common"]
43
44
  )"""
44
45
 
46
+ @auto_timeout("clarification")
45
47
  async def call(
46
48
  self,
47
49
  ctx: MCPContext,
@@ -1,3 +1,5 @@
1
+
2
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
1
3
  """Claude Desktop authentication management.
2
4
 
3
5
  This module provides tools to automate Claude Desktop login/logout,
@@ -448,6 +450,9 @@ claude_auth ensure_agent swarm_agent_1"""
448
450
  """Initialize the auth tool."""
449
451
  self.auth = ClaudeDesktopAuth()
450
452
 
453
+ @auto_timeout("claude_desktop_auth")
454
+
455
+
451
456
  async def call(self, ctx, action: str = "status", **kwargs) -> str:
452
457
  """Execute auth action."""
453
458
  tool_ctx = create_tool_context(ctx)
@@ -13,6 +13,8 @@ from typing import List, Optional
13
13
 
14
14
  from mcp.server.fastmcp import Context as MCPContext
15
15
 
16
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
17
+
16
18
  from hanzo_mcp.tools.common.base import BaseTool
17
19
  from hanzo_mcp.tools.common.context import create_tool_context
18
20
  from hanzo_mcp.tools.common.permissions import PermissionManager
@@ -166,6 +168,9 @@ class CLIAgentBase(BaseTool):
166
168
  await tool_ctx.error(f"{self.provider_name} error: {str(e)}")
167
169
  return f"Error: {str(e)}"
168
170
 
171
+ @auto_timeout("cli_agent_base")
172
+
173
+
169
174
  async def call(self, ctx: MCPContext, prompts: str, **kwargs) -> str:
170
175
  """Execute the CLI agent.
171
176
 
@@ -13,6 +13,8 @@ from pathlib import Path
13
13
 
14
14
  from pydantic import Field
15
15
  from mcp.server import FastMCP
16
+
17
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
16
18
  from mcp.server.fastmcp import Context
17
19
 
18
20
  from hanzo_mcp.tools.common.base import BaseTool
@@ -186,6 +188,9 @@ class ClaudeCLITool(BaseCLITool):
186
188
  def description(self) -> str:
187
189
  return "Execute Claude CLI for AI assistance using Anthropic's models"
188
190
 
191
+ @auto_timeout("cli_tools")
192
+
193
+
189
194
  async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
190
195
  prompt: str = params.get("prompt", "")
191
196
  model: Optional[str] = params.get("model") or self.default_model
@@ -236,6 +241,9 @@ class CodexCLITool(BaseCLITool):
236
241
  def description(self) -> str:
237
242
  return "Execute OpenAI Codex/GPT-4 CLI for code generation and AI assistance"
238
243
 
244
+ @auto_timeout("cli_tools")
245
+
246
+
239
247
  async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
240
248
  prompt: str = params.get("prompt", "")
241
249
  model: Optional[str] = params.get("model") or self.default_model
@@ -274,6 +282,9 @@ class GeminiCLITool(BaseCLITool):
274
282
  def description(self) -> str:
275
283
  return "Execute Google Gemini CLI for multimodal AI assistance"
276
284
 
285
+ @auto_timeout("cli_tools")
286
+
287
+
277
288
  async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
278
289
  prompt: str = params.get("prompt", "")
279
290
  model: Optional[str] = params.get("model") or self.default_model
@@ -312,6 +323,9 @@ class GrokCLITool(BaseCLITool):
312
323
  def description(self) -> str:
313
324
  return "Execute xAI Grok CLI for real-time AI assistance"
314
325
 
326
+ @auto_timeout("cli_tools")
327
+
328
+
315
329
  async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
316
330
  prompt: str = params.get("prompt", "")
317
331
  model: Optional[str] = params.get("model") or self.default_model
@@ -350,6 +364,9 @@ class OpenHandsCLITool(BaseCLITool):
350
364
  def description(self) -> str:
351
365
  return "Execute OpenHands (OpenDevin) for autonomous coding assistance"
352
366
 
367
+ @auto_timeout("cli_tools")
368
+
369
+
353
370
  async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
354
371
  prompt = params.get("prompt", "")
355
372
  model = params.get("model") or self.default_model
@@ -400,6 +417,9 @@ class HanzoDevCLITool(BaseCLITool):
400
417
  def description(self) -> str:
401
418
  return "Execute Hanzo Dev for AI-powered code editing and development"
402
419
 
420
+ @auto_timeout("cli_tools")
421
+
422
+
403
423
  async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
404
424
  prompt = params.get("prompt", "")
405
425
  model = params.get("model") or self.default_model
@@ -438,6 +458,9 @@ class ClineCLITool(BaseCLITool):
438
458
  def description(self) -> str:
439
459
  return "Execute Cline for autonomous coding with Claude"
440
460
 
461
+ @auto_timeout("cli_tools")
462
+
463
+
441
464
  async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
442
465
  prompt = params.get("prompt", "")
443
466
  working_dir: str = params.get("working_dir") or os.getcwd()
@@ -473,6 +496,9 @@ class AiderCLITool(BaseCLITool):
473
496
  def description(self) -> str:
474
497
  return "Execute Aider for AI pair programming"
475
498
 
499
+ @auto_timeout("cli_tools")
500
+
501
+
476
502
  async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
477
503
  prompt = params.get("prompt", "")
478
504
  model = params.get("model") or self.default_model
@@ -6,6 +6,8 @@ This tool manages API keys and accounts for Claude Code and other AI coding tool
6
6
  from typing import Unpack, Optional, TypedDict, final, override
7
7
 
8
8
  from mcp.server import FastMCP
9
+
10
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
9
11
  from mcp.server.fastmcp import Context as MCPContext
10
12
 
11
13
  from hanzo_mcp.tools.common.base import BaseTool
@@ -67,6 +69,9 @@ Providers: claude, openai, azure, deepseek, google, groq"""
67
69
  self.auth_manager = CodeAuthManager()
68
70
 
69
71
  @override
72
+ @auto_timeout("code_auth")
73
+
74
+
70
75
  async def call(
71
76
  self,
72
77
  ctx: MCPContext,
@@ -6,6 +6,7 @@ from typing import List, Optional, override
6
6
  from mcp.server import FastMCP
7
7
  from mcp.server.fastmcp import Context as MCPContext
8
8
 
9
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
9
10
  from hanzo_mcp.tools.common.base import BaseTool
10
11
 
11
12
 
@@ -57,6 +58,7 @@ critic(
57
58
  specific_concerns="Are the imports in the correct format and location?"
58
59
  )"""
59
60
 
61
+ @auto_timeout("critic")
60
62
  async def call(
61
63
  self,
62
64
  ctx: MCPContext,
@@ -5,6 +5,8 @@ from enum import Enum
5
5
  from typing import List, override
6
6
 
7
7
  from mcp.server import FastMCP
8
+
9
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
8
10
  from mcp.server.fastmcp import Context as MCPContext
9
11
 
10
12
  from hanzo_mcp.tools.common.base import BaseTool
@@ -599,6 +601,9 @@ Use this when you need:
599
601
  super().__init__()
600
602
  self.oracle = IChing()
601
603
 
604
+ @auto_timeout("iching")
605
+
606
+
602
607
  async def call(self, ctx: MCPContext, challenge: str) -> str:
603
608
  """Cast I Ching and provide guidance."""
604
609
  # Cast hexagram
@@ -18,6 +18,8 @@ from typing import (
18
18
 
19
19
  from pydantic import Field
20
20
  from mcp.server import FastMCP
21
+
22
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
21
23
  from mcp.server.fastmcp import Context as MCPContext
22
24
 
23
25
  from hanzo_mcp.tools.common.base import BaseTool
@@ -104,6 +106,9 @@ class NetworkTool(BaseTool):
104
106
  return self._cluster
105
107
 
106
108
  @override
109
+ @auto_timeout("network")
110
+
111
+
107
112
  async def call(self, ctx: MCPContext, **params: Unpack[NetworkToolParams]) -> str:
108
113
  """Execute a task on the agent network.
109
114
 
@@ -6,6 +6,7 @@ from typing import List, Optional, override
6
6
  from mcp.server import FastMCP
7
7
  from mcp.server.fastmcp import Context as MCPContext
8
8
 
9
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
9
10
  from hanzo_mcp.tools.common.base import BaseTool
10
11
 
11
12
 
@@ -57,6 +58,7 @@ review(
57
58
  context="This will be used to automatically fix missing imports in Go files"
58
59
  )"""
59
60
 
61
+ @auto_timeout("review")
60
62
  async def call(
61
63
  self,
62
64
  ctx: MCPContext,
@@ -1,3 +1,5 @@
1
+
2
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
1
3
  """Swarm tool as an alias to Network tool for backward compatibility.
2
4
 
3
5
  This module makes swarm an alias to the network tool, as network is the
@@ -63,6 +65,9 @@ For new code, prefer using 'network' directly."""
63
65
  # Just pass through to NetworkTool
64
66
  super().__init__(permission_manager=permission_manager, default_mode=default_mode, **kwargs)
65
67
 
68
+ @auto_timeout("swarm_alias")
69
+
70
+
66
71
  async def call(self, **kwargs) -> str:
67
72
  """Execute swarm via network tool.
68
73
 
@@ -19,6 +19,8 @@ from typing import (
19
19
  from mcp.server import FastMCP
20
20
  from mcp.server.fastmcp import Context as MCPContext
21
21
 
22
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
23
+
22
24
  # Import hanzo-agents SDK with fallback
23
25
  try:
24
26
  from hanzo_agents import (
@@ -508,6 +510,7 @@ Models can be specified as:
508
510
  self.available_tools.append(BatchTool({t.name: t for t in self.available_tools}))
509
511
 
510
512
  @override
513
+ @auto_timeout("swarm")
511
514
  async def call(
512
515
  self,
513
516
  ctx: MCPContext,
@@ -18,6 +18,8 @@ from typing import (
18
18
  )
19
19
 
20
20
  from mcp.server import FastMCP
21
+
22
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
21
23
  from mcp.server.fastmcp import Context as MCPContext
22
24
 
23
25
  from hanzo_mcp.tools.common.base import BaseTool
@@ -203,6 +205,9 @@ Models can be specified as:
203
205
  self.agent_max_tool_uses = agent_max_tool_uses
204
206
 
205
207
  @override
208
+ @auto_timeout("swarm_tool_v1_deprecated")
209
+
210
+
206
211
  async def call(
207
212
  self,
208
213
  ctx: MCPContext,
@@ -11,6 +11,8 @@ from typing import Any, Dict, List, Optional
11
11
  from pathlib import Path
12
12
 
13
13
  from mcp.server import FastMCP
14
+
15
+ from hanzo_mcp.tools.common.auto_timeout import auto_timeout
14
16
  from mcp.server.fastmcp import Context
15
17
 
16
18
  from ..common.base import BaseTool
@@ -142,6 +144,9 @@ class UnifiedCLITool(BaseTool, CLIAgent):
142
144
  command.append(prompt)
143
145
  return command
144
146
 
147
+ @auto_timeout("unified_cli_tools")
148
+
149
+
145
150
  async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
146
151
  """Execute the CLI tool via MCP interface.
147
152