hanzo-mcp 0.6.1__tar.gz → 0.6.3__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 (147) hide show
  1. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/PKG-INFO +4 -3
  2. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/__init__.py +1 -1
  3. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/config/palette_tool.py +16 -3
  4. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/batch_search.py +6 -10
  5. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/content_replace.py +3 -3
  6. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/diff.py +32 -3
  7. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/directory_tree.py +3 -3
  8. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/edit.py +2 -2
  9. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/read.py +3 -3
  10. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/symbols.py +3 -3
  11. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/watch.py +30 -3
  12. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/bash_unified.py +28 -3
  13. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/npx_unified.py +28 -3
  14. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/open.py +10 -3
  15. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/process_unified.py +25 -3
  16. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/uvx_unified.py +28 -3
  17. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp.egg-info/PKG-INFO +4 -3
  18. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp.egg-info/requires.txt +3 -2
  19. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/pyproject.toml +4 -3
  20. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/LICENSE +0 -0
  21. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/README.md +0 -0
  22. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/cli.py +0 -0
  23. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/cli_enhanced.py +0 -0
  24. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/config/__init__.py +0 -0
  25. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/config/settings.py +0 -0
  26. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/config/tool_config.py +0 -0
  27. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/dev_server.py +0 -0
  28. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/prompts/__init__.py +0 -0
  29. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/prompts/compact_conversation.py +0 -0
  30. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/prompts/create_release.py +0 -0
  31. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/prompts/project_system.py +0 -0
  32. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/prompts/project_todo_reminder.py +0 -0
  33. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/prompts/utils.py +0 -0
  34. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/server.py +0 -0
  35. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/__init__.py +0 -0
  36. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/agent/__init__.py +0 -0
  37. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/agent/agent.py +0 -0
  38. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/agent/agent_tool.py +0 -0
  39. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/agent/prompt.py +0 -0
  40. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/agent/tool_adapter.py +0 -0
  41. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/__init__.py +0 -0
  42. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/base.py +0 -0
  43. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/batch_tool.py +0 -0
  44. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/config_tool.py +0 -0
  45. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/context.py +0 -0
  46. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/palette.py +0 -0
  47. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/palette_loader.py +0 -0
  48. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/permissions.py +0 -0
  49. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/stats.py +0 -0
  50. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/thinking_tool.py +0 -0
  51. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/tool_disable.py +0 -0
  52. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/tool_enable.py +0 -0
  53. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/tool_list.py +0 -0
  54. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/common/validation.py +0 -0
  55. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/config/__init__.py +0 -0
  56. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/config/config_tool.py +0 -0
  57. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/config/index_config.py +0 -0
  58. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/database/__init__.py +0 -0
  59. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/database/database_manager.py +0 -0
  60. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/database/graph.py +0 -0
  61. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/database/graph_add.py +0 -0
  62. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/database/graph_query.py +0 -0
  63. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/database/graph_remove.py +0 -0
  64. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/database/graph_search.py +0 -0
  65. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/database/graph_stats.py +0 -0
  66. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/database/sql.py +0 -0
  67. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/database/sql_query.py +0 -0
  68. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/database/sql_search.py +0 -0
  69. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/database/sql_stats.py +0 -0
  70. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/editor/__init__.py +0 -0
  71. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/editor/neovim_command.py +0 -0
  72. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/editor/neovim_edit.py +0 -0
  73. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/editor/neovim_session.py +0 -0
  74. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/__init__.py +0 -0
  75. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/base.py +0 -0
  76. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/find.py +0 -0
  77. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/find_files.py +0 -0
  78. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/git_search.py +0 -0
  79. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/grep.py +0 -0
  80. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/multi_edit.py +0 -0
  81. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/symbols_unified.py +0 -0
  82. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/tree.py +0 -0
  83. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/unified_search.py +0 -0
  84. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/unix_aliases.py +0 -0
  85. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/filesystem/write.py +0 -0
  86. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/jupyter/__init__.py +0 -0
  87. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/jupyter/base.py +0 -0
  88. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/jupyter/jupyter.py +0 -0
  89. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/jupyter/notebook_edit.py +0 -0
  90. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/jupyter/notebook_read.py +0 -0
  91. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/llm/__init__.py +0 -0
  92. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/llm/consensus_tool.py +0 -0
  93. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/llm/llm_manage.py +0 -0
  94. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/llm/llm_tool.py +0 -0
  95. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/llm/llm_unified.py +0 -0
  96. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/llm/provider_tools.py +0 -0
  97. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/mcp/__init__.py +0 -0
  98. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/mcp/mcp_add.py +0 -0
  99. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/mcp/mcp_remove.py +0 -0
  100. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/mcp/mcp_stats.py +0 -0
  101. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/mcp/mcp_unified.py +0 -0
  102. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/__init__.py +0 -0
  103. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/base.py +0 -0
  104. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/base_process.py +0 -0
  105. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/bash_session.py +0 -0
  106. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/bash_session_executor.py +0 -0
  107. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/command_executor.py +0 -0
  108. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/logs.py +0 -0
  109. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/npx.py +0 -0
  110. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/npx_background.py +0 -0
  111. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/pkill.py +0 -0
  112. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/processes.py +0 -0
  113. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/run_background.py +0 -0
  114. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/run_command.py +0 -0
  115. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/run_command_windows.py +0 -0
  116. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/session_manager.py +0 -0
  117. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/session_storage.py +0 -0
  118. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/uvx.py +0 -0
  119. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/shell/uvx_background.py +0 -0
  120. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/todo/__init__.py +0 -0
  121. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/todo/base.py +0 -0
  122. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/todo/todo.py +0 -0
  123. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/todo/todo_read.py +0 -0
  124. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/todo/todo_write.py +0 -0
  125. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/vector/__init__.py +0 -0
  126. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/vector/ast_analyzer.py +0 -0
  127. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/vector/git_ingester.py +0 -0
  128. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/vector/index_tool.py +0 -0
  129. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/vector/infinity_store.py +0 -0
  130. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/vector/mock_infinity.py +0 -0
  131. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/vector/project_manager.py +0 -0
  132. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/vector/vector.py +0 -0
  133. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/vector/vector_index.py +0 -0
  134. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp/tools/vector/vector_search.py +0 -0
  135. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp.egg-info/SOURCES.txt +0 -0
  136. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp.egg-info/dependency_links.txt +0 -0
  137. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp.egg-info/entry_points.txt +0 -0
  138. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/hanzo_mcp.egg-info/top_level.txt +0 -0
  139. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/setup.cfg +0 -0
  140. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/setup.py +0 -0
  141. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/tests/test_async_support.py +0 -0
  142. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/tests/test_cli.py +0 -0
  143. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/tests/test_git_ingestion.py +0 -0
  144. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/tests/test_new_tools.py +0 -0
  145. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/tests/test_search_quality.py +0 -0
  146. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/tests/test_unified_search.py +0 -0
  147. {hanzo_mcp-0.6.1 → hanzo_mcp-0.6.3}/tests/test_vector_store.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hanzo-mcp
