mcp-proxy-adapter 6.4.14__py3-none-any.whl → 6.4.16__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 +169 -19
- mcp_proxy_adapter/version.py +1 -1
- {mcp_proxy_adapter-6.4.14.dist-info → mcp_proxy_adapter-6.4.16.dist-info}/METADATA +2 -1
- {mcp_proxy_adapter-6.4.14.dist-info → mcp_proxy_adapter-6.4.16.dist-info}/RECORD +8 -8
- {mcp_proxy_adapter-6.4.14.dist-info → mcp_proxy_adapter-6.4.16.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-6.4.14.dist-info → mcp_proxy_adapter-6.4.16.dist-info}/entry_points.txt +0 -0
- {mcp_proxy_adapter-6.4.14.dist-info → mcp_proxy_adapter-6.4.16.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
|
@@ -857,6 +859,25 @@ def setup_test_environment(output_dir: Path) -> None:
|
|
857
859
|
shutil.copy2(cert_tokens_src, output_dir / "scripts/")
|
858
860
|
print("✅ Copied generate_certificates_and_tokens.py")
|
859
861
|
|
862
|
+
# Copy test suite runner
|
863
|
+
test_suite_src = examples_src_root / "run_full_test_suite.py"
|
864
|
+
if test_suite_src.exists():
|
865
|
+
shutil.copy2(test_suite_src, output_dir)
|
866
|
+
print("✅ Copied run_full_test_suite.py")
|
867
|
+
|
868
|
+
# Copy other required test files
|
869
|
+
test_files = [
|
870
|
+
"create_test_configs.py",
|
871
|
+
"comprehensive_config.json",
|
872
|
+
"run_security_tests.py",
|
873
|
+
"run_proxy_server.py"
|
874
|
+
]
|
875
|
+
for test_file in test_files:
|
876
|
+
test_file_src = examples_src_root / test_file
|
877
|
+
if test_file_src.exists():
|
878
|
+
shutil.copy2(test_file_src, output_dir)
|
879
|
+
print(f"✅ Copied {test_file}")
|
880
|
+
|
860
881
|
# Copy roles.json to the root directory for compatibility
|
861
882
|
roles_src = examples_src_root / "roles.json"
|
862
883
|
if roles_src.exists():
|
@@ -1023,27 +1044,139 @@ def generate_certificates_with_framework(output_dir: Path) -> bool:
|
|
1023
1044
|
return False
|
1024
1045
|
|
1025
1046
|
|
1047
|
+
def run_full_test_suite(target_root: Path) -> bool:
|
1048
|
+
"""Run the full test suite after environment setup."""
|
1049
|
+
print("\n" + "=" * 60)
|
1050
|
+
print("🚀 AUTOMATICALLY RUNNING FULL TEST SUITE")
|
1051
|
+
print("=" * 60)
|
1052
|
+
|
1053
|
+
try:
|
1054
|
+
# Change to target directory
|
1055
|
+
original_cwd = Path.cwd()
|
1056
|
+
os.chdir(target_root)
|
1057
|
+
|
1058
|
+
# Run the full test suite
|
1059
|
+
result = subprocess.run([
|
1060
|
+
sys.executable, "run_full_test_suite.py"
|
1061
|
+
], capture_output=True, text=True, timeout=300) # 5 minute timeout
|
1062
|
+
|
1063
|
+
# Print output
|
1064
|
+
if result.stdout:
|
1065
|
+
print("📋 Test Suite Output:")
|
1066
|
+
print(result.stdout)
|
1067
|
+
|
1068
|
+
if result.stderr:
|
1069
|
+
print("⚠️ Test Suite Warnings/Errors:")
|
1070
|
+
print(result.stderr)
|
1071
|
+
|
1072
|
+
if result.returncode == 0:
|
1073
|
+
print("🎉 FULL TEST SUITE COMPLETED SUCCESSFULLY!")
|
1074
|
+
return True
|
1075
|
+
else:
|
1076
|
+
print(f"❌ FULL TEST SUITE FAILED (exit code: {result.returncode})")
|
1077
|
+
return False
|
1078
|
+
|
1079
|
+
except subprocess.TimeoutExpired:
|
1080
|
+
print("⏰ Test suite timed out after 5 minutes")
|
1081
|
+
return False
|
1082
|
+
except Exception as e:
|
1083
|
+
print(f"❌ Error running test suite: {e}")
|
1084
|
+
return False
|
1085
|
+
finally:
|
1086
|
+
# Restore original working directory
|
1087
|
+
os.chdir(original_cwd)
|
1088
|
+
|
1089
|
+
|
1090
|
+
def validate_output_directory(output_dir: Path) -> bool:
|
1091
|
+
"""
|
1092
|
+
Validate output directory for test environment setup.
|
1093
|
+
|
1094
|
+
Args:
|
1095
|
+
output_dir: Path to the target directory
|
1096
|
+
|
1097
|
+
Returns:
|
1098
|
+
True if directory is valid for setup, False otherwise
|
1099
|
+
"""
|
1100
|
+
output_dir = output_dir.resolve()
|
1101
|
+
|
1102
|
+
# Check if directory exists
|
1103
|
+
if output_dir.exists():
|
1104
|
+
if not output_dir.is_dir():
|
1105
|
+
print(f"❌ Path exists but is not a directory: {output_dir}")
|
1106
|
+
return False
|
1107
|
+
|
1108
|
+
# Check if directory is empty
|
1109
|
+
try:
|
1110
|
+
contents = list(output_dir.iterdir())
|
1111
|
+
if contents:
|
1112
|
+
print(f"❌ Directory is not empty: {output_dir}")
|
1113
|
+
print(f" Found {len(contents)} items:")
|
1114
|
+
for item in contents[:5]: # Show first 5 items
|
1115
|
+
print(f" - {item.name}")
|
1116
|
+
if len(contents) > 5:
|
1117
|
+
print(f" ... and {len(contents) - 5} more items")
|
1118
|
+
print("\n💡 Please use an empty directory or specify a different path.")
|
1119
|
+
return False
|
1120
|
+
except PermissionError:
|
1121
|
+
print(f"❌ Permission denied accessing directory: {output_dir}")
|
1122
|
+
return False
|
1123
|
+
else:
|
1124
|
+
# Directory doesn't exist, try to create it
|
1125
|
+
try:
|
1126
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
1127
|
+
print(f"✅ Created directory: {output_dir}")
|
1128
|
+
except PermissionError:
|
1129
|
+
print(f"❌ Permission denied creating directory: {output_dir}")
|
1130
|
+
return False
|
1131
|
+
except Exception as e:
|
1132
|
+
print(f"❌ Failed to create directory {output_dir}: {e}")
|
1133
|
+
return False
|
1134
|
+
|
1135
|
+
return True
|
1136
|
+
|
1137
|
+
|
1026
1138
|
def main() -> int:
|
1027
1139
|
"""Main function for command line execution."""
|
1028
1140
|
parser = argparse.ArgumentParser(
|
1029
|
-
description="Setup enhanced test environment for MCP Proxy Adapter"
|
1141
|
+
description="Setup enhanced test environment for MCP Proxy Adapter and run full test suite"
|
1030
1142
|
)
|
1031
1143
|
parser.add_argument(
|
1032
|
-
"
|
1033
|
-
"
|
1144
|
+
"output_dir",
|
1145
|
+
nargs="?",
|
1034
1146
|
type=str,
|
1035
|
-
default=
|
1147
|
+
default=None,
|
1036
1148
|
help=(
|
1037
1149
|
"Target directory to create the test environment "
|
1038
|
-
"(default:
|
1150
|
+
"(default: auto-generated directory in /tmp)"
|
1039
1151
|
),
|
1040
1152
|
)
|
1041
1153
|
parser.add_argument(
|
1042
1154
|
"--skip-certs", action="store_true", help="Skip certificate generation"
|
1043
1155
|
)
|
1156
|
+
parser.add_argument(
|
1157
|
+
"--skip-tests", action="store_true", help="Skip running the full test suite"
|
1158
|
+
)
|
1044
1159
|
args = parser.parse_args()
|
1160
|
+
|
1045
1161
|
try:
|
1046
|
-
|
1162
|
+
# Determine target directory
|
1163
|
+
if args.output_dir is None:
|
1164
|
+
# Create auto-generated directory in /tmp
|
1165
|
+
import tempfile
|
1166
|
+
import time
|
1167
|
+
timestamp = int(time.time())
|
1168
|
+
target_root = Path(tempfile.gettempdir()) / f"mcp_test_env_{timestamp}"
|
1169
|
+
print(f"🔧 Auto-generating test environment directory: {target_root}")
|
1170
|
+
else:
|
1171
|
+
target_root = Path(args.output_dir)
|
1172
|
+
|
1173
|
+
# Validate output directory
|
1174
|
+
print(f"🔍 Validating output directory: {target_root}")
|
1175
|
+
if not validate_output_directory(target_root):
|
1176
|
+
print("\n❌ Directory validation failed. Exiting.")
|
1177
|
+
return 1
|
1178
|
+
|
1179
|
+
print(f"✅ Directory validation passed: {target_root}")
|
1047
1180
|
setup_test_environment(target_root)
|
1048
1181
|
|
1049
1182
|
# Generate certificates if framework is available and not skipped
|
@@ -1056,6 +1189,16 @@ def main() -> int:
|
|
1056
1189
|
"⚠️ Skipping certificate generation (mcp_security_framework "
|
1057
1190
|
"not available)"
|
1058
1191
|
)
|
1192
|
+
|
1193
|
+
# Run full test suite if not skipped
|
1194
|
+
if not args.skip_tests:
|
1195
|
+
test_success = run_full_test_suite(target_root)
|
1196
|
+
if not test_success:
|
1197
|
+
print("\n❌ TEST SUITE FAILED - Check the output above for details")
|
1198
|
+
return 1
|
1199
|
+
else:
|
1200
|
+
print("⚠️ Skipping test suite execution (--skip-tests specified)")
|
1201
|
+
|
1059
1202
|
except Exception as e:
|
1060
1203
|
print(
|
1061
1204
|
"❌ Error setting up test environment: {}".format(e),
|
@@ -1070,19 +1213,26 @@ def main() -> int:
|
|
1070
1213
|
print("\n" + "=" * 60)
|
1071
1214
|
print("✅ ENHANCED TEST ENVIRONMENT SETUP COMPLETED SUCCESSFULLY")
|
1072
1215
|
print("=" * 60)
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1079
|
-
|
1080
|
-
|
1081
|
-
|
1082
|
-
|
1083
|
-
|
1084
|
-
|
1085
|
-
|
1216
|
+
|
1217
|
+
if not args.skip_tests:
|
1218
|
+
print("\n🎉 ALL TESTS PASSED - Environment is ready for use!")
|
1219
|
+
else:
|
1220
|
+
print("\n📋 NEXT STEPS:")
|
1221
|
+
print("1. Review configuration documentation:")
|
1222
|
+
print(" cat docs/CONFIGURATION_GUIDE.md")
|
1223
|
+
print("\n2. Check available configurations:")
|
1224
|
+
print(" ls -la configs/")
|
1225
|
+
print("\n3. Run the full test suite:")
|
1226
|
+
print(" python run_full_test_suite.py")
|
1227
|
+
print("\n4. Test proxy registration SSL fix:")
|
1228
|
+
print(" python test_proxy_registration.py")
|
1229
|
+
print("\n5. Start server with a specific configuration:")
|
1230
|
+
print(" python -m mcp_proxy_adapter --config configs/production_https.json")
|
1231
|
+
print("\n6. Run security tests:")
|
1232
|
+
print(" python -m mcp_proxy_adapter.examples.run_security_tests")
|
1233
|
+
print("\n7. Generate additional certificates (if needed):")
|
1234
|
+
print(" python scripts/create_certificates_simple.py")
|
1235
|
+
|
1086
1236
|
print("=" * 60)
|
1087
1237
|
return 0
|
1088
1238
|
|
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.16
|
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=vD9qI2RVyJ-rCEyme_nJwJxue9fPjPL_XXaDuAWbOHw,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=OsK9qSKlyB4D8uY4Vl3k6wfo93Igb0LsNBcHX4tBxeo,39887
|
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.16.dist-info/METADATA,sha256=wpKtvKnsOk8oVcoXTDrCJldDavlrRHcZHlgp7Yuecuk,6125
|
125
|
+
mcp_proxy_adapter-6.4.16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
126
|
+
mcp_proxy_adapter-6.4.16.dist-info/entry_points.txt,sha256=J3eV6ID0lt_VSp4lIdIgBFTqLCThgObNNxRCbyfiMHw,70
|
127
|
+
mcp_proxy_adapter-6.4.16.dist-info/top_level.txt,sha256=JZT7vPLBYrtroX-ij68JBhJYbjDdghcV-DFySRy-Nnw,18
|
128
|
+
mcp_proxy_adapter-6.4.16.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|