Update test script for claude-code connection
- Use temporary YAML config file to specify claude MCP server - Update to work with current MCPBrowser API - Add better error handling and cleanup - Test sparse mode and tool discovery 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
1ef99927b3
commit
5274079013
|
|
@ -0,0 +1,188 @@
|
||||||
|
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
|
||||||
|
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
|
||||||
|
!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/
|
||||||
|
!_TAG_PROGRAM_NAME Exuberant Ctags //
|
||||||
|
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
|
||||||
|
!_TAG_PROGRAM_VERSION Development //
|
||||||
|
AIAssistant examples/ai_optimized.py /^class AIAssistant:$/;" c
|
||||||
|
BaseMCPServer mcp_servers/base.py /^class BaseMCPServer(ABC):$/;" c
|
||||||
|
ConfigLoader mcp_browser/config.py /^class ConfigLoader:$/;" c
|
||||||
|
DEFAULT_CONFIG mcp_browser/config.py /^ DEFAULT_CONFIG = {$/;" v class:ConfigLoader
|
||||||
|
Decision mcp_servers/memory/memory_server.py /^class Decision:$/;" c
|
||||||
|
GenerateAIDocs setup.py /^class GenerateAIDocs(Command):$/;" c
|
||||||
|
JsonRpcBuffer mcp_browser/buffer.py /^class JsonRpcBuffer:$/;" c
|
||||||
|
MCPBrowser mcp_browser/proxy.py /^class MCPBrowser:$/;" c
|
||||||
|
MCPBrowserConfig mcp_browser/config.py /^class MCPBrowserConfig:$/;" c
|
||||||
|
MCPServer mcp_browser/server.py /^class MCPServer:$/;" c
|
||||||
|
MCPServerConfig mcp_browser/config.py /^class MCPServerConfig:$/;" c
|
||||||
|
MemoryServer mcp_servers/memory/memory_server.py /^class MemoryServer(BaseMCPServer):$/;" c
|
||||||
|
MessageFilter mcp_browser/filter.py /^class MessageFilter:$/;" c
|
||||||
|
MultiServerManager mcp_browser/multi_server.py /^class MultiServerManager:$/;" c
|
||||||
|
OnboardingServer mcp_servers/onboarding/onboarding_server.py /^class OnboardingServer(BaseMCPServer):$/;" c
|
||||||
|
Pattern mcp_servers/memory/memory_server.py /^class Pattern:$/;" c
|
||||||
|
PatternServer mcp_servers/pattern_manager/pattern_server.py /^class PatternServer(BaseMCPServer):$/;" c
|
||||||
|
ScreenServer mcp_servers/screen/screen_server.py /^class ScreenServer(BaseMCPServer):$/;" c
|
||||||
|
Task mcp_servers/memory/memory_server.py /^class Task:$/;" c
|
||||||
|
TestMCPBrowser tests/test_basic.py /^class TestMCPBrowser:$/;" c
|
||||||
|
TestMessageFilter tests/test_basic.py /^class TestMessageFilter:$/;" c
|
||||||
|
TestToolRegistry tests/test_basic.py /^class TestToolRegistry:$/;" c
|
||||||
|
ToolRegistry mcp_browser/registry.py /^class ToolRegistry:$/;" c
|
||||||
|
VirtualToolHandler mcp_browser/filter.py /^class VirtualToolHandler:$/;" c
|
||||||
|
__aenter__ mcp_browser/proxy.py /^ async def __aenter__(self):$/;" m class:MCPBrowser file:
|
||||||
|
__aexit__ mcp_browser/proxy.py /^ async def __aexit__(self, exc_type, exc_val, exc_tb):$/;" m class:MCPBrowser file:
|
||||||
|
__all__ mcp_browser/__init__.py /^__all__ = ["MCPBrowser"]/;" v
|
||||||
|
__init__ examples/ai_optimized.py /^ def __init__(self):$/;" m class:AIAssistant
|
||||||
|
__init__ mcp_browser/buffer.py /^ def __init__(self):$/;" m class:JsonRpcBuffer
|
||||||
|
__init__ mcp_browser/config.py /^ def __init__(self, config_path: Optional[Path] = None):$/;" m class:ConfigLoader
|
||||||
|
__init__ mcp_browser/filter.py /^ def __init__(self, registry: ToolRegistry, server_callback: Callable):$/;" m class:VirtualToolHandler
|
||||||
|
__init__ mcp_browser/filter.py /^ def __init__(self, registry: ToolRegistry, sparse_mode: bool = True):$/;" m class:MessageFilter
|
||||||
|
__init__ mcp_browser/multi_server.py /^ def __init__(self, debug: bool = False):$/;" m class:MultiServerManager
|
||||||
|
__init__ mcp_browser/proxy.py /^ def __init__(self, config_path: Optional[Path] = None, server_name: Optional[str] = None,$/;" m class:MCPBrowser
|
||||||
|
__init__ mcp_browser/registry.py /^ def __init__(self):$/;" m class:ToolRegistry
|
||||||
|
__init__ mcp_browser/server.py /^ def __init__(self, config: MCPServerConfig, debug: bool = False):$/;" m class:MCPServer
|
||||||
|
__init__ mcp_servers/base.py /^ def __init__(self, name: str, version: str = "1.0.0"):$/;" m class:BaseMCPServer
|
||||||
|
__init__ mcp_servers/memory/memory_server.py /^ def __init__(self):$/;" m class:MemoryServer
|
||||||
|
__init__ mcp_servers/onboarding/onboarding_server.py /^ def __init__(self):$/;" m class:OnboardingServer
|
||||||
|
__init__ mcp_servers/pattern_manager/pattern_server.py /^ def __init__(self):$/;" m class:PatternServer
|
||||||
|
__init__ mcp_servers/screen/screen_server.py /^ def __init__(self):$/;" m class:ScreenServer
|
||||||
|
__version__ mcp_browser/__init__.py /^__version__ = "0.1.0"$/;" v
|
||||||
|
_add_pattern mcp_servers/pattern_manager/pattern_server.py /^ async def _add_pattern(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:PatternServer
|
||||||
|
_create_session mcp_servers/screen/screen_server.py /^ async def _create_session(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:ScreenServer
|
||||||
|
_decision_add mcp_servers/memory/memory_server.py /^ async def _decision_add(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:MemoryServer
|
||||||
|
_delete_onboarding mcp_servers/onboarding/onboarding_server.py /^ async def _delete_onboarding(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:OnboardingServer
|
||||||
|
_execute_command mcp_servers/screen/screen_server.py /^ async def _execute_command(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:ScreenServer
|
||||||
|
_execute_pattern mcp_servers/pattern_manager/pattern_server.py /^ async def _execute_pattern(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:PatternServer
|
||||||
|
_export_onboarding mcp_servers/onboarding/onboarding_server.py /^ async def _export_onboarding(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:OnboardingServer
|
||||||
|
_filter_tools_response mcp_browser/filter.py /^ def _filter_tools_response(self, message: dict) -> dict:$/;" m class:MessageFilter
|
||||||
|
_find_config_file mcp_browser/config.py /^ def _find_config_file(self) -> Optional[Path]:$/;" m class:ConfigLoader
|
||||||
|
_format_onboarding mcp_servers/onboarding/onboarding_server.py /^ def _format_onboarding(self, identity: str, data: Dict[str, Any]) -> str:$/;" m class:OnboardingServer
|
||||||
|
_forward_to_server mcp_browser/proxy.py /^ async def _forward_to_server(self, request: dict) -> dict:$/;" m class:MCPBrowser
|
||||||
|
_get_builtin_servers mcp_browser/multi_server.py /^ def _get_builtin_servers(self) -> Dict[str, MCPServerConfig]:$/;" m class:MultiServerManager
|
||||||
|
_handle_call mcp_browser/filter.py /^ async def _handle_call(self, message: dict) -> dict:$/;" m class:VirtualToolHandler
|
||||||
|
_handle_discover mcp_browser/filter.py /^ async def _handle_discover(self, message: dict) -> dict:$/;" m class:VirtualToolHandler
|
||||||
|
_handle_message mcp_browser/server.py /^ async def _handle_message(self, message: dict):$/;" m class:MCPServer
|
||||||
|
_handle_onboarding mcp_servers/onboarding/onboarding_server.py /^ async def _handle_onboarding(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:OnboardingServer
|
||||||
|
_handle_server_message mcp_browser/proxy.py /^ def _handle_server_message(self, message: dict):$/;" m class:MCPBrowser
|
||||||
|
_initialize_connection mcp_browser/proxy.py /^ async def _initialize_connection(self):$/;" m class:MCPBrowser
|
||||||
|
_kill_session mcp_servers/screen/screen_server.py /^ async def _kill_session(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:ScreenServer
|
||||||
|
_knowledge_add mcp_servers/memory/memory_server.py /^ async def _knowledge_add(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:MemoryServer
|
||||||
|
_knowledge_get mcp_servers/memory/memory_server.py /^ async def _knowledge_get(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:MemoryServer
|
||||||
|
_list_identities mcp_servers/onboarding/onboarding_server.py /^ async def _list_identities(self) -> Dict[str, Any]:$/;" m class:OnboardingServer
|
||||||
|
_list_patterns mcp_servers/pattern_manager/pattern_server.py /^ async def _list_patterns(self) -> Dict[str, Any]:$/;" m class:PatternServer
|
||||||
|
_list_sessions mcp_servers/screen/screen_server.py /^ async def _list_sessions(self) -> Dict[str, Any]:$/;" m class:ScreenServer
|
||||||
|
_load_json mcp_servers/memory/memory_server.py /^ def _load_json(self, filename: str, default: Any) -> Any:$/;" m class:MemoryServer
|
||||||
|
_load_memory mcp_servers/memory/memory_server.py /^ def _load_memory(self):$/;" m class:MemoryServer
|
||||||
|
_load_patterns mcp_servers/pattern_manager/pattern_server.py /^ def _load_patterns(self) -> Dict[str, Dict[str, Any]]:$/;" m class:PatternServer
|
||||||
|
_matches_pattern mcp_servers/pattern_manager/pattern_server.py /^ def _matches_pattern(self, text: str, trigger: List[str]) -> bool:$/;" m class:PatternServer
|
||||||
|
_memory_summary mcp_servers/memory/memory_server.py /^ async def _memory_summary(self) -> Dict[str, Any]:$/;" m class:MemoryServer
|
||||||
|
_merge_configs mcp_browser/config.py /^ def _merge_configs(self, base: Dict[str, Any], override: Dict[str, Any]):$/;" m class:ConfigLoader
|
||||||
|
_pattern_add mcp_servers/memory/memory_server.py /^ async def _pattern_add(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:MemoryServer
|
||||||
|
_pattern_resolve mcp_servers/memory/memory_server.py /^ async def _pattern_resolve(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:MemoryServer
|
||||||
|
_peek_session mcp_servers/screen/screen_server.py /^ async def _peek_session(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:ScreenServer
|
||||||
|
_process_response mcp_servers/pattern_manager/pattern_server.py /^ async def _process_response(self, response: Any, context: Dict[str, Any]) -> str:$/;" m class:PatternServer
|
||||||
|
_process_single_response mcp_servers/pattern_manager/pattern_server.py /^ async def _process_single_response(self, response: str, context: Dict[str, Any]) -> str:$/;" m class:PatternServer
|
||||||
|
_project_switch mcp_servers/memory/memory_server.py /^ async def _project_switch(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:MemoryServer
|
||||||
|
_read_stderr mcp_browser/server.py /^ async def _read_stderr(self):$/;" m class:MCPServer
|
||||||
|
_read_stdout mcp_browser/server.py /^ async def _read_stdout(self):$/;" m class:MCPServer
|
||||||
|
_register_tools mcp_servers/memory/memory_server.py /^ def _register_tools(self):$/;" m class:MemoryServer
|
||||||
|
_register_tools mcp_servers/onboarding/onboarding_server.py /^ def _register_tools(self):$/;" m class:OnboardingServer
|
||||||
|
_register_tools mcp_servers/pattern_manager/pattern_server.py /^ def _register_tools(self):$/;" m class:PatternServer
|
||||||
|
_register_tools mcp_servers/screen/screen_server.py /^ def _register_tools(self):$/;" m class:ScreenServer
|
||||||
|
_remove_pattern mcp_servers/pattern_manager/pattern_server.py /^ async def _remove_pattern(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:PatternServer
|
||||||
|
_run_command mcp_servers/screen/screen_server.py /^ async def _run_command(self, cmd: List[str]) -> subprocess.CompletedProcess:$/;" m class:ScreenServer
|
||||||
|
_sanitize_identity mcp_servers/onboarding/onboarding_server.py /^ def _sanitize_identity(self, identity: str) -> str:$/;" m class:OnboardingServer
|
||||||
|
_save_json mcp_servers/memory/memory_server.py /^ def _save_json(self, filename: str, data: Any):$/;" m class:MemoryServer
|
||||||
|
_save_patterns mcp_servers/pattern_manager/pattern_server.py /^ def _save_patterns(self):$/;" m class:PatternServer
|
||||||
|
_task_add mcp_servers/memory/memory_server.py /^ async def _task_add(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:MemoryServer
|
||||||
|
_task_list mcp_servers/memory/memory_server.py /^ async def _task_list(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:MemoryServer
|
||||||
|
_task_update mcp_servers/memory/memory_server.py /^ async def _task_update(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:MemoryServer
|
||||||
|
_test_pattern mcp_servers/pattern_manager/pattern_server.py /^ async def _test_pattern(self, args: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:PatternServer
|
||||||
|
add_message_handler mcp_browser/server.py /^ def add_message_handler(self, handler: Callable[[dict], None]):$/;" m class:MCPServer
|
||||||
|
add_server mcp_browser/multi_server.py /^ async def add_server(self, name: str, config: MCPServerConfig):$/;" m class:MultiServerManager
|
||||||
|
append mcp_browser/buffer.py /^ def append(self, data: str) -> List[dict]:$/;" m class:JsonRpcBuffer
|
||||||
|
async_main mcp_browser/__main__.py /^async def async_main(browser: MCPBrowser):$/;" f
|
||||||
|
author setup.py /^ author="AI Assistant",$/;" v
|
||||||
|
author_email setup.py /^ author_email="ai@anthropic.com",$/;" v
|
||||||
|
call mcp_browser/proxy.py /^ async def call(self, jsonrpc_object: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:MCPBrowser
|
||||||
|
classifiers setup.py /^ classifiers=[$/;" v
|
||||||
|
clear mcp_browser/buffer.py /^ def clear(self):$/;" m class:JsonRpcBuffer
|
||||||
|
close examples/ai_optimized.py /^ async def close(self):$/;" m class:AIAssistant
|
||||||
|
close mcp_browser/proxy.py /^ async def close(self):$/;" m class:MCPBrowser
|
||||||
|
cmdclass setup.py /^ cmdclass={$/;" v
|
||||||
|
content_text mcp_servers/base.py /^ def content_text(self, text: str) -> Dict[str, Any]:$/;" m class:BaseMCPServer
|
||||||
|
create_browser mcp_browser/proxy.py /^async def create_browser(config_path: Optional[Path] = None, $/;" f
|
||||||
|
demo_builtin_servers examples/builtin_servers_demo.py /^async def demo_builtin_servers():$/;" f
|
||||||
|
demonstrate_mcp_browser examples/complete_demo.py /^async def demonstrate_mcp_browser():$/;" f
|
||||||
|
description setup.py /^ description = 'Generate documentation for AI navigation'$/;" v class:GenerateAIDocs
|
||||||
|
description setup.py /^ description="A generic MCP browser with context optimization for AI systems",$/;" v
|
||||||
|
discover mcp_browser/proxy.py /^ def discover(self, jsonpath: str) -> Any:$/;" m class:MCPBrowser
|
||||||
|
discover mcp_browser/registry.py /^ def discover(self, jsonpath: str) -> Union[List[Any], Any, None]:$/;" m class:ToolRegistry
|
||||||
|
entry_points setup.py /^ entry_points={$/;" v
|
||||||
|
execute_user_request examples/ai_optimized.py /^ async def execute_user_request(self, user_request: str):$/;" m class:AIAssistant
|
||||||
|
extras_require setup.py /^ extras_require={$/;" v
|
||||||
|
filter_incoming mcp_browser/filter.py /^ def filter_incoming(self, message: dict) -> Optional[dict]:$/;" m class:MessageFilter
|
||||||
|
filter_outgoing mcp_browser/filter.py /^ def filter_outgoing(self, message: dict) -> Optional[dict]:$/;" m class:MessageFilter
|
||||||
|
finalize_options setup.py /^ def finalize_options(self):$/;" m class:GenerateAIDocs
|
||||||
|
generate_api_summary setup.py /^ def generate_api_summary(self):$/;" m class:GenerateAIDocs
|
||||||
|
generate_structure_doc setup.py /^ def generate_structure_doc(self):$/;" m class:GenerateAIDocs
|
||||||
|
get_all_tool_names mcp_browser/registry.py /^ def get_all_tool_names(self) -> List[str]:$/;" m class:ToolRegistry
|
||||||
|
get_all_tools mcp_browser/multi_server.py /^ async def get_all_tools(self) -> List[Dict[str, Any]]:$/;" m class:MultiServerManager
|
||||||
|
get_sparse_tools mcp_browser/registry.py /^ def get_sparse_tools(self) -> List[Dict[str, Any]]:$/;" m class:ToolRegistry
|
||||||
|
get_tool mcp_browser/registry.py /^ def get_tool(self, name: str) -> Optional[Dict[str, Any]]:$/;" m class:ToolRegistry
|
||||||
|
handle_request mcp_servers/base.py /^ async def handle_request(self, request: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:BaseMCPServer
|
||||||
|
handle_tool_call mcp_browser/filter.py /^ async def handle_tool_call(self, message: dict) -> Optional[dict]:$/;" m class:VirtualToolHandler
|
||||||
|
handle_tool_call mcp_servers/base.py /^ async def handle_tool_call(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:BaseMCPServer
|
||||||
|
handle_tool_call mcp_servers/memory/memory_server.py /^ async def handle_tool_call(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:MemoryServer
|
||||||
|
handle_tool_call mcp_servers/onboarding/onboarding_server.py /^ async def handle_tool_call(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:OnboardingServer
|
||||||
|
handle_tool_call mcp_servers/pattern_manager/pattern_server.py /^ async def handle_tool_call(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:PatternServer
|
||||||
|
handle_tool_call mcp_servers/screen/screen_server.py /^ async def handle_tool_call(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:ScreenServer
|
||||||
|
initialize examples/ai_optimized.py /^ async def initialize(self):$/;" m class:AIAssistant
|
||||||
|
initialize mcp_browser/proxy.py /^ async def initialize(self):$/;" m class:MCPBrowser
|
||||||
|
initialize_options setup.py /^ def initialize_options(self):$/;" m class:GenerateAIDocs
|
||||||
|
install_requires setup.py /^ install_requires=[$/;" v
|
||||||
|
interactive_mode mcp_browser/__main__.py /^async def interactive_mode(browser: MCPBrowser):$/;" f
|
||||||
|
is_virtual_tool mcp_browser/filter.py /^ def is_virtual_tool(self, tool_name: str) -> bool:$/;" m class:MessageFilter
|
||||||
|
keywords setup.py /^ keywords="mcp model-context-protocol ai llm tools json-rpc",$/;" v
|
||||||
|
load mcp_browser/config.py /^ def load(self) -> MCPBrowserConfig:$/;" m class:ConfigLoader
|
||||||
|
long_description setup.py /^ long_description = fh.read()$/;" v class:GenerateAIDocs
|
||||||
|
long_description setup.py /^ long_description=long_description,$/;" v
|
||||||
|
long_description_content_type setup.py /^ long_description_content_type="text\/markdown",$/;" v
|
||||||
|
main examples/ai_optimized.py /^async def main():$/;" f
|
||||||
|
main examples/basic_usage.py /^async def main():$/;" f
|
||||||
|
main mcp_browser/__main__.py /^def main():$/;" f
|
||||||
|
mark_handled mcp_browser/filter.py /^ def mark_handled(self, request_id: Union[str, int]):$/;" m class:MessageFilter
|
||||||
|
name setup.py /^ name="mcp-browser",$/;" v
|
||||||
|
package_data setup.py /^ package_data={$/;" v
|
||||||
|
packages setup.py /^ packages=find_packages(),$/;" v
|
||||||
|
register_tool mcp_servers/base.py /^ def register_tool(self, name: str, description: str, input_schema: Dict[str, Any], $/;" m class:BaseMCPServer
|
||||||
|
route_tool_call mcp_browser/multi_server.py /^ async def route_tool_call(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:$/;" m class:MultiServerManager
|
||||||
|
run mcp_servers/base.py /^ async def run(self):$/;" m class:BaseMCPServer
|
||||||
|
run setup.py /^ def run(self):$/;" m class:GenerateAIDocs
|
||||||
|
run_server_mode mcp_browser/__main__.py /^async def run_server_mode(browser: MCPBrowser):$/;" f
|
||||||
|
send_raw mcp_browser/server.py /^ def send_raw(self, message: str):$/;" m class:MCPServer
|
||||||
|
send_request mcp_browser/server.py /^ async def send_request(self, method: str, params: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:$/;" m class:MCPServer
|
||||||
|
server mcp_servers/memory/memory_server.py /^ server = MemoryServer()$/;" v class:MemoryServer
|
||||||
|
server mcp_servers/onboarding/onboarding_server.py /^ server = OnboardingServer()$/;" v class:OnboardingServer
|
||||||
|
server mcp_servers/pattern_manager/pattern_server.py /^ server = PatternServer()$/;" v class:PatternServer
|
||||||
|
server mcp_servers/screen/screen_server.py /^ server = ScreenServer()$/;" v class:ScreenServer
|
||||||
|
set_metadata mcp_browser/registry.py /^ def set_metadata(self, key: str, value: Any):$/;" m class:ToolRegistry
|
||||||
|
simulate_response tests/test_basic.py /^ async def simulate_response():$/;" f function:TestMCPBrowser.test_call_method
|
||||||
|
start mcp_browser/server.py /^ async def start(self):$/;" m class:MCPServer
|
||||||
|
start_builtin_servers mcp_browser/multi_server.py /^ async def start_builtin_servers(self):$/;" m class:MultiServerManager
|
||||||
|
stop mcp_browser/server.py /^ async def stop(self):$/;" m class:MCPServer
|
||||||
|
stop_all mcp_browser/multi_server.py /^ async def stop_all(self):$/;" m class:MultiServerManager
|
||||||
|
test_call_method tests/test_basic.py /^ async def test_call_method(self):$/;" m class:TestMCPBrowser
|
||||||
|
test_claude_connection test_claude_connection.py /^async def test_claude_connection():$/;" f
|
||||||
|
test_discover_jsonpath tests/test_basic.py /^ def test_discover_jsonpath(self):$/;" m class:TestToolRegistry
|
||||||
|
test_discover_method tests/test_basic.py /^ async def test_discover_method(self):$/;" m class:TestMCPBrowser
|
||||||
|
test_duplicate_error_filtering tests/test_basic.py /^ def test_duplicate_error_filtering(self):$/;" m class:TestMessageFilter
|
||||||
|
test_initialization tests/test_basic.py /^ async def test_initialization(self):$/;" m class:TestMCPBrowser
|
||||||
|
test_onboarding test_onboarding.py /^async def test_onboarding():$/;" f
|
||||||
|
test_sparse_mode_filtering tests/test_basic.py /^ def test_sparse_mode_filtering(self):$/;" m class:TestMessageFilter
|
||||||
|
test_sparse_tools tests/test_basic.py /^ def test_sparse_tools(self):$/;" m class:TestToolRegistry
|
||||||
|
test_update_tools tests/test_basic.py /^ def test_update_tools(self):$/;" m class:TestToolRegistry
|
||||||
|
to_json mcp_browser/registry.py /^ def to_json(self) -> str:$/;" m class:ToolRegistry
|
||||||
|
update_tools mcp_browser/registry.py /^ def update_tools(self, tools: List[Dict[str, Any]]):$/;" m class:ToolRegistry
|
||||||
|
url setup.py /^ url="https:\/\/github.com\/anthropics\/mcp-browser",$/;" v
|
||||||
|
user_options setup.py /^ user_options = []$/;" v class:GenerateAIDocs
|
||||||
|
version setup.py /^ version="0.1.0",$/;" v
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
# MCP Browser API Summary
|
||||||
|
|
||||||
|
## Main Classes
|
||||||
|
|
||||||
|
|
||||||
|
### MCPBrowser (mcp_browser/proxy.py)
|
||||||
|
|
||||||
|
- `discover()`
|
||||||
|
|
||||||
|
### ToolRegistry (mcp_browser/registry.py)
|
||||||
|
|
||||||
|
- `update_tools()`
|
||||||
|
- `get_tool()`
|
||||||
|
- `get_all_tool_names()`
|
||||||
|
- `discover()`
|
||||||
|
- `get_sparse_tools()`
|
||||||
|
- `set_metadata()`
|
||||||
|
- `to_json()`
|
||||||
|
|
||||||
|
### MCPServer (mcp_browser/server.py)
|
||||||
|
|
||||||
|
- `send_raw()`
|
||||||
|
- `add_message_handler()`
|
||||||
|
|
||||||
|
### MultiServerManager (mcp_browser/multi_server.py)
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
# Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
./
|
||||||
|
setup.py
|
||||||
|
test_claude_connection.py
|
||||||
|
test_onboarding.py
|
||||||
|
docs/
|
||||||
|
examples/
|
||||||
|
ai_optimized.py
|
||||||
|
basic_usage.py
|
||||||
|
builtin_servers_demo.py
|
||||||
|
complete_demo.py
|
||||||
|
tests/
|
||||||
|
test_basic.py
|
||||||
|
config/
|
||||||
|
mcp_servers/
|
||||||
|
base.py
|
||||||
|
screen/
|
||||||
|
screen_server.py
|
||||||
|
memory/
|
||||||
|
memory_server.py
|
||||||
|
pattern_manager/
|
||||||
|
pattern_server.py
|
||||||
|
onboarding/
|
||||||
|
onboarding_server.py
|
||||||
|
mcp_browser/
|
||||||
|
__init__.py
|
||||||
|
__main__.py
|
||||||
|
buffer.py
|
||||||
|
config.py
|
||||||
|
filter.py
|
||||||
|
multi_server.py
|
||||||
|
proxy.py
|
||||||
|
registry.py
|
||||||
|
server.py
|
||||||
|
```
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -10,6 +10,8 @@ import asyncio
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
import yaml
|
||||||
|
import tempfile
|
||||||
|
|
||||||
# Add parent directory to path for development
|
# Add parent directory to path for development
|
||||||
sys.path.insert(0, str(Path(__file__).parent))
|
sys.path.insert(0, str(Path(__file__).parent))
|
||||||
|
|
@ -31,14 +33,29 @@ async def test_claude_connection():
|
||||||
|
|
||||||
print(f"✓ Found Claude binary at {claude_path}\n")
|
print(f"✓ Found Claude binary at {claude_path}\n")
|
||||||
|
|
||||||
# Create browser configured for claude-code
|
# Create a temporary config file for claude
|
||||||
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
||||||
|
config = {
|
||||||
|
"servers": {
|
||||||
|
"claude-code": {
|
||||||
|
"command": [claude_path, "mcp", "serve"],
|
||||||
|
"name": "claude-code",
|
||||||
|
"description": "Claude Code MCP interface"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"default_server": "claude-code",
|
||||||
|
"sparse_mode": True,
|
||||||
|
"enable_builtin_servers": False # Disable built-in servers for this test
|
||||||
|
}
|
||||||
|
yaml.dump(config, f)
|
||||||
|
config_path = f.name
|
||||||
|
|
||||||
print("Creating MCP Browser with claude-code as target...")
|
print("Creating MCP Browser with claude-code as target...")
|
||||||
|
|
||||||
# We'll create a custom config for claude
|
# Create browser with custom config
|
||||||
browser = MCPBrowser(
|
browser = MCPBrowser(
|
||||||
server_command=[claude_path, "mcp"],
|
config_path=Path(config_path),
|
||||||
server_name="claude-code",
|
server_name="claude-code"
|
||||||
sparse_mode=True # Use sparse mode to minimize context
|
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
@ -66,7 +83,9 @@ async def test_claude_connection():
|
||||||
all_tools = browser.discover("$.tools[*].name")
|
all_tools = browser.discover("$.tools[*].name")
|
||||||
if all_tools:
|
if all_tools:
|
||||||
print(f" Total tools discovered: {len(all_tools)}")
|
print(f" Total tools discovered: {len(all_tools)}")
|
||||||
print(" Sample tools:", all_tools[:10])
|
# Show a sample of tools
|
||||||
|
sample = all_tools[:10] if len(all_tools) > 10 else all_tools
|
||||||
|
print(f" Sample tools: {sample}")
|
||||||
|
|
||||||
# Test 3: Try to read a file using claude's Read tool
|
# Test 3: Try to read a file using claude's Read tool
|
||||||
print("\n3. Testing file read capability:")
|
print("\n3. Testing file read capability:")
|
||||||
|
|
@ -77,59 +96,44 @@ async def test_claude_connection():
|
||||||
f.write("Hello from MCP Browser!\nThis file was created to test claude-code integration.")
|
f.write("Hello from MCP Browser!\nThis file was created to test claude-code integration.")
|
||||||
print(f" Created test file: {test_file}")
|
print(f" Created test file: {test_file}")
|
||||||
|
|
||||||
# Use mcp_call to invoke Read tool
|
# Use mcp_call to invoke Read tool if available
|
||||||
response = await browser.call({
|
if all_tools and any('Read' in tool or 'read' in tool.lower() for tool in all_tools):
|
||||||
"jsonrpc": "2.0",
|
response = await browser.call({
|
||||||
"id": "test-3",
|
"jsonrpc": "2.0",
|
||||||
"method": "tools/call",
|
"id": "test-3",
|
||||||
"params": {
|
"method": "tools/call",
|
||||||
"name": "mcp_call",
|
"params": {
|
||||||
"arguments": {
|
"name": "mcp_call",
|
||||||
"method": "tools/call",
|
"arguments": {
|
||||||
"params": {
|
"method": "tools/call",
|
||||||
"name": "Read", # Claude's Read tool
|
"params": {
|
||||||
"arguments": {
|
"name": "Read", # Claude's Read tool
|
||||||
"file_path": test_file
|
"arguments": {
|
||||||
|
"file_path": test_file
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
})
|
|
||||||
|
|
||||||
if "result" in response:
|
if "result" in response:
|
||||||
print(" ✓ Successfully read file via claude-code!")
|
print(" ✓ Successfully read file via claude-code!")
|
||||||
content = response["result"]["content"][0]["text"]
|
content = response["result"]["content"][0]["text"]
|
||||||
print(f" File content preview: {content[:100]}...")
|
print(f" File content preview: {content[:100]}...")
|
||||||
|
else:
|
||||||
|
print(" ❌ Failed to read file:", response.get("error", "Unknown error"))
|
||||||
else:
|
else:
|
||||||
print(" ❌ Failed to read file:", response.get("error", "Unknown error"))
|
print(" ⚠ Read tool not found in available tools")
|
||||||
|
|
||||||
# Test 4: Use onboarding
|
|
||||||
print("\n4. Testing identity-aware onboarding:")
|
|
||||||
response = await browser.call({
|
|
||||||
"jsonrpc": "2.0",
|
|
||||||
"id": "test-4",
|
|
||||||
"method": "tools/call",
|
|
||||||
"params": {
|
|
||||||
"name": "onboarding",
|
|
||||||
"arguments": {
|
|
||||||
"identity": "ClaudeCodeTest",
|
|
||||||
"instructions": "Remember: You're testing MCP Browser integration with claude-code"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if "result" in response:
|
|
||||||
print(" ✓ Onboarding set successfully")
|
|
||||||
|
|
||||||
# Clean up test file
|
# Clean up test file
|
||||||
os.remove(test_file)
|
if os.path.exists(test_file):
|
||||||
|
os.remove(test_file)
|
||||||
|
|
||||||
print("\n✅ All tests completed successfully!")
|
print("\n✅ Connection test completed!")
|
||||||
print("\nMCP Browser can successfully:")
|
print("\nMCP Browser successfully:")
|
||||||
print("- Connect to claude-code as an MCP server")
|
print("- Connected to claude-code as an MCP server")
|
||||||
print("- List and discover available tools")
|
print("- Listed available tools in sparse mode")
|
||||||
print("- Execute claude-code tools (like Read)")
|
print("- Discovered all available tools via JSONPath")
|
||||||
print("- Use built-in features (onboarding)")
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"\n❌ Error during testing: {e}")
|
print(f"\n❌ Error during testing: {e}")
|
||||||
|
|
@ -141,6 +145,10 @@ async def test_claude_connection():
|
||||||
await browser.close()
|
await browser.close()
|
||||||
print("✓ Connection closed")
|
print("✓ Connection closed")
|
||||||
|
|
||||||
|
# Clean up config file
|
||||||
|
if os.path.exists(config_path):
|
||||||
|
os.remove(config_path)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print("\nNote: This test requires claude-code to be installed at /usr/local/bin/claude")
|
print("\nNote: This test requires claude-code to be installed at /usr/local/bin/claude")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue