mcp-proxy-adapter 3.1.5__py3-none-any.whl → 4.0.0__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 (122) hide show
  1. mcp_proxy_adapter/api/app.py +86 -27
  2. mcp_proxy_adapter/api/handlers.py +1 -1
  3. mcp_proxy_adapter/api/middleware/error_handling.py +11 -10
  4. mcp_proxy_adapter/api/tool_integration.py +5 -2
  5. mcp_proxy_adapter/api/tools.py +3 -3
  6. mcp_proxy_adapter/commands/base.py +19 -1
  7. mcp_proxy_adapter/commands/command_registry.py +258 -6
  8. mcp_proxy_adapter/commands/help_command.py +54 -65
  9. mcp_proxy_adapter/commands/hooks.py +260 -0
  10. mcp_proxy_adapter/commands/reload_command.py +211 -0
  11. mcp_proxy_adapter/commands/reload_settings_command.py +125 -0
  12. mcp_proxy_adapter/commands/settings_command.py +189 -0
  13. mcp_proxy_adapter/config.py +16 -1
  14. mcp_proxy_adapter/core/__init__.py +44 -0
  15. mcp_proxy_adapter/core/logging.py +87 -34
  16. mcp_proxy_adapter/core/settings.py +376 -0
  17. mcp_proxy_adapter/core/utils.py +2 -2
  18. mcp_proxy_adapter/custom_openapi.py +81 -2
  19. mcp_proxy_adapter/examples/README.md +124 -0
  20. mcp_proxy_adapter/examples/__init__.py +7 -0
  21. mcp_proxy_adapter/examples/basic_server/README.md +60 -0
  22. mcp_proxy_adapter/examples/basic_server/__init__.py +7 -0
  23. mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +39 -0
  24. mcp_proxy_adapter/examples/basic_server/config.json +35 -0
  25. mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +238 -0
  26. mcp_proxy_adapter/examples/basic_server/server.py +98 -0
  27. mcp_proxy_adapter/examples/custom_commands/README.md +127 -0
  28. mcp_proxy_adapter/examples/custom_commands/__init__.py +27 -0
  29. mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +250 -0
  30. mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +6 -0
  31. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +103 -0
  32. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +111 -0
  33. mcp_proxy_adapter/examples/custom_commands/config.json +62 -0
  34. mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +169 -0
  35. mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +215 -0
  36. mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +76 -0
  37. mcp_proxy_adapter/examples/custom_commands/custom_settings.json +96 -0
  38. mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +241 -0
  39. mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +135 -0
  40. mcp_proxy_adapter/examples/custom_commands/echo_command.py +122 -0
  41. mcp_proxy_adapter/examples/custom_commands/hooks.py +230 -0
  42. mcp_proxy_adapter/examples/custom_commands/intercept_command.py +123 -0
  43. mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +103 -0
  44. mcp_proxy_adapter/examples/custom_commands/server.py +223 -0
  45. mcp_proxy_adapter/examples/custom_commands/test_hooks.py +176 -0
  46. mcp_proxy_adapter/examples/deployment/README.md +49 -0
  47. mcp_proxy_adapter/examples/deployment/__init__.py +7 -0
  48. mcp_proxy_adapter/examples/deployment/config.development.json +8 -0
  49. {examples/basic_example → mcp_proxy_adapter/examples/deployment}/config.json +11 -7
  50. mcp_proxy_adapter/examples/deployment/config.production.json +12 -0
  51. mcp_proxy_adapter/examples/deployment/config.staging.json +11 -0
  52. mcp_proxy_adapter/examples/deployment/docker-compose.yml +31 -0
  53. mcp_proxy_adapter/examples/deployment/run.sh +43 -0
  54. mcp_proxy_adapter/examples/deployment/run_docker.sh +84 -0
  55. mcp_proxy_adapter/openapi.py +3 -2
  56. mcp_proxy_adapter/tests/api/test_custom_openapi.py +617 -0
  57. mcp_proxy_adapter/tests/api/test_handlers.py +522 -0
  58. mcp_proxy_adapter/tests/api/test_schemas.py +546 -0
  59. mcp_proxy_adapter/tests/api/test_tool_integration.py +531 -0
  60. mcp_proxy_adapter/tests/commands/test_help_command.py +8 -5
  61. mcp_proxy_adapter/tests/integration/test_cmd_integration.py +4 -5
  62. mcp_proxy_adapter/tests/test_command_registry.py +37 -1
  63. mcp_proxy_adapter/tests/unit/test_base_command.py +391 -85
  64. mcp_proxy_adapter/version.py +1 -1
  65. {mcp_proxy_adapter-3.1.5.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/METADATA +1 -1
  66. mcp_proxy_adapter-4.0.0.dist-info/RECORD +110 -0
  67. {mcp_proxy_adapter-3.1.5.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/WHEEL +1 -1
  68. {mcp_proxy_adapter-3.1.5.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/top_level.txt +0 -1
  69. examples/__init__.py +0 -19
  70. examples/anti_patterns/README.md +0 -51
  71. examples/anti_patterns/__init__.py +0 -9
  72. examples/anti_patterns/bad_design/README.md +0 -72
  73. examples/anti_patterns/bad_design/global_state.py +0 -170
  74. examples/anti_patterns/bad_design/monolithic_command.py +0 -272
  75. examples/basic_example/README.md +0 -245
  76. examples/basic_example/__init__.py +0 -8
  77. examples/basic_example/commands/__init__.py +0 -5
  78. examples/basic_example/commands/echo_command.py +0 -95
  79. examples/basic_example/commands/math_command.py +0 -151
  80. examples/basic_example/commands/time_command.py +0 -152
  81. examples/basic_example/docs/EN/README.md +0 -177
  82. examples/basic_example/docs/RU/README.md +0 -177
  83. examples/basic_example/server.py +0 -151
  84. examples/basic_example/tests/conftest.py +0 -243
  85. examples/check_vstl_schema.py +0 -106
  86. examples/commands/echo_command.py +0 -52
  87. examples/commands/echo_command_di.py +0 -152
  88. examples/commands/echo_result.py +0 -65
  89. examples/commands/get_date_command.py +0 -98
  90. examples/commands/new_uuid4_command.py +0 -91
  91. examples/complete_example/Dockerfile +0 -24
  92. examples/complete_example/README.md +0 -92
  93. examples/complete_example/__init__.py +0 -8
  94. examples/complete_example/commands/__init__.py +0 -5
  95. examples/complete_example/commands/system_command.py +0 -328
  96. examples/complete_example/config.json +0 -41
  97. examples/complete_example/configs/config.dev.yaml +0 -40
  98. examples/complete_example/configs/config.docker.yaml +0 -40
  99. examples/complete_example/docker-compose.yml +0 -35
  100. examples/complete_example/requirements.txt +0 -20
  101. examples/complete_example/server.py +0 -113
  102. examples/di_example/.pytest_cache/README.md +0 -8
  103. examples/di_example/server.py +0 -249
  104. examples/fix_vstl_help.py +0 -123
  105. examples/minimal_example/README.md +0 -65
  106. examples/minimal_example/__init__.py +0 -8
  107. examples/minimal_example/config.json +0 -14
  108. examples/minimal_example/main.py +0 -136
  109. examples/minimal_example/simple_server.py +0 -163
  110. examples/minimal_example/tests/conftest.py +0 -171
  111. examples/minimal_example/tests/test_hello_command.py +0 -111
  112. examples/minimal_example/tests/test_integration.py +0 -181
  113. examples/patch_vstl_service.py +0 -105
  114. examples/patch_vstl_service_mcp.py +0 -108
  115. examples/server.py +0 -69
  116. examples/simple_server.py +0 -128
  117. examples/test_package_3.1.4.py +0 -177
  118. examples/test_server.py +0 -134
  119. examples/tool_description_example.py +0 -82
  120. mcp_proxy_adapter/py.typed +0 -0
  121. mcp_proxy_adapter-3.1.5.dist-info/RECORD +0 -118
  122. {mcp_proxy_adapter-3.1.5.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,39 @@
1
+ {
2
+ "application": {
3
+ "name": "Basic MCP Proxy Server with Custom Settings",
4
+ "version": "1.1.0",
5
+ "environment": "development",
6
+ "description": "Basic server demonstrating custom settings usage"
7
+ },
8
+ "features": {
9
+ "basic_logging": true,
10
+ "simple_commands": true,
11
+ "custom_settings_demo": true,
12
+ "file_based_config": true
13
+ },
14
+ "server_info": {
15
+ "description": "Basic server with file-based custom settings",
16
+ "author": "MCP Proxy Adapter Team",
17
+ "contact": "support@example.com",
18
+ "documentation": "https://example.com/docs"
19
+ },
20
+ "demo_settings": {
21
+ "welcome_message": "Welcome to Basic MCP Proxy Server with Custom Settings!",
22
+ "max_connections": 150,
23
+ "timeout": 45,
24
+ "debug_mode": true,
25
+ "log_level": "INFO"
26
+ },
27
+ "performance": {
28
+ "enable_caching": true,
29
+ "cache_ttl": 300,
30
+ "max_cache_size": 1000
31
+ },
32
+ "security": {
33
+ "enable_rate_limiting": false,
34
+ "max_request_size": "5MB",
35
+ "allowed_origins": [
36
+ "*"
37
+ ]
38
+ }
39
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "server": {
3
+ "host": "127.0.0.1",
4
+ "port": 8000,
5
+ "debug": true,
6
+ "log_level": "DEBUG"
7
+ },
8
+ "logging": {
9
+ "level": "DEBUG",
10
+ "log_dir": "./logs/basic_server",
11
+ "log_file": "basic_server.log",
12
+ "error_log_file": "basic_server_error.log",
13
+ "access_log_file": "basic_server_access.log",
14
+ "max_file_size": "5MB",
15
+ "backup_count": 3,
16
+ "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
17
+ "date_format": "%Y-%m-%d %H:%M:%S",
18
+ "console_output": true,
19
+ "file_output": true
20
+ },
21
+ "commands": {
22
+ "auto_discovery": true,
23
+ "discovery_path": "mcp_proxy_adapter.commands",
24
+ "custom_commands_path": null
25
+ },
26
+ "custom": {
27
+ "server_name": "Basic MCP Proxy Server",
28
+ "description": "Simple example server with basic configuration",
29
+ "features": {
30
+ "hooks_enabled": false,
31
+ "custom_commands_enabled": false,
32
+ "advanced_logging": false
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,238 @@
1
+ """
2
+ Custom Settings Example for Basic Server
3
+
4
+ This example demonstrates how to use custom settings in a basic server.
5
+ """
6
+
7
+ import json
8
+ import os
9
+ from mcp_proxy_adapter.core.settings import (
10
+ add_custom_settings,
11
+ get_custom_setting_value,
12
+ set_custom_setting_value,
13
+ get_custom_settings
14
+ )
15
+ from mcp_proxy_adapter.core.logging import get_logger
16
+
17
+
18
+ def setup_basic_custom_settings():
19
+ """
20
+ Setup basic custom settings for the basic server example.
21
+
22
+ This demonstrates how to add custom settings to the framework
23
+ and access them throughout the application.
24
+ """
25
+ logger = get_logger("basic_server_custom_settings")
26
+
27
+ # Define basic custom settings
28
+ basic_settings = {
29
+ "application": {
30
+ "name": "Basic MCP Proxy Server",
31
+ "version": "1.0.0",
32
+ "environment": "development"
33
+ },
34
+ "features": {
35
+ "basic_logging": True,
36
+ "simple_commands": True,
37
+ "custom_settings_demo": True
38
+ },
39
+ "server_info": {
40
+ "description": "Basic server with custom settings example",
41
+ "author": "MCP Proxy Adapter Team",
42
+ "contact": "support@example.com"
43
+ },
44
+ "demo_settings": {
45
+ "welcome_message": "Welcome to Basic MCP Proxy Server!",
46
+ "max_connections": 100,
47
+ "timeout": 30,
48
+ "debug_mode": True
49
+ }
50
+ }
51
+
52
+ # Add settings to the framework
53
+ add_custom_settings(basic_settings)
54
+
55
+ logger.info("✅ Basic custom settings loaded")
56
+ logger.info(f"📋 Application: {basic_settings['application']['name']} v{basic_settings['application']['version']}")
57
+ logger.info(f"🔧 Features: {list(basic_settings['features'].keys())}")
58
+
59
+ return basic_settings
60
+
61
+
62
+ def demonstrate_custom_settings_usage():
63
+ """
64
+ Demonstrate how to use custom settings in the application.
65
+ """
66
+ logger = get_logger("basic_server_custom_settings")
67
+
68
+ # Get specific settings
69
+ app_name = get_custom_setting_value("application.name", "Unknown")
70
+ app_version = get_custom_setting_value("application.version", "0.0.0")
71
+ welcome_msg = get_custom_setting_value("demo_settings.welcome_message", "Hello!")
72
+ max_connections = get_custom_setting_value("demo_settings.max_connections", 50)
73
+
74
+ logger.info(f"🏷️ Application: {app_name} v{app_version}")
75
+ logger.info(f"💬 Welcome Message: {welcome_msg}")
76
+ logger.info(f"🔗 Max Connections: {max_connections}")
77
+
78
+ # Check if features are enabled
79
+ features = get_custom_setting_value("features", {})
80
+ enabled_features = [name for name, enabled in features.items() if enabled]
81
+
82
+ logger.info(f"✅ Enabled Features: {', '.join(enabled_features)}")
83
+
84
+ # Set a new custom setting
85
+ set_custom_setting_value("demo_settings.last_updated", "2025-08-08")
86
+ logger.info("🔧 Set new custom setting: demo_settings.last_updated")
87
+
88
+ # Get all custom settings
89
+ all_custom_settings = get_custom_settings()
90
+ logger.info(f"📊 Total custom settings: {len(all_custom_settings)} sections")
91
+
92
+ return {
93
+ "app_name": app_name,
94
+ "app_version": app_version,
95
+ "welcome_message": welcome_msg,
96
+ "max_connections": max_connections,
97
+ "enabled_features": enabled_features,
98
+ "total_settings_sections": len(all_custom_settings)
99
+ }
100
+
101
+
102
+ def create_custom_settings_file():
103
+ """
104
+ Create a custom settings JSON file for the basic server.
105
+ """
106
+ custom_settings = {
107
+ "application": {
108
+ "name": "Basic MCP Proxy Server with Custom Settings",
109
+ "version": "1.1.0",
110
+ "environment": "development",
111
+ "description": "Basic server demonstrating custom settings usage"
112
+ },
113
+ "features": {
114
+ "basic_logging": True,
115
+ "simple_commands": True,
116
+ "custom_settings_demo": True,
117
+ "file_based_config": True
118
+ },
119
+ "server_info": {
120
+ "description": "Basic server with file-based custom settings",
121
+ "author": "MCP Proxy Adapter Team",
122
+ "contact": "support@example.com",
123
+ "documentation": "https://example.com/docs"
124
+ },
125
+ "demo_settings": {
126
+ "welcome_message": "Welcome to Basic MCP Proxy Server with Custom Settings!",
127
+ "max_connections": 150,
128
+ "timeout": 45,
129
+ "debug_mode": True,
130
+ "log_level": "INFO"
131
+ },
132
+ "performance": {
133
+ "enable_caching": True,
134
+ "cache_ttl": 300,
135
+ "max_cache_size": 1000
136
+ },
137
+ "security": {
138
+ "enable_rate_limiting": False,
139
+ "max_request_size": "5MB",
140
+ "allowed_origins": ["*"]
141
+ }
142
+ }
143
+
144
+ # Write to file
145
+ settings_file = "basic_custom_settings.json"
146
+ with open(settings_file, 'w', encoding='utf-8') as f:
147
+ json.dump(custom_settings, f, indent=2, ensure_ascii=False)
148
+
149
+ print(f"✅ Created custom settings file: {settings_file}")
150
+ return settings_file
151
+
152
+
153
+ def load_custom_settings_from_file(file_path: str = "basic_custom_settings.json"):
154
+ """
155
+ Load custom settings from a JSON file.
156
+
157
+ Args:
158
+ file_path: Path to the custom settings JSON file
159
+ """
160
+ logger = get_logger("basic_server_custom_settings")
161
+
162
+ try:
163
+ if os.path.exists(file_path):
164
+ with open(file_path, 'r', encoding='utf-8') as f:
165
+ custom_settings = json.load(f)
166
+
167
+ # Add to framework
168
+ add_custom_settings(custom_settings)
169
+
170
+ logger.info(f"📁 Loaded custom settings from: {file_path}")
171
+ logger.info(f"📋 Application: {custom_settings.get('application', {}).get('name', 'Unknown')}")
172
+
173
+ return custom_settings
174
+ else:
175
+ logger.warning(f"⚠️ Custom settings file not found: {file_path}")
176
+ return None
177
+
178
+ except Exception as e:
179
+ logger.error(f"❌ Failed to load custom settings from {file_path}: {e}")
180
+ return None
181
+
182
+
183
+ def print_custom_settings_summary():
184
+ """
185
+ Print a summary of current custom settings.
186
+ """
187
+ logger = get_logger("basic_server_custom_settings")
188
+
189
+ all_settings = get_custom_settings()
190
+
191
+ logger.info("📊 Custom Settings Summary:")
192
+
193
+ # Application info
194
+ app_name = get_custom_setting_value("application.name", "Unknown")
195
+ app_version = get_custom_setting_value("application.version", "0.0.0")
196
+ logger.info(f" Application: {app_name} v{app_version}")
197
+
198
+ # Features
199
+ features = get_custom_setting_value("features", {})
200
+ enabled_features = [name for name, enabled in features.items() if enabled]
201
+ logger.info(f" Enabled Features: {', '.join(enabled_features) if enabled_features else 'None'}")
202
+
203
+ # Demo settings
204
+ welcome_msg = get_custom_setting_value("demo_settings.welcome_message", "Hello!")
205
+ max_connections = get_custom_setting_value("demo_settings.max_connections", 50)
206
+ logger.info(f" Welcome Message: {welcome_msg}")
207
+ logger.info(f" Max Connections: {max_connections}")
208
+
209
+ # Performance
210
+ caching_enabled = get_custom_setting_value("performance.enable_caching", False)
211
+ logger.info(f" Caching: {'Enabled' if caching_enabled else 'Disabled'}")
212
+
213
+ # Security
214
+ rate_limiting = get_custom_setting_value("security.enable_rate_limiting", False)
215
+ logger.info(f" Rate Limiting: {'Enabled' if rate_limiting else 'Disabled'}")
216
+
217
+ logger.info(f" Total Settings Sections: {len(all_settings)}")
218
+
219
+
220
+ if __name__ == "__main__":
221
+ # Setup basic custom settings
222
+ setup_basic_custom_settings()
223
+
224
+ # Demonstrate usage
225
+ demo_info = demonstrate_custom_settings_usage()
226
+
227
+ # Create custom settings file
228
+ settings_file = create_custom_settings_file()
229
+
230
+ # Load from file
231
+ load_custom_settings_from_file(settings_file)
232
+
233
+ # Print summary
234
+ print_custom_settings_summary()
235
+
236
+ print("\n🎉 Custom settings demonstration completed!")
237
+ print(f"📁 Custom settings file: {settings_file}")
238
+ print("🔧 You can now use these settings in your basic server application.")
@@ -0,0 +1,98 @@
1
+ """
2
+ Basic Server Example
3
+
4
+ This example demonstrates a minimal MCP Proxy Adapter server
5
+ without any additional custom commands.
6
+ """
7
+
8
+ import asyncio
9
+ import uvicorn
10
+ import sys
11
+ import os
12
+ sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
13
+
14
+ from mcp_proxy_adapter import create_app
15
+ from mcp_proxy_adapter.core.logging import get_logger, setup_logging
16
+ from mcp_proxy_adapter.core.settings import (
17
+ Settings,
18
+ get_server_host,
19
+ get_server_port,
20
+ get_server_debug,
21
+ get_setting
22
+ )
23
+
24
+
25
+ def main():
26
+ """Run the basic server example."""
27
+ # Load configuration from config.json in the same directory
28
+ config_path = os.path.join(os.path.dirname(__file__), "config.json")
29
+ if os.path.exists(config_path):
30
+ from mcp_proxy_adapter.config import config
31
+ config.load_from_file(config_path)
32
+ print(f"✅ Loaded configuration from: {config_path}")
33
+ else:
34
+ print(f"⚠️ Configuration file not found: {config_path}")
35
+ print(" Using default configuration")
36
+
37
+ # Setup logging with configuration
38
+ setup_logging()
39
+ logger = get_logger("basic_server")
40
+
41
+ # Get settings from configuration
42
+ server_settings = Settings.get_server_settings()
43
+ logging_settings = Settings.get_logging_settings()
44
+ commands_settings = Settings.get_commands_settings()
45
+ custom_settings = Settings.get_custom_setting("custom", {})
46
+
47
+ # Print server header and description
48
+ print("=" * 80)
49
+ print("🔧 BASIC MCP PROXY ADAPTER SERVER")
50
+ print("=" * 80)
51
+ print("📋 Description:")
52
+ print(f" {custom_settings.get('description', 'Basic server example')}")
53
+ print()
54
+ print("⚙️ Configuration:")
55
+ print(f" • Server: {server_settings['host']}:{server_settings['port']}")
56
+ print(f" • Debug: {server_settings['debug']}")
57
+ print(f" • Log Level: {logging_settings['level']}")
58
+ print(f" • Log Directory: {logging_settings['log_dir']}")
59
+ print(f" • Auto Discovery: {commands_settings['auto_discovery']}")
60
+ print()
61
+ print("🔧 Available Commands:")
62
+ print(" • help - Built-in help command")
63
+ print(" • health - Built-in health command")
64
+ print(" • config - Built-in config command")
65
+ print(" • reload - Built-in reload command")
66
+ print()
67
+ print("🎯 Features:")
68
+ print(" • Standard JSON-RPC API")
69
+ print(" • Built-in command discovery")
70
+ print(" • Basic logging and error handling")
71
+ print(" • OpenAPI schema generation")
72
+ print(" • Configuration-driven settings")
73
+ print("=" * 80)
74
+ print()
75
+
76
+ logger.info("Starting Basic MCP Proxy Adapter Server...")
77
+ logger.info(f"Server configuration: {server_settings}")
78
+ logger.info(f"Logging configuration: {logging_settings}")
79
+ logger.info(f"Commands configuration: {commands_settings}")
80
+
81
+ # Create application with settings from configuration
82
+ app = create_app(
83
+ title=custom_settings.get('server_name', 'Basic MCP Proxy Adapter Server'),
84
+ description=custom_settings.get('description', 'Minimal server example with only built-in commands'),
85
+ version="1.0.0"
86
+ )
87
+
88
+ # Run the server with configuration settings
89
+ uvicorn.run(
90
+ app,
91
+ host=server_settings['host'],
92
+ port=server_settings['port'],
93
+ log_level=server_settings['log_level'].lower()
94
+ )
95
+
96
+
97
+ if __name__ == "__main__":
98
+ main()
@@ -0,0 +1,127 @@
1
+ # Custom Commands Server Example
2
+
3
+ This example demonstrates both auto-registration and manual registration of commands in the MCP Proxy Adapter framework.
4
+
5
+ ## Registration Methods
6
+
7
+ ### 1. Auto-Registration
8
+
9
+ Commands are automatically discovered and registered by the framework if they:
10
+ - Are located in packages that follow the naming convention
11
+ - Have class names ending with "Command"
12
+ - Inherit from the `Command` base class
13
+
14
+ **Location:** `auto_commands/` package
15
+ **Files:**
16
+ - `auto_echo_command.py` - AutoEchoCommand
17
+ - `auto_info_command.py` - AutoInfoCommand
18
+
19
+ **How it works:**
20
+ ```python
21
+ # Framework automatically discovers commands in auto_commands/ package
22
+ registry.discover_commands("mcp_proxy_adapter.examples.custom_commands.auto_commands")
23
+ ```
24
+
25
+ ### 2. Manual Registration
26
+
27
+ Commands are explicitly registered in the server code using:
28
+ - `registry.register()` - for regular commands
29
+ - `registry.register_custom_command()` - for commands that override built-ins
30
+
31
+ **Location:** Main server file
32
+ **Files:**
33
+ - `echo_command.py` - EchoCommand
34
+ - `custom_help_command.py` - CustomHelpCommand
35
+ - `custom_health_command.py` - CustomHealthCommand
36
+ - `data_transform_command.py` - DataTransformCommand
37
+ - `intercept_command.py` - InterceptCommand
38
+ - `manual_echo_command.py` - ManualEchoCommand
39
+
40
+ **How it works:**
41
+ ```python
42
+ # Explicit registration in server code
43
+ registry.register(EchoCommand)
44
+ registry.register_custom_command(CustomHelpCommand) # Overrides built-in
45
+ ```
46
+
47
+ ### 3. Built-in Commands
48
+
49
+ Framework provides default commands that are registered automatically:
50
+ - `help` - HelpCommand
51
+ - `health` - HealthCommand
52
+
53
+ These can be overridden by custom commands using `register_custom_command()`.
54
+
55
+ ## Command Hierarchy
56
+
57
+ 1. **Custom Commands** (highest priority) - registered with `register_custom_command()`
58
+ 2. **Manually Registered Commands** - registered with `register()`
59
+ 3. **Auto-Registered Commands** - discovered automatically
60
+ 4. **Built-in Commands** (lowest priority) - framework defaults
61
+
62
+ ## Testing Commands
63
+
64
+ ### Auto-Registered Commands
65
+ ```bash
66
+ # Test auto-registered echo
67
+ curl -X POST http://localhost:8000/cmd \
68
+ -H "Content-Type: application/json" \
69
+ -d '{"jsonrpc": "2.0", "method": "auto_echo", "params": {"message": "Hello!"}, "id": 1}'
70
+
71
+ # Test auto-registered info
72
+ curl -X POST http://localhost:8000/cmd \
73
+ -H "Content-Type: application/json" \
74
+ -d '{"jsonrpc": "2.0", "method": "auto_info", "params": {"topic": "test"}, "id": 2}'
75
+ ```
76
+
77
+ ### Manually Registered Commands
78
+ ```bash
79
+ # Test manually registered echo
80
+ curl -X POST http://localhost:8000/cmd \
81
+ -H "Content-Type: application/json" \
82
+ -d '{"jsonrpc": "2.0", "method": "manual_echo", "params": {"message": "Hello!"}, "id": 3}'
83
+
84
+ # Test other manually registered commands
85
+ curl -X POST http://localhost:8000/cmd \
86
+ -H "Content-Type: application/json" \
87
+ -d '{"jsonrpc": "2.0", "method": "echo", "params": {"message": "Hello!"}, "id": 4}'
88
+ ```
89
+
90
+ ### Built-in Commands (or overridden)
91
+ ```bash
92
+ # Test help command (custom or built-in)
93
+ curl -X POST http://localhost:8000/cmd \
94
+ -H "Content-Type: application/json" \
95
+ -d '{"jsonrpc": "2.0", "method": "help", "id": 5}'
96
+
97
+ # Test health command (custom or built-in)
98
+ curl -X POST http://localhost:8000/cmd \
99
+ -H "Content-Type: application/json" \
100
+ -d '{"jsonrpc": "2.0", "method": "health", "id": 6}'
101
+ ```
102
+
103
+ ## Features Demonstrated
104
+
105
+ ### Auto-Registration
106
+ - ✅ Automatic command discovery
107
+ - ✅ Naming convention compliance
108
+ - ✅ Package-based organization
109
+ - ✅ Framework integration
110
+
111
+ ### Manual Registration
112
+ - ✅ Explicit command registration
113
+ - ✅ Custom command overrides
114
+ - ✅ Priority management
115
+ - ✅ Dependency control
116
+
117
+ ### Built-in Commands
118
+ - ✅ Framework defaults
119
+ - ✅ Override capability
120
+ - ✅ Fallback behavior
121
+ - ✅ Consistent API
122
+
123
+ ### Advanced Features
124
+ - ✅ Command hierarchy
125
+ - ✅ Priority resolution
126
+ - ✅ Hook integration
127
+ - ✅ Error handling
@@ -0,0 +1,27 @@
1
+ """
2
+ Custom Commands Example
3
+
4
+ An example of MCP Proxy Adapter server with custom commands:
5
+ - echo command
6
+ - custom help command
7
+ - custom health command
8
+ """
9
+
10
+ __version__ = "1.0.0"
11
+
12
+ # Import all modules to make them available
13
+ from . import echo_command
14
+ from . import custom_help_command
15
+ from . import custom_health_command
16
+ from . import manual_echo_command
17
+ from . import intercept_command
18
+ from . import data_transform_command
19
+ from . import advanced_hooks
20
+ from . import hooks
21
+ from . import custom_settings_manager
22
+ from . import custom_openapi_generator
23
+ from . import server
24
+
25
+ # Import auto commands
26
+ from .auto_commands import auto_echo_command
27
+ from .auto_commands import auto_info_command