mcp-proxy-adapter 2.1.2__py3-none-any.whl → 2.1.3__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-2.1.2.dist-info → mcp_proxy_adapter-2.1.3.dist-info}/METADATA +1 -1
- mcp_proxy_adapter-2.1.3.dist-info/RECORD +18 -0
- mcp_proxy_adapter-2.1.3.dist-info/top_level.txt +1 -0
- docs/README.md +0 -172
- docs/README_ru.md +0 -172
- docs/architecture.md +0 -251
- docs/architecture_ru.md +0 -343
- docs/command_development.md +0 -250
- docs/command_development_ru.md +0 -593
- docs/deployment.md +0 -251
- docs/deployment_ru.md +0 -1298
- docs/examples.md +0 -254
- docs/examples_ru.md +0 -401
- docs/mcp_proxy_adapter.md +0 -251
- docs/mcp_proxy_adapter_ru.md +0 -405
- docs/quickstart.md +0 -251
- docs/quickstart_ru.md +0 -397
- docs/testing.md +0 -255
- docs/testing_ru.md +0 -469
- docs/validation_ru.md +0 -287
- examples/analyze_config.py +0 -141
- examples/basic_integration.py +0 -161
- examples/docstring_and_schema_example.py +0 -60
- examples/extension_example.py +0 -60
- examples/help_best_practices.py +0 -67
- examples/help_usage.py +0 -64
- examples/mcp_proxy_client.py +0 -131
- examples/mcp_proxy_config.json +0 -175
- examples/openapi_server.py +0 -369
- examples/project_structure_example.py +0 -47
- examples/testing_example.py +0 -53
- mcp_proxy_adapter-2.1.2.dist-info/RECORD +0 -61
- mcp_proxy_adapter-2.1.2.dist-info/top_level.txt +0 -5
- scripts/code_analyzer/code_analyzer.py +0 -328
- scripts/code_analyzer/register_commands.py +0 -446
- scripts/publish.py +0 -85
- tests/conftest.py +0 -12
- tests/test_adapter.py +0 -529
- tests/test_adapter_coverage.py +0 -274
- tests/test_basic_dispatcher.py +0 -169
- tests/test_command_registry.py +0 -328
- tests/test_examples.py +0 -32
- tests/test_mcp_proxy_adapter.py +0 -568
- tests/test_mcp_proxy_adapter_basic.py +0 -262
- tests/test_part1.py +0 -348
- tests/test_part2.py +0 -524
- tests/test_schema.py +0 -358
- tests/test_simple_adapter.py +0 -251
- {mcp_proxy_adapter-2.1.2.dist-info → mcp_proxy_adapter-2.1.3.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-2.1.2.dist-info → mcp_proxy_adapter-2.1.3.dist-info}/licenses/LICENSE +0 -0
examples/openapi_server.py
DELETED
@@ -1,369 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Example of creating an OpenAPI server using MCP Proxy Adapter.
|
3
|
-
|
4
|
-
Usage:
|
5
|
-
python examples/openapi_server.py
|
6
|
-
|
7
|
-
Server will be available at: http://localhost:8000
|
8
|
-
"""
|
9
|
-
import os
|
10
|
-
import sys
|
11
|
-
import logging
|
12
|
-
from typing import Dict, List, Any
|
13
|
-
|
14
|
-
# Add project root directory to sys.path
|
15
|
-
sys.path.insert(0, os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
|
16
|
-
|
17
|
-
from fastapi import FastAPI, Query, Path, Body, Request
|
18
|
-
from pydantic import BaseModel, Field
|
19
|
-
import uvicorn
|
20
|
-
|
21
|
-
# Import MCP Proxy Adapter
|
22
|
-
from mcp_proxy_adapter.adapter import MCPProxyAdapter
|
23
|
-
|
24
|
-
# Import models for JSON-RPC
|
25
|
-
from mcp_proxy_adapter.models import JsonRpcRequest, JsonRpcResponse
|
26
|
-
|
27
|
-
# Import MockRegistry from tests for example
|
28
|
-
# (in a real project, CommandRegistry would be used)
|
29
|
-
from tests.test_mcp_proxy_adapter import MockRegistry
|
30
|
-
|
31
|
-
# Configure logging
|
32
|
-
logging.basicConfig(level=logging.DEBUG)
|
33
|
-
logger = logging.getLogger(__name__)
|
34
|
-
|
35
|
-
# Data model definitions
|
36
|
-
class Item(BaseModel):
|
37
|
-
"""Data model for an item."""
|
38
|
-
id: int = Field(..., description="Unique item identifier")
|
39
|
-
name: str = Field(..., description="Item name")
|
40
|
-
description: str = Field(None, description="Item description")
|
41
|
-
price: float = Field(..., description="Item price")
|
42
|
-
is_available: bool = Field(True, description="Item availability")
|
43
|
-
|
44
|
-
model_config = {
|
45
|
-
"json_schema_extra": {
|
46
|
-
"example": {
|
47
|
-
"id": 1,
|
48
|
-
"name": "Super Product",
|
49
|
-
"description": "Best product on the market",
|
50
|
-
"price": 99.99,
|
51
|
-
"is_available": True
|
52
|
-
}
|
53
|
-
}
|
54
|
-
}
|
55
|
-
|
56
|
-
# Example data
|
57
|
-
items_db = [
|
58
|
-
{
|
59
|
-
"id": 1,
|
60
|
-
"name": "Smartphone X",
|
61
|
-
"description": "Latest smartphone with cutting-edge technology",
|
62
|
-
"price": 999.99,
|
63
|
-
"is_available": True
|
64
|
-
},
|
65
|
-
{
|
66
|
-
"id": 2,
|
67
|
-
"name": "Laptop Y",
|
68
|
-
"description": "Powerful laptop for professionals",
|
69
|
-
"price": 1499.99,
|
70
|
-
"is_available": True
|
71
|
-
},
|
72
|
-
{
|
73
|
-
"id": 3,
|
74
|
-
"name": "Tablet Z",
|
75
|
-
"description": "Compact tablet for creativity",
|
76
|
-
"price": 599.99,
|
77
|
-
"is_available": False
|
78
|
-
}
|
79
|
-
]
|
80
|
-
|
81
|
-
# Define commands for MockRegistry
|
82
|
-
class MockDispatcher:
|
83
|
-
"""Mock for command dispatcher in example."""
|
84
|
-
|
85
|
-
def __init__(self):
|
86
|
-
self.commands = {
|
87
|
-
"get_items": self.get_items,
|
88
|
-
"get_item": self.get_item,
|
89
|
-
"create_item": self.create_item,
|
90
|
-
"update_item": self.update_item,
|
91
|
-
"delete_item": self.delete_item,
|
92
|
-
"search_items": self.search_items,
|
93
|
-
"execute": self.execute_command
|
94
|
-
}
|
95
|
-
self.commands_info = {
|
96
|
-
"get_items": {
|
97
|
-
"description": "Get list of all items",
|
98
|
-
"params": {}
|
99
|
-
},
|
100
|
-
"get_item": {
|
101
|
-
"description": "Get item by ID",
|
102
|
-
"params": {
|
103
|
-
"item_id": {
|
104
|
-
"type": "integer",
|
105
|
-
"description": "Item ID to search for",
|
106
|
-
"required": True
|
107
|
-
}
|
108
|
-
}
|
109
|
-
},
|
110
|
-
"create_item": {
|
111
|
-
"description": "Create new item",
|
112
|
-
"params": {
|
113
|
-
"item": {
|
114
|
-
"type": "object",
|
115
|
-
"description": "Item data",
|
116
|
-
"required": True
|
117
|
-
}
|
118
|
-
}
|
119
|
-
},
|
120
|
-
"update_item": {
|
121
|
-
"description": "Update item by ID",
|
122
|
-
"params": {
|
123
|
-
"item_id": {
|
124
|
-
"type": "integer",
|
125
|
-
"description": "Item ID to update",
|
126
|
-
"required": True
|
127
|
-
},
|
128
|
-
"updated_data": {
|
129
|
-
"type": "object",
|
130
|
-
"description": "Updated data",
|
131
|
-
"required": True
|
132
|
-
}
|
133
|
-
}
|
134
|
-
},
|
135
|
-
"delete_item": {
|
136
|
-
"description": "Delete item by ID",
|
137
|
-
"params": {
|
138
|
-
"item_id": {
|
139
|
-
"type": "integer",
|
140
|
-
"description": "Item ID to delete",
|
141
|
-
"required": True
|
142
|
-
}
|
143
|
-
}
|
144
|
-
},
|
145
|
-
"search_items": {
|
146
|
-
"description": "Search items by keyword",
|
147
|
-
"params": {
|
148
|
-
"keyword": {
|
149
|
-
"type": "string",
|
150
|
-
"description": "Search keyword",
|
151
|
-
"required": True
|
152
|
-
}
|
153
|
-
}
|
154
|
-
},
|
155
|
-
"execute": {
|
156
|
-
"description": "Universal command for executing queries",
|
157
|
-
"params": {
|
158
|
-
"query": {
|
159
|
-
"type": "string",
|
160
|
-
"description": "Query to execute",
|
161
|
-
"required": False
|
162
|
-
},
|
163
|
-
"subcommand": {
|
164
|
-
"type": "string",
|
165
|
-
"description": "Subcommand to execute",
|
166
|
-
"required": False
|
167
|
-
}
|
168
|
-
}
|
169
|
-
}
|
170
|
-
}
|
171
|
-
|
172
|
-
def execute(self, command, **params):
|
173
|
-
"""Executes command with specified parameters."""
|
174
|
-
if command not in self.commands:
|
175
|
-
raise KeyError(f"Unknown command: {command}")
|
176
|
-
return self.commands[command](**params)
|
177
|
-
|
178
|
-
def execute_command(self, **params):
|
179
|
-
"""Universal method for executing commands."""
|
180
|
-
query = params.get("query", "")
|
181
|
-
subcommand = params.get("subcommand", "")
|
182
|
-
|
183
|
-
# Debug logging
|
184
|
-
logger.info(f"Executing universal command with query={query}, subcommand={subcommand}, params={params}")
|
185
|
-
|
186
|
-
# Handle different command types
|
187
|
-
if query.lower() in ["list", "all", "items"]:
|
188
|
-
# Return list of all items
|
189
|
-
return self.get_items()
|
190
|
-
elif query.lower() == "search" and "keyword" in params:
|
191
|
-
# Search by keyword
|
192
|
-
return self.search_items(params["keyword"])
|
193
|
-
elif query.isdigit() or (isinstance(query, int) and query > 0):
|
194
|
-
# If query looks like an ID, return item by ID
|
195
|
-
try:
|
196
|
-
return self.get_item(int(query))
|
197
|
-
except ValueError:
|
198
|
-
return {"error": f"Item with ID {query} not found"}
|
199
|
-
else:
|
200
|
-
# By default return information about available commands
|
201
|
-
commands = list(self.commands.keys())
|
202
|
-
return {
|
203
|
-
"available_commands": commands,
|
204
|
-
"message": "Use one of the available commands or specify query for executing query",
|
205
|
-
"received_params": params
|
206
|
-
}
|
207
|
-
|
208
|
-
def get_valid_commands(self):
|
209
|
-
"""Returns list of available commands."""
|
210
|
-
return list(self.commands.keys())
|
211
|
-
|
212
|
-
def get_command_info(self, command):
|
213
|
-
"""Returns information about command."""
|
214
|
-
return self.commands_info.get(command)
|
215
|
-
|
216
|
-
def get_commands_info(self):
|
217
|
-
"""Returns information about all commands."""
|
218
|
-
return self.commands_info
|
219
|
-
|
220
|
-
# Command implementations
|
221
|
-
def get_items(self):
|
222
|
-
"""Get list of all items."""
|
223
|
-
return items_db
|
224
|
-
|
225
|
-
def get_item(self, item_id):
|
226
|
-
"""Get item by ID."""
|
227
|
-
for item in items_db:
|
228
|
-
if item["id"] == item_id:
|
229
|
-
return item
|
230
|
-
raise ValueError(f"Item with ID {item_id} not found")
|
231
|
-
|
232
|
-
def create_item(self, item):
|
233
|
-
"""Create new item."""
|
234
|
-
# Find maximum ID
|
235
|
-
max_id = max([i["id"] for i in items_db]) if items_db else 0
|
236
|
-
# Create new item with increased ID
|
237
|
-
new_item = {**item, "id": max_id + 1}
|
238
|
-
items_db.append(new_item)
|
239
|
-
return new_item
|
240
|
-
|
241
|
-
def update_item(self, item_id, updated_data):
|
242
|
-
"""Update item by ID."""
|
243
|
-
for i, item in enumerate(items_db):
|
244
|
-
if item["id"] == item_id:
|
245
|
-
# Update item, keeping original ID
|
246
|
-
updated_item = {**item, **updated_data, "id": item_id}
|
247
|
-
items_db[i] = updated_item
|
248
|
-
return updated_item
|
249
|
-
raise ValueError(f"Item with ID {item_id} not found")
|
250
|
-
|
251
|
-
def delete_item(self, item_id):
|
252
|
-
"""Delete item by ID."""
|
253
|
-
for i, item in enumerate(items_db):
|
254
|
-
if item["id"] == item_id:
|
255
|
-
del items_db[i]
|
256
|
-
return {"message": f"Item with ID {item_id} successfully deleted"}
|
257
|
-
raise ValueError(f"Item with ID {item_id} not found")
|
258
|
-
|
259
|
-
def search_items(self, keyword):
|
260
|
-
"""Search items by keyword."""
|
261
|
-
keyword = keyword.lower()
|
262
|
-
return [
|
263
|
-
item for item in items_db
|
264
|
-
if keyword in item["name"].lower() or
|
265
|
-
(item["description"] and keyword in item["description"].lower())
|
266
|
-
]
|
267
|
-
|
268
|
-
class CustomMockRegistry(MockRegistry):
|
269
|
-
"""Custom command registry for example."""
|
270
|
-
|
271
|
-
def __init__(self):
|
272
|
-
"""Initialization with custom dispatcher."""
|
273
|
-
self.dispatcher = MockDispatcher()
|
274
|
-
self.generators = []
|
275
|
-
|
276
|
-
def main():
|
277
|
-
"""Main function to start server."""
|
278
|
-
# Create command registry
|
279
|
-
registry = CustomMockRegistry()
|
280
|
-
|
281
|
-
# Create FastAPI object
|
282
|
-
app = FastAPI(
|
283
|
-
title="OpenAPI Server Example",
|
284
|
-
description="Example OpenAPI server with MCP Proxy Adapter integration",
|
285
|
-
version="1.0.0"
|
286
|
-
)
|
287
|
-
|
288
|
-
# Configure CORS
|
289
|
-
from fastapi.middleware.cors import CORSMiddleware
|
290
|
-
app.add_middleware(
|
291
|
-
CORSMiddleware,
|
292
|
-
allow_origins=["*"], # Allow requests from all sources
|
293
|
-
allow_credentials=True,
|
294
|
-
allow_methods=["*"], # Allow all methods
|
295
|
-
allow_headers=["*"], # Allow all headers
|
296
|
-
)
|
297
|
-
|
298
|
-
# Create MCP Proxy adapter with explicit endpoint
|
299
|
-
adapter = MCPProxyAdapter(registry, cmd_endpoint="/cmd")
|
300
|
-
|
301
|
-
# Register adapter endpoints
|
302
|
-
adapter.register_endpoints(app)
|
303
|
-
|
304
|
-
# Save MCP Proxy configuration to file
|
305
|
-
config_path = os.path.join(os.path.dirname(__file__), "mcp_proxy_config.json")
|
306
|
-
adapter.save_config_to_file(config_path)
|
307
|
-
logger.info(f"MCP Proxy configuration saved to {config_path}")
|
308
|
-
|
309
|
-
# Define REST endpoints for example (not related to MCP Proxy)
|
310
|
-
@app.get("/")
|
311
|
-
def read_root():
|
312
|
-
"""Root endpoint."""
|
313
|
-
return {
|
314
|
-
"message": "OpenAPI Server Example with MCP Proxy Adapter integration",
|
315
|
-
"endpoints": {
|
316
|
-
"items": "/items",
|
317
|
-
"item": "/items/{item_id}",
|
318
|
-
"search": "/items/search",
|
319
|
-
"mcp_proxy": "/cmd"
|
320
|
-
}
|
321
|
-
}
|
322
|
-
|
323
|
-
@app.get("/items", response_model=List[Item])
|
324
|
-
def read_items():
|
325
|
-
"""Get all items."""
|
326
|
-
return items_db
|
327
|
-
|
328
|
-
@app.get("/items/{item_id}", response_model=Item)
|
329
|
-
def read_item(item_id: int = Path(..., description="Item ID", gt=0)):
|
330
|
-
"""Get item by ID."""
|
331
|
-
try:
|
332
|
-
return registry.dispatcher.get_item(item_id)
|
333
|
-
except ValueError as e:
|
334
|
-
return {"error": str(e)}
|
335
|
-
|
336
|
-
@app.post("/items", response_model=Item)
|
337
|
-
def create_new_item(item: Item = Body(..., description="Data of new item")):
|
338
|
-
"""Create new item."""
|
339
|
-
return registry.dispatcher.create_item(item.model_dump())
|
340
|
-
|
341
|
-
@app.put("/items/{item_id}", response_model=Item)
|
342
|
-
def update_existing_item(
|
343
|
-
item_id: int = Path(..., description="Item ID to update", gt=0),
|
344
|
-
item: Item = Body(..., description="Updated item data")
|
345
|
-
):
|
346
|
-
"""Update item by ID."""
|
347
|
-
try:
|
348
|
-
return registry.dispatcher.update_item(item_id, item.model_dump())
|
349
|
-
except ValueError as e:
|
350
|
-
return {"error": str(e)}
|
351
|
-
|
352
|
-
@app.delete("/items/{item_id}")
|
353
|
-
def delete_existing_item(item_id: int = Path(..., description="Item ID to delete", gt=0)):
|
354
|
-
"""Delete item by ID."""
|
355
|
-
try:
|
356
|
-
return registry.dispatcher.delete_item(item_id)
|
357
|
-
except ValueError as e:
|
358
|
-
return {"error": str(e)}
|
359
|
-
|
360
|
-
@app.get("/items/search", response_model=List[Item])
|
361
|
-
def search_items_by_keyword(keyword: str = Query(..., description="Search keyword")):
|
362
|
-
"""Search items by keyword."""
|
363
|
-
return registry.dispatcher.search_items(keyword)
|
364
|
-
|
365
|
-
# Start server
|
366
|
-
uvicorn.run(app, host="0.0.0.0", port=8000)
|
367
|
-
|
368
|
-
if __name__ == "__main__":
|
369
|
-
main()
|
@@ -1,47 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Project Structure Example for MCPProxyAdapter
|
3
|
-
|
4
|
-
- How to organize your project for clean integration
|
5
|
-
- Where to place registry, commands, adapter
|
6
|
-
- How to register endpoints in FastAPI
|
7
|
-
|
8
|
-
Run:
|
9
|
-
python examples/project_structure_example.py
|
10
|
-
"""
|
11
|
-
import os
|
12
|
-
import sys
|
13
|
-
sys.path.insert(0, os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
|
14
|
-
from fastapi import FastAPI
|
15
|
-
from mcp_proxy_adapter.adapter import MCPProxyAdapter
|
16
|
-
|
17
|
-
# --- Command registry and commands ---
|
18
|
-
class MyRegistry:
|
19
|
-
def __init__(self):
|
20
|
-
self.dispatcher = self
|
21
|
-
self.commands = {"hello": self.hello}
|
22
|
-
self.commands_info = {"hello": {"description": "Say hello", "params": {}}}
|
23
|
-
def get_valid_commands(self):
|
24
|
-
return list(self.commands.keys())
|
25
|
-
def get_command_info(self, command):
|
26
|
-
return self.commands_info.get(command)
|
27
|
-
def get_commands_info(self):
|
28
|
-
return self.commands_info
|
29
|
-
def execute(self, command, **params):
|
30
|
-
if command == "hello":
|
31
|
-
return {"message": "Hello, world!"}
|
32
|
-
raise KeyError(f"Unknown command: {command}")
|
33
|
-
def add_generator(self, generator):
|
34
|
-
pass
|
35
|
-
def hello(self):
|
36
|
-
"""Say hello."""
|
37
|
-
return {"message": "Hello, world!"}
|
38
|
-
|
39
|
-
# --- FastAPI app and adapter ---
|
40
|
-
app = FastAPI()
|
41
|
-
registry = MyRegistry()
|
42
|
-
adapter = MCPProxyAdapter(registry)
|
43
|
-
adapter.register_endpoints(app)
|
44
|
-
|
45
|
-
if __name__ == "__main__":
|
46
|
-
import uvicorn
|
47
|
-
uvicorn.run(app, host="0.0.0.0", port=8000)
|
examples/testing_example.py
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Testing Example for MCPProxyAdapter
|
3
|
-
|
4
|
-
- How to write unit and integration tests for commands
|
5
|
-
- How to test help and error handling
|
6
|
-
- Best practices for test structure
|
7
|
-
|
8
|
-
Run:
|
9
|
-
python examples/testing_example.py
|
10
|
-
"""
|
11
|
-
import os
|
12
|
-
import sys
|
13
|
-
sys.path.insert(0, os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
|
14
|
-
from mcp_proxy_adapter.adapter import MCPProxyAdapter
|
15
|
-
|
16
|
-
class MyRegistry:
|
17
|
-
def __init__(self):
|
18
|
-
self.dispatcher = self
|
19
|
-
self.commands = {"echo": self.echo}
|
20
|
-
self.commands_info = {"echo": {"description": "Echo input string", "params": {"text": {"type": "string", "description": "Text to echo", "required": True}}}}
|
21
|
-
def get_valid_commands(self):
|
22
|
-
return list(self.commands.keys())
|
23
|
-
def get_command_info(self, command):
|
24
|
-
return self.commands_info.get(command)
|
25
|
-
def get_commands_info(self):
|
26
|
-
return self.commands_info
|
27
|
-
def execute(self, command, **params):
|
28
|
-
if command == "echo":
|
29
|
-
return self.echo(**params)
|
30
|
-
raise KeyError(f"Unknown command: {command}")
|
31
|
-
def add_generator(self, generator):
|
32
|
-
pass
|
33
|
-
def echo(self, text: str) -> str:
|
34
|
-
"""Echo input string."""
|
35
|
-
return text
|
36
|
-
|
37
|
-
def test_echo():
|
38
|
-
registry = MyRegistry()
|
39
|
-
adapter = MCPProxyAdapter(registry)
|
40
|
-
# Unit test
|
41
|
-
assert registry.execute("echo", text="hi") == "hi"
|
42
|
-
# Integration test (simulate JSON-RPC)
|
43
|
-
class Request:
|
44
|
-
method = "echo"
|
45
|
-
params = {"text": "hello"}
|
46
|
-
id = 1
|
47
|
-
response = adapter.router.routes[0].endpoint(Request())
|
48
|
-
# Not a real FastAPI call, just for illustration
|
49
|
-
print("[TEST] Echo command passed.")
|
50
|
-
|
51
|
-
if __name__ == "__main__":
|
52
|
-
test_echo()
|
53
|
-
print("All tests passed.")
|
@@ -1,61 +0,0 @@
|
|
1
|
-
docs/README.md,sha256=XpZqqKcf7GZ_uqtaadmIZc4dE9oyKv7biKj41kDtQo4,4633
|
2
|
-
docs/README_ru.md,sha256=Ln8oDVOurhBVurQaEFDweVvq_bZZbdFSSTvWTrpBgMs,6326
|
3
|
-
docs/architecture.md,sha256=wF5-RMQI-QssY4jA2lSKjjq6iHunda-n2PqI5ELAj84,10430
|
4
|
-
docs/architecture_ru.md,sha256=Ato3CoAmhNBukMO6uje12e5-OlpDYVrwGIcN1CKqTsw,15529
|
5
|
-
docs/command_development.md,sha256=-CKfEtLO-4tB2WKZNbIT1Ao4juiKFBcKS7As4_1ja74,6645
|
6
|
-
docs/command_development_ru.md,sha256=kzvYpnEfsXfZxZY1wswwDChzBtMtEY9l74M7XkWxtHk,19968
|
7
|
-
docs/deployment.md,sha256=eOOCq8V6Gz_SDo9hReXKXXNtaS8WmrxR-KXjJjUE1pw,4988
|
8
|
-
docs/deployment_ru.md,sha256=0eNxKqiqc-sIht4brdZVEcxZkbrUP4y95PhfpD_0Qyg,40107
|
9
|
-
docs/examples.md,sha256=85kfd73rgqJ2DUD3PrRfjViCXgv5bM_9Uqizm_ET7NE,6348
|
10
|
-
docs/examples_ru.md,sha256=mxQqwKXMX6OcY6tyfuRgmYqAQXYnrzTGOJS_u5ECUcs,11866
|
11
|
-
docs/mcp_proxy_adapter.md,sha256=Y-dcFKwYbYJe5_zDrvlDPuSz-S1czL7Gh848EzclS7k,8210
|
12
|
-
docs/mcp_proxy_adapter_ru.md,sha256=aJ1KAyoyzcRPSn7YGralpUGO-zmUQMtDKoQ2zrOUVTc,17489
|
13
|
-
docs/quickstart.md,sha256=YH0KspJcbe59ynpRf9kne-QsLGcUo4kKtNiEZ48nrus,5419
|
14
|
-
docs/quickstart_ru.md,sha256=biipkQ4_XGVzqxLeGptzfWxyr6J9TN1ggdhCf2pDWKA,11884
|
15
|
-
docs/testing.md,sha256=Z1hdqairo14QMoPxeBX1_YAbbS3Uedy4uaxfvu8aG5k,7572
|
16
|
-
docs/testing_ru.md,sha256=z2-zGIXuFx8GpLYwydP9Oe3N8l_zVzheLBYvxgI-f6k,18219
|
17
|
-
docs/validation_ru.md,sha256=iYtM3ZoFGe3_EaCG0738LkGJ5FPayrEr2z_KPhNcs0Q,15886
|
18
|
-
examples/analyze_config.py,sha256=vog7TNHDw5ZoYhQLbAvZvEoufmQwH54KJzQBJrSq5w4,4283
|
19
|
-
examples/basic_integration.py,sha256=w_oA777YiQt36gzI113KPQ6k45caXbMCqW9hD8sy8zo,4657
|
20
|
-
examples/docstring_and_schema_example.py,sha256=c96L4KF_7yWzffmvd4hyeQuXSdYyYkv7Uvuy0QxgMcQ,1929
|
21
|
-
examples/extension_example.py,sha256=vnatnFdNTapMpPcQ79Ugitk92ZiUfpLTs7Dvsodf1og,2277
|
22
|
-
examples/help_best_practices.py,sha256=wUtZRnAktnpfAc9vAvqSxUquHEr5ewaPDPyc6BoCqdQ,2637
|
23
|
-
examples/help_usage.py,sha256=UOd3HJeYlQpQkAyceGNm66jXX_h-T05pjIGD-b7-Pfg,2568
|
24
|
-
examples/mcp_proxy_client.py,sha256=z4IzFlGigVTQSb8TpcrQ_a0migsmC58LnNwc8wZmTfw,3811
|
25
|
-
examples/mcp_proxy_config.json,sha256=39aeV7NNEZstX9RAOdsr5tUZnvCuo7bR38Xc1sGGCJI,3655
|
26
|
-
examples/openapi_server.py,sha256=hueoG9KcimOc4W27euWksMYjjG8Jz-li9hEKi3ZCDBk,12515
|
27
|
-
examples/project_structure_example.py,sha256=sswTo6FZb1F5juHa0FYG3cgvrh3wfgGfJu2bBy5tCm4,1460
|
28
|
-
examples/testing_example.py,sha256=AB13c4C1bjs1145O-yriwyreeVXtMOlQLzs2BCGmprk,1719
|
29
|
-
mcp_proxy_adapter/__init__.py,sha256=_6D-TfANWp9zc550M5LUeGPvioFqG1bAl3tZj-gNmJU,463
|
30
|
-
mcp_proxy_adapter/adapter.py,sha256=76dkVeDuqLsJ5AhuftzLlwy2M6yr_PfNbmNfo9dXVhc,28844
|
31
|
-
mcp_proxy_adapter/models.py,sha256=acqVQBYAojHXeJ1MJyvpMyT6-J6aMxWuZMszn_-RsOU,2338
|
32
|
-
mcp_proxy_adapter/registry.py,sha256=jgC4TKaPbMbAsoxvGp2ToaOE4drD-VfZug7WJbm4IW4,15853
|
33
|
-
mcp_proxy_adapter/schema.py,sha256=HZM0TTQTSi8ha1TEeVevdCyGZOUPoT1soB7Nex0hV50,10947
|
34
|
-
mcp_proxy_adapter/analyzers/__init__.py,sha256=2rcYZDP-bXq078MQpxP32lAwYYyRhOwAQGBcefBfBzY,368
|
35
|
-
mcp_proxy_adapter/analyzers/docstring_analyzer.py,sha256=T3FLJEo_uChShfiEKRl8GpVoHvh5HiudZkxnj4KixfA,7541
|
36
|
-
mcp_proxy_adapter/analyzers/type_analyzer.py,sha256=6Wac7osKwF03waFSwQ8ZM0Wqn_zAP2D-I4WMEpR0hQM,5230
|
37
|
-
mcp_proxy_adapter/dispatchers/__init__.py,sha256=FWgimgInGphIjCEnvA3-ZExiapUzYAVis2H9C5IWivU,365
|
38
|
-
mcp_proxy_adapter/dispatchers/base_dispatcher.py,sha256=S5_Xri058jAmOWeit1tedB_GMZQ9RLcNcYabA83ZF6k,2288
|
39
|
-
mcp_proxy_adapter/dispatchers/json_rpc_dispatcher.py,sha256=ffu1M32E1AdC7IB44mlbV2L56eJQMsp-7fYi_r4rmHc,6331
|
40
|
-
mcp_proxy_adapter/validators/docstring_validator.py,sha256=Onpq2iNJ1qF4ejkJJIlBkLROuSNIVALHVmXIgkCpaFI,2934
|
41
|
-
mcp_proxy_adapter/validators/metadata_validator.py,sha256=uCrn38-VYYn89l6f5CC_GoTAHAweaOW2Z6Esro1rtGw,3155
|
42
|
-
mcp_proxy_adapter-2.1.2.dist-info/licenses/LICENSE,sha256=OkApFEwdgMCt_mbvUI-eIwKMSTe38K3XnU2DT5ub-wI,1072
|
43
|
-
scripts/publish.py,sha256=MMKksSAzWoZOlxxHOm9-o6juEJYj5AMS4OG5pDIeChw,2627
|
44
|
-
scripts/code_analyzer/code_analyzer.py,sha256=FmWctoxttImvIPJoyNMLyUt7pEg3mQihqt6T9vMBKVQ,12766
|
45
|
-
scripts/code_analyzer/register_commands.py,sha256=GpQxdFsA0BWHONZpDjl18zkoqlbV6pmkabLMwIR_1JE,20545
|
46
|
-
tests/conftest.py,sha256=gkusSolrEp6-AHLjMKDUVxEcmfboa2P5SbeyiMugP-E,495
|
47
|
-
tests/test_adapter.py,sha256=ohLX1wGFmHnv5DXJx2segjT2EEg9-3ZU9FKwS74D7KI,18247
|
48
|
-
tests/test_adapter_coverage.py,sha256=k5oCvT9EQy_8JYam4Os88Npnn-Hgr0pm_ChHyRwk4Vc,8813
|
49
|
-
tests/test_basic_dispatcher.py,sha256=wB30AM3UPI_EklAMrGIwQHDTqbfY80I5spi6arpdxCc,5472
|
50
|
-
tests/test_command_registry.py,sha256=Ze4qwi2fV-EOuJ0su2l-jclLRCB9ZdZNUY54GFtde9E,12000
|
51
|
-
tests/test_examples.py,sha256=dYiRgV3Z74MiOJq4I1soPE4xmJNSM8L-IqxdV4vXCWI,1615
|
52
|
-
tests/test_mcp_proxy_adapter.py,sha256=WDYkLpz9Kd4OW0XbfhSanmhca7m7DIGZNC1L6CAoNpA,24890
|
53
|
-
tests/test_mcp_proxy_adapter_basic.py,sha256=gKIcqYzZVEdJcp3PKKJPKNxtJ05l80Wj4ig1Vd2dagM,10624
|
54
|
-
tests/test_part1.py,sha256=gb7lQ-lKjqYMMLGMt_7aSuScXSqy80tP8vBq2TBSiTs,14191
|
55
|
-
tests/test_part2.py,sha256=842aTEHCwqS6UBs3sE0DRbXRdeiZ8n0w4rJTAWschnY,18220
|
56
|
-
tests/test_schema.py,sha256=-X_323kncA0l3o1GKIKYf9OjhIj1hOJBPCH71682pk8,13704
|
57
|
-
tests/test_simple_adapter.py,sha256=IFLbVphiRMl1w5LoT1AihYOt0b66GNnt8uDafwokVCI,8374
|
58
|
-
mcp_proxy_adapter-2.1.2.dist-info/METADATA,sha256=RWCuMTdFD78eQjOZ_r33iBT8ChwqBJcKu_0T4MDQr6E,8150
|
59
|
-
mcp_proxy_adapter-2.1.2.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
|
60
|
-
mcp_proxy_adapter-2.1.2.dist-info/top_level.txt,sha256=FkpPEr9rFZcEWxGfy6kRIUkCiLMxHpTD3--73ThTnPo,46
|
61
|
-
mcp_proxy_adapter-2.1.2.dist-info/RECORD,,
|