Skip to main content
Glama

OpenAPI to Model Context Protocol (MCP)

#!/usr/bin/env python3 """ Comprehensive test script for the OpenAPI-MCP server. Tests multiple APIs and authentication methods. """ import os import sys import logging # Add src to path sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) import server def test_comprehensive(): """Run comprehensive tests across multiple APIs.""" print("Comprehensive OpenAPI-MCP Server Testing") print("=" * 50) # Set up logging logging.basicConfig(level=logging.ERROR, format='%(levelname)s: %(message)s') test_results = [] # Test 1: Petstore API (Basic functionality) print("\n1. Testing Petstore API (No Authentication)") try: os.environ.clear() os.environ.update({ 'OPENAPI_URL': 'https://petstore3.swagger.io/api/v3/openapi.json', 'SERVER_NAME': 'petstore3' }) config = server.ServerConfig() srv = server.MCPServer(config) srv.initialize() api_tools = srv.register_openapi_tools() srv.register_standard_tools() resources = srv.register_resources() prompts = srv.generate_prompts() # Test a real API call tool_func = srv.registered_tools['petstore3_findPetsByStatus']['function'] result = tool_func(req_id='test', status='available') success = 'result' in result and 'data' in result['result'] test_results.append(('Petstore API', success, f"{api_tools} tools, {resources} resources")) print(f"✓ Petstore: {api_tools} API tools, {len(srv.registered_tools)} total tools") except Exception as e: test_results.append(('Petstore API', False, str(e))) print(f"✗ Petstore failed: {e}") # Test 2: Norwegian Weather API (Real-world example) print("\n2. Testing Norwegian Weather API") try: os.environ.clear() os.environ.update({ 'OPENAPI_URL': 'https://api.met.no/weatherapi/locationforecast/2.0/swagger', 'SERVER_NAME': 'weather' }) config = server.ServerConfig() srv = server.MCPServer(config) srv.initialize() api_tools = srv.register_openapi_tools() srv.register_standard_tools() resources = srv.register_resources() prompts = srv.generate_prompts() # Test weather forecast for Oslo tool_func = srv.registered_tools['weather_get__compact']['function'] result = tool_func(req_id='test', lat=59.9139, lon=10.7522) success = 'result' in result and 'data' in result['result'] if success and 'properties' in result['result']['data']: weather_data = result['result']['data']['properties'] forecast_count = len(weather_data.get('timeseries', [])) test_results.append(('Weather API', True, f"{api_tools} tools, {forecast_count} forecasts")) print(f"✓ Weather: {api_tools} API tools, {forecast_count} forecast periods") else: test_results.append(('Weather API', False, "No weather data")) print("✗ Weather: No data received") except Exception as e: test_results.append(('Weather API', False, str(e))) print(f"✗ Weather failed: {e}") # Test 3: Authentication Configuration (Without real credentials) print("\n3. Testing Authentication Configuration") try: # Test OAuth configuration os.environ.clear() os.environ.update({ 'OPENAPI_URL': 'https://petstore3.swagger.io/api/v3/openapi.json', 'SERVER_NAME': 'petstore_oauth', 'OAUTH_CLIENT_ID': 'test_client', 'OAUTH_CLIENT_SECRET': 'test_secret', 'OAUTH_TOKEN_URL': 'https://example.com/oauth/token' }) config_oauth = server.ServerConfig() srv_oauth = server.MCPServer(config_oauth) oauth_configured = srv_oauth.authenticator.is_configured() # Test username/password configuration os.environ.update({ 'API_USERNAME': 'test_user', 'API_PASSWORD': 'test_pass', 'API_LOGIN_ENDPOINT': 'https://example.com/auth/token' }) config_user = server.ServerConfig() srv_user = server.MCPServer(config_user) user_auth_configured = srv_user.authenticator.is_configured() auth_success = oauth_configured and user_auth_configured test_results.append(('Authentication Config', auth_success, "OAuth & Username/Password")) print(f"✓ Authentication: OAuth={oauth_configured}, Username/Password={user_auth_configured}") except Exception as e: test_results.append(('Authentication Config', False, str(e))) print(f"✗ Authentication failed: {e}") # Test 4: Error Handling and Edge Cases print("\n4. Testing Error Handling") try: # Test with invalid OpenAPI URL os.environ.clear() os.environ.update({ 'OPENAPI_URL': 'https://petstore3.swagger.io/api/v3/openapi.json', 'SERVER_NAME': 'error_test' }) config = server.ServerConfig() srv = server.MCPServer(config) srv.initialize() srv.register_openapi_tools() # Test missing required parameters tool_func = srv.registered_tools['error_test_getPetById']['function'] error_result = tool_func(req_id='test') # Missing required petId has_help = 'result' in error_result and 'help' in error_result['result'] # Test tool not found not_found = srv._tools_call_tool(req_id='test', name='nonexistent_tool') has_error = 'error' in not_found error_success = has_help and has_error test_results.append(('Error Handling', error_success, "Parameter validation & tool not found")) print(f"✓ Error Handling: Parameter validation={has_help}, Tool not found={has_error}") except Exception as e: test_results.append(('Error Handling', False, str(e))) print(f"✗ Error handling failed: {e}") # Summary print("\n" + "=" * 50) print("TEST SUMMARY") print("=" * 50) passed = 0 for test_name, success, details in test_results: status = "✅ PASS" if success else "❌ FAIL" print(f"{status} {test_name}: {details}") if success: passed += 1 print(f"\nResults: {passed}/{len(test_results)} tests passed") if passed == len(test_results): print("\n🎉 All tests passed! OpenAPI-MCP server is working correctly.") print("✅ Multiple API integrations successful") print("✅ Authentication framework operational") print("✅ Error handling robust") print("✅ Real-world API calls working") return True else: print(f"\n⚠️ {len(test_results) - passed} tests failed.") return False if __name__ == "__main__": success = test_comprehensive() sys.exit(0 if success else 1)

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/gujord/OpenAPI-MCP'

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