3
- Version: 0.6.1
3
+ Version: 0.6.3
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
@@ -15,7 +15,7 @@ Requires-Python: >=3.12
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
17
  Requires-Dist: mcp>=1.6.0
18
- Requires-Dist: fastmcp>=2.8.0
18
+ Requires-Dist: fastmcp>=2.9.2
19
19
  Requires-Dist: httpx>=0.27.0
20
20
  Requires-Dist: uvicorn>=0.23.1
21
21
  Requires-Dist: openai>=1.50.0
@@ -26,7 +26,8 @@ Requires-Dist: bashlex>=0.18
26
26
  Requires-Dist: libtmux>=0.39.0
27
27
  Requires-Dist: nbformat>=5.10.4
28
28
  Requires-Dist: psutil>=6.1.0
29
- Requires-Dist: pydantic>=2.10.0
29
+ Requires-Dist: pydantic>=2.11.0
30
+ Requires-Dist: pydantic-settings>=2.7.0
30
31
  Requires-Dist: typing-extensions>=4.12.2
31
32
  Requires-Dist: watchdog>=3.0.0
32
33
  Provides-Extra: dev
@@ -1,3 +1,3 @@
1
1
  """Hanzo MCP - Implementation of Hanzo capabilities using MCP."""
2
2
 
