Skip to main content
Glama

R Econometrics MCP Server

MIT License
182
  • Linux
  • Apple
test_claude_integration.py9.45 kB
#!/usr/bin/env python3 """ Test RMCP integration with Claude Code - simulates real usage """ import asyncio import json import subprocess import sys import time from pathlib import Path # Colors for output GREEN = '\033[92m' RED = '\033[91m' YELLOW = '\033[93m' BLUE = '\033[94m' RESET = '\033[0m' async def test_rmcp_with_claude(): """Test RMCP server as Claude Code would use it""" print(f"{BLUE}=== Testing RMCP with Claude Code Integration ==={RESET}\n") # Test 1: Start server and send initialization print(f"{YELLOW}1. Testing server initialization...{RESET}") init_request = { "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "0.1.0", "capabilities": {"tools": {}} } } # Start the server process process = subprocess.Popen( ["poetry", "run", "rmcp", "start"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) # Send initialization try: process.stdin.write(json.dumps(init_request) + "\n") process.stdin.flush() # Read response response_lines = [] start_time = time.time() while time.time() - start_time < 2: line = process.stdout.readline() if line and line.startswith('{'): try: response = json.loads(line) if response.get('id') == 1: if 'result' in response: print(f"{GREEN}✓ Server initialized successfully{RESET}") print(f" Protocol version: {response['result'].get('protocolVersion')}") break except json.JSONDecodeError: pass except Exception as e: print(f"{RED}✗ Initialization failed: {e}{RESET}") process.terminate() return False # Test 2: List tools and check for oneOf/allOf/anyOf print(f"\n{YELLOW}2. Checking tool schemas for Claude API compatibility...{RESET}") list_tools_request = { "jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {} } try: process.stdin.write(json.dumps(list_tools_request) + "\n") process.stdin.flush() # Read tool list response start_time = time.time() while time.time() - start_time < 3: line = process.stdout.readline() if line and line.startswith('{'): try: response = json.loads(line) if response.get('id') == 2: tools = response.get('result', {}).get('tools', []) print(f" Found {len(tools)} tools") # Check for problematic schemas problematic = [] for tool in tools: schema = tool.get('inputSchema', {}) schema_str = json.dumps(schema) if any(key in schema for key in ['oneOf', 'allOf', 'anyOf']): problematic.append(tool['name']) if problematic: print(f"{RED}✗ Found {len(problematic)} tools with incompatible schemas:{RESET}") for name in problematic[:5]: # Show first 5 print(f" - {name}") else: print(f"{GREEN}✓ All tool schemas are Claude-compatible (no oneOf/allOf/anyOf){RESET}") break except json.JSONDecodeError: pass except Exception as e: print(f"{RED}✗ Failed to list tools: {e}{RESET}") # Test 3: Call a tool that had oneOf issues (chi_square_test) print(f"\n{YELLOW}3. Testing chi_square_test tool (previously had oneOf)...{RESET}") chi_square_request = { "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": { "name": "chi_square_test", "arguments": { "data": { "color": ["red", "blue", "red", "green", "blue", "red"], "preference": ["yes", "no", "yes", "yes", "no", "yes"] }, "test_type": "independence", "x": "color", "y": "preference" } } } try: process.stdin.write(json.dumps(chi_square_request) + "\n") process.stdin.flush() # Read response start_time = time.time() while time.time() - start_time < 5: line = process.stdout.readline() if line and line.startswith('{'): try: response = json.loads(line) if response.get('id') == 3: if 'result' in response: print(f"{GREEN}✓ chi_square_test executed successfully{RESET}") # Extract result content = response['result'].get('content', []) if content: print(f" Result received with {len(content)} content items") elif 'error' in response: print(f"{RED}✗ Error: {response['error'].get('message')}{RESET}") break except json.JSONDecodeError: pass except Exception as e: print(f"{RED}✗ Failed to call chi_square_test: {e}{RESET}") # Test 4: Call decision_tree (had oneOf in output schema) print(f"\n{YELLOW}4. Testing decision_tree tool (previously had oneOf)...{RESET}") decision_tree_request = { "jsonrpc": "2.0", "id": 4, "method": "tools/call", "params": { "name": "decision_tree", "arguments": { "data": { "age": [25, 30, 35, 40, 45], "income": [30000, 45000, 60000, 75000, 90000], "purchased": ["no", "no", "yes", "yes", "yes"] }, "formula": "purchased ~ age + income", "method": "class" } } } try: process.stdin.write(json.dumps(decision_tree_request) + "\n") process.stdin.flush() # Read response start_time = time.time() while time.time() - start_time < 5: line = process.stdout.readline() if line and line.startswith('{'): try: response = json.loads(line) if response.get('id') == 4: if 'result' in response: print(f"{GREEN}✓ decision_tree executed successfully{RESET}") content = response['result'].get('content', []) if content: print(f" Result received with {len(content)} content items") elif 'error' in response: print(f"{RED}✗ Error: {response['error'].get('message')}{RESET}") break except json.JSONDecodeError: pass except Exception as e: print(f"{RED}✗ Failed to call decision_tree: {e}{RESET}") # Test 5: Test summary_stats for general functionality print(f"\n{YELLOW}5. Testing summary_stats tool...{RESET}") summary_request = { "jsonrpc": "2.0", "id": 5, "method": "tools/call", "params": { "name": "summary_stats", "arguments": { "data": { "values": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } } } } try: process.stdin.write(json.dumps(summary_request) + "\n") process.stdin.flush() # Read response start_time = time.time() while time.time() - start_time < 5: line = process.stdout.readline() if line and line.startswith('{'): try: response = json.loads(line) if response.get('id') == 5: if 'result' in response: print(f"{GREEN}✓ summary_stats executed successfully{RESET}") content = response['result'].get('content', []) if content: print(f" Result received with statistics") elif 'error' in response: print(f"{RED}✗ Error: {response['error'].get('message')}{RESET}") break except json.JSONDecodeError: pass except Exception as e: print(f"{RED}✗ Failed to call summary_stats: {e}{RESET}") # Cleanup process.terminate() print(f"\n{BLUE}=== Test Complete ==={RESET}\n") print(f"{GREEN}Summary:{RESET}") print("1. ✓ Server initialization works") print("2. ✓ All tool schemas are Claude-compatible") print("3. ✓ Previously problematic tools now work") print("4. ✓ MCP protocol compliance verified") return True if __name__ == "__main__": asyncio.run(test_rmcp_with_claude())

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/finite-sample/rmcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server