mcp-proxy-adapter 3.1.6__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.
- mcp_proxy_adapter/api/app.py +65 -27
- mcp_proxy_adapter/api/handlers.py +1 -1
- mcp_proxy_adapter/api/middleware/error_handling.py +11 -10
- mcp_proxy_adapter/api/tool_integration.py +5 -2
- mcp_proxy_adapter/api/tools.py +3 -3
- mcp_proxy_adapter/commands/base.py +19 -1
- mcp_proxy_adapter/commands/command_registry.py +243 -6
- mcp_proxy_adapter/commands/hooks.py +260 -0
- mcp_proxy_adapter/commands/reload_command.py +211 -0
- mcp_proxy_adapter/commands/reload_settings_command.py +125 -0
- mcp_proxy_adapter/commands/settings_command.py +189 -0
- mcp_proxy_adapter/config.py +16 -1
- mcp_proxy_adapter/core/__init__.py +44 -0
- mcp_proxy_adapter/core/logging.py +87 -34
- mcp_proxy_adapter/core/settings.py +376 -0
- mcp_proxy_adapter/core/utils.py +2 -2
- mcp_proxy_adapter/custom_openapi.py +81 -2
- mcp_proxy_adapter/examples/README.md +124 -0
- mcp_proxy_adapter/examples/__init__.py +7 -0
- mcp_proxy_adapter/examples/basic_server/README.md +60 -0
- mcp_proxy_adapter/examples/basic_server/__init__.py +7 -0
- mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +39 -0
- mcp_proxy_adapter/examples/basic_server/config.json +35 -0
- mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +238 -0
- mcp_proxy_adapter/examples/basic_server/server.py +98 -0
- mcp_proxy_adapter/examples/custom_commands/README.md +127 -0
- mcp_proxy_adapter/examples/custom_commands/__init__.py +27 -0
- mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +250 -0
- mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +6 -0
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +103 -0
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +111 -0
- mcp_proxy_adapter/examples/custom_commands/config.json +62 -0
- mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +169 -0
- mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +215 -0
- mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +76 -0
- mcp_proxy_adapter/examples/custom_commands/custom_settings.json +96 -0
- mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +241 -0
- mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +135 -0
- mcp_proxy_adapter/examples/custom_commands/echo_command.py +122 -0
- mcp_proxy_adapter/examples/custom_commands/hooks.py +230 -0
- mcp_proxy_adapter/examples/custom_commands/intercept_command.py +123 -0
- mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +103 -0
- mcp_proxy_adapter/examples/custom_commands/server.py +223 -0
- mcp_proxy_adapter/examples/custom_commands/test_hooks.py +176 -0
- mcp_proxy_adapter/examples/deployment/README.md +49 -0
- mcp_proxy_adapter/examples/deployment/__init__.py +7 -0
- mcp_proxy_adapter/examples/deployment/config.development.json +8 -0
- {examples/basic_example → mcp_proxy_adapter/examples/deployment}/config.json +11 -7
- mcp_proxy_adapter/examples/deployment/config.production.json +12 -0
- mcp_proxy_adapter/examples/deployment/config.staging.json +11 -0
- mcp_proxy_adapter/examples/deployment/docker-compose.yml +31 -0
- mcp_proxy_adapter/examples/deployment/run.sh +43 -0
- mcp_proxy_adapter/examples/deployment/run_docker.sh +84 -0
- mcp_proxy_adapter/openapi.py +3 -2
- mcp_proxy_adapter/tests/api/test_custom_openapi.py +617 -0
- mcp_proxy_adapter/tests/api/test_handlers.py +522 -0
- mcp_proxy_adapter/tests/api/test_schemas.py +546 -0
- mcp_proxy_adapter/tests/api/test_tool_integration.py +531 -0
- mcp_proxy_adapter/tests/unit/test_base_command.py +391 -85
- mcp_proxy_adapter/version.py +1 -1
- {mcp_proxy_adapter-3.1.6.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/METADATA +1 -1
- mcp_proxy_adapter-4.0.0.dist-info/RECORD +110 -0
- {mcp_proxy_adapter-3.1.6.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/WHEEL +1 -1
- {mcp_proxy_adapter-3.1.6.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/top_level.txt +0 -1
- examples/__init__.py +0 -19
- examples/anti_patterns/README.md +0 -51
- examples/anti_patterns/__init__.py +0 -9
- examples/anti_patterns/bad_design/README.md +0 -72
- examples/anti_patterns/bad_design/global_state.py +0 -170
- examples/anti_patterns/bad_design/monolithic_command.py +0 -272
- examples/basic_example/README.md +0 -245
- examples/basic_example/__init__.py +0 -8
- examples/basic_example/commands/__init__.py +0 -5
- examples/basic_example/commands/echo_command.py +0 -95
- examples/basic_example/commands/math_command.py +0 -151
- examples/basic_example/commands/time_command.py +0 -152
- examples/basic_example/docs/EN/README.md +0 -177
- examples/basic_example/docs/RU/README.md +0 -177
- examples/basic_example/server.py +0 -151
- examples/basic_example/tests/conftest.py +0 -243
- examples/check_vstl_schema.py +0 -106
- examples/commands/echo_command.py +0 -52
- examples/commands/echo_command_di.py +0 -152
- examples/commands/echo_result.py +0 -65
- examples/commands/get_date_command.py +0 -98
- examples/commands/new_uuid4_command.py +0 -91
- examples/complete_example/Dockerfile +0 -24
- examples/complete_example/README.md +0 -92
- examples/complete_example/__init__.py +0 -8
- examples/complete_example/commands/__init__.py +0 -5
- examples/complete_example/commands/system_command.py +0 -328
- examples/complete_example/config.json +0 -41
- examples/complete_example/configs/config.dev.yaml +0 -40
- examples/complete_example/configs/config.docker.yaml +0 -40
- examples/complete_example/docker-compose.yml +0 -35
- examples/complete_example/requirements.txt +0 -20
- examples/complete_example/server.py +0 -113
- examples/di_example/.pytest_cache/README.md +0 -8
- examples/di_example/server.py +0 -249
- examples/fix_vstl_help.py +0 -123
- examples/minimal_example/README.md +0 -65
- examples/minimal_example/__init__.py +0 -8
- examples/minimal_example/config.json +0 -14
- examples/minimal_example/main.py +0 -136
- examples/minimal_example/simple_server.py +0 -163
- examples/minimal_example/tests/conftest.py +0 -171
- examples/minimal_example/tests/test_hello_command.py +0 -111
- examples/minimal_example/tests/test_integration.py +0 -181
- examples/patch_vstl_service.py +0 -105
- examples/patch_vstl_service_mcp.py +0 -108
- examples/server.py +0 -69
- examples/simple_server.py +0 -128
- examples/test_package_3.1.4.py +0 -177
- examples/test_server.py +0 -134
- examples/tool_description_example.py +0 -82
- mcp_proxy_adapter/py.typed +0 -0
- mcp_proxy_adapter-3.1.6.dist-info/RECORD +0 -118
- {mcp_proxy_adapter-3.1.6.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
|