mcp-proxy-adapter 6.4.10__py3-none-any.whl → 6.4.12__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/basic_framework/main.py +3 -2
- mcp_proxy_adapter/examples/create_test_configs.py +301 -0
- mcp_proxy_adapter/examples/run_full_test_suite.py +180 -20
- mcp_proxy_adapter/version.py +1 -1
- mcp_proxy_adapter-6.4.12.dist-info/METADATA +156 -0
- {mcp_proxy_adapter-6.4.10.dist-info → mcp_proxy_adapter-6.4.12.dist-info}/RECORD +9 -16
- mcp_proxy_adapter-6.4.12.dist-info/top_level.txt +1 -0
- mcp_proxy_adapter/examples/basic_framework/roles.json +0 -21
- mcp_proxy_adapter/examples/full_application/roles.json +0 -21
- mcp_proxy_adapter/examples/generate_comprehensive_config.py +0 -177
- mcp_proxy_adapter/examples/test_mcp_adapter.py +0 -207
- mcp_proxy_adapter/schemas/base_schema.json +0 -114
- mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
- mcp_proxy_adapter/utils/config_generator.py +0 -1167
- mcp_proxy_adapter-6.4.10.dist-info/METADATA +0 -680
- mcp_proxy_adapter-6.4.10.dist-info/top_level.txt +0 -2
- mcp_proxy_adapter_issue_package/demonstrate_issue.py +0 -208
- {mcp_proxy_adapter-6.4.10.dist-info → mcp_proxy_adapter-6.4.12.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-6.4.10.dist-info → mcp_proxy_adapter-6.4.12.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,156 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: mcp-proxy-adapter
|
3
|
+
Version: 6.4.12
|
4
|
+
Summary: Powerful JSON-RPC microservices framework with built-in security, authentication, and proxy registration
|
5
|
+
Home-page: https://github.com/maverikod/mcp-proxy-adapter
|
6
|
+
Author: Vasiliy Zdanovskiy
|
7
|
+
Author-email: Vasiliy Zdanovskiy <vasilyvz@gmail.com>
|
8
|
+
Maintainer: Vasiliy Zdanovskiy
|
9
|
+
Maintainer-email: Vasiliy Zdanovskiy <vasilyvz@gmail.com>
|
10
|
+
License: MIT
|
11
|
+
Project-URL: Homepage, https://github.com/maverikod/mcp-proxy-adapter
|
12
|
+
Project-URL: Documentation, https://github.com/maverikod/mcp-proxy-adapter#readme
|
13
|
+
Project-URL: Source, https://github.com/maverikod/mcp-proxy-adapter
|
14
|
+
Project-URL: Tracker, https://github.com/maverikod/mcp-proxy-adapter/issues
|
15
|
+
Project-URL: PyPI, https://pypi.org/project/mcp-proxy-adapter/
|
16
|
+
Keywords: json-rpc,microservices,fastapi,security,authentication,authorization,proxy,mcp,mtls,ssl,rest,api
|
17
|
+
Classifier: Development Status :: 4 - Beta
|
18
|
+
Classifier: Intended Audience :: Developers
|
19
|
+
Classifier: Operating System :: OS Independent
|
20
|
+
Classifier: Programming Language :: Python :: 3
|
21
|
+
Classifier: Programming Language :: Python :: 3.9
|
22
|
+
Classifier: Programming Language :: Python :: 3.10
|
23
|
+
Classifier: Programming Language :: Python :: 3.11
|
24
|
+
Classifier: Programming Language :: Python :: 3.12
|
25
|
+
Classifier: Framework :: FastAPI
|
26
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
|
27
|
+
Classifier: Topic :: Security
|
28
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
29
|
+
Requires-Python: >=3.9
|
30
|
+
Description-Content-Type: text/markdown
|
31
|
+
Requires-Dist: fastapi<1.0.0,>=0.95.0
|
32
|
+
Requires-Dist: pydantic>=2.0.0
|
33
|
+
Requires-Dist: hypercorn<1.0.0,>=0.15.0
|
34
|
+
Requires-Dist: docstring-parser<1.0.0,>=0.15
|
35
|
+
Requires-Dist: typing-extensions<5.0.0,>=4.5.0
|
36
|
+
Requires-Dist: jsonrpc>=1.2.0
|
37
|
+
Requires-Dist: psutil>=5.9.0
|
38
|
+
Requires-Dist: mcp_security_framework>=1.1.2
|
39
|
+
Requires-Dist: packaging>=20.0
|
40
|
+
Requires-Dist: aiohttp<4.0.0,>=3.8.0
|
41
|
+
Requires-Dist: requests<3.0.0,>=2.28.0
|
42
|
+
Provides-Extra: dev
|
43
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
44
|
+
Requires-Dist: pytest-asyncio>=0.20.0; extra == "dev"
|
45
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
46
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
47
|
+
Requires-Dist: isort>=5.12.0; extra == "dev"
|
48
|
+
Provides-Extra: test
|
49
|
+
Requires-Dist: pytest>=7.0.0; extra == "test"
|
50
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
|
51
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "test"
|
52
|
+
Requires-Dist: httpx>=0.24.0; extra == "test"
|
53
|
+
Requires-Dist: pytest-mock>=3.10.0; extra == "test"
|
54
|
+
Provides-Extra: examples
|
55
|
+
Dynamic: author
|
56
|
+
Dynamic: home-page
|
57
|
+
Dynamic: maintainer
|
58
|
+
Dynamic: requires-python
|
59
|
+
|
60
|
+
# MCP Proxy Adapter
|
61
|
+
|
62
|
+
**Author:** Vasiliy Zdanovskiy
|
63
|
+
**Email:** vasilyvz@gmail.com
|
64
|
+
|
65
|
+
## Overview
|
66
|
+
|
67
|
+
MCP Proxy Adapter is a comprehensive framework for building JSON-RPC API servers with built-in security, SSL/TLS support, and proxy registration capabilities. It provides a unified interface for command execution, protocol management, and security enforcement.
|
68
|
+
|
69
|
+
## Features
|
70
|
+
|
71
|
+
- **JSON-RPC API**: Full JSON-RPC 2.0 support with built-in commands
|
72
|
+
- **Security Framework**: Integrated authentication, authorization, and SSL/TLS
|
73
|
+
- **Protocol Management**: HTTP, HTTPS, and mTLS protocol support
|
74
|
+
- **Proxy Registration**: Automatic registration with proxy servers
|
75
|
+
- **Command System**: Extensible command registry with built-in commands
|
76
|
+
- **Configuration Management**: Comprehensive configuration with environment variable overrides
|
77
|
+
|
78
|
+
## Quick Start
|
79
|
+
|
80
|
+
1. **Installation**:
|
81
|
+
```bash
|
82
|
+
pip install mcp-proxy-adapter
|
83
|
+
```
|
84
|
+
|
85
|
+
2. **Basic Configuration**:
|
86
|
+
```bash
|
87
|
+
# Use the comprehensive config with all options disabled by default
|
88
|
+
python -m mcp_proxy_adapter --config config.json
|
89
|
+
```
|
90
|
+
|
91
|
+
3. **Access the API**:
|
92
|
+
- Health check: `GET http://localhost:8000/health`
|
93
|
+
- JSON-RPC: `POST http://localhost:8000/api/jsonrpc`
|
94
|
+
- REST API: `POST http://localhost:8000/cmd`
|
95
|
+
- Documentation: `http://localhost:8000/docs`
|
96
|
+
|
97
|
+
## Configuration
|
98
|
+
|
99
|
+
The adapter uses a comprehensive JSON configuration file (`config.json`) that includes all available options with sensible defaults. All features are disabled by default and can be enabled as needed:
|
100
|
+
|
101
|
+
- **Server settings**: Host, port, debug mode
|
102
|
+
- **Security**: Authentication methods, SSL/TLS, permissions
|
103
|
+
- **Protocols**: HTTP/HTTPS/mTLS configuration
|
104
|
+
- **Proxy registration**: Automatic server registration
|
105
|
+
- **Logging**: Comprehensive logging configuration
|
106
|
+
- **Commands**: Built-in and custom command management
|
107
|
+
|
108
|
+
See `docs/EN/configuration.md` for complete configuration documentation.
|
109
|
+
|
110
|
+
## Built-in Commands
|
111
|
+
|
112
|
+
- `health` - Server health check
|
113
|
+
- `echo` - Echo test command
|
114
|
+
- `config` - Configuration management
|
115
|
+
- `help` - Command help and documentation
|
116
|
+
- `reload` - Configuration reload
|
117
|
+
- `settings` - Settings management
|
118
|
+
- `load`/`unload` - Command loading/unloading
|
119
|
+
- `plugins` - Plugin management
|
120
|
+
- `proxy_registration` - Proxy registration control
|
121
|
+
- `transport_management` - Transport protocol management
|
122
|
+
- `role_test` - Role-based access testing
|
123
|
+
|
124
|
+
## Security Features
|
125
|
+
|
126
|
+
- **Authentication**: API keys, JWT tokens, certificate-based auth
|
127
|
+
- **Authorization**: Role-based permissions with wildcard support
|
128
|
+
- **SSL/TLS**: Full SSL/TLS and mTLS support
|
129
|
+
- **Rate Limiting**: Configurable request rate limiting
|
130
|
+
- **Security Headers**: Automatic security header injection
|
131
|
+
|
132
|
+
## Examples
|
133
|
+
|
134
|
+
The `mcp_proxy_adapter/examples/` directory contains comprehensive examples for different use cases:
|
135
|
+
|
136
|
+
- **Basic Framework**: Simple HTTP server setup
|
137
|
+
- **Full Application**: Complete application with custom commands and hooks
|
138
|
+
- **Security Testing**: Comprehensive security test suite
|
139
|
+
- **Certificate Generation**: SSL/TLS certificate management
|
140
|
+
|
141
|
+
## Development
|
142
|
+
|
143
|
+
The project follows a modular architecture:
|
144
|
+
|
145
|
+
- `mcp_proxy_adapter/api/` - FastAPI application and handlers
|
146
|
+
- `mcp_proxy_adapter/commands/` - Command system and built-in commands
|
147
|
+
- `mcp_proxy_adapter/core/` - Core functionality and utilities
|
148
|
+
- `mcp_proxy_adapter/config.py` - Configuration management
|
149
|
+
|
150
|
+
## License
|
151
|
+
|
152
|
+
This project is licensed under the MIT License.
|
153
|
+
|
154
|
+
## Support
|
155
|
+
|
156
|
+
For issues and questions, please contact vasilyvz@gmail.com.
|
@@ -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=AuC4X8tE_ZN_ehkTZYFXK_D9dCGtOUNdRena2LNA8Zk,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
|
@@ -83,17 +83,17 @@ mcp_proxy_adapter/core/unified_config_adapter.py,sha256=zBGYdLDZ3G8f3Y9tmtm0Ne0U
|
|
83
83
|
mcp_proxy_adapter/core/utils.py,sha256=wBdDYBDWQ6zbwrnl9tykHjo0FjJVsLT_x8Bjk1lZX60,3270
|
84
84
|
mcp_proxy_adapter/examples/__init__.py,sha256=k1F-EotAFbJ3JvK_rNgiH4bUztmxIWtYn0AfbAZ1ZGs,450
|
85
85
|
mcp_proxy_adapter/examples/create_certificates_simple.py,sha256=xoa4VtKzb9y7Mn8VqcK-uH2q7Bf89vrWG6G3LQmhJng,27086
|
86
|
+
mcp_proxy_adapter/examples/create_test_configs.py,sha256=lFO27tn0V7fUM7i3xa7liV3a-0nXvm12RXe9AiOLs5g,11545
|
86
87
|
mcp_proxy_adapter/examples/debug_request_state.py,sha256=Z3Gy2-fWtu7KIV9OkzGDLVz7TpL_h9V_99ica40uQBU,4489
|
87
88
|
mcp_proxy_adapter/examples/debug_role_chain.py,sha256=GLVXC2fJUwP8UJnXHchd1t-H53cjWLJI3RqTPrKmaak,8750
|
88
89
|
mcp_proxy_adapter/examples/demo_client.py,sha256=en2Rtb70B1sQmhL-vdQ4PDpKNNl_mfll2YCFT_jFCAg,10191
|
89
90
|
mcp_proxy_adapter/examples/generate_all_certificates.py,sha256=lLP5RKmJwpSyprvrxQXFt_xcN4aiUzlIxk5WVdXx2Fk,19024
|
90
91
|
mcp_proxy_adapter/examples/generate_certificates.py,sha256=VRJnT9Za2Wk_oKRT5g2SA7qcGeBSxZm9wPMOM5i50T0,6707
|
91
92
|
mcp_proxy_adapter/examples/generate_certificates_and_tokens.py,sha256=hUCoJH3fy5WeR_YMHj-_W0mR0ZKUWqewH4FVN3yWyrM,17972
|
92
|
-
mcp_proxy_adapter/examples/generate_comprehensive_config.py,sha256=2UyTGIUKxw3EdCFaOMwO1vB-OZjOQV0senU44JPuyH0,4787
|
93
93
|
mcp_proxy_adapter/examples/generate_test_configs.py,sha256=FWg_QFJAWinI1lw05RccX4_VbhsCBEKPpZA6I9v6KAs,14379
|
94
94
|
mcp_proxy_adapter/examples/proxy_registration_example.py,sha256=vemRhftnjbiOBCJkmtDGqlWQ8syTG0a8755GCOnaQsg,12503
|
95
95
|
mcp_proxy_adapter/examples/run_example.py,sha256=yp-a6HIrSk3ddQmbn0KkuKwErId0aNfj028TE6U-zmY,2626
|
96
|
-
mcp_proxy_adapter/examples/run_full_test_suite.py,sha256=
|
96
|
+
mcp_proxy_adapter/examples/run_full_test_suite.py,sha256=2VvcnDy2EkufxLHFFbgchNZ5Z7UjPuCI1wFEMvmehUk,19948
|
97
97
|
mcp_proxy_adapter/examples/run_proxy_server.py,sha256=SBLSSY2F_VEBQD3MsCE_Pa9xFE6Sszr3vHdE9QOEN4Y,5242
|
98
98
|
mcp_proxy_adapter/examples/run_security_tests.py,sha256=0vjaUdWC-rLyviQuNxM3PtfiU9TzSRuxGxWMehrFA_w,23311
|
99
99
|
mcp_proxy_adapter/examples/run_security_tests_fixed.py,sha256=2BKMT0_-FhmcZA73hdQOt2XR7Cgb9Sq8qBI88BkwAAA,10934
|
@@ -102,11 +102,9 @@ mcp_proxy_adapter/examples/setup_test_environment.py,sha256=LR4kGneHELgk4lHMfA9k
|
|
102
102
|
mcp_proxy_adapter/examples/test_config.py,sha256=ekEoUZe9q484vU_0IxOVhQdNMVJXG3IpmQpP--VmuDI,6491
|
103
103
|
mcp_proxy_adapter/examples/test_config_generator.py,sha256=PBXk1V_awJ-iBlbE66Pme5sQwu6CJDxkmqgm8uPtM58,4091
|
104
104
|
mcp_proxy_adapter/examples/test_examples.py,sha256=CYlVatdHUVC_rwv4NsvxFG3GXiKIyxPDUH43BOJHjrU,12330
|
105
|
-
mcp_proxy_adapter/examples/test_mcp_adapter.py,sha256=hwxWwIiXXvyZuLrYB0SiKURRwqCXEmPGfl0mWIfvvz8,7830
|
106
105
|
mcp_proxy_adapter/examples/universal_client.py,sha256=n1-cBPOiCipA86Zcc_mI_jMywDMZS1p3u5JT3AqTsrQ,27577
|
107
106
|
mcp_proxy_adapter/examples/basic_framework/__init__.py,sha256=4aYD--R6hy9n9CUxj7Osb9HcdVUMJ6_cfpu4ujkbCwI,345
|
108
|
-
mcp_proxy_adapter/examples/basic_framework/main.py,sha256=
|
109
|
-
mcp_proxy_adapter/examples/basic_framework/roles.json,sha256=I0lSP3hfq1DESv3xsZ7-xOEdzaQGCb8b9YMK_AOPDsE,510
|
107
|
+
mcp_proxy_adapter/examples/basic_framework/main.py,sha256=XdGrD_52hhCVHwqx4XmfVmd7tlfp6WE-qZ0gw05SyB0,1792
|
110
108
|
mcp_proxy_adapter/examples/basic_framework/commands/__init__.py,sha256=_VQNLUEdsxUG-4yt9BZI_vtOxHAdGG0OUSsP6Wj-Vz4,76
|
111
109
|
mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py,sha256=IE_EIXMnkdXuakZn7wLD9kBFyfDF5lYi56ejgiBeb-A,70
|
112
110
|
mcp_proxy_adapter/examples/commands/__init__.py,sha256=zvY_OpH_B1bVc_khrNIl6O8vqCw1FH6gGMAsJAkGWGY,170
|
@@ -126,7 +124,6 @@ mcp_proxy_adapter/examples/examples/full_application/hooks/builtin_command_hooks
|
|
126
124
|
mcp_proxy_adapter/examples/full_application/__init__.py,sha256=xGiPYhRAzs1Fh9wA8HoowV-Gg9QMLaMZn-OamExq1TI,320
|
127
125
|
mcp_proxy_adapter/examples/full_application/main.py,sha256=ogL3Bil_5puGnwvMh3YNOjrW76FIzzoggKEp-04HSfo,7855
|
128
126
|
mcp_proxy_adapter/examples/full_application/proxy_endpoints.py,sha256=Kt_WAsG61HLTMkKQ1mQqjvlX9I4TcfwYq0NaRR9HKvM,6179
|
129
|
-
mcp_proxy_adapter/examples/full_application/roles.json,sha256=I0lSP3hfq1DESv3xsZ7-xOEdzaQGCb8b9YMK_AOPDsE,510
|
130
127
|
mcp_proxy_adapter/examples/full_application/commands/__init__.py,sha256=yQHxVSFkAyFLUOdk42QOebUODPlQV9IbydPgF3UKsGM,217
|
131
128
|
mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py,sha256=H7FPJmVJNWT61rPWxep06-7hsYRt8XYBUSBiwqpBurU,3096
|
132
129
|
mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py,sha256=DFTqVnIDt6nBdZ27-vD_f1X2cFcDInVQiCEq9ltw4lA,3428
|
@@ -136,12 +133,8 @@ mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py,sha25
|
|
136
133
|
mcp_proxy_adapter/examples/scripts/config_generator.py,sha256=SKFlRRCE_pEHGbfjDuzfKpvV2DMwG6lRfK90uJwRlJM,33410
|
137
134
|
mcp_proxy_adapter/examples/scripts/create_certificates_simple.py,sha256=yCWdUIhMSDPwoPhuLR9rhPdf7jLN5hCjzNfYYgVyHnw,27769
|
138
135
|
mcp_proxy_adapter/examples/scripts/generate_certificates_and_tokens.py,sha256=hUCoJH3fy5WeR_YMHj-_W0mR0ZKUWqewH4FVN3yWyrM,17972
|
139
|
-
mcp_proxy_adapter/
|
140
|
-
mcp_proxy_adapter/
|
141
|
-
mcp_proxy_adapter/
|
142
|
-
|
143
|
-
mcp_proxy_adapter-6.4.
|
144
|
-
mcp_proxy_adapter-6.4.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
145
|
-
mcp_proxy_adapter-6.4.10.dist-info/entry_points.txt,sha256=J3eV6ID0lt_VSp4lIdIgBFTqLCThgObNNxRCbyfiMHw,70
|
146
|
-
mcp_proxy_adapter-6.4.10.dist-info/top_level.txt,sha256=CHk-Mc-AxjO-tRheegA2qLiQnU4vZRnxuTF81So6SAc,50
|
147
|
-
mcp_proxy_adapter-6.4.10.dist-info/RECORD,,
|
136
|
+
mcp_proxy_adapter-6.4.12.dist-info/METADATA,sha256=EBFcB6piku6QastRpuAjeDW-VwZDfYuvvd2F22uR2w4,6087
|
137
|
+
mcp_proxy_adapter-6.4.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
138
|
+
mcp_proxy_adapter-6.4.12.dist-info/entry_points.txt,sha256=J3eV6ID0lt_VSp4lIdIgBFTqLCThgObNNxRCbyfiMHw,70
|
139
|
+
mcp_proxy_adapter-6.4.12.dist-info/top_level.txt,sha256=JZT7vPLBYrtroX-ij68JBhJYbjDdghcV-DFySRy-Nnw,18
|
140
|
+
mcp_proxy_adapter-6.4.12.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
mcp_proxy_adapter
|
@@ -1,21 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"roles": {
|
3
|
-
"admin": {
|
4
|
-
"permissions": ["*"],
|
5
|
-
"description": "Administrator with full access"
|
6
|
-
},
|
7
|
-
"user": {
|
8
|
-
"permissions": ["read", "write"],
|
9
|
-
"description": "Regular user with read/write access"
|
10
|
-
},
|
11
|
-
"readonly": {
|
12
|
-
"permissions": ["read"],
|
13
|
-
"description": "Read-only user"
|
14
|
-
}
|
15
|
-
},
|
16
|
-
"user_roles": {
|
17
|
-
"admin": "admin",
|
18
|
-
"user": "user",
|
19
|
-
"readonly": "readonly"
|
20
|
-
}
|
21
|
-
}
|
@@ -1,21 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"roles": {
|
3
|
-
"admin": {
|
4
|
-
"permissions": ["*"],
|
5
|
-
"description": "Administrator with full access"
|
6
|
-
},
|
7
|
-
"user": {
|
8
|
-
"permissions": ["read", "write"],
|
9
|
-
"description": "Regular user with read/write access"
|
10
|
-
},
|
11
|
-
"readonly": {
|
12
|
-
"permissions": ["read"],
|
13
|
-
"description": "Read-only user"
|
14
|
-
}
|
15
|
-
},
|
16
|
-
"user_roles": {
|
17
|
-
"admin": "admin",
|
18
|
-
"user": "user",
|
19
|
-
"readonly": "readonly"
|
20
|
-
}
|
21
|
-
}
|
@@ -1,177 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
Author: Vasiliy Zdanovskiy
|
4
|
-
email: vasilyvz@gmail.com
|
5
|
-
Script for generating comprehensive HTTP configuration for MCP Proxy Adapter.
|
6
|
-
Generates single comprehensive configuration with all features enabled.
|
7
|
-
"""
|
8
|
-
import json
|
9
|
-
import os
|
10
|
-
import argparse
|
11
|
-
import uuid
|
12
|
-
from typing import Dict, Any
|
13
|
-
|
14
|
-
|
15
|
-
def generate_comprehensive_http_config(
|
16
|
-
port: int = 20001,
|
17
|
-
roles_file: str = "configs/roles.json",
|
18
|
-
) -> Dict[str, Any]:
|
19
|
-
"""Generate comprehensive HTTP configuration with all features."""
|
20
|
-
return {
|
21
|
-
"uuid": str(uuid.uuid4()),
|
22
|
-
"server": {
|
23
|
-
"host": "127.0.0.1",
|
24
|
-
"port": port,
|
25
|
-
"debug": False,
|
26
|
-
"log_level": "INFO",
|
27
|
-
"workers": 1,
|
28
|
-
"reload": False
|
29
|
-
},
|
30
|
-
"ssl": {
|
31
|
-
"enabled": False
|
32
|
-
},
|
33
|
-
"security": {
|
34
|
-
"enabled": True,
|
35
|
-
"auth": {
|
36
|
-
"enabled": True,
|
37
|
-
"methods": [
|
38
|
-
"api_key"
|
39
|
-
],
|
40
|
-
"api_keys": {
|
41
|
-
"admin-token-123": "admin",
|
42
|
-
"user-token-456": "user",
|
43
|
-
"readonly-token-789": "readonly",
|
44
|
-
"guest-token-abc": "guest",
|
45
|
-
"proxy-token-def": "proxy"
|
46
|
-
}
|
47
|
-
},
|
48
|
-
"permissions": {
|
49
|
-
"enabled": True,
|
50
|
-
"roles_file": roles_file
|
51
|
-
}
|
52
|
-
},
|
53
|
-
"registration": {
|
54
|
-
"enabled": True,
|
55
|
-
"url": "http://127.0.0.1:3004/proxy",
|
56
|
-
"name": "comprehensive_http_adapter",
|
57
|
-
"capabilities": [
|
58
|
-
"http",
|
59
|
-
"token_auth",
|
60
|
-
"roles",
|
61
|
-
"registration",
|
62
|
-
"heartbeat"
|
63
|
-
],
|
64
|
-
"retry_count": 3,
|
65
|
-
"retry_delay": 5,
|
66
|
-
"heartbeat": {
|
67
|
-
"enabled": True,
|
68
|
-
"interval": 30
|
69
|
-
}
|
70
|
-
},
|
71
|
-
"protocols": {
|
72
|
-
"enabled": True,
|
73
|
-
"allowed_protocols": [
|
74
|
-
"http"
|
75
|
-
]
|
76
|
-
}
|
77
|
-
}
|
78
|
-
|
79
|
-
|
80
|
-
def generate_roles_config() -> Dict[str, Any]:
|
81
|
-
"""Generate comprehensive roles configuration."""
|
82
|
-
return {
|
83
|
-
"admin": {
|
84
|
-
"description": "Full administrative access",
|
85
|
-
"permissions": [
|
86
|
-
"read",
|
87
|
-
"write",
|
88
|
-
"execute",
|
89
|
-
"delete",
|
90
|
-
"admin"
|
91
|
-
],
|
92
|
-
"inherits": []
|
93
|
-
},
|
94
|
-
"user": {
|
95
|
-
"description": "Standard user access",
|
96
|
-
"permissions": [
|
97
|
-
"read",
|
98
|
-
"write",
|
99
|
-
"execute"
|
100
|
-
],
|
101
|
-
"inherits": []
|
102
|
-
},
|
103
|
-
"readonly": {
|
104
|
-
"description": "Read-only access",
|
105
|
-
"permissions": [
|
106
|
-
"read"
|
107
|
-
],
|
108
|
-
"inherits": []
|
109
|
-
},
|
110
|
-
"guest": {
|
111
|
-
"description": "Limited guest access",
|
112
|
-
"permissions": [
|
113
|
-
"read"
|
114
|
-
],
|
115
|
-
"inherits": []
|
116
|
-
},
|
117
|
-
"proxy": {
|
118
|
-
"description": "Proxy registration access",
|
119
|
-
"permissions": [
|
120
|
-
"read",
|
121
|
-
"register",
|
122
|
-
"heartbeat"
|
123
|
-
],
|
124
|
-
"inherits": []
|
125
|
-
}
|
126
|
-
}
|
127
|
-
|
128
|
-
|
129
|
-
def main():
|
130
|
-
"""Generate comprehensive configuration."""
|
131
|
-
parser = argparse.ArgumentParser(description="Generate comprehensive HTTP configuration")
|
132
|
-
parser.add_argument(
|
133
|
-
"--output-dir",
|
134
|
-
default="configs",
|
135
|
-
help="Output directory for configuration files"
|
136
|
-
)
|
137
|
-
parser.add_argument(
|
138
|
-
"--port",
|
139
|
-
type=int,
|
140
|
-
default=20001,
|
141
|
-
help="Server port"
|
142
|
-
)
|
143
|
-
|
144
|
-
args = parser.parse_args()
|
145
|
-
|
146
|
-
# Create output directory
|
147
|
-
os.makedirs(args.output_dir, exist_ok=True)
|
148
|
-
|
149
|
-
# Generate comprehensive HTTP configuration
|
150
|
-
config = generate_comprehensive_http_config(port=args.port)
|
151
|
-
config_file = os.path.join(args.output_dir, "comprehensive_http.json")
|
152
|
-
|
153
|
-
with open(config_file, 'w') as f:
|
154
|
-
json.dump(config, f, indent=2)
|
155
|
-
|
156
|
-
print(f"Generated: {config_file}")
|
157
|
-
|
158
|
-
# Generate roles configuration
|
159
|
-
roles = generate_roles_config()
|
160
|
-
roles_file = os.path.join(args.output_dir, "roles.json")
|
161
|
-
|
162
|
-
with open(roles_file, 'w') as f:
|
163
|
-
json.dump(roles, f, indent=2)
|
164
|
-
|
165
|
-
print(f"Generated: {roles_file}")
|
166
|
-
|
167
|
-
print(f"\nGenerated comprehensive configuration in {args.output_dir}/")
|
168
|
-
print("Configuration includes:")
|
169
|
-
print("- HTTP server with token authentication")
|
170
|
-
print("- Role-based permissions")
|
171
|
-
print("- Proxy registration")
|
172
|
-
print("- Heartbeat monitoring")
|
173
|
-
print("- 5 predefined tokens with roles")
|
174
|
-
|
175
|
-
|
176
|
-
if __name__ == "__main__":
|
177
|
-
main()
|
@@ -1,207 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
One-Command Test Runner for MCP Proxy Adapter
|
4
|
-
This script creates a fresh test environment and runs all tests.
|
5
|
-
Author: Vasiliy Zdanovskiy
|
6
|
-
email: vasilyvz@gmail.com
|
7
|
-
|
8
|
-
Usage:
|
9
|
-
python test_mcp_adapter.py
|
10
|
-
"""
|
11
|
-
import asyncio
|
12
|
-
import os
|
13
|
-
import subprocess
|
14
|
-
import sys
|
15
|
-
import time
|
16
|
-
from pathlib import Path
|
17
|
-
|
18
|
-
|
19
|
-
def run_command(cmd, description, cwd=None, timeout=300):
|
20
|
-
"""Run a command and return success status."""
|
21
|
-
print(f"🚀 {description}...")
|
22
|
-
try:
|
23
|
-
result = subprocess.run(
|
24
|
-
cmd,
|
25
|
-
shell=True,
|
26
|
-
cwd=cwd,
|
27
|
-
capture_output=True,
|
28
|
-
text=True,
|
29
|
-
timeout=timeout
|
30
|
-
)
|
31
|
-
if result.returncode == 0:
|
32
|
-
print(f"✅ {description} completed successfully")
|
33
|
-
return True
|
34
|
-
else:
|
35
|
-
print(f"❌ {description} failed")
|
36
|
-
if result.stderr.strip():
|
37
|
-
print(f"🔍 Error: {result.stderr.strip()}")
|
38
|
-
return False
|
39
|
-
except subprocess.TimeoutExpired:
|
40
|
-
print(f"⏰ {description} timed out after {timeout} seconds")
|
41
|
-
return False
|
42
|
-
except Exception as e:
|
43
|
-
print(f"❌ {description} failed with exception: {e}")
|
44
|
-
return False
|
45
|
-
|
46
|
-
|
47
|
-
def main():
|
48
|
-
"""Main function to run complete test suite."""
|
49
|
-
print("=" * 80)
|
50
|
-
print("🎯 MCP PROXY ADAPTER - ONE-COMMAND TEST SUITE")
|
51
|
-
print("=" * 80)
|
52
|
-
print("This script will create a fresh test environment and run all tests.")
|
53
|
-
print("=" * 80)
|
54
|
-
|
55
|
-
# Get current directory
|
56
|
-
current_dir = Path.cwd()
|
57
|
-
print(f"📁 Working directory: {current_dir}")
|
58
|
-
|
59
|
-
# Clean up any existing test environment
|
60
|
-
test_env_dir = current_dir / "test_environment"
|
61
|
-
if test_env_dir.exists():
|
62
|
-
print("🧹 Cleaning up existing test environment...")
|
63
|
-
import shutil
|
64
|
-
shutil.rmtree(test_env_dir)
|
65
|
-
print("✅ Cleaned up existing test environment")
|
66
|
-
|
67
|
-
# Step 1: Setup test environment
|
68
|
-
print("\n" + "=" * 60)
|
69
|
-
print("STEP 1: SETTING UP TEST ENVIRONMENT")
|
70
|
-
print("=" * 60)
|
71
|
-
|
72
|
-
setup_cmd = "python -m mcp_proxy_adapter.examples.setup_test_environment --output-dir test_environment"
|
73
|
-
if not run_command(setup_cmd, "Setting up test environment"):
|
74
|
-
print("❌ Failed to setup test environment. Aborting.")
|
75
|
-
return False
|
76
|
-
|
77
|
-
# Step 2: Generate test configurations
|
78
|
-
print("\n" + "=" * 60)
|
79
|
-
print("STEP 2: GENERATING TEST CONFIGURATIONS")
|
80
|
-
print("=" * 60)
|
81
|
-
|
82
|
-
config_cmd = "python -m mcp_proxy_adapter.examples.generate_test_configs --output-dir test_environment/configs"
|
83
|
-
if not run_command(config_cmd, "Generating test configurations"):
|
84
|
-
print("❌ Failed to generate configurations. Aborting.")
|
85
|
-
return False
|
86
|
-
|
87
|
-
# Step 3: Fix mTLS configurations and certificates
|
88
|
-
print("\n" + "=" * 60)
|
89
|
-
print("STEP 3: FIXING mTLS CONFIGURATIONS AND CERTIFICATES")
|
90
|
-
print("=" * 60)
|
91
|
-
|
92
|
-
# Fix certificate naming
|
93
|
-
cert_fixes = [
|
94
|
-
"ln -sf mcp_proxy_adapter_test_ca_ca.crt certs/mcp_proxy_adapter_ca_ca.crt",
|
95
|
-
"ln -sf admin-client_client.crt certs/admin_cert.pem",
|
96
|
-
"ln -sf admin-client_client.key certs/admin_key.pem",
|
97
|
-
"ln -sf admin-client_client.crt certs/user_cert.pem",
|
98
|
-
"ln -sf admin-client_client.key certs/user_key.pem"
|
99
|
-
]
|
100
|
-
|
101
|
-
for fix_cmd in cert_fixes:
|
102
|
-
run_command(fix_cmd, f"Fixing certificate: {fix_cmd.split()[-1]}", cwd=test_env_dir)
|
103
|
-
|
104
|
-
# Fix mTLS configurations
|
105
|
-
print("🔧 Fixing mTLS configurations...")
|
106
|
-
|
107
|
-
# Read and fix mtls_with_roles.json
|
108
|
-
mtls_with_roles_path = test_env_dir / "configs" / "mtls_with_roles.json"
|
109
|
-
if mtls_with_roles_path.exists():
|
110
|
-
try:
|
111
|
-
import json
|
112
|
-
with open(mtls_with_roles_path, 'r') as f:
|
113
|
-
config = json.load(f)
|
114
|
-
|
115
|
-
# Add default_protocol if missing
|
116
|
-
if "protocols" in config and "default_protocol" not in config["protocols"]:
|
117
|
-
config["protocols"]["default_protocol"] = "mtls"
|
118
|
-
|
119
|
-
# Add client certificate paths if missing
|
120
|
-
if "ssl" in config:
|
121
|
-
if "client_cert_file" not in config["ssl"]:
|
122
|
-
config["ssl"]["client_cert_file"] = "certs/admin_cert.pem"
|
123
|
-
if "client_key_file" not in config["ssl"]:
|
124
|
-
config["ssl"]["client_key_file"] = "certs/admin_key.pem"
|
125
|
-
|
126
|
-
with open(mtls_with_roles_path, 'w') as f:
|
127
|
-
json.dump(config, f, indent=2)
|
128
|
-
print("✅ Fixed mtls_with_roles.json")
|
129
|
-
except Exception as e:
|
130
|
-
print(f"⚠️ Warning: Failed to fix mtls_with_roles.json: {e}")
|
131
|
-
|
132
|
-
# Read and fix mtls_no_roles.json
|
133
|
-
mtls_no_roles_path = test_env_dir / "configs" / "mtls_no_roles.json"
|
134
|
-
if mtls_no_roles_path.exists():
|
135
|
-
try:
|
136
|
-
import json
|
137
|
-
with open(mtls_no_roles_path, 'r') as f:
|
138
|
-
config = json.load(f)
|
139
|
-
|
140
|
-
# Add UUID if missing
|
141
|
-
if "uuid" not in config:
|
142
|
-
import uuid
|
143
|
-
config["uuid"] = str(uuid.uuid4())
|
144
|
-
|
145
|
-
# Add default_protocol if missing
|
146
|
-
if "protocols" in config and "default_protocol" not in config["protocols"]:
|
147
|
-
config["protocols"]["default_protocol"] = "mtls"
|
148
|
-
|
149
|
-
# Fix certificate paths in security.ssl section
|
150
|
-
if "security" in config and "ssl" in config["security"]:
|
151
|
-
ssl_config = config["security"]["ssl"]
|
152
|
-
ssl_config["server_cert_file"] = "certs/localhost_server.crt"
|
153
|
-
ssl_config["server_key_file"] = "keys/localhost_server.key"
|
154
|
-
ssl_config["ca_cert_file"] = "certs/mcp_proxy_adapter_test_ca_ca.crt"
|
155
|
-
ssl_config["client_cert_file"] = "certs/admin_cert.pem"
|
156
|
-
ssl_config["client_key_file"] = "certs/admin_key.pem"
|
157
|
-
|
158
|
-
with open(mtls_no_roles_path, 'w') as f:
|
159
|
-
json.dump(config, f, indent=2)
|
160
|
-
print("✅ Fixed mtls_no_roles.json")
|
161
|
-
except Exception as e:
|
162
|
-
print(f"⚠️ Warning: Failed to fix mtls_no_roles.json: {e}")
|
163
|
-
|
164
|
-
# Step 4: Run security tests
|
165
|
-
print("\n" + "=" * 60)
|
166
|
-
print("STEP 4: RUNNING SECURITY TESTS")
|
167
|
-
print("=" * 60)
|
168
|
-
|
169
|
-
test_cmd = "python -m mcp_proxy_adapter.examples.run_security_tests"
|
170
|
-
test_success = run_command(test_cmd, "Running security tests", cwd=test_env_dir, timeout=600)
|
171
|
-
|
172
|
-
# Step 5: Show final results
|
173
|
-
print("\n" + "=" * 80)
|
174
|
-
print("🎉 ONE-COMMAND TEST SUITE FINISHED")
|
175
|
-
print("=" * 80)
|
176
|
-
print("📋 SUMMARY:")
|
177
|
-
print("✅ Test environment created successfully")
|
178
|
-
print("✅ Configurations generated successfully")
|
179
|
-
print("✅ Certificates generated and fixed")
|
180
|
-
print("✅ Security tests executed")
|
181
|
-
print(f"📁 Test environment location: {test_env_dir}")
|
182
|
-
print("\n🔧 Available configurations:")
|
183
|
-
print(" - HTTP: test_environment/configs/http_simple.json")
|
184
|
-
print(" - HTTP + Token: test_environment/configs/http_token.json")
|
185
|
-
print(" - HTTPS: test_environment/configs/https_simple.json")
|
186
|
-
print(" - HTTPS + Token: test_environment/configs/https_token.json")
|
187
|
-
print(" - mTLS: test_environment/configs/mtls_with_roles.json")
|
188
|
-
print("\n📊 Test Results:")
|
189
|
-
if test_success:
|
190
|
-
print("✅ All tests completed successfully")
|
191
|
-
else:
|
192
|
-
print("⚠️ Some tests failed (check output above for details)")
|
193
|
-
print("=" * 80)
|
194
|
-
|
195
|
-
return test_success
|
196
|
-
|
197
|
-
|
198
|
-
if __name__ == "__main__":
|
199
|
-
try:
|
200
|
-
success = main()
|
201
|
-
sys.exit(0 if success else 1)
|
202
|
-
except KeyboardInterrupt:
|
203
|
-
print("\n⚠️ Interrupted by user")
|
204
|
-
sys.exit(1)
|
205
|
-
except Exception as e:
|
206
|
-
print(f"\n❌ Unexpected error: {e}")
|
207
|
-
sys.exit(1)
|