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.
- mcp_proxy_adapter/api/app.py +86 -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 +258 -6
- mcp_proxy_adapter/commands/help_command.py +54 -65
- 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/commands/test_help_command.py +8 -5
- mcp_proxy_adapter/tests/integration/test_cmd_integration.py +4 -5
- mcp_proxy_adapter/tests/test_command_registry.py +37 -1
- mcp_proxy_adapter/tests/unit/test_base_command.py +391 -85
- mcp_proxy_adapter/version.py +1 -1
- {mcp_proxy_adapter-3.1.5.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.5.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/WHEEL +1 -1
- {mcp_proxy_adapter-3.1.5.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.5.dist-info/RECORD +0 -118
- {mcp_proxy_adapter-3.1.5.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,169 @@
|
|
1
|
+
"""
|
2
|
+
Custom Health Command Example
|
3
|
+
|
4
|
+
A custom health command with enhanced system information.
|
5
|
+
"""
|
6
|
+
|
7
|
+
import os
|
8
|
+
import platform
|
9
|
+
import sys
|
10
|
+
import psutil
|
11
|
+
from datetime import datetime
|
12
|
+
from typing import Dict, Any
|
13
|
+
|
14
|
+
from mcp_proxy_adapter.commands.base import Command
|
15
|
+
from mcp_proxy_adapter.commands.result import SuccessResult
|
16
|
+
from mcp_proxy_adapter.commands.command_registry import registry
|
17
|
+
|
18
|
+
|
19
|
+
class CustomHealthResult(SuccessResult):
|
20
|
+
"""
|
21
|
+
Result of the custom health command execution.
|
22
|
+
"""
|
23
|
+
|
24
|
+
def __init__(self, status: str, version: str, uptime: float,
|
25
|
+
components: Dict[str, Any], custom_metrics: Dict[str, Any]):
|
26
|
+
"""
|
27
|
+
Initialize custom health command result.
|
28
|
+
|
29
|
+
Args:
|
30
|
+
status: Server status ("ok" or "error")
|
31
|
+
version: Server version
|
32
|
+
uptime: Server uptime in seconds
|
33
|
+
components: Dictionary with components status
|
34
|
+
custom_metrics: Additional custom metrics
|
35
|
+
"""
|
36
|
+
super().__init__(
|
37
|
+
data={
|
38
|
+
"status": status,
|
39
|
+
"version": version,
|
40
|
+
"uptime": uptime,
|
41
|
+
"components": components,
|
42
|
+
"custom_metrics": custom_metrics,
|
43
|
+
"custom_health": True
|
44
|
+
}
|
45
|
+
)
|
46
|
+
|
47
|
+
@classmethod
|
48
|
+
def get_schema(cls) -> Dict[str, Any]:
|
49
|
+
"""
|
50
|
+
Get JSON schema for result validation.
|
51
|
+
|
52
|
+
Returns:
|
53
|
+
Dict[str, Any]: JSON schema
|
54
|
+
"""
|
55
|
+
return {
|
56
|
+
"type": "object",
|
57
|
+
"properties": {
|
58
|
+
"data": {
|
59
|
+
"type": "object",
|
60
|
+
"properties": {
|
61
|
+
"status": {"type": "string"},
|
62
|
+
"version": {"type": "string"},
|
63
|
+
"uptime": {"type": "number"},
|
64
|
+
"components": {"type": "object"},
|
65
|
+
"custom_metrics": {"type": "object"},
|
66
|
+
"custom_health": {"type": "boolean"}
|
67
|
+
},
|
68
|
+
"required": ["status", "version", "uptime", "components", "custom_metrics", "custom_health"]
|
69
|
+
}
|
70
|
+
},
|
71
|
+
"required": ["data"]
|
72
|
+
}
|
73
|
+
|
74
|
+
|
75
|
+
class CustomHealthCommand(Command):
|
76
|
+
"""
|
77
|
+
Custom health command with enhanced system information.
|
78
|
+
"""
|
79
|
+
|
80
|
+
name = "health"
|
81
|
+
result_class = CustomHealthResult
|
82
|
+
|
83
|
+
async def execute(self, **kwargs) -> CustomHealthResult:
|
84
|
+
"""
|
85
|
+
Execute custom health command.
|
86
|
+
|
87
|
+
Returns:
|
88
|
+
CustomHealthResult: Custom health command result
|
89
|
+
"""
|
90
|
+
# Get version from package
|
91
|
+
try:
|
92
|
+
from mcp_proxy_adapter.version import __version__ as version
|
93
|
+
except ImportError:
|
94
|
+
version = "unknown"
|
95
|
+
|
96
|
+
# Get process start time
|
97
|
+
process = psutil.Process(os.getpid())
|
98
|
+
start_time = datetime.fromtimestamp(process.create_time())
|
99
|
+
uptime_seconds = (datetime.now() - start_time).total_seconds()
|
100
|
+
|
101
|
+
# Get system information
|
102
|
+
system_info = {
|
103
|
+
"platform": platform.platform(),
|
104
|
+
"python_version": sys.version,
|
105
|
+
"cpu_count": psutil.cpu_count(),
|
106
|
+
"memory_total": psutil.virtual_memory().total,
|
107
|
+
"memory_available": psutil.virtual_memory().available
|
108
|
+
}
|
109
|
+
|
110
|
+
# Get process information
|
111
|
+
process_info = {
|
112
|
+
"pid": os.getpid(),
|
113
|
+
"memory_usage": process.memory_info().rss,
|
114
|
+
"cpu_percent": process.cpu_percent(),
|
115
|
+
"create_time": process.create_time()
|
116
|
+
}
|
117
|
+
|
118
|
+
# Get commands information
|
119
|
+
from mcp_proxy_adapter.commands.command_registry import registry
|
120
|
+
commands_info = {
|
121
|
+
"total_commands": len(registry.get_all_commands()),
|
122
|
+
"custom_commands": ["echo", "help", "health"],
|
123
|
+
"registry_status": "active"
|
124
|
+
}
|
125
|
+
|
126
|
+
# Custom metrics
|
127
|
+
custom_metrics = {
|
128
|
+
"custom_health_check": True,
|
129
|
+
"enhanced_monitoring": True,
|
130
|
+
"system_load": psutil.getloadavg() if hasattr(psutil, 'getloadavg') else None,
|
131
|
+
"disk_usage": {
|
132
|
+
"total": psutil.disk_usage('/').total,
|
133
|
+
"free": psutil.disk_usage('/').free,
|
134
|
+
"used": psutil.disk_usage('/').used
|
135
|
+
},
|
136
|
+
"network_interfaces": len(psutil.net_if_addrs()),
|
137
|
+
"custom_features": ["enhanced_metrics", "system_monitoring", "custom_health"],
|
138
|
+
"hook_enhanced": kwargs.get("hook_enhanced", False),
|
139
|
+
"health_check_id": kwargs.get("health_check_id"),
|
140
|
+
"global_hook_processed": kwargs.get("global_hook_processed", False)
|
141
|
+
}
|
142
|
+
|
143
|
+
components = {
|
144
|
+
"system": system_info,
|
145
|
+
"process": process_info,
|
146
|
+
"commands": commands_info
|
147
|
+
}
|
148
|
+
|
149
|
+
return CustomHealthResult(
|
150
|
+
status="ok",
|
151
|
+
version=version,
|
152
|
+
uptime=uptime_seconds,
|
153
|
+
components=components,
|
154
|
+
custom_metrics=custom_metrics
|
155
|
+
)
|
156
|
+
|
157
|
+
@classmethod
|
158
|
+
def get_schema(cls) -> Dict[str, Any]:
|
159
|
+
"""
|
160
|
+
Get JSON schema for command parameters.
|
161
|
+
|
162
|
+
Returns:
|
163
|
+
Dict[str, Any]: JSON schema
|
164
|
+
"""
|
165
|
+
return {
|
166
|
+
"type": "object",
|
167
|
+
"properties": {},
|
168
|
+
"description": "Get enhanced system health information"
|
169
|
+
}
|
@@ -0,0 +1,215 @@
|
|
1
|
+
"""
|
2
|
+
Custom Help Command Example
|
3
|
+
|
4
|
+
A custom help command that provides enhanced help information.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from typing import Dict, Any, Optional
|
8
|
+
from mcp_proxy_adapter.commands.base import Command
|
9
|
+
from mcp_proxy_adapter.commands.result import CommandResult
|
10
|
+
from mcp_proxy_adapter.commands.command_registry import registry
|
11
|
+
from mcp_proxy_adapter.core.errors import NotFoundError
|
12
|
+
|
13
|
+
|
14
|
+
class CustomHelpResult(CommandResult):
|
15
|
+
"""
|
16
|
+
Result of the custom help command execution.
|
17
|
+
"""
|
18
|
+
|
19
|
+
def __init__(self, commands_info: Optional[Dict[str, Any]] = None,
|
20
|
+
command_info: Optional[Dict[str, Any]] = None,
|
21
|
+
custom_info: Optional[Dict[str, Any]] = None):
|
22
|
+
"""
|
23
|
+
Initialize custom help command result.
|
24
|
+
|
25
|
+
Args:
|
26
|
+
commands_info: Information about all commands
|
27
|
+
command_info: Information about a specific command
|
28
|
+
custom_info: Additional custom information
|
29
|
+
"""
|
30
|
+
self.commands_info = commands_info
|
31
|
+
self.command_info = command_info
|
32
|
+
self.custom_info = custom_info or {}
|
33
|
+
|
34
|
+
def to_dict(self) -> Dict[str, Any]:
|
35
|
+
"""
|
36
|
+
Convert result to dictionary.
|
37
|
+
|
38
|
+
Returns:
|
39
|
+
Dict[str, Any]: Result as dictionary
|
40
|
+
"""
|
41
|
+
if self.command_info is not None:
|
42
|
+
return {
|
43
|
+
"cmdname": self.command_info.get("name", "unknown"),
|
44
|
+
"info": {
|
45
|
+
"description": self.command_info.get("description", ""),
|
46
|
+
"summary": self.command_info.get("summary", ""),
|
47
|
+
"params": self.command_info.get("params", {}),
|
48
|
+
"examples": self.command_info.get("examples", []),
|
49
|
+
"custom_help": True
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
if self.commands_info is None:
|
54
|
+
return {
|
55
|
+
"tool_info": {
|
56
|
+
"name": "Custom MCP-Proxy API Service",
|
57
|
+
"description": "Enhanced JSON-RPC API with custom commands",
|
58
|
+
"version": "2.0.0",
|
59
|
+
"custom_help": True
|
60
|
+
},
|
61
|
+
"help_usage": {
|
62
|
+
"description": "Get enhanced information about commands",
|
63
|
+
"examples": [
|
64
|
+
{"command": "help", "description": "List of all available commands"},
|
65
|
+
{"command": "help", "params": {"cmdname": "command_name"}, "description": "Get detailed information about a specific command"}
|
66
|
+
]
|
67
|
+
},
|
68
|
+
"commands": {},
|
69
|
+
"total": 0,
|
70
|
+
"custom_features": self.custom_info
|
71
|
+
}
|
72
|
+
|
73
|
+
result = self.commands_info.copy()
|
74
|
+
commands = result.get("commands", {})
|
75
|
+
result["total"] = len(commands)
|
76
|
+
result["custom_help"] = True
|
77
|
+
result["custom_features"] = self.custom_info
|
78
|
+
|
79
|
+
return result
|
80
|
+
|
81
|
+
@classmethod
|
82
|
+
def get_schema(cls) -> Dict[str, Any]:
|
83
|
+
"""
|
84
|
+
Get JSON schema for the result.
|
85
|
+
|
86
|
+
Returns:
|
87
|
+
Dict[str, Any]: JSON schema
|
88
|
+
"""
|
89
|
+
return {
|
90
|
+
"type": "object",
|
91
|
+
"properties": {
|
92
|
+
"cmdname": {
|
93
|
+
"type": "string",
|
94
|
+
"description": "Name of the command"
|
95
|
+
},
|
96
|
+
"info": {
|
97
|
+
"type": "object",
|
98
|
+
"properties": {
|
99
|
+
"description": {"type": "string"},
|
100
|
+
"summary": {"type": "string"},
|
101
|
+
"params": {"type": "object"},
|
102
|
+
"examples": {"type": "array"},
|
103
|
+
"custom_help": {"type": "boolean"}
|
104
|
+
}
|
105
|
+
},
|
106
|
+
"tool_info": {
|
107
|
+
"type": "object",
|
108
|
+
"properties": {
|
109
|
+
"name": {"type": "string"},
|
110
|
+
"description": {"type": "string"},
|
111
|
+
"version": {"type": "string"},
|
112
|
+
"custom_help": {"type": "boolean"}
|
113
|
+
}
|
114
|
+
},
|
115
|
+
"help_usage": {
|
116
|
+
"type": "object",
|
117
|
+
"properties": {
|
118
|
+
"description": {"type": "string"},
|
119
|
+
"examples": {"type": "array"}
|
120
|
+
}
|
121
|
+
},
|
122
|
+
"commands": {"type": "object"},
|
123
|
+
"total": {"type": "integer"},
|
124
|
+
"custom_features": {"type": "object"}
|
125
|
+
}
|
126
|
+
}
|
127
|
+
|
128
|
+
|
129
|
+
class CustomHelpCommand(Command):
|
130
|
+
"""
|
131
|
+
Custom help command with enhanced functionality.
|
132
|
+
"""
|
133
|
+
|
134
|
+
name = "help"
|
135
|
+
result_class = CustomHelpResult
|
136
|
+
|
137
|
+
async def execute(self, cmdname: Optional[str] = None, **kwargs) -> CustomHelpResult:
|
138
|
+
"""
|
139
|
+
Execute custom help command.
|
140
|
+
|
141
|
+
Args:
|
142
|
+
cmdname: Name of specific command to get help for
|
143
|
+
**kwargs: Additional parameters
|
144
|
+
|
145
|
+
Returns:
|
146
|
+
CustomHelpResult: Custom help command result
|
147
|
+
"""
|
148
|
+
try:
|
149
|
+
# Check if hook processed this request
|
150
|
+
request_id = kwargs.get("request_id")
|
151
|
+
hook_processed = kwargs.get("hook_processed", False)
|
152
|
+
|
153
|
+
if cmdname is not None:
|
154
|
+
# Get specific command info
|
155
|
+
command_info = registry.get_command_info(cmdname)
|
156
|
+
if command_info is None:
|
157
|
+
raise NotFoundError(f"Command '{cmdname}' not found")
|
158
|
+
|
159
|
+
custom_info = {
|
160
|
+
"enhanced": True,
|
161
|
+
"command_specific": True,
|
162
|
+
"request_id": request_id,
|
163
|
+
"hook_processed": hook_processed
|
164
|
+
}
|
165
|
+
|
166
|
+
return CustomHelpResult(
|
167
|
+
command_info=command_info,
|
168
|
+
custom_info=custom_info
|
169
|
+
)
|
170
|
+
else:
|
171
|
+
# Get all commands info
|
172
|
+
commands_info = registry.get_all_commands_info()
|
173
|
+
|
174
|
+
custom_info = {
|
175
|
+
"enhanced": True,
|
176
|
+
"total_commands": len(commands_info.get("commands", {})),
|
177
|
+
"custom_commands": ["echo", "help", "health"],
|
178
|
+
"request_id": request_id,
|
179
|
+
"hook_processed": hook_processed
|
180
|
+
}
|
181
|
+
|
182
|
+
return CustomHelpResult(
|
183
|
+
commands_info=commands_info,
|
184
|
+
custom_info=custom_info
|
185
|
+
)
|
186
|
+
|
187
|
+
except Exception as e:
|
188
|
+
# Return error result
|
189
|
+
return CustomHelpResult(
|
190
|
+
custom_info={
|
191
|
+
"error": str(e),
|
192
|
+
"enhanced": True,
|
193
|
+
"error_handling": True,
|
194
|
+
"request_id": request_id,
|
195
|
+
"hook_processed": hook_processed
|
196
|
+
}
|
197
|
+
)
|
198
|
+
|
199
|
+
@classmethod
|
200
|
+
def get_schema(cls) -> Dict[str, Any]:
|
201
|
+
"""
|
202
|
+
Get JSON schema for command parameters.
|
203
|
+
|
204
|
+
Returns:
|
205
|
+
Dict[str, Any]: JSON schema
|
206
|
+
"""
|
207
|
+
return {
|
208
|
+
"type": "object",
|
209
|
+
"properties": {
|
210
|
+
"cmdname": {
|
211
|
+
"type": "string",
|
212
|
+
"description": "Name of specific command to get help for"
|
213
|
+
}
|
214
|
+
}
|
215
|
+
}
|
@@ -0,0 +1,76 @@
|
|
1
|
+
"""
|
2
|
+
Custom OpenAPI generator example for the extended server.
|
3
|
+
|
4
|
+
This demonstrates how to create a custom OpenAPI schema generator
|
5
|
+
that can be registered with the framework.
|
6
|
+
"""
|
7
|
+
|
8
|
+
from typing import Dict, Any
|
9
|
+
from fastapi import FastAPI
|
10
|
+
|
11
|
+
from mcp_proxy_adapter.custom_openapi import register_openapi_generator, CustomOpenAPIGenerator
|
12
|
+
from mcp_proxy_adapter.core.logging import logger
|
13
|
+
|
14
|
+
|
15
|
+
def custom_openapi_generator(app: FastAPI) -> Dict[str, Any]:
|
16
|
+
"""
|
17
|
+
Custom OpenAPI generator for the extended server example.
|
18
|
+
|
19
|
+
This generator extends the default generator with additional
|
20
|
+
information specific to the extended server.
|
21
|
+
|
22
|
+
Args:
|
23
|
+
app: FastAPI application instance.
|
24
|
+
|
25
|
+
Returns:
|
26
|
+
Custom OpenAPI schema.
|
27
|
+
"""
|
28
|
+
# Use the default generator as base
|
29
|
+
default_generator = CustomOpenAPIGenerator()
|
30
|
+
schema = default_generator.generate(
|
31
|
+
title=getattr(app, 'title', None),
|
32
|
+
description=getattr(app, 'description', None),
|
33
|
+
version=getattr(app, 'version', None)
|
34
|
+
)
|
35
|
+
|
36
|
+
# Add custom information to the schema
|
37
|
+
schema["info"]["description"] += "\n\n## Extended Server Features:\n"
|
38
|
+
schema["info"]["description"] += "- Custom commands with hooks\n"
|
39
|
+
schema["info"]["description"] += "- Data transformation hooks\n"
|
40
|
+
schema["info"]["description"] += "- Command interception hooks\n"
|
41
|
+
schema["info"]["description"] += "- Auto-registration and manual registration examples\n"
|
42
|
+
|
43
|
+
# Add custom tags
|
44
|
+
if "tags" not in schema:
|
45
|
+
schema["tags"] = []
|
46
|
+
|
47
|
+
schema["tags"].extend([
|
48
|
+
{
|
49
|
+
"name": "custom-commands",
|
50
|
+
"description": "Custom commands with advanced features"
|
51
|
+
},
|
52
|
+
{
|
53
|
+
"name": "hooks",
|
54
|
+
"description": "Command hooks for data transformation and interception"
|
55
|
+
},
|
56
|
+
{
|
57
|
+
"name": "registration",
|
58
|
+
"description": "Command registration examples"
|
59
|
+
}
|
60
|
+
])
|
61
|
+
|
62
|
+
# Add custom server information
|
63
|
+
if "servers" not in schema:
|
64
|
+
schema["servers"] = []
|
65
|
+
|
66
|
+
schema["servers"].append({
|
67
|
+
"url": "http://localhost:8000",
|
68
|
+
"description": "Extended server with custom features"
|
69
|
+
})
|
70
|
+
|
71
|
+
logger.info("Generated custom OpenAPI schema for extended server")
|
72
|
+
return schema
|
73
|
+
|
74
|
+
|
75
|
+
# Register the custom generator
|
76
|
+
register_openapi_generator("extended_server", custom_openapi_generator)
|
@@ -0,0 +1,96 @@
|
|
1
|
+
{
|
2
|
+
"application": {
|
3
|
+
"name": "Extended MCP Proxy Server with Custom Settings",
|
4
|
+
"version": "2.1.0",
|
5
|
+
"environment": "development",
|
6
|
+
"description": "Advanced server with custom settings management"
|
7
|
+
},
|
8
|
+
"features": {
|
9
|
+
"advanced_hooks": true,
|
10
|
+
"custom_commands": true,
|
11
|
+
"data_transformation": true,
|
12
|
+
"command_interception": true,
|
13
|
+
"performance_monitoring": true,
|
14
|
+
"custom_settings_manager": true
|
15
|
+
},
|
16
|
+
"security": {
|
17
|
+
"enable_authentication": false,
|
18
|
+
"max_request_size": "15MB",
|
19
|
+
"rate_limiting": {
|
20
|
+
"enabled": true,
|
21
|
+
"requests_per_minute": 200,
|
22
|
+
"burst_limit": 50
|
23
|
+
},
|
24
|
+
"cors": {
|
25
|
+
"enabled": true,
|
26
|
+
"allowed_origins": ["*"],
|
27
|
+
"allowed_methods": ["GET", "POST", "PUT", "DELETE"]
|
28
|
+
}
|
29
|
+
},
|
30
|
+
"monitoring": {
|
31
|
+
"enable_metrics": true,
|
32
|
+
"metrics_interval": 30,
|
33
|
+
"health_check_interval": 15,
|
34
|
+
"log_level": "DEBUG",
|
35
|
+
"performance_tracking": {
|
36
|
+
"enabled": true,
|
37
|
+
"track_response_times": true,
|
38
|
+
"track_memory_usage": true
|
39
|
+
}
|
40
|
+
},
|
41
|
+
"custom_commands": {
|
42
|
+
"auto_echo": {
|
43
|
+
"enabled": true,
|
44
|
+
"max_length": 2000,
|
45
|
+
"enable_formatting": true
|
46
|
+
},
|
47
|
+
"data_transform": {
|
48
|
+
"enabled": true,
|
49
|
+
"transform_types": ["uppercase", "lowercase", "reverse", "capitalize", "title"],
|
50
|
+
"enable_custom_transforms": true
|
51
|
+
},
|
52
|
+
"intercept": {
|
53
|
+
"enabled": true,
|
54
|
+
"bypass_conditions": ["input_value == 0", "input_value < 0"],
|
55
|
+
"intercept_all_commands": false
|
56
|
+
},
|
57
|
+
"manual_echo": {
|
58
|
+
"enabled": true,
|
59
|
+
"description": "Manually registered echo command with custom settings"
|
60
|
+
}
|
61
|
+
},
|
62
|
+
"hooks": {
|
63
|
+
"data_transform": {
|
64
|
+
"enabled": true,
|
65
|
+
"transform_types": ["uppercase", "lowercase", "reverse"],
|
66
|
+
"apply_to_all_commands": false
|
67
|
+
},
|
68
|
+
"intercept": {
|
69
|
+
"enabled": true,
|
70
|
+
"bypass_conditions": ["input_value == 0"],
|
71
|
+
"log_interceptions": true
|
72
|
+
}
|
73
|
+
},
|
74
|
+
"database": {
|
75
|
+
"enabled": false,
|
76
|
+
"type": "sqlite",
|
77
|
+
"connection_string": "sqlite:///custom_server.db",
|
78
|
+
"pool_size": 10,
|
79
|
+
"max_overflow": 20
|
80
|
+
},
|
81
|
+
"cache": {
|
82
|
+
"enabled": true,
|
83
|
+
"type": "memory",
|
84
|
+
"ttl": 300,
|
85
|
+
"max_size": 1000
|
86
|
+
},
|
87
|
+
"api": {
|
88
|
+
"version": "v1",
|
89
|
+
"prefix": "/api/v1",
|
90
|
+
"documentation": {
|
91
|
+
"enabled": true,
|
92
|
+
"title": "Extended MCP Proxy API",
|
93
|
+
"description": "Advanced API with custom settings support"
|
94
|
+
}
|
95
|
+
}
|
96
|
+
}
|