mcp-proxy-adapter 6.0.0__py3-none-any.whl → 6.0.1__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.
Files changed (212) hide show
  1. mcp_proxy_adapter/__main__.py +27 -7
  2. mcp_proxy_adapter/api/app.py +209 -79
  3. mcp_proxy_adapter/api/handlers.py +16 -5
  4. mcp_proxy_adapter/api/middleware/__init__.py +14 -9
  5. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +148 -0
  6. mcp_proxy_adapter/api/middleware/factory.py +36 -12
  7. mcp_proxy_adapter/api/middleware/protocol_middleware.py +84 -18
  8. mcp_proxy_adapter/api/middleware/unified_security.py +197 -0
  9. mcp_proxy_adapter/api/middleware/user_info_middleware.py +158 -0
  10. mcp_proxy_adapter/commands/__init__.py +7 -1
  11. mcp_proxy_adapter/commands/base.py +7 -4
  12. mcp_proxy_adapter/commands/builtin_commands.py +8 -2
  13. mcp_proxy_adapter/commands/command_registry.py +8 -0
  14. mcp_proxy_adapter/commands/echo_command.py +81 -0
  15. mcp_proxy_adapter/commands/health_command.py +1 -1
  16. mcp_proxy_adapter/commands/help_command.py +21 -14
  17. mcp_proxy_adapter/commands/proxy_registration_command.py +326 -185
  18. mcp_proxy_adapter/commands/role_test_command.py +141 -0
  19. mcp_proxy_adapter/commands/security_command.py +488 -0
  20. mcp_proxy_adapter/commands/ssl_setup_command.py +234 -351
  21. mcp_proxy_adapter/commands/token_management_command.py +1 -1
  22. mcp_proxy_adapter/config.py +323 -40
  23. mcp_proxy_adapter/core/app_factory.py +410 -0
  24. mcp_proxy_adapter/core/app_runner.py +272 -0
  25. mcp_proxy_adapter/core/certificate_utils.py +291 -73
  26. mcp_proxy_adapter/core/client.py +574 -0
  27. mcp_proxy_adapter/core/client_manager.py +284 -0
  28. mcp_proxy_adapter/core/client_security.py +384 -0
  29. mcp_proxy_adapter/core/logging.py +8 -3
  30. mcp_proxy_adapter/core/mtls_asgi.py +156 -0
  31. mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
  32. mcp_proxy_adapter/core/protocol_manager.py +169 -10
  33. mcp_proxy_adapter/core/proxy_client.py +602 -0
  34. mcp_proxy_adapter/core/proxy_registration.py +299 -47
  35. mcp_proxy_adapter/core/security_adapter.py +12 -15
  36. mcp_proxy_adapter/core/security_integration.py +286 -0
  37. mcp_proxy_adapter/core/server_adapter.py +282 -0
  38. mcp_proxy_adapter/core/server_engine.py +270 -0
  39. mcp_proxy_adapter/core/ssl_utils.py +13 -12
  40. mcp_proxy_adapter/core/transport_manager.py +5 -5
  41. mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
  42. mcp_proxy_adapter/examples/__init__.py +13 -4
  43. mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
  44. mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
  45. mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
  46. mcp_proxy_adapter/examples/basic_framework/main.py +44 -0
  47. mcp_proxy_adapter/examples/commands/__init__.py +5 -0
  48. mcp_proxy_adapter/examples/create_certificates_simple.py +550 -0
  49. mcp_proxy_adapter/examples/debug_request_state.py +112 -0
  50. mcp_proxy_adapter/examples/debug_role_chain.py +158 -0
  51. mcp_proxy_adapter/examples/demo_client.py +275 -0
  52. mcp_proxy_adapter/examples/examples/basic_framework/__init__.py +9 -0
  53. mcp_proxy_adapter/examples/examples/basic_framework/commands/__init__.py +4 -0
  54. mcp_proxy_adapter/examples/examples/basic_framework/hooks/__init__.py +4 -0
  55. mcp_proxy_adapter/examples/examples/basic_framework/main.py +44 -0
  56. mcp_proxy_adapter/examples/examples/full_application/__init__.py +12 -0
  57. mcp_proxy_adapter/examples/examples/full_application/commands/__init__.py +7 -0
  58. mcp_proxy_adapter/examples/examples/full_application/commands/custom_echo_command.py +80 -0
  59. mcp_proxy_adapter/examples/examples/full_application/commands/dynamic_calculator_command.py +90 -0
  60. mcp_proxy_adapter/examples/examples/full_application/hooks/__init__.py +7 -0
  61. mcp_proxy_adapter/examples/examples/full_application/hooks/application_hooks.py +75 -0
  62. mcp_proxy_adapter/examples/examples/full_application/hooks/builtin_command_hooks.py +71 -0
  63. mcp_proxy_adapter/examples/examples/full_application/main.py +173 -0
  64. mcp_proxy_adapter/examples/examples/full_application/proxy_endpoints.py +154 -0
  65. mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
  66. mcp_proxy_adapter/examples/full_application/commands/__init__.py +7 -0
  67. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +80 -0
  68. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +90 -0
  69. mcp_proxy_adapter/examples/full_application/hooks/__init__.py +7 -0
  70. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +75 -0
  71. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +71 -0
  72. mcp_proxy_adapter/examples/full_application/main.py +173 -0
  73. mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +154 -0
  74. mcp_proxy_adapter/examples/generate_all_certificates.py +362 -0
  75. mcp_proxy_adapter/examples/generate_certificates.py +177 -0
  76. mcp_proxy_adapter/examples/generate_certificates_and_tokens.py +369 -0
  77. mcp_proxy_adapter/examples/generate_test_configs.py +331 -0
  78. mcp_proxy_adapter/examples/proxy_registration_example.py +334 -0
  79. mcp_proxy_adapter/examples/run_example.py +59 -0
  80. mcp_proxy_adapter/examples/run_full_test_suite.py +318 -0
  81. mcp_proxy_adapter/examples/run_proxy_server.py +146 -0
  82. mcp_proxy_adapter/examples/run_security_tests.py +544 -0
  83. mcp_proxy_adapter/examples/run_security_tests_fixed.py +247 -0
  84. mcp_proxy_adapter/examples/scripts/config_generator.py +740 -0
  85. mcp_proxy_adapter/examples/scripts/create_certificates_simple.py +560 -0
  86. mcp_proxy_adapter/examples/scripts/generate_certificates_and_tokens.py +369 -0
  87. mcp_proxy_adapter/examples/security_test_client.py +782 -0
  88. mcp_proxy_adapter/examples/setup_test_environment.py +328 -0
  89. mcp_proxy_adapter/examples/test_config.py +148 -0
  90. mcp_proxy_adapter/examples/test_config_generator.py +86 -0
  91. mcp_proxy_adapter/examples/test_examples.py +281 -0
  92. mcp_proxy_adapter/examples/universal_client.py +620 -0
  93. mcp_proxy_adapter/main.py +66 -148
  94. mcp_proxy_adapter/utils/config_generator.py +1008 -0
  95. mcp_proxy_adapter/version.py +5 -2
  96. mcp_proxy_adapter-6.0.1.dist-info/METADATA +679 -0
  97. mcp_proxy_adapter-6.0.1.dist-info/RECORD +140 -0
  98. mcp_proxy_adapter-6.0.1.dist-info/entry_points.txt +2 -0
  99. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.1.dist-info}/licenses/LICENSE +2 -2
  100. mcp_proxy_adapter/api/middleware/auth.py +0 -146
  101. mcp_proxy_adapter/api/middleware/auth_adapter.py +0 -235
  102. mcp_proxy_adapter/api/middleware/mtls_adapter.py +0 -305
  103. mcp_proxy_adapter/api/middleware/mtls_middleware.py +0 -296
  104. mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
  105. mcp_proxy_adapter/api/middleware/rate_limit_adapter.py +0 -241
  106. mcp_proxy_adapter/api/middleware/roles_adapter.py +0 -365
  107. mcp_proxy_adapter/api/middleware/roles_middleware.py +0 -381
  108. mcp_proxy_adapter/api/middleware/security.py +0 -376
  109. mcp_proxy_adapter/api/middleware/token_auth_middleware.py +0 -261
  110. mcp_proxy_adapter/examples/README.md +0 -124
  111. mcp_proxy_adapter/examples/basic_server/README.md +0 -60
  112. mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
  113. mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
  114. mcp_proxy_adapter/examples/basic_server/config.json +0 -70
  115. mcp_proxy_adapter/examples/basic_server/config_all_protocols.json +0 -54
  116. mcp_proxy_adapter/examples/basic_server/config_http.json +0 -70
  117. mcp_proxy_adapter/examples/basic_server/config_http_only.json +0 -52
  118. mcp_proxy_adapter/examples/basic_server/config_https.json +0 -58
  119. mcp_proxy_adapter/examples/basic_server/config_mtls.json +0 -58
  120. mcp_proxy_adapter/examples/basic_server/config_ssl.json +0 -46
  121. mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
  122. mcp_proxy_adapter/examples/basic_server/server.py +0 -114
  123. mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
  124. mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
  125. mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -566
  126. mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
  127. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
  128. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
  129. mcp_proxy_adapter/examples/custom_commands/auto_commands/test_command.py +0 -105
  130. mcp_proxy_adapter/examples/custom_commands/catalog/commands/test_command.py +0 -129
  131. mcp_proxy_adapter/examples/custom_commands/config.json +0 -118
  132. mcp_proxy_adapter/examples/custom_commands/config_all_protocols.json +0 -46
  133. mcp_proxy_adapter/examples/custom_commands/config_https_only.json +0 -46
  134. mcp_proxy_adapter/examples/custom_commands/config_https_transport.json +0 -33
  135. mcp_proxy_adapter/examples/custom_commands/config_mtls_only.json +0 -46
  136. mcp_proxy_adapter/examples/custom_commands/config_mtls_transport.json +0 -33
  137. mcp_proxy_adapter/examples/custom_commands/config_single_transport.json +0 -33
  138. mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
  139. mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
  140. mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
  141. mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
  142. mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
  143. mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
  144. mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
  145. mcp_proxy_adapter/examples/custom_commands/full_help_response.json +0 -1
  146. mcp_proxy_adapter/examples/custom_commands/generated_openapi.json +0 -629
  147. mcp_proxy_adapter/examples/custom_commands/get_openapi.py +0 -103
  148. mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
  149. mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
  150. mcp_proxy_adapter/examples/custom_commands/loadable_commands/test_ignored.py +0 -129
  151. mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
  152. mcp_proxy_adapter/examples/custom_commands/proxy_connection_manager.py +0 -278
  153. mcp_proxy_adapter/examples/custom_commands/server.py +0 -252
  154. mcp_proxy_adapter/examples/custom_commands/simple_openapi_server.py +0 -75
  155. mcp_proxy_adapter/examples/custom_commands/start_server_with_proxy_manager.py +0 -299
  156. mcp_proxy_adapter/examples/custom_commands/start_server_with_registration.py +0 -278
  157. mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
  158. mcp_proxy_adapter/examples/custom_commands/test_openapi.py +0 -27
  159. mcp_proxy_adapter/examples/custom_commands/test_registry.py +0 -23
  160. mcp_proxy_adapter/examples/custom_commands/test_simple.py +0 -19
  161. mcp_proxy_adapter/examples/custom_project_example/README.md +0 -103
  162. mcp_proxy_adapter/examples/custom_project_example/README_EN.md +0 -103
  163. mcp_proxy_adapter/examples/deployment/README.md +0 -49
  164. mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
  165. mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
  166. mcp_proxy_adapter/examples/deployment/config.json +0 -29
  167. mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
  168. mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
  169. mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
  170. mcp_proxy_adapter/examples/deployment/run.sh +0 -43
  171. mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
  172. mcp_proxy_adapter/examples/simple_custom_commands/README.md +0 -149
  173. mcp_proxy_adapter/examples/simple_custom_commands/README_EN.md +0 -149
  174. mcp_proxy_adapter/schemas/base_schema.json +0 -114
  175. mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
  176. mcp_proxy_adapter/schemas/roles_schema.json +0 -162
  177. mcp_proxy_adapter/tests/__init__.py +0 -0
  178. mcp_proxy_adapter/tests/api/__init__.py +0 -3
  179. mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
  180. mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
  181. mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
  182. mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
  183. mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
  184. mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
  185. mcp_proxy_adapter/tests/commands/__init__.py +0 -3
  186. mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
  187. mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
  188. mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
  189. mcp_proxy_adapter/tests/conftest.py +0 -131
  190. mcp_proxy_adapter/tests/functional/__init__.py +0 -3
  191. mcp_proxy_adapter/tests/functional/test_api.py +0 -253
  192. mcp_proxy_adapter/tests/integration/__init__.py +0 -3
  193. mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
  194. mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
  195. mcp_proxy_adapter/tests/performance/__init__.py +0 -3
  196. mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
  197. mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
  198. mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
  199. mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
  200. mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
  201. mcp_proxy_adapter/tests/test_base_command.py +0 -123
  202. mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
  203. mcp_proxy_adapter/tests/test_command_registry.py +0 -281
  204. mcp_proxy_adapter/tests/test_config.py +0 -127
  205. mcp_proxy_adapter/tests/test_utils.py +0 -65
  206. mcp_proxy_adapter/tests/unit/__init__.py +0 -3
  207. mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
  208. mcp_proxy_adapter/tests/unit/test_config.py +0 -270
  209. mcp_proxy_adapter-6.0.0.dist-info/METADATA +0 -201
  210. mcp_proxy_adapter-6.0.0.dist-info/RECORD +0 -179
  211. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.1.dist-info}/WHEEL +0 -0
  212. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.1.dist-info}/top_level.txt +0 -0
