mcp-proxy-adapter 3.1.6__py3-none-any.whl → 4.1.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 +254 -8
- 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.1.0.dist-info}/METADATA +3 -3
- mcp_proxy_adapter-4.1.0.dist-info/RECORD +110 -0
- {mcp_proxy_adapter-3.1.6.dist-info → mcp_proxy_adapter-4.1.0.dist-info}/WHEEL +1 -1
- {mcp_proxy_adapter-3.1.6.dist-info → mcp_proxy_adapter-4.1.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.1.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,124 @@
|
|
1
|
+
# MCP Proxy Adapter Examples
|
2
|
+
|
3
|
+
This directory contains examples demonstrating different usage patterns of the MCP Proxy Adapter framework.
|
4
|
+
|
5
|
+
## Examples Overview
|
6
|
+
|
7
|
+
### 1. Basic Server (`basic_server/`)
|
8
|
+
Minimal server example with only built-in commands. Demonstrates:
|
9
|
+
- Basic framework setup
|
10
|
+
- Built-in command discovery
|
11
|
+
- Standard JSON-RPC API
|
12
|
+
- Backward compatibility with property setting
|
13
|
+
|
14
|
+
### 2. Custom Commands Server (`custom_commands/`)
|
15
|
+
Advanced server example with custom commands and hooks. Demonstrates:
|
16
|
+
- Custom command registration
|
17
|
+
- Basic hooks (before/after execution)
|
18
|
+
- Global hooks
|
19
|
+
- Performance and security monitoring
|
20
|
+
- Advanced hooks with data transformation and command interception
|
21
|
+
|
22
|
+
## Setting Application Title and Description
|
23
|
+
|
24
|
+
The framework supports two ways to set application properties:
|
25
|
+
|
26
|
+
### Method 1: During Creation (Recommended)
|
27
|
+
```python
|
28
|
+
from mcp_proxy_adapter import create_app
|
29
|
+
|
30
|
+
app = create_app(
|
31
|
+
title="My Custom Server",
|
32
|
+
description="My custom server description",
|
33
|
+
version="2.0.0"
|
34
|
+
)
|
35
|
+
```
|
36
|
+
|
37
|
+
### Method 2: After Creation (Backward Compatible)
|
38
|
+
```python
|
39
|
+
from mcp_proxy_adapter import create_app
|
40
|
+
|
41
|
+
app = create_app()
|
42
|
+
|
43
|
+
# Set properties after creation
|
44
|
+
app.set_properties(
|
45
|
+
new_title="My Custom Server",
|
46
|
+
new_description="My custom server description",
|
47
|
+
new_version="2.0.0"
|
48
|
+
)
|
49
|
+
```
|
50
|
+
|
51
|
+
## Running Examples
|
52
|
+
|
53
|
+
### Basic Server
|
54
|
+
```bash
|
55
|
+
cd mcp_proxy_adapter/examples/basic_server
|
56
|
+
python server.py
|
57
|
+
```
|
58
|
+
|
59
|
+
### Custom Commands Server
|
60
|
+
```bash
|
61
|
+
cd mcp_proxy_adapter/examples/custom_commands
|
62
|
+
python server.py
|
63
|
+
```
|
64
|
+
|
65
|
+
## Testing Examples
|
66
|
+
|
67
|
+
### Basic Server Commands
|
68
|
+
```bash
|
69
|
+
# Get help
|
70
|
+
curl -X POST http://localhost:8000/cmd \
|
71
|
+
-H "Content-Type: application/json" \
|
72
|
+
-d '{"jsonrpc": "2.0", "method": "help", "id": 1}'
|
73
|
+
|
74
|
+
# Get health
|
75
|
+
curl -X POST http://localhost:8000/cmd \
|
76
|
+
-H "Content-Type: application/json" \
|
77
|
+
-d '{"jsonrpc": "2.0", "method": "health", "id": 2}'
|
78
|
+
```
|
79
|
+
|
80
|
+
### Custom Commands Server Commands
|
81
|
+
```bash
|
82
|
+
# Test echo command
|
83
|
+
curl -X POST http://localhost:8000/cmd \
|
84
|
+
-H "Content-Type: application/json" \
|
85
|
+
-d '{"jsonrpc": "2.0", "method": "echo", "params": {"message": "Hello!"}, "id": 1}'
|
86
|
+
|
87
|
+
# Test data transformation
|
88
|
+
curl -X POST http://localhost:8000/cmd \
|
89
|
+
-H "Content-Type: application/json" \
|
90
|
+
-d '{"jsonrpc": "2.0", "method": "data_transform", "params": {"data": {"name": "test", "value": 123}}, "id": 2}'
|
91
|
+
|
92
|
+
# Test command interception (bypass_flag=0)
|
93
|
+
curl -X POST http://localhost:8000/cmd \
|
94
|
+
-H "Content-Type: application/json" \
|
95
|
+
-d '{"jsonrpc": "2.0", "method": "intercept", "params": {"bypass_flag": 0}, "id": 3}'
|
96
|
+
|
97
|
+
# Test command execution (bypass_flag=1)
|
98
|
+
curl -X POST http://localhost:8000/cmd \
|
99
|
+
-H "Content-Type: application/json" \
|
100
|
+
-d '{"jsonrpc": "2.0", "method": "intercept", "params": {"bypass_flag": 1}, "id": 4}'
|
101
|
+
```
|
102
|
+
|
103
|
+
## Features Demonstrated
|
104
|
+
|
105
|
+
### Basic Server
|
106
|
+
- ✅ Standard JSON-RPC API
|
107
|
+
- ✅ Built-in command discovery
|
108
|
+
- ✅ Basic logging
|
109
|
+
- ✅ OpenAPI schema generation
|
110
|
+
- ✅ Backward compatibility
|
111
|
+
|
112
|
+
### Custom Commands Server
|
113
|
+
- ✅ Custom command registration
|
114
|
+
- ✅ Command override with priority
|
115
|
+
- ✅ Basic hooks (before/after)
|
116
|
+
- ✅ Global hooks
|
117
|
+
- ✅ Performance monitoring
|
118
|
+
- ✅ Security monitoring
|
119
|
+
- ✅ Data transformation hooks
|
120
|
+
- ✅ Command interception hooks
|
121
|
+
- ✅ Conditional processing
|
122
|
+
- ✅ Smart interception
|
123
|
+
- ✅ Centralized logging
|
124
|
+
- ✅ Advanced error handling
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# Basic Server Example
|
2
|
+
|
3
|
+
A minimal example of MCP Proxy Adapter server without additional commands.
|
4
|
+
|
5
|
+
## Features
|
6
|
+
|
7
|
+
This example demonstrates:
|
8
|
+
- Basic server setup
|
9
|
+
- Built-in commands only (help, health)
|
10
|
+
- Default configuration
|
11
|
+
- No custom commands
|
12
|
+
|
13
|
+
## Available Commands
|
14
|
+
|
15
|
+
- `help` - Get information about available commands
|
16
|
+
- `health` - Get server health status
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
|
20
|
+
### Run the server
|
21
|
+
|
22
|
+
```bash
|
23
|
+
python server.py
|
24
|
+
```
|
25
|
+
|
26
|
+
### Test the server
|
27
|
+
|
28
|
+
```bash
|
29
|
+
# Get help
|
30
|
+
curl -X POST http://localhost:8000/cmd \
|
31
|
+
-H "Content-Type: application/json" \
|
32
|
+
-d '{"command": "help"}'
|
33
|
+
|
34
|
+
# Get health status
|
35
|
+
curl -X POST http://localhost:8000/cmd \
|
36
|
+
-H "Content-Type: application/json" \
|
37
|
+
-d '{"command": "health"}'
|
38
|
+
```
|
39
|
+
|
40
|
+
## API Endpoints
|
41
|
+
|
42
|
+
- `POST /cmd` - Execute commands
|
43
|
+
- `GET /health` - Health check
|
44
|
+
- `GET /commands` - List available commands
|
45
|
+
- `GET /docs` - API documentation
|
46
|
+
|
47
|
+
## Configuration
|
48
|
+
|
49
|
+
The server uses default configuration. You can customize it by:
|
50
|
+
|
51
|
+
1. Creating a `config.json` file
|
52
|
+
2. Setting environment variables
|
53
|
+
3. Passing configuration to `create_app()`
|
54
|
+
|
55
|
+
## Notes
|
56
|
+
|
57
|
+
- This is the simplest possible setup
|
58
|
+
- No custom commands are registered
|
59
|
+
- Uses framework defaults
|
60
|
+
- Good starting point for understanding the framework
|
@@ -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()
|