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,176 +0,0 @@
1
- """
2
- Test Hooks Example
3
-
4
- This script demonstrates the hooks system by making requests to the server
5
- and showing how hooks process the commands.
6
- """
7
-
8
- import requests
9
- import json
10
- import time
11
-
12
-
13
- def test_echo_hooks():
14
- """Test echo command with hooks."""
15
- print("\n🔔 Testing Echo Command with Hooks")
16
- print("=" * 50)
17
-
18
- # Test basic echo
19
- response = requests.post(
20
- "http://localhost:8000/cmd",
21
- json={
22
- "command": "echo",
23
- "params": {"message": "Hello from hooks!"}
24
- }
25
- )
26
-
27
- if response.status_code == 200:
28
- result = response.json()
29
- print("✅ Echo command executed successfully")
30
- print(f"📤 Result: {json.dumps(result, indent=2)}")
31
- else:
32
- print(f"❌ Error: {response.status_code} - {response.text}")
33
-
34
-
35
- def test_help_hooks():
36
- """Test help command with hooks."""
37
- print("\n📖 Testing Help Command with Hooks")
38
- print("=" * 50)
39
-
40
- # Test help for all commands
41
- response = requests.post(
42
- "http://localhost:8000/cmd",
43
- json={"command": "help"}
44
- )
45
-
46
- if response.status_code == 200:
47
- result = response.json()
48
- print("✅ Help command executed successfully")
49
- print(f"📚 Total commands: {result.get('total', 0)}")
50
- print(f"🔧 Custom features: {result.get('custom_features', {})}")
51
- else:
52
- print(f"❌ Error: {response.status_code} - {response.text}")
53
-
54
- # Test help for specific command
55
- response = requests.post(
56
- "http://localhost:8000/cmd",
57
- json={
58
- "command": "help",
59
- "params": {"cmdname": "echo"}
60
- }
61
- )
62
-
63
- if response.status_code == 200:
64
- result = response.json()
65
- print("✅ Help for echo command executed successfully")
66
- print(f"📖 Command info: {result.get('info', {}).get('description', 'N/A')}")
67
- else:
68
- print(f"❌ Error: {response.status_code} - {response.text}")
69
-
70
-
71
- def test_health_hooks():
72
- """Test health command with hooks."""
73
- print("\n🏥 Testing Health Command with Hooks")
74
- print("=" * 50)
75
-
76
- response = requests.post(
77
- "http://localhost:8000/cmd",
78
- json={"command": "health"}
79
- )
80
-
81
- if response.status_code == 200:
82
- result = response.json()
83
- print("✅ Health command executed successfully")
84
-
85
- data = result.get("data", {})
86
- print(f"🏥 Status: {data.get('status', 'unknown')}")
87
- print(f"⏱️ Uptime: {data.get('uptime', 0):.2f}s")
88
-
89
- custom_metrics = data.get("custom_metrics", {})
90
- print(f"🔧 Hook enhanced: {custom_metrics.get('hook_enhanced', False)}")
91
- print(f"🆔 Health check ID: {custom_metrics.get('health_check_id', 'N/A')}")
92
- else:
93
- print(f"❌ Error: {response.status_code} - {response.text}")
94
-
95
-
96
- def test_security_hooks():
97
- """Test security hooks with sensitive data."""
98
- print("\n🔒 Testing Security Hooks")
99
- print("=" * 50)
100
-
101
- # Test with sensitive parameter
102
- response = requests.post(
103
- "http://localhost:8000/cmd",
104
- json={
105
- "command": "echo",
106
- "params": {
107
- "message": "Test message",
108
- "password": "secret123",
109
- "api_token": "sensitive_data"
110
- }
111
- }
112
- )
113
-
114
- if response.status_code == 200:
115
- result = response.json()
116
- print("✅ Echo command with sensitive data executed")
117
- print("🔒 Security hooks should have logged warnings")
118
- else:
119
- print(f"❌ Error: {response.status_code} - {response.text}")
120
-
121
-
122
- def test_performance_hooks():
123
- """Test performance hooks with slow operation simulation."""
124
- print("\n⏱️ Testing Performance Hooks")
125
- print("=" * 50)
126
-
127
- # Test with a command that might be slow
128
- response = requests.post(
129
- "http://localhost:8000/cmd",
130
- json={
131
- "command": "health",
132
- "params": {}
133
- }
134
- )
135
-
136
- if response.status_code == 200:
137
- result = response.json()
138
- print("✅ Health command executed")
139
- print("⏱️ Performance hooks should have logged execution time")
140
- else:
141
- print(f"❌ Error: {response.status_code} - {response.text}")
142
-
143
-
144
- def main():
145
- """Run all hook tests."""
146
- print("🧪 Testing Custom Commands with Hooks")
147
- print("=" * 60)
148
- print("Make sure the server is running on http://localhost:8000")
149
- print("Check the server logs to see hook activity")
150
- print("=" * 60)
151
-
152
- # Wait a moment for server to be ready
153
- time.sleep(1)
154
-
155
- try:
156
- test_echo_hooks()
157
- test_help_hooks()
158
- test_health_hooks()
159
- test_security_hooks()
160
- test_performance_hooks()
161
-
162
- print("\n✅ All tests completed!")
163
- print("📋 Check the server logs to see hook activity:")
164
- print(" - Command-specific hooks")
165
- print(" - Global hooks")
166
- print(" - Performance monitoring")
167
- print(" - Security monitoring")
168
-
169
- except requests.exceptions.ConnectionError:
170
- print("❌ Could not connect to server. Make sure it's running on http://localhost:8000")
171
- except Exception as e:
172
- print(f"❌ Error during testing: {e}")
173
-
174
-
175
- if __name__ == "__main__":
176
- main()
@@ -1,27 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Simple test server to get OpenAPI schema.
4
- """
5
-
6
- import uvicorn
7
- from fastapi import FastAPI
8
- from mcp_proxy_adapter.custom_openapi import custom_openapi_with_fallback
9
-
10
- # Create FastAPI app
11
- app = FastAPI(
12
- title="Test MCP Proxy Server",
13
- description="Test server for OpenAPI schema",
14
- version="1.0.0"
15
- )
16
-
17
- # Set custom OpenAPI generator
18
- app.openapi = lambda: custom_openapi_with_fallback(app)
19
-
20
- # Add OpenAPI endpoint
21
- @app.get("/openapi.json")
22
- async def get_openapi_schema():
23
- """Returns OpenAPI schema."""
24
- return custom_openapi_with_fallback(app)
25
-
26
- if __name__ == "__main__":
27
- uvicorn.run(app, host="0.0.0.0", port=8001)
@@ -1,23 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Test script to understand registry issues.
4
- """
5
-
6
- import sys
7
- import os
8
- sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
9
-
10
- print("1. Importing registry directly...")
11
- from mcp_proxy_adapter.commands.command_registry import registry
12
- print(f" Registry type: {type(registry)}")
13
- print(f" Registry has reload_system: {hasattr(registry, 'reload_system')}")
14
- print(f" Registry methods: {[m for m in dir(registry) if not m.startswith('_')]}")
15
-
16
- print("2. Testing reload_system...")
17
- try:
18
- result = registry.reload_system()
19
- print(f" ✅ reload_system worked: {result}")
20
- except Exception as e:
21
- print(f" ❌ reload_system failed: {e}")
22
- import traceback
23
- traceback.print_exc()
@@ -1,19 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Simple test in custom_commands directory.
4
- """
5
-
6
- import sys
7
- import os
8
- sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
9
-
10
- print("1. Importing registry directly...")
11
- from mcp_proxy_adapter.commands.command_registry import registry
12
- print(f" Registry has reload_system: {hasattr(registry, 'reload_system')}")
13
-
14
- print("2. Testing reload_system...")
15
- try:
16
- result = registry.reload_system()
17
- print(f" ✅ reload_system worked: {result}")
18
- except Exception as e:
19
- print(f" ❌ reload_system failed: {e}")
@@ -1,103 +0,0 @@
1
- # Пример пользовательского проекта с командами
2
-
3
- Этот пример показывает, как создать свой проект с командами и настроить `discovery_path` для их автоматического обнаружения.
4
-
5
- ## Структура проекта
6
-
7
- ```
8
- myproject/
9
- ├── config.json
10
- ├── main.py
11
- ├── myproject/
12
- │ ├── __init__.py
13
- │ └── commands/
14
- │ ├── __init__.py
15
- │ ├── echo_command.py
16
- │ └── info_command.py
17
- └── README.md
18
- ```
19
-
20
- ## Конфигурация
21
-
22
- В файле `config.json` указываем путь к нашим командам:
23
-
24
- ```json
25
- {
26
- "server": {
27
- "host": "127.0.0.1",
28
- "port": 8001,
29
- "debug": true,
30
- "log_level": "DEBUG"
31
- },
32
- "logging": {
33
- "level": "DEBUG",
34
- "log_dir": "./logs",
35
- "log_file": "myproject.log"
36
- },
37
- "commands": {
38
- "auto_discovery": true,
39
- "discovery_path": "myproject.commands"
40
- }
41
- }
42
- ```
43
-
44
- ## Команды
45
-
46
- ### echo_command.py
47
-
48
- ```python
49
- from mcp_proxy_adapter.commands.base import Command
50
- from mcp_proxy_adapter.commands.result import CommandResult
51
-
52
- class EchoCommand(Command):
53
- """Echo command that returns the input text."""
54
-
55
- name = "echo"
56
-
57
- def execute(self, text: str) -> CommandResult:
58
- return CommandResult(success=True, data={"echo": text})
59
-
60
- @classmethod
61
- def get_param_info(cls) -> dict:
62
- return {
63
- "text": {
64
- "type": "string",
65
- "description": "Text to echo",
66
- "required": True
67
- }
68
- }
69
- ```
70
-
71
- ### info_command.py
72
-
73
- ```python
74
- from mcp_proxy_adapter.commands.base import Command
75
- from mcp_proxy_adapter.commands.result import CommandResult
76
-
77
- class InfoCommand(Command):
78
- """Info command that returns project information."""
79
-
80
- name = "info"
81
-
82
- def execute(self) -> CommandResult:
83
- return CommandResult(
84
- success=True,
85
- data={
86
- "project": "myproject",
87
- "version": "1.0.0",
88
- "description": "Example project with custom commands"
89
- }
90
- )
91
-
92
- @classmethod
93
- def get_param_info(cls) -> dict:
94
- return {}
95
- ```
96
-
97
- ## Запуск
98
-
99
- ```bash
100
- python main.py
101
- ```
102
-
103
- При запуске сервис автоматически обнаружит команды из пакета `myproject.commands` благодаря настройке `discovery_path` в конфигурации.
@@ -1,103 +0,0 @@
1
- # Custom Project Example with Commands
2
-
3
- This example shows how to create your own project with commands and configure `discovery_path` for their automatic discovery.
4
-
5
- ## Project Structure
6
-
7
- ```
8
- myproject/
9
- ├── config.json
10
- ├── main.py
11
- ├── myproject/
12
- │ ├── __init__.py
13
- │ └── commands/
14
- │ ├── __init__.py
15
- │ ├── echo_command.py
16
- │ └── info_command.py
17
- └── README.md
18
- ```
19
-
20
- ## Configuration
21
-
22
- In the `config.json` file, specify the path to our commands:
23
-
24
- ```json
25
- {
26
- "server": {
27
- "host": "127.0.0.1",
28
- "port": 8001,
29
- "debug": true,
30
- "log_level": "DEBUG"
31
- },
32
- "logging": {
33
- "level": "DEBUG",
34
- "log_dir": "./logs",
35
- "log_file": "myproject.log"
36
- },
37
- "commands": {
38
- "auto_discovery": true,
39
- "discovery_path": "myproject.commands"
40
- }
41
- }
42
- ```
43
-
44
- ## Commands
45
-
46
- ### echo_command.py
47
-
48
- ```python
49
- from mcp_proxy_adapter.commands.base import Command
50
- from mcp_proxy_adapter.commands.result import CommandResult
51
-
52
- class EchoCommand(Command):
53
- """Echo command that returns the input text."""
54
-
55
- name = "echo"
56
-
57
- def execute(self, text: str) -> CommandResult:
58
- return CommandResult(success=True, data={"echo": text})
59
-
60
- @classmethod
61
- def get_param_info(cls) -> dict:
62
- return {
63
- "text": {
64
- "type": "string",
65
- "description": "Text to echo",
66
- "required": True
67
- }
68
- }
69
- ```
70
-
71
- ### info_command.py
72
-
73
- ```python
74
- from mcp_proxy_adapter.commands.base import Command
75
- from mcp_proxy_adapter.commands.result import CommandResult
76
-
77
- class InfoCommand(Command):
78
- """Info command that returns project information."""
79
-
80
- name = "info"
81
-
82
- def execute(self) -> CommandResult:
83
- return CommandResult(
84
- success=True,
85
- data={
86
- "project": "myproject",
87
- "version": "1.0.0",
88
- "description": "Example project with custom commands"
89
- }
90
- )
91
-
92
- @classmethod
93
- def get_param_info(cls) -> dict:
94
- return {}
95
- ```
96
-
97
- ## Running
98
-
99
- ```bash
100
- python main.py
101
- ```
102
-
103
- When starting, the service will automatically discover commands from the `myproject.commands` package thanks to the `discovery_path` configuration setting.
@@ -1,49 +0,0 @@
1
- # Deployment Examples
2
-
3
- This directory contains deployment examples for the MCP Proxy Adapter framework.
4
-
5
- ## Files
6
-
7
- ### Docker Deployment
8
- - `Dockerfile` - Docker image configuration for the framework
9
- - `docker-compose.yml` - Docker Compose configuration for easy deployment
10
- - `run_docker.sh` - Script to run the application in Docker
11
-
12
- ### Local Deployment
13
- - `run.sh` - Script to run the application locally
14
-
15
- ### Configuration Files
16
- - `config.json` - Default configuration file
17
- - `config.development.json` - Development environment configuration
18
- - `config.staging.json` - Staging environment configuration
19
- - `config.production.json` - Production environment configuration
20
-
21
- ## Usage
22
-
23
- ### Local Development
24
- ```bash
25
- ./run.sh
26
- ```
27
-
28
- ### Docker Deployment
29
- ```bash
30
- ./run_docker.sh
31
- ```
32
-
33
- ### Docker Compose
34
- ```bash
35
- docker-compose up -d
36
- ```
37
-
38
- ## Configuration
39
-
40
- Copy the appropriate configuration file to your project root:
41
- ```bash
42
- cp config.development.json config.json
43
- ```
44
-
45
- ## Notes
46
-
47
- - These are example configurations and should be customized for your specific use case
48
- - The framework itself is designed to be used as a library, not as a standalone application
49
- - Modify the configuration files according to your deployment requirements
@@ -1,7 +0,0 @@
1
- """
2
- Deployment Examples
3
-
4
- This package contains deployment examples for the MCP Proxy Adapter framework.
5
- """
6
-
7
- __version__ = "1.0.0"
@@ -1,8 +0,0 @@
1
- {
2
- "host": "0.0.0.0",
3
- "port": 8000,
4
- "log_level": "DEBUG",
5
- "log_file": "logs/mcp_proxy.log",
6
- "cors_origins": ["*"],
7
- "api_keys": ["dev-api-key"]
8
- }
@@ -1,29 +0,0 @@
1
- {
2
- "server": {
3
- "host": "0.0.0.0",
4
- "port": 8000,
5
- "debug": false,
6
- "log_level": "info"
7
- },
8
- "logging": {
9
- "level": "INFO",
10
- "file": "adapter.log",
11
- "rotation": {
12
- "type": "size",
13
- "max_bytes": 10485760,
14
- "backup_count": 5
15
- }
16
- },
17
- "service": {
18
- "name": "MCP Proxy Adapter",
19
- "version": "1.0.0"
20
- },
21
- "discovery": {
22
- "enabled": true,
23
- "package": "commands"
24
- },
25
- "docker": {
26
- "container_name": "mcp-proxy-adapter",
27
- "network": "default"
28
- }
29
- }
@@ -1,12 +0,0 @@
1
- {
2
- "host": "0.0.0.0",
3
- "port": 8000,
4
- "log_level": "WARNING",
5
- "log_file": "logs/mcp_proxy.log",
6
- "log_rotation_type": "time",
7
- "log_rotation_when": "D",
8
- "log_rotation_interval": 1,
9
- "log_rotation_backup_count": 30,
10
- "cors_origins": ["https://example.com"],
11
- "api_keys": ["${API_KEY}"]
12
- }
@@ -1,11 +0,0 @@
1
- {
2
- "host": "0.0.0.0",
3
- "port": 8000,
4
- "log_level": "INFO",
5
- "log_file": "logs/mcp_proxy.log",
6
- "log_rotation_type": "size",
7
- "log_max_bytes": 10485760,
8
- "log_backup_count": 5,
9
- "cors_origins": ["https://staging.example.com"],
10
- "api_keys": ["staging-api-key"]
11
- }
@@ -1,31 +0,0 @@
1
- version: '3.8'
2
-
3
- # Variables for docker-compose
4
- x-environment: &default-env
5
- - CONFIG_PATH=/app/config.json
6
- - LOG_LEVEL=INFO
7
-
8
- x-volume-mounts: &default-mounts
9
- - ./config.json:/app/config.json:ro
10
- - ./logs:/app/logs:rw
11
- - ./data:/app/data:rw
12
- - ./cache:/app/cache:rw
13
-
14
- services:
15
- mcp-proxy-adapter:
16
- container_name: ${CONTAINER_NAME:-mcp-proxy-adapter}
17
- build:
18
- context: ../../
19
- dockerfile: mcp_proxy_adapter/examples/deployment/Dockerfile
20
- ports:
21
- - "127.0.0.1:${HOST_PORT:-8000}:${SERVICE_PORT:-8000}"
22
- volumes: *default-mounts
23
- environment: *default-env
24
- restart: unless-stopped
25
- user: "${USER_ID:-1000}:${GROUP_ID:-1000}"
26
- networks:
27
- - default
28
-
29
- networks:
30
- default:
31
- driver: bridge
@@ -1,43 +0,0 @@
1
- #!/bin/bash
2
-
3
- # MCP Proxy Adapter - Local Development Script
4
- # This script runs the framework locally for development
5
-
6
- # Variables
7
- HOST_PORT=${HOST_PORT:-8000}
8
- CONFIG_PATH=${CONFIG_PATH:-"config.json"}
9
- LOG_LEVEL=${LOG_LEVEL:-"INFO"}
10
-
11
- # Get the project root directory (3 levels up from this script)
12
- PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
13
-
14
- echo "Starting MCP Proxy Adapter locally..."
15
- echo "Project root: $PROJECT_ROOT"
16
- echo "Config path: $CONFIG_PATH"
17
- echo "Port: $HOST_PORT"
18
-
19
- # Activate virtual environment if it exists
20
- if [ -d "$PROJECT_ROOT/.venv" ]; then
21
- echo "Activating virtual environment..."
22
- source "$PROJECT_ROOT/.venv/bin/activate"
23
- fi
24
-
25
- # Install dependencies if needed
26
- if [ ! -d "$PROJECT_ROOT/.venv" ]; then
27
- echo "Creating virtual environment..."
28
- python3 -m venv "$PROJECT_ROOT/.venv"
29
- source "$PROJECT_ROOT/.venv/bin/activate"
30
- pip install -r "$PROJECT_ROOT/requirements.txt"
31
- fi
32
-
33
- # Copy config file if it doesn't exist
34
- if [ ! -f "$PROJECT_ROOT/config.json" ]; then
35
- echo "Copying default config..."
36
- cp "$(dirname "${BASH_SOURCE[0]}")/config.json" "$PROJECT_ROOT/config.json"
37
- fi
38
-
39
- # Run the application
40
- cd "$PROJECT_ROOT"
41
- python -m uvicorn mcp_proxy_adapter.api.app:create_app --host 0.0.0.0 --port $HOST_PORT --reload
42
-
43
- echo "MCP Proxy Adapter started on http://localhost:$HOST_PORT"