mcp-proxy-adapter 2.0.2__py3-none-any.whl → 2.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- docs/README.md +172 -0
- docs/README_ru.md +172 -0
- docs/architecture.md +251 -0
- docs/architecture_ru.md +343 -0
- docs/command_development.md +250 -0
- docs/command_development_ru.md +593 -0
- docs/deployment.md +251 -0
- docs/deployment_ru.md +1298 -0
- docs/examples.md +254 -0
- docs/examples_ru.md +401 -0
- docs/mcp_proxy_adapter.md +251 -0
- docs/mcp_proxy_adapter_ru.md +405 -0
- docs/quickstart.md +251 -0
- docs/quickstart_ru.md +397 -0
- docs/testing.md +255 -0
- docs/testing_ru.md +469 -0
- docs/validation_ru.md +287 -0
- examples/analyze_config.py +141 -0
- examples/basic_integration.py +161 -0
- examples/docstring_and_schema_example.py +60 -0
- examples/extension_example.py +60 -0
- examples/help_best_practices.py +67 -0
- examples/help_usage.py +64 -0
- examples/mcp_proxy_client.py +131 -0
- examples/mcp_proxy_config.json +175 -0
- examples/openapi_server.py +369 -0
- examples/project_structure_example.py +47 -0
- examples/testing_example.py +53 -0
- mcp_proxy_adapter/__init__.py +1 -1
- mcp_proxy_adapter/models.py +19 -19
- {mcp_proxy_adapter-2.0.2.dist-info → mcp_proxy_adapter-2.1.1.dist-info}/METADATA +47 -13
- mcp_proxy_adapter-2.1.1.dist-info/RECORD +61 -0
- {mcp_proxy_adapter-2.0.2.dist-info → mcp_proxy_adapter-2.1.1.dist-info}/WHEEL +1 -1
- mcp_proxy_adapter-2.1.1.dist-info/top_level.txt +5 -0
- scripts/code_analyzer/code_analyzer.py +328 -0
- scripts/code_analyzer/register_commands.py +446 -0
- scripts/publish.py +85 -0
- tests/conftest.py +12 -0
- tests/test_adapter.py +529 -0
- tests/test_adapter_coverage.py +274 -0
- tests/test_basic_dispatcher.py +169 -0
- tests/test_command_registry.py +328 -0
- tests/test_examples.py +32 -0
- tests/test_mcp_proxy_adapter.py +568 -0
- tests/test_mcp_proxy_adapter_basic.py +262 -0
- tests/test_part1.py +348 -0
- tests/test_part2.py +524 -0
- tests/test_schema.py +358 -0
- tests/test_simple_adapter.py +251 -0
- mcp_proxy_adapter/adapters/__init__.py +0 -16
- mcp_proxy_adapter/cli/__init__.py +0 -12
- mcp_proxy_adapter/cli/__main__.py +0 -79
- mcp_proxy_adapter/cli/command_runner.py +0 -233
- mcp_proxy_adapter/generators/__init__.py +0 -14
- mcp_proxy_adapter/generators/endpoint_generator.py +0 -172
- mcp_proxy_adapter/generators/openapi_generator.py +0 -254
- mcp_proxy_adapter/generators/rest_api_generator.py +0 -207
- mcp_proxy_adapter/openapi_schema/__init__.py +0 -38
- mcp_proxy_adapter/openapi_schema/command_registry.py +0 -312
- mcp_proxy_adapter/openapi_schema/rest_schema.py +0 -510
- mcp_proxy_adapter/openapi_schema/rpc_generator.py +0 -307
- mcp_proxy_adapter/openapi_schema/rpc_schema.py +0 -416
- mcp_proxy_adapter/validators/__init__.py +0 -14
- mcp_proxy_adapter/validators/base_validator.py +0 -23
- mcp_proxy_adapter-2.0.2.dist-info/RECORD +0 -33
- mcp_proxy_adapter-2.0.2.dist-info/top_level.txt +0 -1
- {mcp_proxy_adapter-2.0.2.dist-info → mcp_proxy_adapter-2.1.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,251 @@
|
|
1
|
+
# MCP Proxy Adapter
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
MCP Proxy Adapter is a specialized adapter for integrating Command Registry with MCP Proxy (Model Control Protocol Proxy). It allows using commands from Command Registry as tools for artificial intelligence models, providing a unified JSON-RPC interface for interacting with commands.
|
6
|
+
|
7
|
+
## Key Features
|
8
|
+
|
9
|
+
- **JSON-RPC interface** for executing commands from the registry
|
10
|
+
- **Automatic configuration generation** for MCPProxy
|
11
|
+
- **OpenAPI schema optimization** for working with AI models
|
12
|
+
- **Enhanced error handling** with detailed logging
|
13
|
+
- **Parameter type validation** to prevent runtime errors
|
14
|
+
- **Integration with any FastAPI applications**
|
15
|
+
|
16
|
+
## Installation
|
17
|
+
|
18
|
+
```bash
|
19
|
+
pip install mcp-proxy-adapter
|
20
|
+
```
|
21
|
+
|
22
|
+
## Quick Start
|
23
|
+
|
24
|
+
### Basic Integration
|
25
|
+
|
26
|
+
```python
|
27
|
+
from fastapi import FastAPI
|
28
|
+
from command_registry import CommandRegistry
|
29
|
+
from mcp_proxy_adapter.adapter import MCPProxyAdapter
|
30
|
+
|
31
|
+
# Create FastAPI application
|
32
|
+
app = FastAPI()
|
33
|
+
|
34
|
+
# Create command registry
|
35
|
+
registry = CommandRegistry()
|
36
|
+
|
37
|
+
# Register commands
|
38
|
+
registry.register_command("search_by_text", search_function,
|
39
|
+
description="Search by text query")
|
40
|
+
|
41
|
+
# Create MCP Proxy adapter
|
42
|
+
adapter = MCPProxyAdapter(registry)
|
43
|
+
|
44
|
+
# Register endpoints in FastAPI application
|
45
|
+
adapter.register_endpoints(app)
|
46
|
+
|
47
|
+
# Save MCP Proxy configuration to file
|
48
|
+
adapter.save_config_to_file("mcp_proxy_config.json")
|
49
|
+
```
|
50
|
+
|
51
|
+
### Working with External Loggers
|
52
|
+
|
53
|
+
```python
|
54
|
+
import logging
|
55
|
+
from mcp_proxy_adapter.adapter import configure_logger
|
56
|
+
|
57
|
+
# Create application logger
|
58
|
+
app_logger = logging.getLogger("my_application")
|
59
|
+
app_logger.setLevel(logging.DEBUG)
|
60
|
+
|
61
|
+
# Configure handler for logger
|
62
|
+
handler = logging.StreamHandler()
|
63
|
+
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
|
64
|
+
app_logger.addHandler(handler)
|
65
|
+
|
66
|
+
# Integrate application logger with adapter
|
67
|
+
adapter_logger = configure_logger(app_logger)
|
68
|
+
|
69
|
+
# Now all messages from adapter will go through application logger
|
70
|
+
```
|
71
|
+
|
72
|
+
## Architecture
|
73
|
+
|
74
|
+
### Core Components
|
75
|
+
|
76
|
+
MCP Proxy Adapter consists of the following components:
|
77
|
+
|
78
|
+
1. **MCPProxyAdapter** — main class providing integration with Command Registry and FastAPI
|
79
|
+
2. **JsonRpcRequest/JsonRpcResponse** — models for working with JSON-RPC requests and responses
|
80
|
+
3. **SchemaOptimizer** — OpenAPI schema optimizer for working with MCP Proxy
|
81
|
+
4. **MCPProxyConfig/MCPProxyTool** — models for forming MCP Proxy configuration
|
82
|
+
|
83
|
+
### Technical Implementation Details
|
84
|
+
|
85
|
+
Based on code analysis, the following was discovered:
|
86
|
+
|
87
|
+
1. **Implementation duplication** — MCPProxyAdapter is present in two files:
|
88
|
+
- `src/adapter.py` (394 lines) — main adapter implementation
|
89
|
+
- `src/adapters/mcp_proxy_adapter.py` — specialized version
|
90
|
+
|
91
|
+
2. **OpenAPI Schemas** — a significant part of the codebase consists of OpenAPI schemas:
|
92
|
+
- `src/openapi_schema/rest_schema.py` (506 lines)
|
93
|
+
- `src/openapi_schema/rpc_schema.py` (414 lines)
|
94
|
+
|
95
|
+
3. **Method Call Chains**:
|
96
|
+
- `__init__` calls `_generate_router` for FastAPI router setup
|
97
|
+
- `save_config_to_file` uses `generate_mcp_proxy_config`
|
98
|
+
- `get_openapi_schema` uses `_generate_basic_schema`
|
99
|
+
- `execute_command` uses `_validate_param_types` for type checking
|
100
|
+
|
101
|
+
### Interaction Diagram
|
102
|
+
|
103
|
+
```
|
104
|
+
┌─────────────────┐ ┌────────────────────┐ ┌─────────────────┐
|
105
|
+
│ │ │ │ │ │
|
106
|
+
│ MCP Proxy │ │ MCPProxyAdapter │ │ CommandRegistry │
|
107
|
+
│ │◄─────┤ │◄─────┤ │
|
108
|
+
└─────────────────┘ └────────────────────┘ └─────────────────┘
|
109
|
+
▲ ▲ ▲
|
110
|
+
│ │ │
|
111
|
+
│ ┌────────┴───────┐ │
|
112
|
+
│ │ │ │
|
113
|
+
└────────────────┤ FastAPI App │──────────────────┘
|
114
|
+
│ │
|
115
|
+
└────────────────┘
|
116
|
+
```
|
117
|
+
|
118
|
+
## Adapter API
|
119
|
+
|
120
|
+
### Initialization
|
121
|
+
|
122
|
+
```python
|
123
|
+
def __init__(
|
124
|
+
self,
|
125
|
+
registry: CommandRegistry,
|
126
|
+
cmd_endpoint: str = "/cmd",
|
127
|
+
include_schema: bool = True,
|
128
|
+
optimize_schema: bool = True
|
129
|
+
)
|
130
|
+
```
|
131
|
+
|
132
|
+
* **registry** — CommandRegistry instance for integration
|
133
|
+
* **cmd_endpoint** — path for command execution endpoint
|
134
|
+
* **include_schema** — whether to include OpenAPI schema generation
|
135
|
+
* **optimize_schema** — whether to optimize schema for MCP Proxy
|
136
|
+
|
137
|
+
### Main Methods
|
138
|
+
|
139
|
+
* **register_endpoints(app: FastAPI)** — registers endpoints in FastAPI application
|
140
|
+
* **generate_mcp_proxy_config()** — generates configuration for MCP Proxy
|
141
|
+
* **save_config_to_file(filename: str)** — saves configuration to file
|
142
|
+
* **_generate_router()** — internal method for generating FastAPI router
|
143
|
+
* **_validate_param_types(command, params)** — checks parameter types before command execution
|
144
|
+
* **_generate_basic_schema()** — creates basic OpenAPI schema when generator is absent
|
145
|
+
* **_optimize_schema(schema)** — optimizes OpenAPI schema for MCP Proxy
|
146
|
+
|
147
|
+
## Implementation Features
|
148
|
+
|
149
|
+
Code analysis revealed the following important implementation aspects:
|
150
|
+
|
151
|
+
1. **Parameter Validation** occurs in several stages:
|
152
|
+
- First, command presence in registry is checked
|
153
|
+
- Then, presence of all required parameters is verified
|
154
|
+
- After that, types of all passed parameters are checked
|
155
|
+
|
156
|
+
2. **Error Handling** is implemented using an extensive try/except mechanism that:
|
157
|
+
- Catches specific exceptions (TypeError, KeyError)
|
158
|
+
- Handles general exceptions through Exception block
|
159
|
+
- Formats all errors in JSON-RPC format with appropriate codes
|
160
|
+
|
161
|
+
3. **Schema Optimization** includes several steps:
|
162
|
+
- Removing redundant information from OpenAPI schema
|
163
|
+
- Adding JSON-RPC components
|
164
|
+
- Preparing schema for use with MCP Proxy
|
165
|
+
|
166
|
+
## JSON-RPC Protocol
|
167
|
+
|
168
|
+
### Request Format
|
169
|
+
|
170
|
+
```json
|
171
|
+
{
|
172
|
+
"jsonrpc": "2.0",
|
173
|
+
"method": "command_name",
|
174
|
+
"params": {
|
175
|
+
"param1": "value1",
|
176
|
+
"param2": "value2"
|
177
|
+
},
|
178
|
+
"id": "request_id"
|
179
|
+
}
|
180
|
+
```
|
181
|
+
|
182
|
+
### Successful Response Format
|
183
|
+
|
184
|
+
```json
|
185
|
+
{
|
186
|
+
"jsonrpc": "2.0",
|
187
|
+
"result": {
|
188
|
+
// Command execution result
|
189
|
+
},
|
190
|
+
"id": "request_id"
|
191
|
+
}
|
192
|
+
```
|
193
|
+
|
194
|
+
### Error Response Format
|
195
|
+
|
196
|
+
```json
|
197
|
+
{
|
198
|
+
"jsonrpc": "2.0",
|
199
|
+
"error": {
|
200
|
+
"code": -32603,
|
201
|
+
"message": "Error description"
|
202
|
+
},
|
203
|
+
"id": "request_id"
|
204
|
+
}
|
205
|
+
```
|
206
|
+
|
207
|
+
## Error Handling
|
208
|
+
|
209
|
+
The adapter handles and logs the following error types:
|
210
|
+
|
211
|
+
1. **Non-existent Command** (-32601) — calling a command not registered in the registry
|
212
|
+
2. **Missing Required Parameters** (-32602) — required command parameters not specified
|
213
|
+
3. **Parameter Type Errors** (-32602) — parameter type doesn't match expected type
|
214
|
+
4. **Command Execution Errors** (-32603) — exceptions occurring during execution
|
215
|
+
5. **Internal Server Errors** (-32603) — unexpected errors in adapter operation
|
216
|
+
|
217
|
+
## Usage Examples
|
218
|
+
|
219
|
+
### Integration with Existing FastAPI Application
|
220
|
+
|
221
|
+
```python
|
222
|
+
from fastapi import FastAPI
|
223
|
+
from command_registry import CommandRegistry
|
224
|
+
from mcp_proxy_adapter.adapter import MCPProxyAdapter, configure_logger
|
225
|
+
|
226
|
+
# Create main application
|
227
|
+
app = FastAPI(title="My Application API")
|
228
|
+
|
229
|
+
# Create command registry
|
230
|
+
registry = CommandRegistry()
|
231
|
+
|
232
|
+
# Register commands from different modules
|
233
|
+
registry.scan_module("myapp.commands.search")
|
234
|
+
registry.scan_module("myapp.commands.analytics")
|
235
|
+
|
236
|
+
# Configure project logger and integrate it with adapter
|
237
|
+
logger = logging.getLogger("myapp")
|
238
|
+
adapter_logger = configure_logger(logger)
|
239
|
+
|
240
|
+
# Create MCP Proxy adapter
|
241
|
+
adapter = MCPProxyAdapter(registry)
|
242
|
+
|
243
|
+
# Register endpoints in application
|
244
|
+
adapter.register_endpoints(app)
|
245
|
+
|
246
|
+
# Save configuration for MCP Proxy
|
247
|
+
adapter.save_config_to_file("config/mcp_proxy_config.json")
|
248
|
+
```
|
249
|
+
|
250
|
+
### Parameter Type Validation
|
251
|
+
```
|
@@ -0,0 +1,405 @@
|
|
1
|
+
# MCP Proxy Adapter
|
2
|
+
|
3
|
+
## Обзор
|
4
|
+
|
5
|
+
MCP Proxy Adapter — это специализированный адаптер для интеграции Command Registry с MCP Proxy (Model Control Protocol Proxy). Он позволяет использовать команды из Command Registry как инструменты (tools) для моделей искусственного интеллекта, предоставляя унифицированный JSON-RPC интерфейс для взаимодействия с командами.
|
6
|
+
|
7
|
+
## Основные возможности
|
8
|
+
|
9
|
+
- **JSON-RPC интерфейс** для выполнения команд из реестра
|
10
|
+
- **Автоматическая генерация конфигурации** для MCPProxy
|
11
|
+
- **Оптимизация OpenAPI схемы** для работы с моделями ИИ
|
12
|
+
- **Расширенная обработка ошибок** с детальным логированием
|
13
|
+
- **Валидация типов параметров** для предотвращения ошибок во время выполнения
|
14
|
+
- **Интеграция с любыми FastAPI приложениями**
|
15
|
+
|
16
|
+
## Установка
|
17
|
+
|
18
|
+
```bash
|
19
|
+
pip install mcp-proxy-adapter
|
20
|
+
```
|
21
|
+
|
22
|
+
## Быстрый старт
|
23
|
+
|
24
|
+
### Базовая интеграция
|
25
|
+
|
26
|
+
```python
|
27
|
+
from fastapi import FastAPI
|
28
|
+
from command_registry import CommandRegistry
|
29
|
+
from mcp_proxy_adapter.adapter import MCPProxyAdapter
|
30
|
+
|
31
|
+
# Создаем приложение FastAPI
|
32
|
+
app = FastAPI()
|
33
|
+
|
34
|
+
# Создаем реестр команд
|
35
|
+
registry = CommandRegistry()
|
36
|
+
|
37
|
+
# Регистрируем команды
|
38
|
+
registry.register_command("search_by_text", search_function,
|
39
|
+
description="Поиск по текстовому запросу")
|
40
|
+
|
41
|
+
# Создаем MCP Proxy адаптер
|
42
|
+
adapter = MCPProxyAdapter(registry)
|
43
|
+
|
44
|
+
# Регистрируем эндпоинты в FastAPI приложении
|
45
|
+
adapter.register_endpoints(app)
|
46
|
+
|
47
|
+
# Сохраняем конфигурацию MCP Proxy в файл
|
48
|
+
adapter.save_config_to_file("mcp_proxy_config.json")
|
49
|
+
```
|
50
|
+
|
51
|
+
### Работа с внешними логгерами
|
52
|
+
|
53
|
+
```python
|
54
|
+
import logging
|
55
|
+
from mcp_proxy_adapter.adapter import configure_logger
|
56
|
+
|
57
|
+
# Создаем логгер приложения
|
58
|
+
app_logger = logging.getLogger("my_application")
|
59
|
+
app_logger.setLevel(logging.DEBUG)
|
60
|
+
|
61
|
+
# Настраиваем обработчик для логгера
|
62
|
+
handler = logging.StreamHandler()
|
63
|
+
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
|
64
|
+
app_logger.addHandler(handler)
|
65
|
+
|
66
|
+
# Интегрируем логгер приложения с адаптером
|
67
|
+
adapter_logger = configure_logger(app_logger)
|
68
|
+
|
69
|
+
# Теперь все сообщения от адаптера будут проходить через логгер приложения
|
70
|
+
```
|
71
|
+
|
72
|
+
## Архитектура
|
73
|
+
|
74
|
+
### Основные компоненты
|
75
|
+
|
76
|
+
MCP Proxy Adapter состоит из следующих компонентов:
|
77
|
+
|
78
|
+
1. **MCPProxyAdapter** — основной класс, обеспечивающий интеграцию с Command Registry и FastAPI
|
79
|
+
2. **JsonRpcRequest/JsonRpcResponse** — модели для работы с JSON-RPC запросами и ответами
|
80
|
+
3. **SchemaOptimizer** — оптимизатор OpenAPI схемы для работы с MCP Proxy
|
81
|
+
4. **MCPProxyConfig/MCPProxyTool** — модели для формирования конфигурации MCP Proxy
|
82
|
+
|
83
|
+
### Технические детали реализации
|
84
|
+
|
85
|
+
На основании анализа кода было обнаружено:
|
86
|
+
|
87
|
+
1. **Дублирование реализации** — MCPProxyAdapter представлен в двух файлах:
|
88
|
+
- `src/adapter.py` (394 строки) — основная реализация адаптера
|
89
|
+
- `src/adapters/mcp_proxy_adapter.py` — специализированная версия
|
90
|
+
|
91
|
+
2. **Схемы OpenAPI** — значительную часть кодовой базы составляют схемы OpenAPI:
|
92
|
+
- `src/openapi_schema/rest_schema.py` (506 строк)
|
93
|
+
- `src/openapi_schema/rpc_schema.py` (414 строк)
|
94
|
+
|
95
|
+
3. **Цепочки вызовов методов**:
|
96
|
+
- `__init__` вызывает `_generate_router` для настройки FastAPI маршрутизатора
|
97
|
+
- `save_config_to_file` использует `generate_mcp_proxy_config`
|
98
|
+
- `get_openapi_schema` использует `_generate_basic_schema`
|
99
|
+
- `execute_command` использует `_validate_param_types` для проверки типов
|
100
|
+
|
101
|
+
### Диаграмма взаимодействия
|
102
|
+
|
103
|
+
```
|
104
|
+
┌─────────────────┐ ┌────────────────────┐ ┌─────────────────┐
|
105
|
+
│ │ │ │ │ │
|
106
|
+
│ МСР Proxy │ │ MCPProxyAdapter │ │ CommandRegistry │
|
107
|
+
│ │◄─────┤ │◄─────┤ │
|
108
|
+
└─────────────────┘ └────────────────────┘ └─────────────────┘
|
109
|
+
▲ ▲ ▲
|
110
|
+
│ │ │
|
111
|
+
│ ┌────────┴───────┐ │
|
112
|
+
│ │ │ │
|
113
|
+
└────────────────┤ FastAPI App │──────────────────┘
|
114
|
+
│ │
|
115
|
+
└────────────────┘
|
116
|
+
```
|
117
|
+
|
118
|
+
## API адаптера
|
119
|
+
|
120
|
+
### Инициализация
|
121
|
+
|
122
|
+
```python
|
123
|
+
def __init__(
|
124
|
+
self,
|
125
|
+
registry: CommandRegistry,
|
126
|
+
cmd_endpoint: str = "/cmd",
|
127
|
+
include_schema: bool = True,
|
128
|
+
optimize_schema: bool = True
|
129
|
+
)
|
130
|
+
```
|
131
|
+
|
132
|
+
* **registry** — экземпляр CommandRegistry для интеграции
|
133
|
+
* **cmd_endpoint** — путь для эндпоинта выполнения команд
|
134
|
+
* **include_schema** — включить ли генерацию схемы OpenAPI
|
135
|
+
* **optimize_schema** — оптимизировать ли схему для MCP Proxy
|
136
|
+
|
137
|
+
### Основные методы
|
138
|
+
|
139
|
+
* **register_endpoints(app: FastAPI)** — регистрирует эндпоинты в приложении FastAPI
|
140
|
+
* **generate_mcp_proxy_config()** — генерирует конфигурацию для MCP Proxy
|
141
|
+
* **save_config_to_file(filename: str)** — сохраняет конфигурацию в файл
|
142
|
+
* **_generate_router()** — внутренний метод для генерации маршрутизатора FastAPI
|
143
|
+
* **_validate_param_types(command, params)** — проверяет типы параметров перед выполнением команды
|
144
|
+
* **_generate_basic_schema()** — создает базовую схему OpenAPI при отсутствии генератора
|
145
|
+
* **_optimize_schema(schema)** — оптимизирует схему OpenAPI для MCP Proxy
|
146
|
+
|
147
|
+
## Особенности реализации
|
148
|
+
|
149
|
+
Анализ кода показал следующие важные аспекты реализации:
|
150
|
+
|
151
|
+
1. **Валидация параметров** происходит в несколько этапов:
|
152
|
+
- Сначала проверяется наличие команды в реестре
|
153
|
+
- Затем проверяется наличие всех обязательных параметров
|
154
|
+
- После этого проверяются типы всех переданных параметров
|
155
|
+
|
156
|
+
2. **Обработка ошибок** реализована с помощью обширного механизма try/except, который:
|
157
|
+
- Перехватывает специфические исключения (TypeError, KeyError)
|
158
|
+
- Обрабатывает общие исключения через блок Exception
|
159
|
+
- Форматирует все ошибки в формат JSON-RPC с соответствующими кодами
|
160
|
+
|
161
|
+
3. **Оптимизация схемы** включает несколько шагов:
|
162
|
+
- Удаление избыточной информации из схемы OpenAPI
|
163
|
+
- Добавление JSON-RPC компонентов
|
164
|
+
- Подготовка схемы для использования с MCP Proxy
|
165
|
+
|
166
|
+
## JSON-RPC протокол
|
167
|
+
|
168
|
+
### Формат запроса
|
169
|
+
|
170
|
+
```json
|
171
|
+
{
|
172
|
+
"jsonrpc": "2.0",
|
173
|
+
"method": "имя_команды",
|
174
|
+
"params": {
|
175
|
+
"параметр1": "значение1",
|
176
|
+
"параметр2": "значение2"
|
177
|
+
},
|
178
|
+
"id": "идентификатор_запроса"
|
179
|
+
}
|
180
|
+
```
|
181
|
+
|
182
|
+
### Формат успешного ответа
|
183
|
+
|
184
|
+
```json
|
185
|
+
{
|
186
|
+
"jsonrpc": "2.0",
|
187
|
+
"result": {
|
188
|
+
// Результат выполнения команды
|
189
|
+
},
|
190
|
+
"id": "идентификатор_запроса"
|
191
|
+
}
|
192
|
+
```
|
193
|
+
|
194
|
+
### Формат ответа с ошибкой
|
195
|
+
|
196
|
+
```json
|
197
|
+
{
|
198
|
+
"jsonrpc": "2.0",
|
199
|
+
"error": {
|
200
|
+
"code": -32603,
|
201
|
+
"message": "Описание ошибки"
|
202
|
+
},
|
203
|
+
"id": "идентификатор_запроса"
|
204
|
+
}
|
205
|
+
```
|
206
|
+
|
207
|
+
## Обработка ошибок
|
208
|
+
|
209
|
+
Адаптер обрабатывает и логирует следующие типы ошибок:
|
210
|
+
|
211
|
+
1. **Несуществующая команда** (-32601) — вызов команды, которая не зарегистрирована в реестре
|
212
|
+
2. **Отсутствие обязательных параметров** (-32602) — не указаны обязательные параметры команды
|
213
|
+
3. **Ошибки типов параметров** (-32602) — тип параметра не соответствует ожидаемому
|
214
|
+
4. **Ошибки при выполнении команды** (-32603) — исключения, возникающие в процессе выполнения
|
215
|
+
5. **Внутренние ошибки сервера** (-32603) — непредвиденные ошибки в работе адаптера
|
216
|
+
|
217
|
+
## Примеры использования
|
218
|
+
|
219
|
+
### Интеграция с существующим FastAPI приложением
|
220
|
+
|
221
|
+
```python
|
222
|
+
from fastapi import FastAPI
|
223
|
+
from command_registry import CommandRegistry
|
224
|
+
from mcp_proxy_adapter.adapter import MCPProxyAdapter, configure_logger
|
225
|
+
|
226
|
+
# Создаем основное приложение
|
227
|
+
app = FastAPI(title="My Application API")
|
228
|
+
|
229
|
+
# Создаем реестр команд
|
230
|
+
registry = CommandRegistry()
|
231
|
+
|
232
|
+
# Регистрируем команды из разных модулей
|
233
|
+
registry.scan_module("myapp.commands.search")
|
234
|
+
registry.scan_module("myapp.commands.analytics")
|
235
|
+
|
236
|
+
# Настраиваем логгер проекта и интегрируем его с адаптером
|
237
|
+
logger = logging.getLogger("myapp")
|
238
|
+
adapter_logger = configure_logger(logger)
|
239
|
+
|
240
|
+
# Создаем MCP Proxy адаптер
|
241
|
+
adapter = MCPProxyAdapter(registry)
|
242
|
+
|
243
|
+
# Регистрируем эндпоинты в приложении
|
244
|
+
adapter.register_endpoints(app)
|
245
|
+
|
246
|
+
# Сохраняем конфигурацию для MCP Proxy
|
247
|
+
adapter.save_config_to_file("config/mcp_proxy_config.json")
|
248
|
+
```
|
249
|
+
|
250
|
+
### Валидация типов параметров
|
251
|
+
|
252
|
+
MCP Proxy Adapter автоматически проверяет типы параметров перед выполнением команды:
|
253
|
+
|
254
|
+
```python
|
255
|
+
# Определение команды с типизированными параметрами
|
256
|
+
def search_documents(query: str, max_results: int = 10, filters: dict = None) -> list:
|
257
|
+
"""
|
258
|
+
Поиск документов по запросу.
|
259
|
+
|
260
|
+
Args:
|
261
|
+
query: Поисковый запрос
|
262
|
+
max_results: Максимальное количество результатов
|
263
|
+
filters: Фильтры для уточнения поиска
|
264
|
+
|
265
|
+
Returns:
|
266
|
+
Список найденных документов
|
267
|
+
"""
|
268
|
+
# Реализация поиска...
|
269
|
+
|
270
|
+
# Пример JSON-RPC запроса с некорректным типом
|
271
|
+
# {
|
272
|
+
# "jsonrpc": "2.0",
|
273
|
+
# "method": "search_documents",
|
274
|
+
# "params": {
|
275
|
+
# "query": "test query",
|
276
|
+
# "max_results": "not_a_number" # Должно быть числом
|
277
|
+
# },
|
278
|
+
# "id": 1
|
279
|
+
# }
|
280
|
+
#
|
281
|
+
# Ответ с ошибкой:
|
282
|
+
# {
|
283
|
+
# "jsonrpc": "2.0",
|
284
|
+
# "error": {
|
285
|
+
# "code": -32602,
|
286
|
+
# "message": "Invalid parameter types: Параметр 'max_results' должен быть целым числом"
|
287
|
+
# },
|
288
|
+
# "id": 1
|
289
|
+
# }
|
290
|
+
```
|
291
|
+
|
292
|
+
## Тестирование адаптера
|
293
|
+
|
294
|
+
Для тестирования MCP Proxy Adapter рекомендуется использовать следующий подход:
|
295
|
+
|
296
|
+
```python
|
297
|
+
import pytest
|
298
|
+
from fastapi import FastAPI
|
299
|
+
from fastapi.testclient import TestClient
|
300
|
+
from command_registry import CommandRegistry
|
301
|
+
from mcp_proxy_adapter.adapter import MCPProxyAdapter
|
302
|
+
|
303
|
+
# Тестовая команда
|
304
|
+
def test_command(value: int = 1) -> dict:
|
305
|
+
"""Тестовая команда."""
|
306
|
+
return {"result": value * 2}
|
307
|
+
|
308
|
+
@pytest.fixture
|
309
|
+
def test_app():
|
310
|
+
"""Создает тестовое приложение с настроенным адаптером."""
|
311
|
+
# Создаем реестр команд
|
312
|
+
registry = CommandRegistry()
|
313
|
+
registry.register_command("test", test_command)
|
314
|
+
|
315
|
+
# Создаем адаптер
|
316
|
+
adapter = MCPProxyAdapter(registry)
|
317
|
+
|
318
|
+
# Создаем приложение FastAPI
|
319
|
+
app = FastAPI()
|
320
|
+
adapter.register_endpoints(app)
|
321
|
+
|
322
|
+
# Возвращаем тестовый клиент
|
323
|
+
return TestClient(app)
|
324
|
+
|
325
|
+
def test_successful_command_execution(test_app):
|
326
|
+
"""Тест успешного выполнения команды."""
|
327
|
+
response = test_app.post("/cmd", json={
|
328
|
+
"jsonrpc": "2.0",
|
329
|
+
"method": "test",
|
330
|
+
"params": {"value": 5},
|
331
|
+
"id": 1
|
332
|
+
})
|
333
|
+
assert response.status_code == 200
|
334
|
+
data = response.json()
|
335
|
+
assert data["result"] == {"result": 10}
|
336
|
+
assert data["jsonrpc"] == "2.0"
|
337
|
+
assert data["id"] == 1
|
338
|
+
```
|
339
|
+
|
340
|
+
## Интеграция с MCP Proxy
|
341
|
+
|
342
|
+
### Конфигурация MCP Proxy
|
343
|
+
|
344
|
+
MCP Proxy Adapter автоматически генерирует конфигурацию для MCP Proxy:
|
345
|
+
|
346
|
+
```json
|
347
|
+
{
|
348
|
+
"version": "1.0",
|
349
|
+
"tools": [
|
350
|
+
{
|
351
|
+
"name": "mcp_search_documents",
|
352
|
+
"description": "Поиск документов по запросу",
|
353
|
+
"parameters": {
|
354
|
+
"type": "object",
|
355
|
+
"properties": {
|
356
|
+
"query": {
|
357
|
+
"type": "string",
|
358
|
+
"description": "Поисковый запрос"
|
359
|
+
},
|
360
|
+
"max_results": {
|
361
|
+
"type": "integer",
|
362
|
+
"description": "Максимальное количество результатов"
|
363
|
+
},
|
364
|
+
"filters": {
|
365
|
+
"type": "object",
|
366
|
+
"description": "Фильтры для уточнения поиска"
|
367
|
+
}
|
368
|
+
},
|
369
|
+
"required": ["query"]
|
370
|
+
}
|
371
|
+
}
|
372
|
+
],
|
373
|
+
"routes": [
|
374
|
+
{
|
375
|
+
"path": "/cmd",
|
376
|
+
"type": "json_rpc",
|
377
|
+
"method_field": "method",
|
378
|
+
"params_field": "params"
|
379
|
+
}
|
380
|
+
]
|
381
|
+
}
|
382
|
+
```
|
383
|
+
|
384
|
+
### Запуск с MCP Proxy
|
385
|
+
|
386
|
+
1. Запустите ваше FastAPI приложение с MCPProxyAdapter
|
387
|
+
2. Запустите MCP Proxy с сгенерированной конфигурацией:
|
388
|
+
```bash
|
389
|
+
mcp-proxy --config mcp_proxy_config.json
|
390
|
+
```
|
391
|
+
3. Настройте модель ИИ для работы с MCP Proxy
|
392
|
+
|
393
|
+
## Известные проблемы и ограничения
|
394
|
+
|
395
|
+
Анализ кода показал следующие моменты, о которых следует знать:
|
396
|
+
|
397
|
+
1. **Дублирование реализации** — адаптер реализован в двух разных файлах, что может привести к несогласованности при обновлениях. Рекомендуется использовать версию из `mcp_proxy_adapter.adapter`.
|
398
|
+
|
399
|
+
2. **Большой размер схем** — схемы OpenAPI довольно объемные (более 400 строк), что может повлиять на производительность при обработке большого количества команд.
|
400
|
+
|
401
|
+
3. **Ограничения обнаружения типов** — валидация типов работает только с базовыми типами Python и может иметь ограничения при работе со сложными пользовательскими типами.
|
402
|
+
|
403
|
+
## Заключение
|
404
|
+
|
405
|
+
MCP Proxy Adapter — это мощный инструмент для интеграции Command Registry с моделями искусственного интеллекта через MCP Proxy. Он предоставляет унифицированный JSON-RPC интерфейс, автоматически генерирует конфигурацию для MCP Proxy и обеспечивает надежную обработку ошибок и валидацию параметров.
|