mcp-browser/examples/builtin_servers_demo.py

243 lines
7.9 KiB
Python

#!/usr/bin/env python3
"""
Demonstration of MCP Browser with built-in servers.
Shows how the built-in servers (screen, memory, patterns, onboarding)
are automatically available and can be used through the unified interface.
"""
import asyncio
import json
import sys
from pathlib import Path
# Add parent directory to path for development
sys.path.insert(0, str(Path(__file__).parent.parent))
from mcp_browser import MCPBrowser
async def demo_builtin_servers():
"""Demonstrate built-in server functionality."""
print("=== MCP Browser Built-in Servers Demo ===\n")
print("This demo shows the 4 built-in servers that start automatically:")
print("- Screen: GNU screen session management")
print("- Memory: Persistent project memory")
print("- Patterns: Auto-response patterns")
print("- Onboarding: Identity-aware onboarding")
print("\n" + "-" * 60 + "\n")
# Create browser with built-in servers only (no external server)
browser = MCPBrowser(server_name="builtin-only")
try:
await browser.initialize()
print("✓ MCP Browser initialized with built-in servers\n")
# 1. Test Onboarding (directly available in sparse mode)
print("1. ONBOARDING DEMONSTRATION")
print("-" * 40)
# First, get onboarding for a new identity
response = await browser.call({
"jsonrpc": "2.0",
"id": "onboard-1",
"method": "tools/call",
"params": {
"name": "onboarding",
"arguments": {
"identity": "DemoAssistant"
}
}
})
print("Getting onboarding for 'DemoAssistant':")
if "result" in response:
text = response["result"]["content"][0]["text"]
print(text[:300] + "...\n")
# Set onboarding instructions
response = await browser.call({
"jsonrpc": "2.0",
"id": "onboard-2",
"method": "tools/call",
"params": {
"name": "onboarding",
"arguments": {
"identity": "DemoAssistant",
"instructions": "Welcome back! Remember:\n- You're helping with the MCP Browser project\n- Focus on simplicity and clarity\n- The user prefers concise responses"
}
}
})
print("✓ Set onboarding instructions for DemoAssistant\n")
# 2. Discover available tools
print("\n2. DISCOVERING BUILT-IN TOOLS")
print("-" * 40)
# Use mcp_discover to find all tools
all_tools = browser.discover("$.tools[*].name")
print(f"Total tools available: {len(all_tools) if all_tools else 0}")
# Group by server
tool_groups = {}
for tool in all_tools or []:
if "::" in tool:
server, tool_name = tool.split("::", 1)
if server not in tool_groups:
tool_groups[server] = []
tool_groups[server].append(tool_name)
for server, tools in tool_groups.items():
print(f"\n{server}:")
for tool in tools[:3]: # Show first 3
print(f" - {tool}")
if len(tools) > 3:
print(f" ... and {len(tools) - 3} more")
# 3. Use Memory server
print("\n\n3. MEMORY SERVER DEMONSTRATION")
print("-" * 40)
# Add a task
response = await browser.call({
"jsonrpc": "2.0",
"id": "mem-1",
"method": "tools/call",
"params": {
"name": "mcp_call",
"arguments": {
"method": "tools/call",
"params": {
"name": "builtin:memory::task_add",
"arguments": {
"content": "Complete MCP Browser documentation",
"priority": "high"
}
}
}
}
})
print("Added task to memory")
# Get memory summary
response = await browser.call({
"jsonrpc": "2.0",
"id": "mem-2",
"method": "tools/call",
"params": {
"name": "mcp_call",
"arguments": {
"method": "tools/call",
"params": {
"name": "builtin:memory::memory_summary",
"arguments": {}
}
}
}
})
if "result" in response:
print("\nMemory Summary:")
print(response["result"]["content"][0]["text"][:200] + "...")
# 4. Use Screen server
print("\n\n4. SCREEN SERVER DEMONSTRATION")
print("-" * 40)
# List sessions
response = await browser.call({
"jsonrpc": "2.0",
"id": "screen-1",
"method": "tools/call",
"params": {
"name": "mcp_call",
"arguments": {
"method": "tools/call",
"params": {
"name": "builtin:screen::list_sessions",
"arguments": {}
}
}
}
})
if "result" in response:
print("Screen sessions:")
print(response["result"]["content"][0]["text"])
# 5. Pattern Manager
print("\n\n5. PATTERN MANAGER DEMONSTRATION")
print("-" * 40)
# Add a pattern
response = await browser.call({
"jsonrpc": "2.0",
"id": "pattern-1",
"method": "tools/call",
"params": {
"name": "mcp_call",
"arguments": {
"method": "tools/call",
"params": {
"name": "builtin:patterns::add_pattern",
"arguments": {
"trigger": ["Continue?", "(y/n)"],
"response": "y",
"description": "Auto-confirm continue prompts"
}
}
}
}
})
print("✓ Added auto-response pattern for continue prompts")
# List patterns
response = await browser.call({
"jsonrpc": "2.0",
"id": "pattern-2",
"method": "tools/call",
"params": {
"name": "mcp_call",
"arguments": {
"method": "tools/call",
"params": {
"name": "builtin:patterns::list_patterns",
"arguments": {}
}
}
}
})
if "result" in response:
print("\nActive patterns:")
print(response["result"]["content"][0]["text"][:200] + "...")
except Exception as e:
print(f"\n✗ Error: {e}")
import traceback
traceback.print_exc()
finally:
await browser.close()
print("\n\n✓ MCP Browser closed")
if __name__ == "__main__":
print("\nNote: This demo uses built-in Python MCP servers.")
print("Make sure Python 3.8+ is available.\n")
# Check for screen if on Linux/Mac
import platform
if platform.system() != "Windows":
import subprocess
try:
subprocess.run(["screen", "--version"], capture_output=True, check=True)
except:
print("Warning: GNU screen not installed. Screen server features won't work.")
print("Install with: sudo apt-get install screen (Ubuntu) or brew install screen (Mac)\n")
asyncio.run(demo_builtin_servers())