@@ -1,270 +0,0 @@
1
- """
2
- Unit tests for configuration module.
3
- """
4
-
5
- import json
6
- import os
7
- import tempfile
8
- from typing import Generator
9
-
10
- import pytest
11
-
12
- from mcp_proxy_adapter.config import Config
13
-
14
-
15
- @pytest.fixture
16
- def temp_config_file() -> Generator[str, None, None]:
17
- """
18
- Creates temporary configuration file for tests.
19
-
20
- Returns:
21
- Path to temporary configuration file.
22
- """
23
- # Create temporary file
24
- fd, path = tempfile.mkstemp(suffix=".json")
25
-
26
- # Write test configuration
27
- test_config = {
28
- "server": {
29
- "host": "127.0.0.1",
30
- "port": 8000
31
- },
32
- "logging": {
33
- "level": "DEBUG",
34
- "file": "test.log"
35
- },
36
- "ssl": {
37
- "enabled": True,
38
- "mode": "https_only",
39
- "cert_file": "test_cert.pem",
40
- "key_file": "test_key.pem",
41
- "cipher_suites": ["TLS_AES_256_GCM_SHA384"],
42
- "token_auth": {
43
- "enabled": True,
44
- "header_name": "Authorization",
45
- "token_prefix": "Bearer",
46
- "tokens_file": "test_tokens.json",
47
- "token_expiry": 3600,
48
- "jwt_secret": "test-secret",
49
- "jwt_algorithm": "HS256"
50
- }
51
- },
52
- "test_section": {
53
- "test_key": "test_value",
54
- "nested": {
55
- "key1": "value1",
56
- "key2": 42
57
- }
58
- }
59
- }
60
-
61
- with os.fdopen(fd, "w") as f:
62
- json.dump(test_config, f)
63
-
64
- yield path
65
-
66
- # Remove temporary file after tests
67
- os.unlink(path)
68
-
69
-
70
- @pytest.mark.unit
71
- def test_config_load_from_file(temp_config_file: str):
72
- """
73
- Test loading configuration from file.
74
-
75
- Args:
76
- temp_config_file: Path to temporary configuration file.
77
- """
78
- config = Config(temp_config_file)
79
-
80
- # Check loaded values
81
- assert config.get("server.host") == "127.0.0.1"
82
- assert config.get("server.port") == 8000
83
- assert config.get("logging.level") == "DEBUG"
84
- assert config.get("logging.file") == "test.log"
85
- assert config.get("test_section.test_key") == "test_value"
86
-
87
- # Check SSL configuration
88
- assert config.get("ssl.enabled") is True
89
- assert config.get("ssl.mode") == "https_only"
90
- assert config.get("ssl.cert_file") == "test_cert.pem"
91
- assert config.get("ssl.key_file") == "test_key.pem"
92
- assert config.get("ssl.cipher_suites") == ["TLS_AES_256_GCM_SHA384"]
93
-
94
- # Check token authentication configuration
95
- assert config.get("ssl.token_auth.enabled") is True
96
- assert config.get("ssl.token_auth.header_name") == "Authorization"
97
- assert config.get("ssl.token_auth.token_prefix") == "Bearer"
98
- assert config.get("ssl.token_auth.tokens_file") == "test_tokens.json"
99
- assert config.get("ssl.token_auth.token_expiry") == 3600
100
- assert config.get("ssl.token_auth.jwt_secret") == "test-secret"
101
- assert config.get("ssl.token_auth.jwt_algorithm") == "HS256"
102
-
103
-
104
- @pytest.mark.unit
105
- def test_config_get_nested_values(temp_config_file: str):
106
- """
107
- Test getting nested values from configuration.
108
-
109
- Args:
110
- temp_config_file: Path to temporary configuration file.
111
- """
112
- config = Config(temp_config_file)
113
-
114
- # Get nested values
115
- assert config.get("test_section.nested.key1") == "value1"
116
- assert config.get("test_section.nested.key2") == 42
117
-
118
-
119
- @pytest.mark.unit
120
- def test_config_get_with_default(temp_config_file: str):
121
- """
122
- Test getting configuration values with default.
123
-
124
- Args:
125
- temp_config_file: Path to temporary configuration file.
126
- """
127
- config = Config(temp_config_file)
128
-
129
- # Get non-existent values with defaults
130
- assert config.get("non_existent", default="default") == "default"
131
- assert config.get("server.non_existent", default=123) == 123
132
- assert config.get("test_section.nested.non_existent", default=False) is False
133
-
134
-
135
- @pytest.mark.unit
136
- def test_config_default_ssl_settings():
137
- """
138
- Test default SSL configuration settings.
139
- """
140
- config = Config()
141
-
142
- # Check default SSL settings
143
- assert config.get("ssl.enabled") is False
144
- assert config.get("ssl.mode") == "https_only"
145
- assert config.get("ssl.cert_file") is None
146
- assert config.get("ssl.key_file") is None
147
- assert config.get("ssl.ca_cert") is None
148
- assert config.get("ssl.verify_client") is False
149
- assert config.get("ssl.client_cert_required") is False
150
- assert "TLS_AES_256_GCM_SHA384" in config.get("ssl.cipher_suites")
151
- assert "TLS_CHACHA20_POLY1305_SHA256" in config.get("ssl.cipher_suites")
152
- assert config.get("ssl.min_tls_version") == "1.2"
153
- assert config.get("ssl.max_tls_version") == "1.3"
154
-
155
-
156
- @pytest.mark.unit
157
- def test_config_get_without_default(temp_config_file: str):
158
- """
159
- Test getting non-existent configuration values without default.
160
-
161
- Args:
162
- temp_config_file: Path to temporary configuration file.
163
- """
164
- config = Config(temp_config_file)
165
-
166
- # Get non-existent values without defaults
167
- assert config.get("non_existent") is None
168
- assert config.get("server.non_existent") is None
169
- assert config.get("test_section.nested.non_existent") is None
170
-
171
-
172
- @pytest.mark.unit
173
- def test_config_set_value(temp_config_file: str):
174
- """
175
- Test setting configuration values.
176
-
177
- Args:
178
- temp_config_file: Path to temporary configuration file.
179
- """
180
- config = Config(temp_config_file)
181
-
182
- # Set values
183
- config.set("server.host", "localhost")
184
- config.set("logging.level", "INFO")
185
- config.set("new_section.new_key", "new_value")
186
-
187
- # Check set values
188
- assert config.get("server.host") == "localhost"
189
- assert config.get("logging.level") == "INFO"
190
- assert config.get("new_section.new_key") == "new_value"
191
-
192
-
193
- @pytest.mark.unit
194
- def test_config_save_and_load(temp_config_file: str):
195
- """
196
- Test saving and loading configuration.
197
-
198
- Args:
199
- temp_config_file: Path to temporary configuration file.
200
- """
201
- # Create and modify configuration
202
- config1 = Config(temp_config_file)
203
- config1.set("server.host", "localhost")
204
- config1.set("new_section.new_key", "new_value")
205
-
206
- # Save configuration
207
- config1.save()
208
-
209
- # Load configuration again
210
- config2 = Config(temp_config_file)
211
-
212
- # Check values
213
- assert config2.get("server.host") == "localhost"
214
- assert config2.get("new_section.new_key") == "new_value"
215
-
216
-
217
- @pytest.mark.unit
218
- def test_config_load_updated_file(temp_config_file: str):
219
- """
220
- Test loading updated configuration from file.
221
-
222
- Args:
223
- temp_config_file: Path to temporary configuration file.
224
- """
225
- # Load configuration
226
- config = Config(temp_config_file)
227
- original_host = config.get("server.host")
228
-
229
- # Modify file directly
230
- with open(temp_config_file, "r+") as f:
231
- data = json.load(f)
232
- data["server"]["host"] = "new_host"
233
- f.seek(0)
234
- f.truncate()
235
- json.dump(data, f)
236
-
237
- # Create new config instance to load updated file
238
- updated_config = Config(temp_config_file)
239
-
240
- # Check that value was updated
241
- assert updated_config.get("server.host") == "new_host"
242
- assert updated_config.get("server.host") != original_host
243
-
244
-
245
- @pytest.mark.unit
246
- def test_config_access_nested_sections(temp_config_file: str):
247
- """
248
- Test accessing nested configuration sections directly.
249
-
250
- Args:
251
- temp_config_file: Path to temporary configuration file.
252
- """
253
- config = Config(temp_config_file)
254
-
255
- # Get parent key then access nested keys
256
- server = config.get("server")
257
- logging = config.get("logging")
258
- test_section = config.get("test_section")
259
-
260
- # Check sections
261
- assert isinstance(server, dict)
262
- assert isinstance(logging, dict)
263
- assert isinstance(test_section, dict)
264
-
265
- assert server["host"] == "127.0.0.1"
266
- assert server["port"] == 8000
267
- assert logging["level"] == "DEBUG"
268
- assert logging["file"] == "test.log"
269
- assert test_section["test_key"] == "test_value"
270
- assert test_section["nested"]["key1"] == "value1"
@@ -1,201 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: mcp-proxy-adapter
3
- Version: 6.0.0
4
- Summary: Reliable microservice with unified JSON-RPC endpoint
5
- Home-page: https://github.com/maverikod/mcp-proxy-adapter
6
- Author: Vasiliy Zdanovskiy
7
- Author-email: Vasiliy Zubarev <vasiliy.zubarev@example.com>
8
- License: MIT License
9
-
10
- Copyright (c) 2023-2024 Vasiliy VZ
11
-
12
- Permission is hereby granted, free of charge, to any person obtaining a copy
13
- of this software and associated documentation files (the "Software"), to deal
14
- in the Software without restriction, including without limitation the rights
15
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
- copies of the Software, and to permit persons to whom the Software is
17
- furnished to do so, subject to the following conditions:
18
-
19
- The above copyright notice and this permission notice shall be included in all
20
- copies or substantial portions of the Software.
21
-
22
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
- SOFTWARE.
29
- Project-URL: Documentation, https://github.com/maverikod/vvz-mcp-proxy-adapter/tree/main/docs/RU/README.md
30
- Project-URL: Source, https://github.com/maverikod/vvz-mcp-proxy-adapter
31
- Project-URL: Bug Reports, https://github.com/maverikod/vvz-mcp-proxy-adapter/issues
32
- Classifier: Programming Language :: Python :: 3
33
- Classifier: License :: OSI Approved :: MIT License
34
- Classifier: Operating System :: OS Independent
35
- Classifier: Framework :: FastAPI
36
- Classifier: Topic :: Software Development :: Libraries :: Python Modules
37
- Classifier: Intended Audience :: Developers
38
- Requires-Python: >=3.9
39
- Description-Content-Type: text/markdown
40
- License-File: LICENSE
41
- Requires-Dist: fastapi<1.0.0,>=0.95.0
42
- Requires-Dist: pydantic>=2.0.0
43
- Requires-Dist: uvicorn<1.0.0,>=0.22.0
44
- Requires-Dist: docstring-parser<1.0.0,>=0.15
45
- Requires-Dist: typing-extensions<5.0.0,>=4.5.0
46
- Requires-Dist: jsonrpc>=1.2.0
47
- Requires-Dist: psutil>=5.9.0
48
- Requires-Dist: mcp_security_framework>=0.1.0
49
- Dynamic: author
50
- Dynamic: home-page
51
- Dynamic: license-file
52
- Dynamic: requires-python
53
-
54
- # MCP Proxy Adapter
55
-
56
- **MCP Proxy Adapter** - это фреймворк для создания микросервисов на основе JSON-RPC. Он предоставляет базовую инфраструктуру для создания команд, обработки запросов и возвращения ответов через JSON-RPC API.
57
-
58
- **MCP Proxy Adapter** - это фреймворк для создания микросервисов на основе JSON-RPC. Он предоставляет базовую инфраструктуру для создания команд, обработки запросов и возвращения ответов через JSON-RPC API.
59
-
60
- ## Установка
61
-
62
- ```bash
63
- pip install mcp-proxy-adapter
64
- ```
65
-
66
- ## Использование
67
-
68
- 1. Создайте свой проект и установите зависимость:
69
-
70
- ```bash
71
- pip install mcp-proxy-adapter
72
- ```
73
-
74
- 2. Создайте свои команды:
75
-
76
- ```python
77
- from mcp_proxy_adapter.commands.base import Command
78
- from mcp_proxy_adapter.commands.result import SuccessResult
79
-
80
- class YourCommand(Command):
81
- name = "your_command"
82
-
83
- async def execute(self, param1: str, param2: int = 0) -> SuccessResult:
84
- # Ваша логика
85
- result_data = {"param1": param1, "param2": param2}
86
- return SuccessResult(data=result_data)
87
- ```
88
-
89
- 3. Запустите сервер:
90
-
91
- ```python
92
- import uvicorn
93
- from mcp_proxy_adapter.api.app import create_app
94
-
95
- # Регистрация ваших команд происходит автоматически
96
- app = create_app()
97
-
98
- uvicorn.run(app, host="0.0.0.0", port=8000)
99
- ```
100
-
101
- ## Структура проекта
102
-
103
- Проект представляет собой фреймворк с базовой инфраструктурой:
104
-
105
- * **mcp_proxy_adapter/** - основной модуль фреймворка
106
- * **api/** - модуль API
107
- * **commands/** - базовые классы команд
108
- * **core/** - ядро фреймворка
109
- * **schemas/** - JSON-схемы
110
- * **examples/** - примеры использования фреймворка
111
- * **basic_example/** - базовый пример
112
- * **minimal_example/** - минимальный пример
113
- * **complete_example/** - полный пример с Docker
114
-
115
- ## Базовые команды
116
-
117
- Фреймворк включает следующие базовые команды:
118
-
119
- - `help` - получение справки по доступным командам
120
- - `health` - проверка состояния сервиса
121
-
122
- ## API
123
-
124
- Фреймворк предоставляет следующие эндпоинты:
125
-
126
- - `POST /api/jsonrpc` - основной JSON-RPC эндпоинт для выполнения команд
127
- - `POST /api/command/{command_name}` - REST эндпоинт для выполнения конкретной команды
128
- - `GET /api/commands` - получение списка доступных команд
129
- - `GET /api/commands/{command_name}` - получение информации о конкретной команде
130
- - `GET /health` - проверка состояния сервиса
131
-
132
- ## Запуск примеров
133
-
134
- ```bash
135
- # Базовый пример
136
- cd examples/basic_example
137
- python main.py
138
-
139
- # Минимальный пример
140
- cd examples/minimal_example
141
- python main.py
142
-
143
- # Полный пример с Docker
144
- cd examples/complete_example
145
- docker-compose up -d
146
- ```
147
-
148
- ## Создание новой команды
149
-
150
- Пример создания новой команды:
151
-
152
- ```python
153
- from typing import Dict, Any, ClassVar, Type
154
- from mcp_proxy_adapter.commands.base import Command
155
- from mcp_proxy_adapter.commands.result import SuccessResult
156
-
157
- class CustomResult(SuccessResult):
158
- """
159
- Пользовательский класс результата.
160
- """
161
-
162
- def __init__(self, value: str):
163
- super().__init__(data={"value": value})
164
-
165
- @classmethod
166
- def get_schema(cls) -> Dict[str, Any]:
167
- return {
168
- "type": "object",
169
- "properties": {
170
- "data": {
171
- "type": "object",
172
- "properties": {
173
- "value": {"type": "string"}
174
- },
175
- "required": ["value"]
176
- }
177
- },
178
- "required": ["data"]
179
- }
180
-
181
- class CustomCommand(Command):
182
- """
183
- Пользовательская команда.
184
- """
185
-
186
- name: ClassVar[str] = "custom"
187
- result_class: ClassVar[Type[SuccessResult]] = CustomResult
188
-
189
- async def execute(self, input_text: str) -> CustomResult:
190
- return CustomResult(value=f"Processed: {input_text}")
191
-
192
- @classmethod
193
- def get_schema(cls) -> Dict[str, Any]:
194
- return {
195
- "type": "object",
196
- "properties": {
197
- "input_text": {"type": "string"}
198
- },
199
- "required": ["input_text"],
200
- "additionalProperties": False
201
- }
@@ -1,179 +0,0 @@
1
- mcp_proxy_adapter/__init__.py,sha256=B7m1YWyv_Wb87-Q-JqVpHQgwajnfIgDyZ_iIxzdTbBY,1021
2
- mcp_proxy_adapter/__main__.py,sha256=GuX2ZMrX4PaoQ2sLTbURZyebVn721AS8tM36e0HEJAI,246
3
- mcp_proxy_adapter/config.py,sha256=F3rrQSA3q1Zs_OGV9U6NGYohViFKVhwio7SoGX7rDro,10226
4
- mcp_proxy_adapter/custom_openapi.py,sha256=jYUrCy8C1mShh3sjKj-JkzSMLAvxDLTvtzSJFj5HUNg,15023
5
- mcp_proxy_adapter/main.py,sha256=Ug_7KmiUHKA_g6Hk2raSYEAcIK2bLSWOKfhAPoVZ09g,5702
6
- mcp_proxy_adapter/openapi.py,sha256=36vOEbJjGnVZR6hUhl6mHCD29HYOEFKo2bL0JdGSm-4,13952
7
- mcp_proxy_adapter/version.py,sha256=2YUdv_4cqrC5EGOexrOuZ1x0MtvtjpJCsW38cdsNc9E,71
8
- mcp_proxy_adapter/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- mcp_proxy_adapter/api/app.py,sha256=m9wsLWX4N3oZUtuKz5TKp67pRJFAEjy3lo89l-z04u8,21943
10
- mcp_proxy_adapter/api/handlers.py,sha256=DmuXPkug3Zr9R0PVFxE_qdb2TCV-GTusVHGMjaLd_EA,7879
11
- mcp_proxy_adapter/api/schemas.py,sha256=xOmiSwHaapY6myEFnLu7o-LWVPM7vwmLYZXFo2c6NfE,12381
12
- mcp_proxy_adapter/api/tool_integration.py,sha256=MrtX7vUXCGBBuZuOs3C6EF67R_U_0xMfOmlmsAz-wuE,10245
13
- mcp_proxy_adapter/api/tools.py,sha256=rRCRN2I8Odd2biBJZKByQS15rAWf0XwLRZEHDELc7Tg,8116
14
- mcp_proxy_adapter/api/middleware/__init__.py,sha256=okzo5WIvnlTv0p_NgO6__oJzXHddiu6C84BEpXK2RTQ,1807
15
- mcp_proxy_adapter/api/middleware/auth.py,sha256=bic-ez4o4xh74ZczLXSNafrk_m2qk82GF9MHmfDpf9w,4891
16
- mcp_proxy_adapter/api/middleware/auth_adapter.py,sha256=HBPkITt-BWiumbUhk-wv2lwJLNJnv079R4W4Fra4SDs,8045
17
- mcp_proxy_adapter/api/middleware/base.py,sha256=aMV9YPLHkUnJECuQWYbnlEGaj6xUJFHZR_hJb0OKvu8,2282
18
- mcp_proxy_adapter/api/middleware/error_handling.py,sha256=avIZTjXj1sNOT3ekKtLAYJKM7V4duX0BF9PW-j18dEY,7134
19
- mcp_proxy_adapter/api/middleware/factory.py,sha256=bH2PFZ4kXvMDgr8mPRJ1FpuGX9fHtD-Z15BnGuSrvEU,7433
20
- mcp_proxy_adapter/api/middleware/logging.py,sha256=VvUUX7bN4davCzFO6GYbN1O4sgJjOspV-EBLE3xpwpc,4730
21
- mcp_proxy_adapter/api/middleware/mtls_adapter.py,sha256=IkrYXCw3CbaEbgngjh58JWCylTYNqsk2b6qFjmho4OM,10624
22
- mcp_proxy_adapter/api/middleware/mtls_middleware.py,sha256=q7TmMF-M3JCH2quEV1DtYqHpuYB-7oIdA5lUiyzfKo0,10618
23
- mcp_proxy_adapter/api/middleware/performance.py,sha256=dHBxTF43LEGXMKHMH3A8ybKmwAWURd_zswqq_oC4xbw,2454
24
- mcp_proxy_adapter/api/middleware/protocol_middleware.py,sha256=ts9_XD7oI6ZPOAvRDwGKbduRL3MH1_wDP3ET7MnVwEE,4851
25
- mcp_proxy_adapter/api/middleware/rate_limit.py,sha256=DIv_-ZUVmL-jEo_A5BlfnasZf25zT84AiIJDUUnXkpM,5041
26
- mcp_proxy_adapter/api/middleware/rate_limit_adapter.py,sha256=lYKl1q-w7uMLrNDltmac2yQSimYDYek2VuVmFPn4XlQ,8709
27
- mcp_proxy_adapter/api/middleware/roles_adapter.py,sha256=FkAs-eRfcwOsJjr7_3TPR-fu7mXagoJ2ze143ThtNmA,12827
28
- mcp_proxy_adapter/api/middleware/roles_middleware.py,sha256=cHx9rUVFnrHA-Y_eAUB7NLrK4vEC9p4WklL2oDcZNmU,13336
29
- mcp_proxy_adapter/api/middleware/security.py,sha256=I4Yo5lwrQYo1HcuAVDqkg79hhU7XB0oM08bDTan9Pw8,12918
30
- mcp_proxy_adapter/api/middleware/token_auth_middleware.py,sha256=qUv8XdXi1TJksHJ1GT2EAdLS0FvHWoEpx8zG_GBZAvk,8561
31
- mcp_proxy_adapter/api/middleware/transport_middleware.py,sha256=Esy2gGKpEV5RoUTilr1YKKTDc5jh5RxsomD0VXyR2pE,4396
32
- mcp_proxy_adapter/commands/__init__.py,sha256=dFyvN2RLZrraqbeeOMg26qAN22T0ETfcdQtLAMStx3w,1223
33
- mcp_proxy_adapter/commands/auth_validation_command.py,sha256=z612WJDVgZwaCrxdQhATwRc5i3qxH37MPuIV6SuZPn8,15083
34
- mcp_proxy_adapter/commands/base.py,sha256=h6AKBWRUKJSSDUTy0BMPZyWRbXNDVpVM8-H0tVto31M,15562
35
- mcp_proxy_adapter/commands/builtin_commands.py,sha256=QFEZg2UH284_aN9VkCRMScU-kVpSO6lSIFrKP4E0O40,3029
36
- mcp_proxy_adapter/commands/catalog_manager.py,sha256=FVyF2Ky8DUmvFxjiem3YeC9ASFOzCZ9Lp2MsNobA1wI,34712
37
- mcp_proxy_adapter/commands/cert_monitor_command.py,sha256=JWitmmHDeooWXt2fWLbcfAHDeHpsTL2AuBaoka7OWNE,24485
38
- mcp_proxy_adapter/commands/certificate_management_command.py,sha256=4byTb1yCqTQCbNH_L4p_z3HithuugzI3a-H9gjiLDhg,24440
39
- mcp_proxy_adapter/commands/command_registry.py,sha256=BWCEzM1e1HicXtzPJgz7zu1y7OJtrDgJRF3eUvGIXvE,34880
40
- mcp_proxy_adapter/commands/config_command.py,sha256=-Z6BGaEQTf859l56zZpHYBeZFeIVdpMYybDrd7LOPIg,3553
41
- mcp_proxy_adapter/commands/dependency_container.py,sha256=Uz9OPRAUZN7tsVrMVgXgPQcsRD2N-e2Ixg9XarPOlnY,3410
42
- mcp_proxy_adapter/commands/dependency_manager.py,sha256=lmY79MBkh-JRIPsYxSkdrUE9XHi4XBCbucaEMT0w6do,7683
43
- mcp_proxy_adapter/commands/health_command.py,sha256=uo6iND710oSUHEZm6ueT0TsKXRJKFbxUiVeSK57SBlE,4575
44
- mcp_proxy_adapter/commands/help_command.py,sha256=dfqNt1h2H6vQJ9rLySWa_-0-QzesnN-Mgx0cz-uFlIo,13051
45
- mcp_proxy_adapter/commands/hooks.py,sha256=Gu5TDSgA9EBHexWMWze8wgT63i6-dMEEwG8edWbrX3U,10060
46
- mcp_proxy_adapter/commands/key_management_command.py,sha256=qin-iYXksIXOkZEfmJpclJSOyKaz9qRinj9uVa8hkdk,19339
47
- mcp_proxy_adapter/commands/load_command.py,sha256=2zwPOCSBck6mr5KehyyH8lPRAqYYGeUeIIJdbxMSoZk,5984
48
- mcp_proxy_adapter/commands/plugins_command.py,sha256=Te6YQH0ukJWIHAAEJE5DmdAilpjO1QMDa_PexhfQLH0,8531
49
- mcp_proxy_adapter/commands/protocol_management_command.py,sha256=XSrNPGagopM4SinrSmNFW12KLng7-Oc9q6NpiInJ-QI,8485
50
- mcp_proxy_adapter/commands/proxy_registration_command.py,sha256=oO-NgkxK12EEGx7K7epmawhWgK1j2-Un8OBw-bFCV8s,8535
51
- mcp_proxy_adapter/commands/reload_command.py,sha256=6yJduQlIgXhtDSH4Q8qmfR8wZW1RVC1WT1eBIpxzCNo,7507
52
- mcp_proxy_adapter/commands/result.py,sha256=9iFyoRRZ17q3d822XTMNyqnBvWypyoyV0NiHtM2bCd4,5604
53
- mcp_proxy_adapter/commands/roles_management_command.py,sha256=JSMkW9-Hq9ncltUvBjolQdvSeTa1FY2hoU0oD2mBon4,22471
54
- mcp_proxy_adapter/commands/settings_command.py,sha256=hTBrFRABJDFYwnDf2ryfqoejUe06fM4XMOoiH0Exdyo,6407
55
- mcp_proxy_adapter/commands/ssl_setup_command.py,sha256=P9GvZg1HWxpyjYWARUUsrFUHUhYKf8VvIJqry4eJECg,17405
56
- mcp_proxy_adapter/commands/token_management_command.py,sha256=HigG7wpWR2nqnZV7Xqd8ErX91FJ5rOYxfqjHNYHs18A,18146
57
- mcp_proxy_adapter/commands/transport_management_command.py,sha256=yv2lqUqJliYGIbYW7t0HQTrt5Cu2Y02rUjVzdznLtPk,4692
58
- mcp_proxy_adapter/commands/unload_command.py,sha256=mhRZ23sJtTwUfWkjZzH8KDRpwxUX0kdu8LbAXAURRJc,5079
59
- mcp_proxy_adapter/core/__init__.py,sha256=Ch50cV5Nd8m-HO9rMnVModajjwDK-OdUy7hxISDFkAM,800
60
- mcp_proxy_adapter/core/auth_validator.py,sha256=lJxBVkoQWSk5CNtnPYMEJSsz4FhcXK-gB5QJ_OP9jEE,20937
61
- mcp_proxy_adapter/core/certificate_utils.py,sha256=6wxTf8dYXb4pCDVkFqKkeJE0Zc_CyzefgmzQT6dTi1c,30448
62
- mcp_proxy_adapter/core/config_converter.py,sha256=FAA2zx-yRgqMgzg73o9Aq5CEEfodNCeaA8Yluto4wAs,16985
63
- mcp_proxy_adapter/core/config_validator.py,sha256=qDVmkRatuDeWylIPLjMq02Vpzff6DDTE_CstpzqGi7o,7773
64
- mcp_proxy_adapter/core/errors.py,sha256=s34OxiIR4NCJu_pYSigKXqrIvRjUUK2OWw0X4dpDjIA,5151
65
- mcp_proxy_adapter/core/logging.py,sha256=Cw0idPAq0z0dJ9pea2kPOMPqAFS5pwKjwmjkZJRe-ak,9482
66
- mcp_proxy_adapter/core/protocol_manager.py,sha256=ZSjnjtuo9tlaNAddmo2x9XL0i7R-SPPwFBJQSx8FerA,8105
67
- mcp_proxy_adapter/core/proxy_registration.py,sha256=n3p0KfdMqmTmrJZmC_nsTB-ZMCVuwzVFtTBaqojVqdM,9734
68
- mcp_proxy_adapter/core/role_utils.py,sha256=wMoTVz3gF5fM7jozNMwsEwPkp1tui26M-t_KH1Oz8gs,12880
69
- mcp_proxy_adapter/core/security_adapter.py,sha256=8cc-76a423AIk-5JFh0VG2mUwEMJT3XbdUrUMo19dzU,13426
70
- mcp_proxy_adapter/core/security_factory.py,sha256=4r7qvBq30XfosGD_b1ZHyNVLN8rOQ3NAKuaCOCEK8jA,8262
71
- mcp_proxy_adapter/core/settings.py,sha256=ZfUnmqD1tjAuaQo2VAF8evC1oHUit7gTu4WkTF0IMYI,10628
72
- mcp_proxy_adapter/core/ssl_utils.py,sha256=aBJZhc-5BX4Z9PaQMHEqbAJ8DWdDDZc9REY8MZTedfE,8197
73
- mcp_proxy_adapter/core/transport_manager.py,sha256=sRDNK6yTUCfQjv2c9nIN2hZuneY3GQn8VPmCxkOmJu0,9506
74
- mcp_proxy_adapter/core/utils.py,sha256=ly8Ttg2v1OBukThJLxudRvmttU1hxJFLJUfat4b2dOI,3268
75
- mcp_proxy_adapter/examples/README.md,sha256=rAaBDPCuat7RWaeoCFSR4X92XPn0OmD2QQaYBAT-rz4,3342
76
- mcp_proxy_adapter/examples/__init__.py,sha256=Y0Q3rsoHZTIJS0gHbcE3W-htBkUkeYFSZG7sAfowMUI,147
77
- mcp_proxy_adapter/examples/basic_server/README.md,sha256=E5dzfz3X6tPtLpNOOmbmZ2F6do_R9xy9wDI66KjlooY,1223
78
- mcp_proxy_adapter/examples/basic_server/__init__.py,sha256=63tFue2XfrlkNpIMC3foQxGOYooZiIHJkKFlmSjqgPw,128
79
- mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json,sha256=OQGAT2TUERhnznpOV0IsUix5JM-am7VCEvG97BWUxos,1003
80
- mcp_proxy_adapter/examples/basic_server/config.json,sha256=QYJV44juWVWUZtsnFavXkmThpC5yl7ICCX06akckBbU,1835
81
- mcp_proxy_adapter/examples/basic_server/config_all_protocols.json,sha256=A08uRS-01N3pDHdO__PVKX4-im9nN3_VhOePWTUkZdY,1312
82
- mcp_proxy_adapter/examples/basic_server/config_http.json,sha256=6kilmP_AQfiGXx3xlbsJYOsFaGOTczYQ5H0uTUeqvB4,1813
83
- mcp_proxy_adapter/examples/basic_server/config_http_only.json,sha256=UF403UCBZOaDXHaviH997rhKrWqtYbivNYWWhtBigd4,1146
84
- mcp_proxy_adapter/examples/basic_server/config_https.json,sha256=f_BKYdtTBwJocxouK1-xmIvugpEz-w5hQkA4DnMtndY,1386
85
- mcp_proxy_adapter/examples/basic_server/config_mtls.json,sha256=TV7Jein1Gdb-ep7fPPyAWdfmoItNh7yXvMbQmXaB2I8,1402
86
- mcp_proxy_adapter/examples/basic_server/config_ssl.json,sha256=r9rVZcgjU-8MULs-XXp_LZNSZQ4Misbe5JLa2AdsnyM,1097
87
- mcp_proxy_adapter/examples/basic_server/custom_settings_example.py,sha256=9VM7_D5OzSZ-eezH17gthsLo3DvklOtzkx-3QM9j8RU,8218
88
- mcp_proxy_adapter/examples/basic_server/server.py,sha256=uR7vtjHUz1cXfWqsEd8IGb1f7CpvCdDolKCgMs4Xw08,4322
89
- mcp_proxy_adapter/examples/custom_commands/README.md,sha256=nkrZ-mbz0AfnYUVb57hPsO4jUadWvDaUTWkIDUwY0VY,3881
90
- mcp_proxy_adapter/examples/custom_commands/__init__.py,sha256=yUKbYt6pnxp9y-seMZK5LaMT9KgWSt8gNDRtoWnBQ0k,713
91
- mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py,sha256=W4NgefEvRUhzBJcyR8ugFNeWjKqoO5vPNNsAmuVzGgI,21727
92
- mcp_proxy_adapter/examples/custom_commands/config.json,sha256=6cb91QYskJ9NU92lNpYTXY-pP_tTggvm_ugexKyhSFo,2881
93
- mcp_proxy_adapter/examples/custom_commands/config_all_protocols.json,sha256=XZHx1vqDsrtEELLJ0Q4gKRcX0fIVhODpXzi2iZc1UcU,996
94
- mcp_proxy_adapter/examples/custom_commands/config_https_only.json,sha256=6K4MAB1ttOvdJXn36Ajmjxwl4o0DJWFDQ2xDCcFcqZ8,970
95
- mcp_proxy_adapter/examples/custom_commands/config_https_transport.json,sha256=zWLBZdL24wJ_Gg2qLFhV56GRuY4XAzw1sj9lYpmZnQs,765
96
- mcp_proxy_adapter/examples/custom_commands/config_mtls_only.json,sha256=FwQoNNKV48x8k1RAjawEMTwrmKsrQpJGy_prHdd60ho,959
97
- mcp_proxy_adapter/examples/custom_commands/config_mtls_transport.json,sha256=e04F6k1l7EGvXs48GQe8tk3kQRxLyPJg3lH0Fgy0EeY,760
98
- mcp_proxy_adapter/examples/custom_commands/config_single_transport.json,sha256=fF2FqPjypWs8PTXjISd425eszW0H66TErG4R1CtT_BA,676
99
- mcp_proxy_adapter/examples/custom_commands/custom_health_command.py,sha256=V7qqFRgFQAxriEnUtkJ_sHjIOCjGjeqgsHjcfZrd26w,5473
100
- mcp_proxy_adapter/examples/custom_commands/custom_help_command.py,sha256=3HPj4peKcwbwSfXW2ATQ4vFGvbsXLxfZXfxjjPYiowU,7486
101
- mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py,sha256=txm6oC8jP-nOHNgWlB2B0_YIYf2YQFSqLYpObNyDDq4,2408
102
- mcp_proxy_adapter/examples/custom_commands/custom_settings.json,sha256=-5RQlIZzTIZLb8-OqIDc-2kEred2tbJncZBLHYHTvZA,2413
103
- mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py,sha256=JDkxfnxSDg2mASEKq4LTjpyT-QhVlCCY51YicTqP4Y8,9290
104
- mcp_proxy_adapter/examples/custom_commands/data_transform_command.py,sha256=Pi8noxGMbvj5rPqE-Yf-MFiN2g3LQZwuS9GgISY1588,4400
105
- mcp_proxy_adapter/examples/custom_commands/echo_command.py,sha256=5cP0MQiTcpEiix7k5oBD2aHEHcYDS75nIrS23KETzd0,3394
106
- mcp_proxy_adapter/examples/custom_commands/full_help_response.json,sha256=k-KtPleorNwCwNaE7Mo8SqdfSGqWu2-rrH7r04audKU,21038
107
- mcp_proxy_adapter/examples/custom_commands/generated_openapi.json,sha256=xIJi2jrpj-Q5AfI-n4iibpF0_ES-IG8QrRO4-YrgGLA,18502
108
- mcp_proxy_adapter/examples/custom_commands/get_openapi.py,sha256=eg-nqJwmzl3ks6WWcGTSG6pHlBTk6OVv5ToQwKE2nXM,3927
109
- mcp_proxy_adapter/examples/custom_commands/hooks.py,sha256=Zfd-9T2XYJF7XMgQmEGdzWtM8Gz2EF8dn-jNJbYOgb4,7486
110
- mcp_proxy_adapter/examples/custom_commands/intercept_command.py,sha256=06xPpS-9kC6Lu-b6anES1ah8gLtP0sgFL4N1JkDkOrk,3716
111
- mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py,sha256=4Bma586HU17IpuVuCuG-_rk-kycDx_oN6gKJ-q3DQr4,2787
112
- mcp_proxy_adapter/examples/custom_commands/proxy_connection_manager.py,sha256=c6TRZQisnBz5XBLISQUxpWtmnzy7_hVR8HkgWZ7L8io,9993
113
- mcp_proxy_adapter/examples/custom_commands/server.py,sha256=7vPHAd-hmOk04M6ogQC7EO9tz_FaCoL6Ggjhfo4QD_E,10258
114
- mcp_proxy_adapter/examples/custom_commands/simple_openapi_server.py,sha256=Z_JbS2h3RRRGg6t9v2J4L42eJn78HCbyqcdRKUaS8TY,2337
115
- mcp_proxy_adapter/examples/custom_commands/start_server_with_proxy_manager.py,sha256=54FoME6iv2cHs67hmu7YhjTNTMWhQL0b2eyZBUtEgGQ,11265
116
- mcp_proxy_adapter/examples/custom_commands/start_server_with_registration.py,sha256=nw5QGSXJiwWmp5LnTtMrr_dpMJngAkjrU4b4jaqGnfc,10472
117
- mcp_proxy_adapter/examples/custom_commands/test_hooks.py,sha256=0VUwENRAAYGDYMUxXVEA_EByKiHQiqJmdkul1LvebQE,5288
118
- mcp_proxy_adapter/examples/custom_commands/test_openapi.py,sha256=rYvWTMB-Rx8fAeoDFgDHWCJ6zyiyJWDrL4_bmlrYjI4,660
119
- mcp_proxy_adapter/examples/custom_commands/test_registry.py,sha256=ZvSUrpn5L4lidHpVa78-y-_0tCjWQsIoVd5S31fI_js,738
120
- mcp_proxy_adapter/examples/custom_commands/test_simple.py,sha256=-eb0EJWOsyvEqCKqQD2uRyvB88G0sgoj62pKc1YLMAI,560
121
- mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py,sha256=AN5b9FNYobhDL5MWaftVy0imcAlbEuLIxwRQYX1U-_o,161
122
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py,sha256=M0QlkCdSY9rD1b88JdZLlVMo2zU9iCnWC4DeSWCtU44,2725
123
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py,sha256=zPgPc43YLKY6xObrLAqADne6T06bs3zCsx3BCeFZa0Q,2889
124
- mcp_proxy_adapter/examples/custom_commands/auto_commands/test_command.py,sha256=9rrwKuKJB0w2Ny4MVRs70_DGv2RiRPZJsOMEjr-iOC8,3015
125
- mcp_proxy_adapter/examples/custom_commands/catalog/commands/test_command.py,sha256=-Qe_1OwsYyt3ZGWyz4Zr9yFOwATeiW_Nj2ekIrcylG4,3475
126
- mcp_proxy_adapter/examples/custom_commands/loadable_commands/test_ignored.py,sha256=-Qe_1OwsYyt3ZGWyz4Zr9yFOwATeiW_Nj2ekIrcylG4,3475
127
- mcp_proxy_adapter/examples/custom_project_example/README.md,sha256=lUoewJU7NwyfF5imnKnr3XTzqXCduvB4IXgV-S5bkVM,2549
128
- mcp_proxy_adapter/examples/custom_project_example/README_EN.md,sha256=XFcrx_ib6nX0NUCxFBFN3BnEgJ1IsLRFNZW2afatYvI,2283
129
- mcp_proxy_adapter/examples/deployment/README.md,sha256=5JzrIQPEw1NolHsHRKByNxbUTLj__ZYI9WQrtbxLJMk,1227
130
- mcp_proxy_adapter/examples/deployment/__init__.py,sha256=Nu3mrZT9kg5-GK4AUtdcnE9uSa9QdeLStBMXWrR4fHA,131
131
- mcp_proxy_adapter/examples/deployment/config.development.json,sha256=o-P1s0Ci3CpaoS7f4xrCej1FyumuhqJwFsnhIFFcy-I,156
132
- mcp_proxy_adapter/examples/deployment/config.json,sha256=xXEr378-nkWn2RVkkPt-hvkSlFy12brXO6Ntqs2sZxE,505
133
- mcp_proxy_adapter/examples/deployment/config.production.json,sha256=3cWz5d50_Ojx1f_Wn9C6jh5cET4hyPlpacOFckVhg54,299
134
- mcp_proxy_adapter/examples/deployment/config.staging.json,sha256=8maxqWfSZ3mHtjpIOCa37JQXUs2iEZacwBSc0wcvpRE,270
135
- mcp_proxy_adapter/examples/deployment/docker-compose.yml,sha256=jYVVsegJIXtxy9IVhj2WEyjLs7omDWXP1lUkwMCydLg,739
136
- mcp_proxy_adapter/examples/deployment/run.sh,sha256=tzvjztSwewtetewjFb2MUVjOym9G0rVKVDLSmLKuB-E,1352
137
- mcp_proxy_adapter/examples/deployment/run_docker.sh,sha256=XniKJkDproyPxsENZAa55PAO7WmzmPNqqFhZHEp2PKQ,2668
138
- mcp_proxy_adapter/examples/simple_custom_commands/README.md,sha256=qzGfxjIVbz6RHBQ4OsNIOKLc4N81H1f5ldT_69asqKM,4390
139
- mcp_proxy_adapter/examples/simple_custom_commands/README_EN.md,sha256=Q5AHfu9pJVT_puLuKQY5BS-pO-9MIgq3EjQwZIBoCs8,3855
140
- mcp_proxy_adapter/schemas/base_schema.json,sha256=v9G9cGMd4dRhCZsOQ_FMqOi5VFyVbI6Cf3fyIvOT9dc,2881
141
- mcp_proxy_adapter/schemas/openapi_schema.json,sha256=C3yLkwmDsvnLW9B5gnKKdBGl4zxkeU-rEmjTrNVsQU0,8405
142
- mcp_proxy_adapter/schemas/roles_schema.json,sha256=deHgI7L6GwfBXacOlNtDgDJelDThppClC3Ti4Eh8rJY,5659
143
- mcp_proxy_adapter/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
- mcp_proxy_adapter/tests/conftest.py,sha256=VBA2wLeYfp9XAGSq4c489PVBIqMGAJiQPrT0k3kyzXw,2999
145
- mcp_proxy_adapter/tests/test_api_endpoints.py,sha256=ePtWCf0szD1JeY9WdHAhcKnuOzoSCpUcqZ_2DVhlC-A,10280
146
- mcp_proxy_adapter/tests/test_api_handlers.py,sha256=LeHO0o6eCxan6mt_8ZkUwSbeY7qYfoYMJ-bT_sSgdxc,11011
147
- mcp_proxy_adapter/tests/test_base_command.py,sha256=nSIi_mfjux8TL--65pMBfyg91EiLjJhI2P_ASWqyW-U,3779
148
- mcp_proxy_adapter/tests/test_batch_requests.py,sha256=9-gvhPq48AcEwGlhwgn3DWNhpleLA0f4luZNYMrqlXY,4103
149
- mcp_proxy_adapter/tests/test_command_registry.py,sha256=ywi5gM7D7NHcNOkdwXOgpJqHjwGADZEaB3ueM3nR0gM,7683
150
- mcp_proxy_adapter/tests/test_config.py,sha256=i4YbFhB3WI1wWKCxkG6l-UpFv2LAbhh4hmGipmYG1d0,3928
151
- mcp_proxy_adapter/tests/test_utils.py,sha256=K8DqdWDAV-cXjjeykehHpG5phfq5ydu2HLJzaAL282Y,1653
152
- mcp_proxy_adapter/tests/api/__init__.py,sha256=QzjeBIhrRLqfUKYmxVSCbMOoni5MAXgyAx9HxxB6JRs,27
153
- mcp_proxy_adapter/tests/api/test_cmd_endpoint.py,sha256=RFg_N7Ut1l_pncUPMaqVg85XV4KTpVe03yI_VA0Z47o,3843
154
- mcp_proxy_adapter/tests/api/test_custom_openapi.py,sha256=oSZ61G-CzrlGe7-F5OXMeNR2N2dZnKDH-npS9vumHqE,26404
155
- mcp_proxy_adapter/tests/api/test_handlers.py,sha256=RjO5yjUwpl9UPX45z9qSSvjU1gl9F7MHDEbnLFYL1GE,18921
156
- mcp_proxy_adapter/tests/api/test_middleware.py,sha256=3Rgc09VJ7JG6_06oIgAVq6u7qJsaiuhW0KpfDjxk8Ac,12285
157
- mcp_proxy_adapter/tests/api/test_schemas.py,sha256=QJbo-aWwhe233U9VKBWaTDudmDEkkvcOeX0hoIst1nM,19986
158
- mcp_proxy_adapter/tests/api/test_tool_integration.py,sha256=zCLztv4OLRKeug_VD2MwqewrhrSE52_Xzto3yOY72wY,21720
159
- mcp_proxy_adapter/tests/commands/__init__.py,sha256=DZxhtyr__AleyXN1s8Ef887tK5nsoHKfW4QXyzLaP0E,36
160
- mcp_proxy_adapter/tests/commands/test_config_command.py,sha256=ud0Y57xUhFiyrUKDyA0eBZ8IOKiGDpioijtwY-detC4,6522
161
- mcp_proxy_adapter/tests/commands/test_echo_command.py,sha256=c2dmqfx3ZfvDedy5vuxArFv7iHsReepMmD2Lchg4l3E,3437
162
- mcp_proxy_adapter/tests/commands/test_help_command.py,sha256=0kylFDGSYV-YStVCf_j7_4EF8VDaClIZbJz3V2V2-DI,4272
163
- mcp_proxy_adapter/tests/functional/__init__.py,sha256=muVNR6LD5o7DsDaLrbLTFsavUNcnyM608-mr-dqzgDU,59
164
- mcp_proxy_adapter/tests/functional/test_api.py,sha256=OaGB-WAWVyX4b0b-mCdXBNhwwYABYeBPO3IDnA3I00c,7114
165
- mcp_proxy_adapter/tests/integration/__init__.py,sha256=JZpeNG1PBRZ3k5zfq6NH3GyzDc1Yx1ZUgwi6eLBxs1o,60
166
- mcp_proxy_adapter/tests/integration/test_cmd_integration.py,sha256=BS3lA6ayveMckHcy1WJjyqR7l7WTcjmGiCYSnMjVfO0,3415
167
- mcp_proxy_adapter/tests/integration/test_integration.py,sha256=Rf8GTxdZOvZzrtgqWN2fp-36qUU5rpHdV9zhN1JxNw8,6619
168
- mcp_proxy_adapter/tests/performance/__init__.py,sha256=2kHf6g4LmYnFuV4EALXzo7Qk9vHGA9DXZFt7nORRFjM,60
169
- mcp_proxy_adapter/tests/performance/test_performance.py,sha256=Djrnu-SsXRrc_Prj1Aw8OoPzPUwHJds-Itk3aX6o01w,5730
170
- mcp_proxy_adapter/tests/stubs/__init__.py,sha256=qJ_gqvLdt68rAfLOeJpjVcLWyWdhEg6RkKheyV2yjJs,178
171
- mcp_proxy_adapter/tests/stubs/echo_command.py,sha256=Y7SA4IB5Lo_ncn78SDm9iRZvJSKy2pXi2nBQjIUPrvg,2620
172
- mcp_proxy_adapter/tests/unit/__init__.py,sha256=RS-5UoSCcLKtr2jrAaZw_NG9MquA6BZmxq-P6cTw9ok,53
173
- mcp_proxy_adapter/tests/unit/test_base_command.py,sha256=iCJzmfcvknS6pnzqu9TSkpgKBGoYCLWu0aQekcj1AME,18183
174
- mcp_proxy_adapter/tests/unit/test_config.py,sha256=_suOuPN7rMl0bjHQ34ZT9gjzF-3cgsKpNFuFdCsTdN0,8081
175
- mcp_proxy_adapter-6.0.0.dist-info/licenses/LICENSE,sha256=OkApFEwdgMCt_mbvUI-eIwKMSTe38K3XnU2DT5ub-wI,1072
176
- mcp_proxy_adapter-6.0.0.dist-info/METADATA,sha256=UuWt3yXxVYK2kcRItEsewPGhbcXoMmQqkssLZRkG3qQ,7589
177
- mcp_proxy_adapter-6.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
178
- mcp_proxy_adapter-6.0.0.dist-info/top_level.txt,sha256=JZT7vPLBYrtroX-ij68JBhJYbjDdghcV-DFySRy-Nnw,18
179
- mcp_proxy_adapter-6.0.0.dist-info/RECORD,,