MCP‑сервер для управления памятью агента: README.md
This commit is contained in:
+50
-59
@@ -5,38 +5,38 @@
|
|||||||
MCP (Memory Control Protocol) – это протокол, позволяющий удалённо управлять памятью агентов в распределённых системах.
|
MCP (Memory Control Protocol) – это протокол, позволяющий удалённо управлять памятью агентов в распределённых системах.
|
||||||
Данный репозиторий содержит реализацию **MCP‑сервера**, который:
|
Данный репозиторий содержит реализацию **MCP‑сервера**, который:
|
||||||
|
|
||||||
- принимает команды от клиентов через TCP;
|
- принимает команды от клиентов по TCP/IP;
|
||||||
- хранит и обновляет состояние памяти агента (ключ‑значение);
|
- обрабатывает запросы на чтение/запись памяти агента;
|
||||||
- обеспечивает простую API для чтения, записи и удаления данных.
|
- поддерживает простую аутентификацию и логирование.
|
||||||
|
|
||||||
Сервер написан на Python 3.8+ и использует стандартную библиотеку `socket` + `threading`.
|
Сервер написан на Python 3.8+ и использует асинхронную библиотеку `asyncio` для одновременной обработки множества соединений.
|
||||||
Он может быть запущен как самостоятельный процесс или интегрирован в более крупные проекты.
|
|
||||||
|
|
||||||
## Структура проекта
|
## Структура проекта
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp_server/
|
mcp_server/
|
||||||
├── mcp_server.py # Основной сервер
|
├── mcp_server.py # Основной серверный скрипт
|
||||||
├── client_example.py # Пример клиента (показывает, как взаимодействовать)
|
├── client_example.py # Пример клиента, демонстрирующий работу с сервером
|
||||||
├── requirements.txt # Пакеты (если понадобится)
|
├── requirements.txt # Список зависимостей
|
||||||
└── README.md # Это файл
|
└── README.md # Это файл
|
||||||
```
|
```
|
||||||
|
|
||||||
## Установка зависимостей
|
## Установка зависимостей
|
||||||
|
|
||||||
> **Важно**: проект использует только стандартную библиотеку Python.
|
|
||||||
> Если вы хотите использовать виртуальное окружение:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
# Создайте виртуальное окружение (рекомендуется)
|
||||||
python -m venv .venv
|
python -m venv .venv
|
||||||
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
||||||
pip install -r requirements.txt # На данный момент файл пустой, но оставлен для совместимости
|
|
||||||
|
# Установите зависимости
|
||||||
|
pip install -r requirements.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`requirements.txt` содержит только стандартные библиотеки, но в случае необходимости можно добавить сторонние пакеты.
|
||||||
|
|
||||||
## Запуск сервера
|
## Запуск сервера
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# В корне проекта
|
|
||||||
python mcp_server.py --host 0.0.0.0 --port 9000
|
python mcp_server.py --host 0.0.0.0 --port 9000
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -44,8 +44,8 @@ python mcp_server.py --host 0.0.0.0 --port 9000
|
|||||||
|
|
||||||
| Параметр | Описание | По умолчанию |
|
| Параметр | Описание | По умолчанию |
|
||||||
|----------|----------|--------------|
|
|----------|----------|--------------|
|
||||||
| `--host` | IP‑адрес, на котором сервер будет слушать запросы | `127.0.0.1` |
|
| `--host` | IP‑адрес, на котором сервер будет слушать подключения | `127.0.0.1` |
|
||||||
| `--port` | TCP‑порт для подключения клиентов | `9000` |
|
| `--port` | TCP‑порт для входящих соединений | `9000` |
|
||||||
|
|
||||||
Сервер выводит в консоль информацию о подключениях и выполненных командах.
|
Сервер выводит в консоль информацию о подключениях и выполненных командах.
|
||||||
|
|
||||||
@@ -55,64 +55,55 @@ python mcp_server.py --host 0.0.0.0 --port 9000
|
|||||||
python client_example.py --host 127.0.0.1 --port 9000
|
python client_example.py --host 127.0.0.1 --port 9000
|
||||||
```
|
```
|
||||||
|
|
||||||
Пример клиентского кода (`client_example.py`) демонстрирует:
|
Клиент демонстрирует:
|
||||||
|
|
||||||
1. Подключение к серверу.
|
1. Подключение к серверу;
|
||||||
2. Отправку команды `SET key value`.
|
2. Отправку команды `SET key value`;
|
||||||
3. Чтение значения через команду `GET key`.
|
3. Чтение значения через команду `GET key`;
|
||||||
4. Удаление ключа с помощью `DEL key`.
|
4. Вывод результата в консоль.
|
||||||
|
|
||||||
|
## Пример использования
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# client_example.py (упрощённый фрагмент)
|
# client_example.py
|
||||||
import socket
|
import asyncio
|
||||||
|
import argparse
|
||||||
|
|
||||||
def send_command(sock, cmd):
|
async def main(host, port):
|
||||||
sock.sendall((cmd + '\n').encode())
|
reader, writer = await asyncio.open_connection(host, port)
|
||||||
return sock.recv(4096).decode().strip()
|
|
||||||
|
|
||||||
with socket.create_connection(('127.0.0.1', 9000)) as s:
|
# Установим значение
|
||||||
print(send_command(s, 'SET foo bar')) # -> OK
|
writer.write(b"SET counter 42\n")
|
||||||
print(send_command(s, 'GET foo')) # -> bar
|
await writer.drain()
|
||||||
print(send_command(s, 'DEL foo')) # -> DELETED
|
print(await reader.readline()) # OK
|
||||||
|
|
||||||
|
# Получим значение
|
||||||
|
writer.write(b"GET counter\n")
|
||||||
|
await writer.drain()
|
||||||
|
print(await reader.readline()) # 42
|
||||||
|
|
||||||
|
writer.close()
|
||||||
|
await writer.wait_closed()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = argparse.ArgumentParser(description="MCP client example")
|
||||||
|
parser.add_argument("--host", default="127.0.0.1")
|
||||||
|
parser.add_argument("--port", type=int, default=9000)
|
||||||
|
args = parser.parse_args()
|
||||||
|
asyncio.run(main(args.host, args.port))
|
||||||
```
|
```
|
||||||
|
|
||||||
## Пример использования в реальном проекте
|
## Тесты
|
||||||
|
|
||||||
```python
|
Для запуска тестов (если они добавлены) используйте:
|
||||||
# Внутри вашего приложения
|
|
||||||
import socket
|
|
||||||
|
|
||||||
class MCPClient:
|
|
||||||
def __init__(self, host='127.0.0.1', port=9000):
|
|
||||||
self.sock = socket.create_connection((host, port))
|
|
||||||
|
|
||||||
def set(self, key, value):
|
|
||||||
return self._send(f'SET {key} {value}')
|
|
||||||
|
|
||||||
def get(self, key):
|
|
||||||
return self._send(f'GET {key}')
|
|
||||||
|
|
||||||
def delete(self, key):
|
|
||||||
return self._send(f'DEL {key}')
|
|
||||||
|
|
||||||
def _send(self, cmd):
|
|
||||||
self.sock.sendall((cmd + '\n').encode())
|
|
||||||
return self.sock.recv(4096).decode().strip()
|
|
||||||
```
|
|
||||||
|
|
||||||
## Тестирование
|
|
||||||
|
|
||||||
Для запуска простого набора тестов (если они добавлены) используйте:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python -m unittest discover tests
|
pytest tests/
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Замечание**: в текущей версии тесты отсутствуют, но структура готова к их добавлению.
|
|
||||||
|
|
||||||
## Лицензия
|
## Лицензия
|
||||||
|
|
||||||
MIT License – смотрите файл `LICENSE`.
|
MIT License – см. файл `LICENSE`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user