Обновить memory_client.py

This commit is contained in:
2026-05-29 06:31:24 +00:00
parent 255781ff2c
commit fbb52fc53c
+93 -48
View File
@@ -1,58 +1,103 @@
# memory_client.py
"""
Асинхронный клиент для тестирования работы MCP-сервера памяти.
Использует FastMCP Client и демонстрирует вызовы инструментов:
- save_with_namespace
- get_by_namespace
- list_keys
"""
import argparse
import json
import sys
from pathlib import Path
from fastmcp import Client
import asyncio
import requests
from rich import print
from rich.console import Console
from rich.table import Table
async def main() -> None:
console = Console()
def _request(method: str, url: str, **kwargs):
"""
Основная точка входа: создаём клиент, подключаемся к серверу,
вызываем инструменты и выводим результаты.
Универсальная обёртка над requests для работы с MCP‑сервером.
"""
# Создаём клиента, указывая путь к исполняемому файлу сервера
client = Client("python memory_server.py")
# Подключаемся к серверу (асинхронно)
await client.connect()
try:
# Сохраняем данные в namespace 'default'
result = await client.call_tool(
"save_with_namespace",
{"key": "username", "value": "Алексей", "namespace": "default"}
)
print(f"Сохранено: {result}")
resp = requests.request(method, url, timeout=10, **kwargs)
resp.raise_for_status()
except requests.RequestException as exc:
console.print(f"[red]Ошибка запроса: {exc}[/red]")
sys.exit(1)
try:
return resp.json()
except ValueError:
console.print("[red]Ответ не в формате JSON[/red]")
sys.exit(1)
# Получаем все записи из namespace 'default'
result = await client.call_tool(
"get_by_namespace",
{"namespace": "default"}
)
print("Данные namespace 'default':")
for item in result:
# В ответе ключ хранится как 'namespace:key', но в JSON
# сохраняется только значение и timestamp, поэтому выводим
# только полезную часть.
key = item.get("key", "")
value = item.get("value", "")
print(f" {key}: {value}")
# Получаем список ключей с подстрокой 'name'
keys = await client.call_tool(
"list_keys",
{"pattern": "*name"}
)
print(f"Ключи с 'name': {keys}")
def add_memory(server: str, key: str, value: str):
"""
Добавить запись в память агента.
"""
url = f"{server}/memory"
payload = {"key": key, "value": value}
result = _request("POST", url, json=payload)
console.print(f"[green]Запись добавлена: {result}[/green]")
def get_memory(server: str, key: str):
"""
Получить значение по ключу.
"""
url = f"{server}/memory/{key}"
result = _request("GET", url)
console.print(f"[cyan]Получено: {result}[/cyan]")
def delete_memory(server: str, key: str):
"""
Удалить запись из памяти.
"""
url = f"{server}/memory/{key}"
result = _request("DELETE", url)
console.print(f"[yellow]Удалено: {result}[/yellow]")
def list_memory(server: str):
"""
Вывести таблицу всех записей в памяти.
"""
url = f"{server}/memory"
result = _request("GET", url)
table = Table(title="Память агента")
table.add_column("Ключ", style="magenta")
table.add_column("Значение", style="green")
for item in result.get("items", []):
table.add_row(item.get("key", ""), item.get("value", ""))
console.print(table)
def main():
parser = argparse.ArgumentParser(description="Клиент MCP‑сервера для управления памятью агента.")
parser.add_argument("--server", default="http://localhost:8000", help="URL сервера MCP (по умолчанию http://localhost:8000)")
sub = parser.add_subparsers(dest="command", required=True)
add = sub.add_parser("add", help="Добавить запись")
add.add_argument("key", help="Ключ записи")
add.add_argument("value", help="Значение записи")
get = sub.add_parser("get", help="Получить запись")
get.add_argument("key", help="Ключ записи")
delete = sub.add_parser("delete", help="Удалить запись")
delete.add_argument("key", help="Ключ записи")
list_ = sub.add_parser("list", help="Список всех записей")
args = parser.parse_args()
if args.command == "add":
add_memory(args.server, args.key, args.value)
elif args.command == "get":
get_memory(args.server, args.key)
elif args.command == "delete":
delete_memory(args.server, args.key)
elif args.command == "list":
list_memory(args.server)
finally:
# Закрываем соединение
await client.close()
if __name__ == "__main__":
asyncio.run(main())
main()