Обновить 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 import argparse
""" import json
Асинхронный клиент для тестирования работы MCP-сервера памяти. import sys
Использует FastMCP Client и демонстрирует вызовы инструментов: from pathlib import Path
- save_with_namespace
- get_by_namespace
- list_keys
"""
from fastmcp import Client import requests
import asyncio 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: try:
# Сохраняем данные в namespace 'default' resp = requests.request(method, url, timeout=10, **kwargs)
result = await client.call_tool( resp.raise_for_status()
"save_with_namespace", except requests.RequestException as exc:
{"key": "username", "value": "Алексей", "namespace": "default"} console.print(f"[red]Ошибка запроса: {exc}[/red]")
) sys.exit(1)
print(f"Сохранено: {result}") 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' def add_memory(server: str, key: str, value: str):
keys = await client.call_tool( """
"list_keys", Добавить запись в память агента.
{"pattern": "*name"} """
) url = f"{server}/memory"
print(f"Ключи с 'name': {keys}") 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__": if __name__ == "__main__":
asyncio.run(main()) main()