mcp-proxy-adapter 2.1.16__tar.gz → 2.1.17__tar.gz
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-2.1.16/mcp_proxy_adapter.egg-info → mcp_proxy_adapter-2.1.17}/PKG-INFO +37 -2
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/README.md +36 -1
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/adapter.py +2 -2
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/dispatchers/json_rpc_dispatcher.py +30 -3
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17/mcp_proxy_adapter.egg-info}/PKG-INFO +37 -2
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/pyproject.toml +1 -1
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/setup.py +1 -1
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/LICENSE +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/MANIFEST.in +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/code_index.yaml +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/docs/RU/FAQ_HOWTO.md +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/__init__.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/analyzers/__init__.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/analyzers/docstring_analyzer.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/analyzers/type_analyzer.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/dispatchers/__init__.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/dispatchers/base_dispatcher.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/analyze_config.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/basic_integration.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/docstring_and_schema_example.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/extension_example.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/help_best_practices.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/help_usage.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/mcp_proxy_client.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/openapi_server.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/project_structure_example.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/testing_example.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/models.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/registry.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/schema.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/testing_utils.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/validators/__init__.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/validators/docstring_validator.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/validators/metadata_validator.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter.egg-info/SOURCES.txt +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter.egg-info/dependency_links.txt +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter.egg-info/requires.txt +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter.egg-info/top_level.txt +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/requirements.txt +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/setup.cfg +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/tests/conftest.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/tests/test_adapter.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/tests/test_adapter_coverage.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/tests/test_basic_dispatcher.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/tests/test_command_registry.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/tests/test_examples.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/tests/test_mcp_proxy_adapter.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/tests/test_mcp_proxy_adapter_basic.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/tests/test_part1.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/tests/test_part2.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/tests/test_schema.py +0 -0
- {mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/tests/test_simple_adapter.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: mcp-proxy-adapter
|
3
|
-
Version: 2.1.
|
3
|
+
Version: 2.1.17
|
4
4
|
Summary: Adapter for exposing Command Registry commands as tools for AI models via MCP Proxy.
|
5
5
|
Home-page: https://github.com/vasilyvz/mcp-proxy-adapter
|
6
6
|
Author: Vasiliy VZ
|
@@ -338,4 +338,39 @@ This project uses GitHub Actions for continuous integration and automated publis
|
|
338
338
|
- All tests are run on every push and pull request.
|
339
339
|
- On push of a new tag (vX.Y.Z), the package is built and published to PyPI automatically.
|
340
340
|
|
341
|
-
See `.github/workflows/publish.yml` for details.
|
341
|
+
See `.github/workflows/publish.yml` for details.
|
342
|
+
|
343
|
+
## Встроенная команда help: правила и типовые ошибки
|
344
|
+
|
345
|
+
### Как работает
|
346
|
+
- Команда `help` всегда встроена в MCPProxyAdapter и не требует реализации или регистрации со стороны пользователя.
|
347
|
+
- Для получения справки по конкретной команде используйте параметр `cmdname`:
|
348
|
+
```json
|
349
|
+
{"jsonrpc": "2.0", "method": "help", "params": {"cmdname": "имя_команды"}, "id": 1}
|
350
|
+
```
|
351
|
+
- Для получения списка всех команд:
|
352
|
+
```json
|
353
|
+
{"jsonrpc": "2.0", "method": "help", "id": 1}
|
354
|
+
```
|
355
|
+
|
356
|
+
### Типовые ошибки и их решения
|
357
|
+
- **Ошибка: передан параметр `command` вместо `cmdname`**
|
358
|
+
- Ответ:
|
359
|
+
```json
|
360
|
+
{"error": "Parameter 'command' is not supported. Use 'cmdname' instead.", "hint": "Send params: {\"cmdname\": \"your_command\"}", ...}
|
361
|
+
```
|
362
|
+
- **Решение:** всегда используйте `cmdname`.
|
363
|
+
- **Ошибка сериализации coroutine**
|
364
|
+
- Причина: handler вызывается без await, либо возвращает coroutine.
|
365
|
+
- Ответ:
|
366
|
+
```json
|
367
|
+
{"error": "Help handler must be awaited. Call as await dispatcher.execute('help', ...) in async context.", ...}
|
368
|
+
```
|
369
|
+
- **Решение:** всегда await-ить dispatcher.execute в async endpoint.
|
370
|
+
|
371
|
+
### Важно для интеграторов и пользователей
|
372
|
+
- Не реализуйте свой обработчик help — используйте встроенный.
|
373
|
+
- Не используйте параметр `command` — только `cmdname`.
|
374
|
+
- Все ошибки help-команды теперь сопровождаются понятной подсказкой и примером корректного запроса.
|
375
|
+
|
376
|
+
---
|
@@ -306,4 +306,39 @@ This project uses GitHub Actions for continuous integration and automated publis
|
|
306
306
|
- All tests are run on every push and pull request.
|
307
307
|
- On push of a new tag (vX.Y.Z), the package is built and published to PyPI automatically.
|
308
308
|
|
309
|
-
See `.github/workflows/publish.yml` for details.
|
309
|
+
See `.github/workflows/publish.yml` for details.
|
310
|
+
|
311
|
+
## Встроенная команда help: правила и типовые ошибки
|
312
|
+
|
313
|
+
### Как работает
|
314
|
+
- Команда `help` всегда встроена в MCPProxyAdapter и не требует реализации или регистрации со стороны пользователя.
|
315
|
+
- Для получения справки по конкретной команде используйте параметр `cmdname`:
|
316
|
+
```json
|
317
|
+
{"jsonrpc": "2.0", "method": "help", "params": {"cmdname": "имя_команды"}, "id": 1}
|
318
|
+
```
|
319
|
+
- Для получения списка всех команд:
|
320
|
+
```json
|
321
|
+
{"jsonrpc": "2.0", "method": "help", "id": 1}
|
322
|
+
```
|
323
|
+
|
324
|
+
### Типовые ошибки и их решения
|
325
|
+
- **Ошибка: передан параметр `command` вместо `cmdname`**
|
326
|
+
- Ответ:
|
327
|
+
```json
|
328
|
+
{"error": "Parameter 'command' is not supported. Use 'cmdname' instead.", "hint": "Send params: {\"cmdname\": \"your_command\"}", ...}
|
329
|
+
```
|
330
|
+
- **Решение:** всегда используйте `cmdname`.
|
331
|
+
- **Ошибка сериализации coroutine**
|
332
|
+
- Причина: handler вызывается без await, либо возвращает coroutine.
|
333
|
+
- Ответ:
|
334
|
+
```json
|
335
|
+
{"error": "Help handler must be awaited. Call as await dispatcher.execute('help', ...) in async context.", ...}
|
336
|
+
```
|
337
|
+
- **Решение:** всегда await-ить dispatcher.execute в async endpoint.
|
338
|
+
|
339
|
+
### Важно для интеграторов и пользователей
|
340
|
+
- Не реализуйте свой обработчик help — используйте встроенный.
|
341
|
+
- Не используйте параметр `command` — только `cmdname`.
|
342
|
+
- Все ошибки help-команды теперь сопровождаются понятной подсказкой и примером корректного запроса.
|
343
|
+
|
344
|
+
---
|
@@ -236,7 +236,7 @@ class MCPProxyAdapter:
|
|
236
236
|
# Execute the command
|
237
237
|
logger.debug(f"Executing command {request.method} with parameters {request.params}")
|
238
238
|
try:
|
239
|
-
result = self.registry.dispatcher.execute(
|
239
|
+
result = await self.registry.dispatcher.execute(
|
240
240
|
request.method,
|
241
241
|
**request.params
|
242
242
|
)
|
@@ -537,7 +537,7 @@ class MCPProxyAdapter:
|
|
537
537
|
|
538
538
|
# Execute the command
|
539
539
|
try:
|
540
|
-
result = self.registry.dispatcher.execute(command, **params)
|
540
|
+
result = await self.registry.dispatcher.execute(command, **params)
|
541
541
|
|
542
542
|
# Return result in MCP Proxy format
|
543
543
|
return {"result": result}
|
@@ -141,7 +141,22 @@ class JsonRpcDispatcher(BaseDispatcher):
|
|
141
141
|
async def _return_sync():
|
142
142
|
return result
|
143
143
|
return await _return_sync()
|
144
|
-
except
|
144
|
+
except TypeError as e:
|
145
|
+
# Попробовать вызвать handler(params=kwargs), если ошибка связана с лишними именованными аргументами
|
146
|
+
if (len(params) == 1 and 'params' in params):
|
147
|
+
try:
|
148
|
+
if inspect.iscoroutinefunction(handler):
|
149
|
+
result = handler(params=kwargs)
|
150
|
+
else:
|
151
|
+
result = loop.run_in_executor(None, lambda: handler(params=kwargs))
|
152
|
+
if inspect.isawaitable(result):
|
153
|
+
return await result
|
154
|
+
else:
|
155
|
+
async def _return_sync():
|
156
|
+
return result
|
157
|
+
return await _return_sync()
|
158
|
+
except Exception:
|
159
|
+
pass
|
145
160
|
raise e
|
146
161
|
|
147
162
|
async def execute(self, command: str, **kwargs) -> Any:
|
@@ -204,7 +219,20 @@ class JsonRpcDispatcher(BaseDispatcher):
|
|
204
219
|
"""
|
205
220
|
if not params:
|
206
221
|
params = {}
|
207
|
-
|
222
|
+
# Если передан неправильный параметр 'command', возвращаем понятную ошибку
|
223
|
+
if "command" in params and params["command"]:
|
224
|
+
return {
|
225
|
+
"error": "Parameter 'command' is not supported. Use 'cmdname' instead.",
|
226
|
+
"hint": "Send params: {\"cmdname\": \"your_command\"}",
|
227
|
+
"example": {"jsonrpc": "2.0", "method": "help", "params": {"cmdname": "your_command"}, "id": 1}
|
228
|
+
}
|
229
|
+
# Если handler вызывается синхронно и возвращает coroutine, возвращаем явную ошибку
|
230
|
+
if inspect.iscoroutinefunction(self._help_command):
|
231
|
+
return {
|
232
|
+
"error": "Help handler must be awaited. Call as await dispatcher.execute('help', ...) in async context.",
|
233
|
+
"hint": "Use async endpoint or await the result in your code.",
|
234
|
+
"example": "result = await dispatcher.execute('help', cmdname='your_command')"
|
235
|
+
}
|
208
236
|
# If specific command is specified, return information only about it
|
209
237
|
if "cmdname" in params and params["cmdname"]:
|
210
238
|
command = params["cmdname"]
|
@@ -213,7 +241,6 @@ class JsonRpcDispatcher(BaseDispatcher):
|
|
213
241
|
"error": f"Command '{command}' not found",
|
214
242
|
"available_commands": list(self._metadata.keys())
|
215
243
|
}
|
216
|
-
|
217
244
|
return {
|
218
245
|
"command": command,
|
219
246
|
"info": self._metadata[command]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: mcp-proxy-adapter
|
3
|
-
Version: 2.1.
|
3
|
+
Version: 2.1.17
|
4
4
|
Summary: Adapter for exposing Command Registry commands as tools for AI models via MCP Proxy.
|
5
5
|
Home-page: https://github.com/vasilyvz/mcp-proxy-adapter
|
6
6
|
Author: Vasiliy VZ
|
@@ -338,4 +338,39 @@ This project uses GitHub Actions for continuous integration and automated publis
|
|
338
338
|
- All tests are run on every push and pull request.
|
339
339
|
- On push of a new tag (vX.Y.Z), the package is built and published to PyPI automatically.
|
340
340
|
|
341
|
-
See `.github/workflows/publish.yml` for details.
|
341
|
+
See `.github/workflows/publish.yml` for details.
|
342
|
+
|
343
|
+
## Встроенная команда help: правила и типовые ошибки
|
344
|
+
|
345
|
+
### Как работает
|
346
|
+
- Команда `help` всегда встроена в MCPProxyAdapter и не требует реализации или регистрации со стороны пользователя.
|
347
|
+
- Для получения справки по конкретной команде используйте параметр `cmdname`:
|
348
|
+
```json
|
349
|
+
{"jsonrpc": "2.0", "method": "help", "params": {"cmdname": "имя_команды"}, "id": 1}
|
350
|
+
```
|
351
|
+
- Для получения списка всех команд:
|
352
|
+
```json
|
353
|
+
{"jsonrpc": "2.0", "method": "help", "id": 1}
|
354
|
+
```
|
355
|
+
|
356
|
+
### Типовые ошибки и их решения
|
357
|
+
- **Ошибка: передан параметр `command` вместо `cmdname`**
|
358
|
+
- Ответ:
|
359
|
+
```json
|
360
|
+
{"error": "Parameter 'command' is not supported. Use 'cmdname' instead.", "hint": "Send params: {\"cmdname\": \"your_command\"}", ...}
|
361
|
+
```
|
362
|
+
- **Решение:** всегда используйте `cmdname`.
|
363
|
+
- **Ошибка сериализации coroutine**
|
364
|
+
- Причина: handler вызывается без await, либо возвращает coroutine.
|
365
|
+
- Ответ:
|
366
|
+
```json
|
367
|
+
{"error": "Help handler must be awaited. Call as await dispatcher.execute('help', ...) in async context.", ...}
|
368
|
+
```
|
369
|
+
- **Решение:** всегда await-ить dispatcher.execute в async endpoint.
|
370
|
+
|
371
|
+
### Важно для интеграторов и пользователей
|
372
|
+
- Не реализуйте свой обработчик help — используйте встроенный.
|
373
|
+
- Не используйте параметр `command` — только `cmdname`.
|
374
|
+
- Все ошибки help-команды теперь сопровождаются понятной подсказкой и примером корректного запроса.
|
375
|
+
|
376
|
+
---
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "mcp-proxy-adapter"
|
7
|
-
version = "2.1.
|
7
|
+
version = "2.1.17"
|
8
8
|
description = "Adapter for exposing Command Registry commands as tools for AI models via MCP Proxy."
|
9
9
|
readme = "README.md"
|
10
10
|
requires-python = ">=3.9"
|
@@ -14,7 +14,7 @@ with open(os.path.join(here, 'requirements.txt'), encoding='utf-8') as f:
|
|
14
14
|
|
15
15
|
setup(
|
16
16
|
name="mcp-proxy-adapter",
|
17
|
-
version="2.1.
|
17
|
+
version="2.1.17",
|
18
18
|
description="Adapter for exposing Command Registry commands as tools for AI models via MCP Proxy.",
|
19
19
|
long_description=long_description,
|
20
20
|
long_description_content_type="text/markdown",
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/analyzers/__init__.py
RENAMED
File without changes
|
File without changes
|
{mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/analyzers/type_analyzer.py
RENAMED
File without changes
|
{mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/dispatchers/__init__.py
RENAMED
File without changes
|
File without changes
|
{mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/analyze_config.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/help_usage.py
RENAMED
File without changes
|
{mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/mcp_proxy_client.py
RENAMED
File without changes
|
{mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/openapi_server.py
RENAMED
File without changes
|
File without changes
|
{mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/examples/testing_example.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter/validators/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter.egg-info/SOURCES.txt
RENAMED
File without changes
|
File without changes
|
{mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter.egg-info/requires.txt
RENAMED
File without changes
|
{mcp_proxy_adapter-2.1.16 → mcp_proxy_adapter-2.1.17}/mcp_proxy_adapter.egg-info/top_level.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|