Skip to main content
Glama
evangstav

Memory MCP Server

by evangstav

Сервер памяти MCP

Сервер протокола контекста модели (MCP), который предоставляет функциональность графа знаний для управления сущностями, отношениями и наблюдениями в памяти со строгими правилами проверки для поддержания согласованности данных.

Установка

Установите сервер в Claude Desktop:

mcp install main.py -v MEMORY_FILE_PATH=/path/to/memory.jsonl

Related MCP server: Qualitative Researcher MCP Server

Правила проверки данных

Имена сущностей

  • Должны начинаться со строчной буквы

  • Могут содержать строчные буквы, цифры и дефисы

  • Максимальная длина 100 символов

  • Должны быть уникальными в пределах графа

  • Примеры допустимых имен: python-project, meeting-notes-2024, user-john

Типы сущностей

Поддерживаются следующие типы сущностей:

  • person: Люди

  • concept: Абстрактные идеи или принципы

  • project: Рабочие инициативы или задачи

  • document: Любая форма документации

  • tool: Программные инструменты или утилиты

  • organization: Компании или группы

  • location: Физические или виртуальные места

  • event: События, ограниченные по времени

Наблюдения

  • Непустые строки

  • Максимальная длина 500 символов

  • Должны быть уникальными для каждой сущности

  • Должны быть фактическими и объективными утверждениями

  • Включайте временную метку, когда это уместно

Отношения

Поддерживаются следующие типы отношений:

  • knows: Связь между людьми

  • contains: Отношение родитель/потомок

  • uses: Сущность, использующая другую сущность

  • created: Отношение авторства/создания

  • belongs-to: Принадлежность/владение

  • depends-on: Отношение зависимости

  • related-to: Общее отношение

Дополнительные правила отношений:

  • Исходная и целевая сущности должны существовать

  • Самореферентные отношения не допускаются

  • Циклические зависимости не допускаются

  • Необходимо использовать предопределенные типы отношений

Использование

Сервер предоставляет инструменты для управления графом знаний:

Получить сущность

result = await session.call_tool("get_entity", {
    "entity_name": "example"
})
if not result.success:
    if result.error_type == "NOT_FOUND":
        print(f"Entity not found: {result.error}")
    elif result.error_type == "VALIDATION_ERROR":
        print(f"Invalid input: {result.error}")
    else:
        print(f"Error: {result.error}")
else:
    entity = result.data
    print(f"Found entity: {entity}")

Получить граф

result = await session.call_tool("get_graph", {})
if result.success:
    graph = result.data
    print(f"Graph data: {graph}")
else:
    print(f"Error retrieving graph: {result.error}")

Создать сущности

# Valid entity creation
entities = [
    Entity(
        name="python-project",  # Lowercase with hyphens
        entityType="project",   # Must be a valid type
        observations=["Started development on 2024-01-29"]
    ),
    Entity(
        name="john-doe",
        entityType="person",
        observations=["Software engineer", "Joined team in 2024"]
    )
]
result = await session.call_tool("create_entities", {
    "entities": entities
})
if not result.success:
    if result.error_type == "VALIDATION_ERROR":
        print(f"Invalid entity data: {result.error}")
    else:
        print(f"Error creating entities: {result.error}")

Добавить наблюдение

# Valid observation
result = await session.call_tool("add_observation", {
    "entity": "python-project",
    "observation": "Completed initial prototype"  # Must be unique for entity
})
if not result.success:
    if result.error_type == "NOT_FOUND":
        print(f"Entity not found: {result.error}")
    elif result.error_type == "VALIDATION_ERROR":
        print(f"Invalid observation: {result.error}")
    else:
        print(f"Error adding observation: {result.error}")

Создать отношение

# Valid relation
result = await session.call_tool("create_relation", {
    "from_entity": "john-doe",
    "to_entity": "python-project",
    "relation_type": "created"  # Must be a valid type
})
if not result.success:
    if result.error_type == "NOT_FOUND":
        print(f"Entity not found: {result.error}")
    elif result.error_type == "VALIDATION_ERROR":
        print(f"Invalid relation data: {result.error}")
    else:
        print(f"Error creating relation: {result.error}")

Поиск в памяти

result = await session.call_tool("search_memory", {
    "query": "most recent workout"  # Supports natural language queries
})
if result.success:
    if result.error_type == "NO_RESULTS":
        print(f"No results found: {result.error}")
    else:
        results = result.data
        print(f"Search results: {results}")
else:
    print(f"Error searching memory: {result.error}")

Функциональность поиска поддерживает:

  • Временные запросы (например, "самый недавний", "последний")

  • Запросы активности (например, "тренировка", "упражнение")

  • Общий поиск сущностей

  • Нечеткий поиск с порогом сходства 80%

  • Взвешенный поиск по:

    • Именам сущностей (вес: 1.0)

    • Типам сущностей (вес: 0.8)

    • Наблюдениям (вес: 0.6)

Удалить сущности

result = await session.call_tool("delete_entities", {
    "names": ["python-project", "john-doe"]
})
if not result.success:
    if result.error_type == "NOT_FOUND":
        print(f"Entity not found: {result.error}")
    else:
        print(f"Error deleting entities: {result.error}")

Удалить отношение

result = await session.call_tool("delete_relation", {
    "from_entity": "john-doe",
    "to_entity": "python-project"
})
if not result.success:
    if result.error_type == "NOT_FOUND":
        print(f"Entity not found: {result.error}")
    else:
        print(f"Error deleting relation: {result.error}")

Очистить память

result = await session.call_tool("flush_memory", {})
if not result.success:
    print(f"Error flushing memory: {result.error}")

Типы ошибок

Сервер использует следующие типы ошибок:

  • NOT_FOUND: Сущность или ресурс не найден

  • VALIDATION_ERROR: Неверные входные данные

  • INTERNAL_ERROR: Ошибка на стороне сервера

  • ALREADY_EXISTS: Ресурс уже существует

  • INVALID_RELATION: Неверное отношение между сущностями

Модели ответов

Все инструменты возвращают типизированные ответы, используя следующие модели:

EntityResponse

class EntityResponse(BaseModel):
    success: bool
    data: Optional[Dict[str, Any]] = None
    error: Optional[str] = None
    error_type: Optional[str] = None

GraphResponse

class GraphResponse(BaseModel):
    success: bool
    data: Optional[Dict[str, Any]] = None
    error: Optional[str] = None
    error_type: Optional[str] = None

OperationResponse

class OperationResponse(BaseModel):
    success: bool
    error: Optional[str] = None
    error_type: Optional[str] = None

Разработка

Запуск тестов

pytest tests/

Добавление новых функций

  1. Обновите правила проверки в validation.py

  2. Добавьте тесты в tests/test_validation.py

  3. Реализуйте изменения в knowledge_graph_manager.py

-
security - not tested
A
license - permissive license
-
quality - not tested

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/evangstav/python-memory-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server