#!/usr/bin/env python3
# debug/debug_mcp_server.py
"""
Enhanced debug script to check what methods are available on the MCPServer object
and analyze the complete chuk-mcp library structure.
"""
import inspect
def analyze_mcp_server():
"""Analyze the MCPServer class in detail."""
try:
from chuk_mcp.server import MCPServer
from chuk_mcp.protocol.types import ServerCapabilities
print("๐ Inspecting MCPServer class:")
print("=" * 50)
# Create a server instance
server = MCPServer(name="test", version="1.0.0")
# Get all methods and attributes
methods = []
attributes = []
for name in dir(server):
if not name.startswith("_"):
obj = getattr(server, name)
if callable(obj):
methods.append(name)
else:
attributes.append(name)
print("๐ Available Methods:")
for method in sorted(methods):
try:
sig = inspect.signature(getattr(server, method))
print(f" โข {method}{sig}")
except:
print(f" โข {method}()")
print("\n๐ Available Attributes:")
for attr in sorted(attributes):
attr_obj = getattr(server, attr)
print(f" โข {attr}: {type(attr_obj)}")
# Check for specific methods we need
required_methods = [
"run_stdio",
"run",
"start",
"serve",
"register_tool",
"register_resource",
"register_prompt",
]
print("\n๐ Checking for required methods:")
for method in required_methods:
if hasattr(server, method):
print(f" โ
{method} - Available")
try:
sig = inspect.signature(getattr(server, method))
print(f" Signature: {method}{sig}")
except:
pass
else:
print(f" โ {method} - Missing")
# Check the server's class hierarchy
print("\n๐๏ธ Class hierarchy:")
for cls in server.__class__.__mro__:
print(f" โข {cls}")
# Check if there are any run-like methods
print("\n๐ Run-like methods:")
run_methods = []
for method in methods:
if any(
keyword in method.lower()
for keyword in ["run", "start", "serve", "execute", "handle"]
):
run_methods.append(method)
print(f" โข {method}")
if not run_methods:
print(" ๐ No run-like methods found")
# Analyze the protocol handler in detail
print("\n๐ Protocol Handler Analysis:")
if hasattr(server, "protocol_handler"):
handler = server.protocol_handler
print(f" โข Type: {type(handler)}")
handler_methods = []
for name in dir(handler):
if not name.startswith("_") and callable(getattr(handler, name)):
handler_methods.append(name)
print(f" โข Methods: {', '.join(sorted(handler_methods))}")
# Check if handle_message is async
if hasattr(handler, "handle_message"):
handle_msg = getattr(handler, "handle_message")
is_async = inspect.iscoroutinefunction(handle_msg)
print(f" โข handle_message is async: {is_async}")
try:
sig = inspect.signature(handle_msg)
print(f" โข handle_message signature: {sig}")
except:
pass
return True
except ImportError as e:
print(f"โ Failed to import chuk_mcp: {e}")
return False
except Exception as e:
print(f"โ Error inspecting MCPServer: {e}")
import traceback
traceback.print_exc()
return False
def analyze_chuk_mcp_structure():
"""Analyze the complete chuk_mcp library structure."""
print("\n๐ฆ Analyzing chuk_mcp library structure:")
print("=" * 50)
try:
import chuk_mcp
print(f"๐ chuk_mcp version: {getattr(chuk_mcp, '__version__', 'unknown')}")
# Get top-level items
top_level = {}
for attr in dir(chuk_mcp):
if not attr.startswith("_"):
obj = getattr(chuk_mcp, attr)
obj_type = type(obj).__name__
if obj_type not in top_level:
top_level[obj_type] = []
top_level[obj_type].append(attr)
for obj_type, items in sorted(top_level.items()):
print(f"\n๐ {obj_type}s ({len(items)}):")
for item in sorted(items)[:10]: # Show first 10
print(f" โข {item}")
if len(items) > 10:
print(f" ... and {len(items) - 10} more")
# Check for transport-related items
print("\n๐ Transport-related items:")
transport_items = []
for attr in dir(chuk_mcp):
if any(
keyword in attr.lower()
for keyword in ["transport", "stdio", "http", "client", "server"]
):
obj = getattr(chuk_mcp, attr)
transport_items.append((attr, type(obj)))
if transport_items:
for attr, obj_type in transport_items:
print(f" โข {attr}: {obj_type}")
else:
print(" ๐ No obvious transport items found at top level")
# Check submodules
print("\n๐ Checking for submodules:")
potential_submodules = ["server", "client", "transport", "protocol", "stdio"]
for submodule in potential_submodules:
if hasattr(chuk_mcp, submodule):
sub = getattr(chuk_mcp, submodule)
if hasattr(sub, "__file__") or hasattr(sub, "__path__"):
print(f" โ
{submodule}: {type(sub)}")
# List contents of server module specifically
if submodule == "server":
print(" ๐ server module contents:")
for item in dir(sub):
if not item.startswith("_"):
print(f" โข {item}: {type(getattr(sub, item))}")
else:
print(f" โ ๏ธ {submodule}: {type(sub)} (not a module)")
else:
print(f" โ {submodule}: Not found")
return True
except Exception as e:
print(f"โ Error analyzing chuk_mcp: {e}")
return False
def check_working_solution():
"""Document our current working solution."""
print("\nโ
Current Working Solution Summary:")
print("=" * 50)
print("๐ What works:")
print(" โข MCPServer.register_tool() - โ
Working")
print(" โข MCPServer.register_resource() - โ
Working")
print(" โข MCPServer.protocol_handler.handle_message() - โ
Working (async)")
print(" โข Manual stdio handling - โ
Working")
print(" โข 286 mathematical functions - โ
Working")
print(" โข Async function execution - โ
Working")
print(" โข JSON-RPC communication - โ
Working")
print("\n๐ What's missing/not working:")
print(" โข MCPServer.run_stdio() - โ Missing")
print(" โข MCPServer.register_prompt() - โ Missing")
print(" โข Built-in transport handling - โ Missing")
print("\n๐ง Our workarounds:")
print(" โข Manual stdio loop instead of run_stdio()")
print(" โข Skip prompt registration (method doesn't exist)")
print(" โข Direct module access for math functions (get_mcp_functions returns 0)")
print(" โข Proper async/await handling for protocol_handler.handle_message()")
print("\n๐ฏ Result:")
print(" โข Fully functional MCP Math Server with 286 functions")
print(" โข Compatible with chuk-mcp v0.4.0")
print(" โข Real mathematical computations working correctly")
def main():
"""Main analysis function."""
print("๐งฎ Enhanced chuk-mcp Library Analysis")
print("=" * 60)
# Analyze MCPServer
server_success = analyze_mcp_server()
# Analyze overall library structure
lib_success = analyze_chuk_mcp_structure()
# Document our working solution
check_working_solution()
print("\n๐ Analysis Summary:")
print(f" โข MCPServer analysis: {'โ
Success' if server_success else 'โ Failed'}")
print(f" โข Library analysis: {'โ
Success' if lib_success else 'โ Failed'}")
print(" โข Server implementation: โ
Working with 286 functions")
if __name__ == "__main__":
main()