3
- __version__ = "0.6.0"
3
+ __version__ = "0.6.3"
@@ -155,11 +155,24 @@ palette --action current"""
155
155
 
156
156
  def register(self, server: FastMCP) -> None:
157
157
  """Register the tool with the MCP server."""
158
- server.tool(name=self.name, description=self.description)(self.call)
158
+ tool_self = self
159
+
160
+ @server.tool(name=self.name, description=self.description)
161
+ async def palette_handler(
162
+ ctx: MCPContext,
163
+ action: str = "list",
164
+ name: Optional[str] = None,
165
+ ) -> str:
166
+ """Handle palette tool calls."""
167
+ return await tool_self.run(ctx, action=action, name=name)
159
168
 
160
- async def call(self, **kwargs) -> str:
169
+ async def call(self, ctx: MCPContext, **params) -> str:
161
170
  """Call the tool with arguments."""
162
- return await self.run(None, **kwargs)
171
+ return await self.run(
172
+ ctx,
173
+ action=params.get("action", "list"),
174
+ name=params.get("name")
175
+ )
163
176
 
164
177
 
165
178
  # Create tool instance
@@ -784,29 +784,25 @@ Perfect for comprehensive code analysis and refactoring tasks."""
784
784
 
785
785
  @override
786
786
  def register(self, mcp_server: FastMCP) -> None:
787
- """Register the unified search tool with the MCP server."""
787
+ """Register the batch search tool with the MCP server."""
788
788
  tool_self = self
789
789
 
790
790
  @mcp_server.tool(name=self.name, description=self.description)
