mcp-proxy-adapter 6.4.14__py3-none-any.whl → 6.4.15__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mcp_proxy_adapter/examples/run_full_test_suite.py +0 -4
- mcp_proxy_adapter/examples/setup_test_environment.py +150 -19
- mcp_proxy_adapter/version.py +1 -1
- {mcp_proxy_adapter-6.4.14.dist-info → mcp_proxy_adapter-6.4.15.dist-info}/METADATA +2 -1
- {mcp_proxy_adapter-6.4.14.dist-info → mcp_proxy_adapter-6.4.15.dist-info}/RECORD +8 -8
- {mcp_proxy_adapter-6.4.14.dist-info → mcp_proxy_adapter-6.4.15.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-6.4.14.dist-info → mcp_proxy_adapter-6.4.15.dist-info}/entry_points.txt +0 -0
- {mcp_proxy_adapter-6.4.14.dist-info → mcp_proxy_adapter-6.4.15.dist-info}/top_level.txt +0 -0
@@ -436,10 +436,6 @@ class FullTestSuiteRunner:
|
|
436
436
|
print(f"Python executable: {sys.executable}")
|
437
437
|
|
438
438
|
try:
|
439
|
-
# Step 0: Clean up existing directories
|
440
|
-
if not self.cleanup_directories():
|
441
|
-
return False
|
442
|
-
|
443
439
|
# Step 1: Environment validation
|
444
440
|
if not self.check_environment():
|
445
441
|
return False
|
@@ -18,7 +18,9 @@ Features:
|
|
18
18
|
- Protocol-aware configuration generation
|
19
19
|
- Enhanced error handling and troubleshooting
|
20
20
|
"""
|
21
|
+
import os
|
21
22
|
import shutil
|
23
|
+
import subprocess
|
22
24
|
import sys
|
23
25
|
import argparse
|
24
26
|
import json
|
@@ -1023,27 +1025,139 @@ def generate_certificates_with_framework(output_dir: Path) -> bool:
|
|
1023
1025
|
return False
|
1024
1026
|
|
1025
1027
|
|
1028
|
+
def run_full_test_suite(target_root: Path) -> bool:
|
1029
|
+
"""Run the full test suite after environment setup."""
|
1030
|
+
print("\n" + "=" * 60)
|
1031
|
+
print("🚀 AUTOMATICALLY RUNNING FULL TEST SUITE")
|
1032
|
+
print("=" * 60)
|
1033
|
+
|
1034
|
+
try:
|
1035
|
+
# Change to target directory
|
1036
|
+
original_cwd = Path.cwd()
|
1037
|
+
os.chdir(target_root)
|
1038
|
+
|
1039
|
+
# Run the full test suite
|
1040
|
+
result = subprocess.run([
|
1041
|
+
sys.executable, "run_full_test_suite.py"
|
1042
|
+
], capture_output=True, text=True, timeout=300) # 5 minute timeout
|
1043
|
+
|
1044
|
+
# Print output
|
1045
|
+
if result.stdout:
|
1046
|
+
print("📋 Test Suite Output:")
|
1047
|
+
print(result.stdout)
|
1048
|
+
|
1049
|
+
if result.stderr:
|
1050
|
+
print("⚠️ Test Suite Warnings/Errors:")
|
1051
|
+
print(result.stderr)
|
1052
|
+
|
1053
|
+
if result.returncode == 0:
|
1054
|
+
print("🎉 FULL TEST SUITE COMPLETED SUCCESSFULLY!")
|
1055
|
+
return True
|
1056
|
+
else:
|
1057
|
+
print(f"❌ FULL TEST SUITE FAILED (exit code: {result.returncode})")
|
1058
|
+
return False
|
1059
|
+
|
1060
|
+
except subprocess.TimeoutExpired:
|
1061
|
+
print("⏰ Test suite timed out after 5 minutes")
|
1062
|
+
return False
|
1063
|
+
except Exception as e:
|
1064
|
+
print(f"❌ Error running test suite: {e}")
|
1065
|
+
return False
|
1066
|
+
finally:
|
1067
|
+
# Restore original working directory
|
1068
|
+
os.chdir(original_cwd)
|
1069
|
+
|
1070
|
+
|
1071
|
+
def validate_output_directory(output_dir: Path) -> bool:
|
1072
|
+
"""
|
1073
|
+
Validate output directory for test environment setup.
|
1074
|
+
|
1075
|
+
Args:
|
1076
|
+
output_dir: Path to the target directory
|
1077
|
+
|
1078
|
+
Returns:
|
1079
|
+
True if directory is valid for setup, False otherwise
|
1080
|
+
"""
|
1081
|
+
output_dir = output_dir.resolve()
|
1082
|
+
|
1083
|
+
# Check if directory exists
|
1084
|
+
if output_dir.exists():
|
1085
|
+
if not output_dir.is_dir():
|
1086
|
+
print(f"❌ Path exists but is not a directory: {output_dir}")
|
1087
|
+
return False
|
1088
|
+
|
1089
|
+
# Check if directory is empty
|
1090
|
+
try:
|
1091
|
+
contents = list(output_dir.iterdir())
|
1092
|
+
if contents:
|
1093
|
+
print(f"❌ Directory is not empty: {output_dir}")
|
1094
|
+
print(f" Found {len(contents)} items:")
|
1095
|
+
for item in contents[:5]: # Show first 5 items
|
1096
|
+
print(f" - {item.name}")
|
1097
|
+
if len(contents) > 5:
|
1098
|
+
print(f" ... and {len(contents) - 5} more items")
|
1099
|
+
print("\n💡 Please use an empty directory or specify a different path.")
|
1100
|
+
return False
|
1101
|
+
except PermissionError:
|
1102
|
+
print(f"❌ Permission denied accessing directory: {output_dir}")
|
1103
|
+
return False
|
1104
|
+
else:
|
1105
|
+
# Directory doesn't exist, try to create it
|
1106
|
+
try:
|
1107
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
1108
|
+
print(f"✅ Created directory: {output_dir}")
|
1109
|
+
except PermissionError:
|
1110
|
+
print(f"❌ Permission denied creating directory: {output_dir}")
|
1111
|
+
return False
|
1112
|
+
except Exception as e:
|
1113
|
+
print(f"❌ Failed to create directory {output_dir}: {e}")
|
1114
|
+
return False
|
1115
|
+
|
1116
|
+
return True
|
1117
|
+
|
1118
|
+
|
1026
1119
|
def main() -> int:
|
1027
1120
|
"""Main function for command line execution."""
|
1028
1121
|
parser = argparse.ArgumentParser(
|
1029
|
-
description="Setup enhanced test environment for MCP Proxy Adapter"
|
1122
|
+
description="Setup enhanced test environment for MCP Proxy Adapter and run full test suite"
|
1030
1123
|
)
|
1031
1124
|
parser.add_argument(
|
1032
|
-
"
|
1033
|
-
"
|
1125
|
+
"output_dir",
|
1126
|
+
nargs="?",
|
1034
1127
|
type=str,
|
1035
|
-
default=
|
1128
|
+
default=None,
|
1036
1129
|
help=(
|
1037
1130
|
"Target directory to create the test environment "
|
1038
|
-
"(default:
|
1131
|
+
"(default: auto-generated directory in /tmp)"
|
1039
1132
|
),
|
1040
1133
|
)
|
1041
1134
|
parser.add_argument(
|
1042
1135
|
"--skip-certs", action="store_true", help="Skip certificate generation"
|
1043
1136
|
)
|
1137
|
+
parser.add_argument(
|
1138
|
+
"--skip-tests", action="store_true", help="Skip running the full test suite"
|
1139
|
+
)
|
1044
1140
|
args = parser.parse_args()
|
1141
|
+
|
1045
1142
|
try:
|
1046
|
-
|
1143
|
+
# Determine target directory
|
1144
|
+
if args.output_dir is None:
|
1145
|
+
# Create auto-generated directory in /tmp
|
1146
|
+
import tempfile
|
1147
|
+
import time
|
1148
|
+
timestamp = int(time.time())
|
1149
|
+
target_root = Path(tempfile.gettempdir()) / f"mcp_test_env_{timestamp}"
|
1150
|
+
print(f"🔧 Auto-generating test environment directory: {target_root}")
|
1151
|
+
else:
|
1152
|
+
target_root = Path(args.output_dir)
|
1153
|
+
|
1154
|
+
# Validate output directory
|
1155
|
+
print(f"🔍 Validating output directory: {target_root}")
|
1156
|
+
if not validate_output_directory(target_root):
|
1157
|
+
print("\n❌ Directory validation failed. Exiting.")
|
1158
|
+
return 1
|
1159
|
+
|
1160
|
+
print(f"✅ Directory validation passed: {target_root}")
|
1047
1161
|
setup_test_environment(target_root)
|
1048
1162
|
|
1049
1163
|
# Generate certificates if framework is available and not skipped
|
@@ -1056,6 +1170,16 @@ def main() -> int:
|
|
1056
1170
|
"⚠️ Skipping certificate generation (mcp_security_framework "
|
1057
1171
|
"not available)"
|
1058
1172
|
)
|
1173
|
+
|
1174
|
+
# Run full test suite if not skipped
|
1175
|
+
if not args.skip_tests:
|
1176
|
+
test_success = run_full_test_suite(target_root)
|
1177
|
+
if not test_success:
|
1178
|
+
print("\n❌ TEST SUITE FAILED - Check the output above for details")
|
1179
|
+
return 1
|
1180
|
+
else:
|
1181
|
+
print("⚠️ Skipping test suite execution (--skip-tests specified)")
|
1182
|
+
|
1059
1183
|
except Exception as e:
|
1060
1184
|
print(
|
1061
1185
|
"❌ Error setting up test environment: {}".format(e),
|
@@ -1070,19 +1194,26 @@ def main() -> int:
|
|
1070
1194
|
print("\n" + "=" * 60)
|
1071
1195
|
print("✅ ENHANCED TEST ENVIRONMENT SETUP COMPLETED SUCCESSFULLY")
|
1072
1196
|
print("=" * 60)
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1079
|
-
|
1080
|
-
|
1081
|
-
|
1082
|
-
|
1083
|
-
|
1084
|
-
|
1085
|
-
|
1197
|
+
|
1198
|
+
if not args.skip_tests:
|
1199
|
+
print("\n🎉 ALL TESTS PASSED - Environment is ready for use!")
|
1200
|
+
else:
|
1201
|
+
print("\n📋 NEXT STEPS:")
|
1202
|
+
print("1. Review configuration documentation:")
|
1203
|
+
print(" cat docs/CONFIGURATION_GUIDE.md")
|
1204
|
+
print("\n2. Check available configurations:")
|
1205
|
+
print(" ls -la configs/")
|
1206
|
+
print("\n3. Run the full test suite:")
|
1207
|
+
print(" python run_full_test_suite.py")
|
1208
|
+
print("\n4. Test proxy registration SSL fix:")
|
1209
|
+
print(" python test_proxy_registration.py")
|
1210
|
+
print("\n5. Start server with a specific configuration:")
|
1211
|
+
print(" python -m mcp_proxy_adapter --config configs/production_https.json")
|
1212
|
+
print("\n6. Run security tests:")
|
1213
|
+
print(" python -m mcp_proxy_adapter.examples.run_security_tests")
|
1214
|
+
print("\n7. Generate additional certificates (if needed):")
|
1215
|
+
print(" python scripts/create_certificates_simple.py")
|
1216
|
+
|
1086
1217
|
print("=" * 60)
|
1087
1218
|
return 0
|
1088
1219
|
|
mcp_proxy_adapter/version.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: mcp-proxy-adapter
|
3
|
-
Version: 6.4.
|
3
|
+
Version: 6.4.15
|
4
4
|
Summary: Powerful JSON-RPC microservices framework with built-in security, authentication, and proxy registration
|
5
5
|
Home-page: https://github.com/maverikod/mcp-proxy-adapter
|
6
6
|
Author: Vasiliy Zdanovskiy
|
@@ -31,6 +31,7 @@ Description-Content-Type: text/markdown
|
|
31
31
|
Requires-Dist: fastapi<1.0.0,>=0.95.0
|
32
32
|
Requires-Dist: pydantic>=2.0.0
|
33
33
|
Requires-Dist: hypercorn<1.0.0,>=0.15.0
|
34
|
+
Requires-Dist: uvicorn<1.0.0,>=0.15.0
|
34
35
|
Requires-Dist: docstring-parser<1.0.0,>=0.15
|
35
36
|
Requires-Dist: typing-extensions<5.0.0,>=4.5.0
|
36
37
|
Requires-Dist: jsonrpc>=1.2.0
|
@@ -4,7 +4,7 @@ mcp_proxy_adapter/config.py,sha256=-7iVS0mUWWKNeao7nqTAFlUD6FcMwRlDkchN7OwYsr0,2
|
|
4
4
|
mcp_proxy_adapter/custom_openapi.py,sha256=yLle4CntYK9wpivgn9NflZyJhy-YNrmWjJzt0ai5nP0,14672
|
5
5
|
mcp_proxy_adapter/main.py,sha256=idp3KUR7CT7kTXLVPvvclJlNnt8d_HYl8_jY98uknmo,4677
|
6
6
|
mcp_proxy_adapter/openapi.py,sha256=2UZOI09ZDRJuBYBjKbMyb2U4uASszoCMD5o_4ktRpvg,13480
|
7
|
-
mcp_proxy_adapter/version.py,sha256=
|
7
|
+
mcp_proxy_adapter/version.py,sha256=jFw6lUL1VNuJJK-Vfao7X6pxlEIpynWMf3UdHycqad4,75
|
8
8
|
mcp_proxy_adapter/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
9
|
mcp_proxy_adapter/api/app.py,sha256=UQ7_m-LbUzKuuPJPxS_69ahANUQ5rnPwoddQ2MMXNkg,33941
|
10
10
|
mcp_proxy_adapter/api/handlers.py,sha256=iyFGoEuUS1wxbV1ELA0zmaxIyQR7j4zw-4MrD-uIO6E,8294
|
@@ -94,12 +94,12 @@ mcp_proxy_adapter/examples/generate_certificates_and_tokens.py,sha256=hUCoJH3fy5
|
|
94
94
|
mcp_proxy_adapter/examples/generate_test_configs.py,sha256=FWg_QFJAWinI1lw05RccX4_VbhsCBEKPpZA6I9v6KAs,14379
|
95
95
|
mcp_proxy_adapter/examples/proxy_registration_example.py,sha256=vemRhftnjbiOBCJkmtDGqlWQ8syTG0a8755GCOnaQsg,12503
|
96
96
|
mcp_proxy_adapter/examples/run_example.py,sha256=yp-a6HIrSk3ddQmbn0KkuKwErId0aNfj028TE6U-zmY,2626
|
97
|
-
mcp_proxy_adapter/examples/run_full_test_suite.py,sha256=
|
97
|
+
mcp_proxy_adapter/examples/run_full_test_suite.py,sha256=uOXKzQKVP6d9VxnWaDNo-KY9VBkLWCmA1EZHchWOJ1c,19806
|
98
98
|
mcp_proxy_adapter/examples/run_proxy_server.py,sha256=SBLSSY2F_VEBQD3MsCE_Pa9xFE6Sszr3vHdE9QOEN4Y,5242
|
99
99
|
mcp_proxy_adapter/examples/run_security_tests.py,sha256=0vjaUdWC-rLyviQuNxM3PtfiU9TzSRuxGxWMehrFA_w,23311
|
100
100
|
mcp_proxy_adapter/examples/run_security_tests_fixed.py,sha256=2BKMT0_-FhmcZA73hdQOt2XR7Cgb9Sq8qBI88BkwAAA,10934
|
101
101
|
mcp_proxy_adapter/examples/security_test_client.py,sha256=K5gEVat1SJS2pBVxqLl5c9-uiiG12k8UT3ULQDXZ2Uc,35713
|
102
|
-
mcp_proxy_adapter/examples/setup_test_environment.py,sha256=
|
102
|
+
mcp_proxy_adapter/examples/setup_test_environment.py,sha256=bi8fNsL95H0YdaxZqVGLdl_cYNRNvrZ93a4QruFIqMc,39243
|
103
103
|
mcp_proxy_adapter/examples/test_config.py,sha256=ekEoUZe9q484vU_0IxOVhQdNMVJXG3IpmQpP--VmuDI,6491
|
104
104
|
mcp_proxy_adapter/examples/test_config_generator.py,sha256=PBXk1V_awJ-iBlbE66Pme5sQwu6CJDxkmqgm8uPtM58,4091
|
105
105
|
mcp_proxy_adapter/examples/test_examples.py,sha256=CYlVatdHUVC_rwv4NsvxFG3GXiKIyxPDUH43BOJHjrU,12330
|
@@ -121,8 +121,8 @@ mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py,sha25
|
|
121
121
|
mcp_proxy_adapter/examples/scripts/config_generator.py,sha256=SKFlRRCE_pEHGbfjDuzfKpvV2DMwG6lRfK90uJwRlJM,33410
|
122
122
|
mcp_proxy_adapter/examples/scripts/create_certificates_simple.py,sha256=yCWdUIhMSDPwoPhuLR9rhPdf7jLN5hCjzNfYYgVyHnw,27769
|
123
123
|
mcp_proxy_adapter/examples/scripts/generate_certificates_and_tokens.py,sha256=hUCoJH3fy5WeR_YMHj-_W0mR0ZKUWqewH4FVN3yWyrM,17972
|
124
|
-
mcp_proxy_adapter-6.4.
|
125
|
-
mcp_proxy_adapter-6.4.
|
126
|
-
mcp_proxy_adapter-6.4.
|
127
|
-
mcp_proxy_adapter-6.4.
|
128
|
-
mcp_proxy_adapter-6.4.
|
124
|
+
mcp_proxy_adapter-6.4.15.dist-info/METADATA,sha256=41hiHJgKlGSGHD75fAeEgBsEPjml3vrbCy1jM3Q2U4A,6125
|
125
|
+
mcp_proxy_adapter-6.4.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
126
|
+
mcp_proxy_adapter-6.4.15.dist-info/entry_points.txt,sha256=J3eV6ID0lt_VSp4lIdIgBFTqLCThgObNNxRCbyfiMHw,70
|
127
|
+
mcp_proxy_adapter-6.4.15.dist-info/top_level.txt,sha256=JZT7vPLBYrtroX-ij68JBhJYbjDdghcV-DFySRy-Nnw,18
|
128
|
+
mcp_proxy_adapter-6.4.15.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|