* fix: resolve tuple unpacking error in search_tools when using server manager
Fixes#138 - ValueError: not enough values to unpack (expected 3, got 1)
**Problem:**
When using MCPAgent with use_server_manager=True, users encountered a tuple
unpacking error in search_tools.py. The issue occurred because:
1. ToolSearchEngine.search_tools() sometimes returned a string (when no results)
and sometimes returned a list of tuples (when results found)
2. SearchToolsTool._arun() expected search_tools() to return a list of tuples
to pass to format_search_results()
3. When search_tools() returned a string, format_search_results() tried to
iterate over the string characters, causing the unpacking error
**Solution:**
- Modified ToolSearchEngine.search_tools() to consistently return formatted
strings by calling a new _format_search_results() method
- Added _format_search_results() method to ToolSearchEngine class
- Updated SearchToolsTool._arun() to return the already-formatted results
directly instead of calling format_search_results() again
- Updated CLAUDE.md to include virtual environment activation instructions
**Testing:**
- Successfully reproduced the original error
- Verified the fix resolves the issue
- All unit tests pass (113/113)
- Applied code formatting and linting
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* test: add comprehensive test suite for issue #138 tuple unpacking bug
- test_tool_search_engine_consistent_return_type_with_results: ensures search_tools
returns string when results are found (not list of tuples as in the bug)
- test_tool_search_engine_consistent_return_type_no_results: ensures search_tools
returns string when no results found
- test_tool_search_engine_not_indexed_scenario: tests the 'still preparing' scenario
- test_search_tools_tool_arun_with_string_result: tests SearchToolsTool._arun()
correctly handles string results from search_tools
- test_search_tools_tool_integration_scenario: integration test simulating the
exact scenario from issue #138 that was causing the tuple unpacking error
- test_format_search_results_method_exists: validates the new _format_search_results method
- test_server_manager_active_server_marking: tests active server marking functionality
- test_search_tools_input_validation: validates ToolSearchInput model
These tests ensure the tuple unpacking bug (ValueError: not enough values to unpack
expected 3, got 1) will not regress in the future and verify the fix works correctly.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: resolve logger mock issues in search_tools tests
Added @patch decorators to mock the logger in tests that call _format_search_results
to avoid TypeError with logging level comparisons during testing.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: Update documentation to use session-based API instead of deprecated client methods
- Replace all references to non-existent client.connect_all() with client.create_all_sessions()
- Replace all references to non-existent client.disconnect_all() with client.close_all_sessions()
- Replace all references to client.list_tools() with session.list_tools()
- Replace all references to client.call_tool() with session.call_tool()
- Update API documentation to reflect actual MCPClient implementation
- Fix code examples to use proper session-based architecture
- Ensure all documentation matches the real codebase API
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Improve docs
* remove unused
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Add support for langfuse and laminar observaility layers
* Example env file
* fix: improve observability transparency and documentation
- Add debug logging for package import failures and missing API keys
- Fix documentation to correctly state LANGFUSE_HOST is supported
- Centralize dotenv loading to avoid multiple calls
Co-authored-by: Pietro Zullo <pietrozullo@users.noreply.github.com>
* Ruff fix
---------
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Pietro Zullo <pietrozullo@users.noreply.github.com>
* Telemetry base
* Fix debug level
* Singleton pattern in utils for metric server
* Added public identifier to transports
* Update telemetry
* Add telemetry to mcpagent
* telemetry docs
* Refactor integration test to have multiple mcp servers
* fix: check correct attribute in client_session validation
* Minor
* Add custom streaming server integration test (not related to the issue)
* Add server
* Enhanced base connector connection check to fix connection status as True even after SSE connections were closed by the server.
* Fix test since now we are using the connector and not the client_session
* Add integration tests and servers for timeout and connection testing
* Removed wrapped call_tool from session and test connection from the base connector + fix tests
* Add fallback check or default assumption for stream object
* Extend HTTP connector to support newer streamable http transport
* Fix timeout since they should be timedelta objects
* Refactor http connector to use streamable http by default
This will fallback to SSE if there are any issues with the test
ping send.
* Added transport integration tests
* Fail fast removed
* add fastmcp deps
* system install
* Fixed tests
* Remove python 3.12 from tests
---------
Co-authored-by: pietrozullo <pietro.zullo@gmail.com>
* Add E2B optional dependency for sandboxed mcp servers
* Add types for sandbox options
* Add util to check if stdio server config
* Ignore B017
* Add sandbox connector to run MCP servers on e2b sandbox
* Add client options to set sandbox and sandbox options + use sandbox connector
* Add sandbox connector test + fix
* Add sandboxed stdio server example
* Add docs
* Set logger info
* Set debug in example
* Add install new optional dep
* Add connector hooks to resources and propts
* Adapter implementation for resources and tools, treated them as tools
* Move unpacking responsibility to adapters
* Update unittests
* Separate unit and integration
* Fix initialization logic
* Fixed tests with capability check
* Removed tool reference from session
* Move server manager to manager
* update imports
* Search tool with full indexing
* Use tool search in sevrer manager -- rebase
* Simplified server manager
* WIP: tool search with fastemebed
* Import changes and adapter repr
* Update server manager API
* Implemented search tool, single tool usage tool, and separated tools into their own implementations, decoupled manager from tools
* Separate piproject and ruff config
* Remove sentence transformers - use fastembed
* Added search extra - update isntall in test action
* Small refactor
* docs
* Langchain adapter
* Removed langchain agent
* Refactored mcpagent, removed import
* Removed double initialization
* Server manager implementation
* Moved prompts to proper place and relative utils too
* Working server manager agent integration
* Update examples
* Removed debug true and added verbose option
* Replaced switch server to server disconnect
* Docs about server switching
---------
Signed-off-by: pietrozullo <62951181+pietrozullo@users.noreply.github.com>