791
- async def unified_search(
791
+ async def batch_search(
792
792
  ctx: MCPContext,
793
- pattern: Pattern,
793
+ queries: Queries,
794
794
  path: SearchPath = ".",
795
795
  include: Include = "*",
796
796
  max_results: MaxResults = 20,
797
- enable_vector: EnableVector = True,
798
- enable_ast: EnableAST = True,
799
- enable_symbol: EnableSymbol = True,
800
797
  include_context: IncludeContext = True,
798
+ combine_results: CombineResults = True
801
799
  ) -> str:
802
800
  return await tool_self.call(
803
801
  ctx,
804
- pattern=pattern,
802
+ queries=queries,
805
803
  path=path,
806
804
  include=include,
807
805
  max_results=max_results,
808
- enable_vector=enable_vector,
809
- enable_ast=enable_ast,
810
- enable_symbol=enable_symbol,
811
806
  include_context=include_context,
807
+ combine_results=combine_results
812
808
  )
@@ -275,12 +275,12 @@ Only works within allowed directories."""
275
275
 
276
276
  @mcp_server.tool(name=self.name, description=self.description)
277
277
  async def content_replace(
278
+ ctx: MCPContext,
278
279
  pattern: Pattern,
279
280
  replacement: Replacement,
280
281
  path: SearchPath,
281
- file_pattern: FilePattern,
282
- dry_run: DryRun,
283
- ctx: MCPContext
282
+ file_pattern: FilePattern = "*",
283
+ dry_run: DryRun = False
284
284
  ) -> str:
285
285
  return await tool_self.call(
286
286
  ctx,
@@ -173,11 +173,40 @@ diff a.json b.json --ignore-whitespace"""
173
173
 
174
174
  def register(self, server: FastMCP) -> None:
175
175
  """Register the tool with the MCP server."""
176
- server.tool(name=self.name, description=self.description)(self.call)
176
+ tool_self = self
177
+
178
+ @server.tool(name=self.name, description=self.description)
179
+ async def diff_handler(
180
+ ctx: MCPContext,
181
+ file1: str,
182
+ file2: str,
183
+ unified: bool = True,
184
+ context: int = 3,
185
+ ignore_whitespace: bool = False,
186
+ show_line_numbers: bool = True,
187
+ ) -> str:
188
+ """Handle diff tool calls."""
189
+ return await tool_self.run(
190
+ ctx,
191
+ file1=file1,
192
+ file2=file2,
193
+ unified=unified,
194
+ context=context,
195
+ ignore_whitespace=ignore_whitespace,
196
+ show_line_numbers=show_line_numbers,
197
+ )
177
198
 
178
- async def call(self, **kwargs) -> str:
199
+ async def call(self, ctx: MCPContext, **params) -> str:
179
200
  """Call the tool with arguments."""
180
- return await self.run(None, **kwargs)
201
+ return await self.run(
202
+ ctx,
203
+ file1=params["file1"],
204
+ file2=params["file2"],
205
+ unified=params.get("unified", True),
206
+ context=params.get("context", 3),
207
+ ignore_whitespace=params.get("ignore_whitespace", False),
208
+ show_line_numbers=params.get("show_line_numbers", True)
209
+ )
181
210
 
182
211
 
183
212
  # Create tool instance (requires permission manager to be set)
@@ -298,10 +298,10 @@ requested. Only works within allowed directories."""
298
298
 
299
299
  @mcp_server.tool(name=self.name, description=self.description)
300
300
  async def directory_tree(
301
+ ctx: MCPContext,
301
302
  path: DirectoryPath,
302
- depth: Depth,
303
- include_filtered: IncludeFiltered,
304
- ctx: MCPContext
303
+ depth: Depth = 3,
304
+ include_filtered: IncludeFiltered = False
305
305
  ) -> str:
306
306
  return await tool_self.call(
307
307
  ctx, path=path, depth=depth, include_filtered=include_filtered
@@ -262,11 +262,11 @@ Usage:
262
262
 
263
263
  @mcp_server.tool(name=self.name, description=self.description)
264
264
  async def edit(
265
+ ctx: MCPContext,
265
266
  file_path: FilePath,
266
267
  old_string: OldString,
267
268
  new_string: NewString,
268
- expected_replacements: ExpectedReplacements,
269
- ctx: MCPContext
269
+ expected_replacements: ExpectedReplacements = 1
270
270
  ) -> str:
271
271
  return await tool_self.call(
272
272
  ctx,
@@ -257,10 +257,10 @@ Usage:
257
257
 
258
258
  @mcp_server.tool(name=self.name, description=self.description)
259
259
  async def read(
260
+ ctx: MCPContext,
260
261
  file_path: FilePath,
261
- offset: Offset,
262
- limit: Limit,
263
- ctx: MCPContext
262
+ offset: Offset = 0,
263
+ limit: Limit = 2000
264
264
  ) -> str:
265
265
  return await tool_self.call(
266
266
  ctx, file_path=file_path, offset=offset, limit=limit
@@ -225,11 +225,11 @@ Finds code structures (functions, classes, methods) with full context."""
225
225
 
226
226
  @mcp_server.tool(name=self.name, description=self.description)
227
227
  async def symbols(
228
+ ctx: MCPContext,
228
229
  pattern: Pattern,
229
230
  path: SearchPath,
230
- ignore_case: IgnoreCase,
231
- line_number: LineNumber,
232
- ctx: MCPContext
231
+ ignore_case: IgnoreCase = False,
232
+ line_number: LineNumber = False
233
233
  ) -> str:
234
234
  return await tool_self.call(
235
235
  ctx,
@@ -20,11 +20,38 @@ class WatchTool(BaseTool):
20
20
 
21
21
  def register(self, server: FastMCP) -> None:
22
22
  """Register the tool with the MCP server."""
23
- server.tool(name=self.name, description=self.description)(self.call)
23
+
24
+ @server.tool(name=self.name, description=self.description)
25
+ async def watch_handler(
26
+ path: str,
27
+ pattern: str = "*",
28
+ interval: int = 1,
29
+ recursive: bool = True,
30
+ exclude: str = "",
31
+ duration: int = 30,
32
+ ) -> str:
33
+ """Handle watch tool calls."""
34
+ return await self.run(
35
+ None,
36
+ path=path,
37
+ pattern=pattern,
38
+ interval=interval,
39
+ recursive=recursive,
40
+ exclude=exclude,
41
+ duration=duration,
42
+ )
24
43
 
25
- async def call(self, **kwargs) -> str:
44
+ async def call(self, ctx: MCPContext, **params) -> str:
26
45
  """Call the tool with arguments."""
27
- return await self.run(None, **kwargs)
46
+ return await self.run(
47
+ ctx,
48
+ path=params["path"],
49
+ pattern=params.get("pattern", "*"),
50
+ interval=params.get("interval", 1),
51
+ recursive=params.get("recursive", True),
52
+ exclude=params.get("exclude", ""),
53
+ duration=params.get("duration", 30)
54
+ )
28
55
 
29
56
  @property
30
57
  @override
@@ -18,11 +18,36 @@ class BashTool(BaseScriptTool):
18
18
 
19
19
  def register(self, server: FastMCP) -> None:
20
20
  """Register the tool with the MCP server."""
21
- server.tool(name=self.name, description=self.description)(self.call)
21
+ tool_self = self
22
+
23
+ @server.tool(name=self.name, description=self.description)
24
+ async def bash(
25
+ ctx: MCPContext,
26
+ command: str,
27
+ action: str = "run",
28
+ cwd: Optional[str] = None,
29
+ env: Optional[dict[str, str]] = None,
30
+ timeout: Optional[int] = None,
31
+ ) -> str:
32
+ return await tool_self.run(
33
+ ctx,
34
+ command=command,
35
+ action=action,
36
+ cwd=cwd,
37
+ env=env,
38
+ timeout=timeout
39
+ )
22
40
 
23
- async def call(self, **kwargs) -> str:
41
+ async def call(self, ctx: MCPContext, **params) -> str:
24
42
  """Call the tool with arguments."""
25
- return await self.run(None, **kwargs)
43
+ return await self.run(
44
+ ctx,
45
+ command=params["command"],
46
+ action=params.get("action", "run"),
47
+ cwd=params.get("cwd"),
48
+ env=params.get("env"),
49
+ timeout=params.get("timeout")
50
+ )
26
51
 
27
52
  @property
28
53
  @override
@@ -90,11 +90,36 @@ npx --action background json-server db.json"""
90
90
 
91
91
  def register(self, server: FastMCP) -> None:
92
92
  """Register the tool with the MCP server."""
93
- server.tool(name=self.name, description=self.description)(self.call)
93
+ tool_self = self
94
+
95
+ @server.tool(name=self.name, description=self.description)
96
+ async def npx(
97
+ ctx: MCPContext,
98
+ package: str,
99
+ args: str = "",
100
+ action: str = "run",
101
+ cwd: Optional[str] = None,
102
+ yes: bool = True,
103
+ ) -> str:
104
+ return await tool_self.run(
105
+ ctx,
106
+ package=package,
107
+ args=args,
108
+ action=action,
109
+ cwd=cwd,
110
+ yes=yes
111
+ )
94
112
 
95
- async def call(self, **kwargs) -> str:
113
+ async def call(self, ctx: MCPContext, **params) -> str:
96
114
  """Call the tool with arguments."""
97
- return await self.run(None, **kwargs)
115
+ return await self.run(
116
+ ctx,
117
+ package=params["package"],
118
+ args=params.get("args", ""),
119
+ action=params.get("action", "run"),
120
+ cwd=params.get("cwd"),
121
+ yes=params.get("yes", True)
122
+ )
98
123
 
99
124
 
100
125
  # Create tool instance
@@ -20,11 +20,18 @@ class OpenTool(BaseTool):
20
20
 
21
21
  def register(self, server: FastMCP) -> None:
22
22
  """Register the tool with the MCP server."""
23
- server.tool(name=self.name, description=self.description)(self.call)
23
+ tool_self = self
24
+
25
+ @server.tool(name=self.name, description=self.description)
26
+ async def open(
27
+ ctx: MCPContext,
28
+ path: str
29
+ ) -> str:
30
+ return await tool_self.run(ctx, path)
24
31
 
25
- async def call(self, **kwargs) -> str:
32
+ async def call(self, ctx: MCPContext, **params) -> str:
26
33
  """Call the tool with arguments."""
27
- return await self.run(None, **kwargs)
34
+ return await self.run(ctx, params["path"])
28
35
 
29
36
  @property
30
37
  @override
@@ -120,11 +120,33 @@ process --action logs --id bash_ghi789 --lines 50"""
120
120
 
121
121
  def register(self, server: FastMCP) -> None:
122
122
  """Register the tool with the MCP server."""
123
- server.tool(name=self.name, description=self.description)(self.call)
123
+ tool_self = self
124
+
125
+ @server.tool(name=self.name, description=self.description)
126
+ async def process(
127
+ ctx: MCPContext,
128
+ action: str = "list",
129
+ id: Optional[str] = None,
130
+ signal_type: str = "TERM",
131
+ lines: int = 100,
132
+ ) -> str:
133
+ return await tool_self.run(
134
+ ctx,
135
+ action=action,
136
+ id=id,
137
+ signal_type=signal_type,
138
+ lines=lines
139
+ )
124
140
 
125
- async def call(self, **kwargs) -> str:
141
+ async def call(self, ctx: MCPContext, **params) -> str:
126
142
  """Call the tool with arguments."""
127
- return await self.run(None, **kwargs)
143
+ return await self.run(
144
+ ctx,
145
+ action=params.get("action", "list"),
146
+ id=params.get("id"),
147
+ signal_type=params.get("signal_type", "TERM"),
148
+ lines=params.get("lines", 100)
149
+ )
128
150
 
129
151
 
130
152
  # Create tool instance
@@ -90,11 +90,36 @@ uvx --action background jupyter lab --port 8888"""
90
90
 
91
91
  def register(self, server: FastMCP) -> None:
92
92
  """Register the tool with the MCP server."""
93
- server.tool(name=self.name, description=self.description)(self.call)
93
+ tool_self = self
94
+
95
+ @server.tool(name=self.name, description=self.description)
96
+ async def uvx(
97
+ ctx: MCPContext,
98
+ package: str,
99
+ args: str = "",
100
+ action: str = "run",
101
+ cwd: Optional[str] = None,
102
+ python: Optional[str] = None,
103
+ ) -> str:
104
+ return await tool_self.run(
105
+ ctx,
106
+ package=package,
107
+ args=args,
108
+ action=action,
109
+ cwd=cwd,
110
+ python=python
111
+ )
94
112
 
95
- async def call(self, **kwargs) -> str:
113
+ async def call(self, ctx: MCPContext, **params) -> str:
96
114
  """Call the tool with arguments."""
97
- return await self.run(None, **kwargs)
115
+ return await self.run(
116
+ ctx,
117
+ package=params["package"],
118
+ args=params.get("args", ""),
119
+ action=params.get("action", "run"),
120
+ cwd=params.get("cwd"),
121
+ python=params.get("python")
122
+ )
98
123
 
99
124
 
100
125
  # Create tool instance
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hanzo-mcp
3
- Version: 0.6.1
3
+ Version: 0.6.3
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
@@ -15,7 +15,7 @@ Requires-Python: >=3.12
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
17
  Requires-Dist: mcp>=1.6.0
18
- Requires-Dist: fastmcp>=2.8.0
18
+ Requires-Dist: fastmcp>=2.9.2
19
19
  Requires-Dist: httpx>=0.27.0
20
20
  Requires-Dist: uvicorn>=0.23.1
21
21
  Requires-Dist: openai>=1.50.0
@@ -26,7 +26,8 @@ Requires-Dist: bashlex>=0.18
26
26
  Requires-Dist: libtmux>=0.39.0
27
27
  Requires-Dist: nbformat>=5.10.4
28
28
  Requires-Dist: psutil>=6.1.0
29
- Requires-Dist: pydantic>=2.10.0
29
+ Requires-Dist: pydantic>=2.11.0
30
+ Requires-Dist: pydantic-settings>=2.7.0
30
31
  Requires-Dist: typing-extensions>=4.12.2
31
32
  Requires-Dist: watchdog>=3.0.0
32
33
  Provides-Extra: dev
@@ -1,5 +1,5 @@
1
1
  mcp>=1.6.0
2
- fastmcp>=2.8.0
2
+ fastmcp>=2.9.2
3
3
  httpx>=0.27.0
4
4
  uvicorn>=0.23.1
5
5
  openai>=1.50.0
@@ -10,7 +10,8 @@ bashlex>=0.18
10
10
  libtmux>=0.39.0
11
11
  nbformat>=5.10.4
12
12
  psutil>=6.1.0
13
- pydantic>=2.10.0
13
+ pydantic>=2.11.0
14
+ pydantic-settings>=2.7.0
14
15
  typing-extensions>=4.12.2
15
16
  watchdog>=3.0.0
16
17
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "hanzo-mcp"
7
- version = "0.6.1"
7
+ version = "0.6.3"
8
8
  description = "The Zen of Hanzo MCP: One server to rule them all. The ultimate MCP that orchestrates all others."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -18,7 +18,7 @@ classifiers = [
18
18
  keywords = ["mcp", "claude", "hanzo", "code", "agent"]
19
19
  dependencies = [
20
20
  "mcp>=1.6.0",
21
- "fastmcp>=2.8.0",
21
+ "fastmcp>=2.9.2",
22
22
  "httpx>=0.27.0",
23
23
  "uvicorn>=0.23.1",
24
24
  "openai>=1.50.0",
@@ -29,7 +29,8 @@ dependencies = [
29
29
  "libtmux>=0.39.0",
30
30
  "nbformat>=5.10.4",
31
31
  "psutil>=6.1.0",
32
- "pydantic>=2.10.0",
32
+ "pydantic>=2.11.0",
33
+ "pydantic-settings>=2.7.0",
33
34
  "typing-extensions>=4.12.2",
34
35
  "watchdog>=3.0.0",
35
36
  ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes