Servidor MCP de Picard
Descripción general
Picard MCP es un sistema completo de gestión de memoria basado en el estándar del Protocolo de Contexto de Modelo (MCP) . Consta de dos componentes principales: un servidor MCP que proporciona servicios seguros de almacenamiento y recuperación de memoria, y una aplicación cliente Django que muestra cómo integrarse con el servidor MCP. El sistema permite a los usuarios almacenar, recuperar y gestionar sus memorias, controlando los permisos de acceso y permitiendo la búsqueda semántica y consultas basadas en IA basadas en las memorias almacenadas.
Cumplimiento de MCP
Esta implementación sigue el estándar del Protocolo de Contexto de Modelo (MCP), que permite a las aplicaciones LLM interactuar con el servidor de forma estandarizada. El servidor MCP expone:
Recursos : puntos finales de solo lectura que proporcionan datos a los LLM (contenido de memoria)
Herramientas : puntos finales funcionales que realizan acciones (creación de memoria, actualizaciones, consultas)
Autenticación : implementación de OAuth 2.0 para acceso seguro a recursos protegidos
Componentes clave
Servidor MCP : una implementación basada en FastAPI del Protocolo de contexto de modelo que proporciona:
Autenticación y autorización OAuth 2.0 con compatibilidad con PKCE
Almacenamiento de memoria con incrustaciones vectoriales
Control de acceso a memoria basado en permisos
Integración de LLM para consultas basadas en memoria
Cliente Django : una aplicación web que demuestra la integración con el servidor MCP:
Registro y autenticación de usuarios
Implementación del cliente OAuth 2.0
Interfaz de usuario de creación, recuperación y gestión de memoria
Interfaz de consulta basada en personas
Arquitectura del sistema
Arquitectura general
El sistema Picard MCP sigue una arquitectura cliente-servidor con los siguientes componentes:
Servidor MCP : servicio central de backend que gestiona el almacenamiento de memoria, la recuperación y las operaciones de IA
Creado con FastAPI (FastMCP) para un alto rendimiento y compatibilidad asincrónica
Utiliza PostgreSQL con extensión pgvector para almacenamiento de vectores y búsqueda semántica
Implementa modelos de datos para usuarios, memorias (con incrustaciones vectoriales), clientes OAuth y tokens
Utiliza SQLAlchemy ORM con migraciones de Alembic para la gestión de bases de datos
Implementa OAuth 2.0 para autenticación y autorización seguras
Se integra con la API de OpenAI para incrustaciones de memoria (text-embedding-3-small)
Utiliza LangChain para operaciones LLM cuando está disponible
Proporciona modos de operación con estado y sin estado
Admite transporte HTTP transmitible para una mejor escalabilidad
Cliente Django : aplicación web que demuestra la integración con el servidor MCP
Proporciona registro de usuarios, autenticación y gestión de perfiles.
Implementa el cliente OAuth 2.0 para una comunicación segura con el servidor MCP
Ofrece una interfaz fácil de usar para la gestión y consulta de memoria.
Utiliza su propia base de datos PostgreSQL separada del servidor MCP
Infraestructura Docker : Implementación en contenedores para una fácil configuración y escalabilidad
Contenedores separados para el servidor MCP (puerto 8001), el cliente Django (puerto 8000) y las bases de datos PostgreSQL
Redes configuradas para una comunicación segura entre contenedores
Montaje de volumen para almacenamiento de datos persistentes
Compatible tanto con la implementación local de Docker como con la implementación en la nube de Render
Enfoques de autenticación
El sistema ofrece dos enfoques principales de autenticación:
1. Conexión directa con el flujo de tokens de contexto de usuario (recomendado)
Este enfoque simplificado permite a los usuarios autenticarse solo una vez con el cliente Django, evitando la necesidad de una autenticación separada del servidor MCP:
Registro de cliente :
El cliente Django se registra en el servidor MCP utilizando el punto final
/api/admin/clients/registerEl registro requiere autenticación de administrador e incluye el nombre del cliente, las URI de redireccionamiento y los alcances solicitados.
El servidor MCP emite un ID de cliente basado en UUID y un secreto de cliente criptográficamente seguro
Las credenciales del cliente deben almacenarse de forma segura y nunca exponerse en el código del lado del cliente.
Flujo de autenticación de usuario :
El usuario se autentica únicamente con el cliente Django
Cuando el usuario inicia la conexión al servidor MCP, el cliente Django realiza una solicitud del lado del servidor al punto final
/api/user-tokens/user-tokendel MCPLa solicitud incluye:
Credenciales del cliente (client_id y client_secret)
Información del usuario (nombre de usuario y correo electrónico)
Opción para crear usuario si no existe
El servidor MCP verifica las credenciales del cliente y encuentra o crea un usuario correspondiente.
El servidor MCP emite tokens de acceso y actualización para el usuario
El cliente de Django almacena de forma segura estos tokens y los utiliza para solicitudes de API
Acceso API :
El cliente incluye el token de acceso en el encabezado de autorización (
Authorization: Bearer {token}) para todas las solicitudes de APIEl servidor MCP valida la firma del token, la expiración y las reclamaciones de audiencia.
El servidor MCP aplica permisos basados en el alcance para cada punto final
Cuando el token de acceso expira, el cliente utiliza el token de actualización para obtener uno nuevo
Características de seguridad :
Sólo los clientes confidenciales pueden utilizar este método, lo que proporciona seguridad de servidor a servidor.
Las credenciales del cliente se verifican para cada solicitud de token
Los tokens se incluyen en la lista negra después de su uso para evitar ataques de repetición.
Rotación de uso de tokens de actualización: cada uso genera un nuevo token de actualización e invalida el anterior
2. Flujo de código de autorización estándar de OAuth 2.0 con PKCE (heredado)
El sistema también es compatible con el flujo de código de autorización OAuth 2.0 estándar con PKCE para mayor seguridad, conforme a los estándares RFC 6749 y RFC 7636. Este enfoque requiere que los usuarios se autentiquen tanto con el cliente como con el servidor MCP:
Flujo de autorización :
El usuario inicia el inicio de sesión a través del cliente Django
El cliente genera un parámetro
statealeatorio criptográficamente seguro para la protección CSRFEl cliente genera un
code_verifierPKCE aleatorio y derivacode_challengeutilizando SHA-256El cliente redirecciona al punto final
/authorizedel servidor MCP con:response_type=codeclient_id(formato UUID)redirect_uriscope(lista separada por espacios, p. ej.,memories:read memories:write)state(para protección CSRF)Parámetros PKCE (
code_challengeycode_challenge_method=S256)
El servidor MCP autentica al usuario (si aún no está autenticado)
El servidor MCP valida todos los parámetros y redirecciona al cliente con un código de autorización de corta duración.
Intercambio de tokens :
El cliente verifica que el parámetro
statedevuelto coincida con el enviado en la solicitud de autorizaciónEl cliente intercambia el código de autorización para acceder y actualizar tokens a través del punto final
/tokenEl servidor MCP emite un token de acceso JWT, un token de actualización, un tiempo de expiración y alcances otorgados
Acceso API :
Igual que en el enfoque de Conexión Directa
Modelos de bases de datos
El servidor MCP utiliza SQLAlchemy ORM con los siguientes modelos clave:
Modelo de usuario :
Almacena información del usuario con correo electrónico, nombre de usuario y contraseña cifrada.
Incluye indicadores booleanos para el estado de la cuenta (is_active, is_superuser)
Vinculado a los recuerdos a través de una relación de uno a muchos
Modelo de memoria con almacenamiento vectorial :
Utiliza la extensión pgvector para almacenar y consultar incrustaciones de vectores (1536 dimensiones)
Admite contenido de texto con cifrado opcional
Incluye controles de permisos (privados/públicos)
Admite fechas de vencimiento para memorias con límite de tiempo
Asociado con los usuarios a través de una relación de clave externa
Modelos OAuth :
OAuthClient : almacena detalles de la aplicación cliente, incluidos client_id, client_secret, URI de redireccionamiento y ámbitos autorizados
Código de autorización : administra códigos de autorización temporales con soporte PKCE
Token : almacena tokens de acceso y actualización con seguimiento de vencimiento
El sistema utiliza Alembic para las migraciones de bases de datos, lo que garantiza el control de versiones del esquema y actualizaciones fáciles.
Sistema de gestión de memoria
La funcionalidad principal de Picard MCP gira en torno a la gestión de memoria con los siguientes componentes:
Almacenamiento de memoria :
Los recuerdos se almacenan como texto con metadatos asociados.
Las incrustaciones vectoriales (que utilizan el modelo text-embedding-3-small) habilitan capacidades de búsqueda semántica
Los permisos controlan quién puede acceder a cada memoria
Las marcas de tiempo rastrean la creación, modificación y vencimiento
El texto de la memoria se cifra en reposo mientras que los metadatos siguen siendo buscables
Todos los identificadores utilizan el formato UUID en lugar de números enteros secuenciales para mayor escalabilidad.
Cada memoria se convierte en una incrustación vectorial utilizando el modelo de incrustación de OpenAI
Las incrustaciones permiten la búsqueda semántica y la coincidencia de similitudes
PostgreSQL con la extensión pgvector proporciona un almacenamiento y recuperación de vectores eficiente
Gestión de permisos :
Cada memoria tiene un nivel de permiso (privado o público)
Los recuerdos privados sólo son accesibles al propietario.
Otros usuarios pueden acceder a las memorias públicas para realizar consultas personales.
El sistema está diseñado para ser extensible para futuros tipos de permisos (por ejemplo, para uso estadístico/agregado).
Los recuerdos compartidos pueden ser accedidos por usuarios o grupos específicos
El propietario de la memoria puede modificar los permisos en cualquier momento.
Recuperación de memoria :
Los usuarios pueden recuperar sus propios recuerdos con opciones de filtrado y clasificación.
La búsqueda semántica permite encontrar recuerdos basándose en el significado, no solo en palabras clave.
La similitud vectorial (coseno) permite encontrar memorias relacionadas en la base de datos
Se devuelven los N recuerdos más similares según la relevancia de la consulta
Las comprobaciones de permisos garantizan que los usuarios solo accedan a las memorias autorizadas
Integración LLM :
Los recuerdos se pueden utilizar como contexto para las consultas LLM
Los usuarios pueden crear personajes basados en sus recuerdos públicos.
Otros usuarios pueden consultar a estas personas para obtener respuestas basadas en los recuerdos.
El sistema gestiona automáticamente la gestión del contexto y la ingeniería de indicaciones.
Características principales
Características del servidor MCP
Autenticación OAuth 2.0 :
Flujo de código de autorización con PKCE para una mayor seguridad
Sistema de permisos basado en alcance (
memories:read,memories:write,memories:admin)Gestión de tokens con soporte para tokens de actualización
Registro y gestión de clientes
Gestión de memoria :
Crear, leer, actualizar y eliminar recuerdos
Incorporación de vectores para búsqueda semántica
Control de acceso basado en permisos
Operaciones por lotes para una gestión eficiente de la memoria
Gestión de usuarios :
Registro y autenticación de usuarios
Gestión y configuración de perfiles
Seguimiento y análisis de actividades
Controles de administración para la gestión del sistema
Integración de IA :
Integración de API de OpenAI para incrustaciones y consultas LLM
Creación de personajes basada en los recuerdos del usuario
Procesamiento de consultas según el contexto
Parámetros y configuraciones de IA personalizables
Características del cliente Django
Interfaz de usuario :
Diseño limpio y responsivo para computadoras de escritorio y dispositivos móviles.
Interfaz intuitiva de gestión de memoria
Opciones avanzadas de búsqueda y filtrado
Interfaz de creación y consulta de personajes
Implementación del cliente OAuth :
Almacenamiento y gestión seguros de tokens
Actualización automática del token
Disponibilidad de funciones según el alcance
Manejo y recuperación de errores
Herramientas de memoria :
Creación de memoria con soporte de texto enriquecido
Importación y exportación por lotes
Interfaz de gestión de permisos
Etiquetado y categorización
Interfaz MCP
Recursos de MCP
Recurso de memoria :
memories://{memory_id}Devuelve el contenido de una memoria específica con comprobaciones de permisos
Parámetros: memory_id (UUID)
Respuesta: Contenido de memoria con metadatos
Recurso de memorias de usuario :
users://{user_id}/memoriesDevuelve una lista de recuerdos para un usuario específico con comprobaciones de permisos
Parámetros: user_id (UUID), filtros opcionales
Respuesta: Lista de resúmenes de memoria
Herramientas MCP
Herramienta de envío de memoria : crea una nueva memoria
Parámetros: texto (cadena), permiso (cadena)
Devuelve: Detalles de la memoria creada con UUID
Herramienta de actualización de memoria : actualiza una memoria existente
Parámetros: memory_id (UUID), texto (cadena)
Devoluciones: Detalles de memoria actualizados
Herramienta Eliminar memoria : elimina una memoria
Parámetros: memory_id (UUID)
Devoluciones: Confirmación de éxito
Herramienta de consulta de memoria : realiza búsquedas semánticas en las memorias
Parámetros: consulta (cadena), límite (entero)
Devoluciones: Lista de recuerdos relevantes
Consulta de usuario : consulta la personalidad de un usuario basándose en recuerdos
Parámetros: user_id (UUID), consulta (cadena)
Devoluciones: Respuesta basada en los recuerdos del usuario
Puntos finales de API
Puntos finales de OAuth
Registro de cliente :
/registerMétodo: POST
Descripción: Registrar un nuevo cliente OAuth
Solicitud: Detalles del cliente (ID, secreto, URI de redireccionamiento, alcances)
Respuesta: Credenciales del cliente e información de registro
Autorización :
/authorizeMétodo: GET
Descripción: Iniciar el flujo de autorización OAuth
Parámetros: tipo_de_respuesta, id_de_cliente, uri_de_redireccionamiento, alcance, estado, desafío_de_código, método_de_desafío_de_código
Respuesta: Redirecciona al cliente con código de autorización
Intercambio de tokens :
/tokenMétodo: POST
Descripción: Código de autorización de intercambio de tokens
Solicitud: tipo_concesión, código, uri_redireccionamiento, id_cliente, secreto_cliente, verificador_código
Respuesta: Token de acceso, token de actualización, vencimiento e información de alcance
Puntos finales de memoria
Obtener memorias :
/api/tools(herramienta:get_memories)Método: POST
Descripción: Recupera recuerdos con filtrado opcional
Autenticación: Token de portador
Solicitud: parámetros de filtro opcionales (id de usuario, permiso, estado de expiración)
Respuesta: Lista de memorias accesibles al usuario
Ejemplo de solicitud:
{ "tool": "get_memories", "data": { "user_id": "550e8400-e29b-41d4-a716-446655440000", "permission": "private" } }
Enviar memoria :
/api/tools(herramienta:submit_memory)Método: POST
Descripción: Crea una nueva memoria
Autenticación: Token de portador
Solicitud: Texto de memoria, nivel de permiso y fecha de vencimiento (formato ISO 8601, p. ej., "2025-12-31T23:59:59Z")
Respuesta: Se crearon detalles de la memoria, incluido el identificador UUID
Ejemplo de solicitud:
{ "tool": "submit_memory", "data": { "text": "This is my memory content", "permission": "private" } }
Recuperar recuerdos :
/api/tools(herramienta:retrieve_memories)Método: POST
Descripción: Obtener todos los recuerdos del usuario autenticado
Autenticación: Token de portador
Respuesta: Lista de objetos de memoria con identificadores UUID
Ejemplo de solicitud:
{ "tool": "retrieve_memories", "data": {} }
Actualizar memoria :
/api/tools(herramienta:update_memory)Método: POST
Descripción: Actualizar una memoria existente
Autenticación: Token de portador
Solicitud: ID de memoria, contenido actualizado y fecha de vencimiento actualizada opcionalmente (formato ISO 8601)
Respuesta: Detalles de memoria actualizados
Ejemplo de solicitud:
{ "tool": "update_memory", "data": { "memory_id": "550e8400-e29b-41d4-a716-446655440000", "text": "Updated memory content", "expiration_date": "2026-01-01T00:00:00Z" } }
Modificar permisos :
/api/tools(herramienta:modify_permissions)Método: POST
Descripción: Actualizar el nivel de permiso de memoria
Autenticación: Token de portador
Solicitud: UUID de memoria y nuevo nivel de permiso
Respuesta: Detalles de memoria actualizados
Ejemplo de solicitud:
{ "tool": "modify_permissions", "data": { "memory_id": "550e8400-e29b-41d4-a716-446655440000", "permission": "public" } }
Consulta de usuario :
/api/tools(herramienta:query_user)Método: POST
Descripción: Consulta la personalidad de un usuario basándose en recuerdos (públicos para otros usuarios, públicos+privados para uno mismo)
Autenticación: Token de portador
Solicitud: UUID del usuario y solicitud de consulta
Respuesta: JSON que contiene memorias no vencidas, ya sean todas las memorias válidas o las N más similares a la consulta
Respuesta: Respuesta generada por IA basada en los recuerdos del usuario.
Ejemplo de solicitud:
{ "tool": "query_user", "data": { "user_id": "550e8400-e29b-41d4-a716-446655440000", "prompt": "What are your thoughts on artificial intelligence?" } }
Configuración e implementación
Prerrequisitos
Docker y Docker Compose
Python 3.10+
Clave API de OpenAI
Guía de instalación completa
Clonar el repositorio:
git clone https://github.com/yourusername/picard_mcp.git cd picard_mcpCree archivos de entorno para ambos componentes:
# For MCP server cp mcp_server/.env.example mcp_server/.env # For Django client cp django_client/.env.example django_client/.envEdite los archivos de entorno para establecer su configuración:
En
mcp_server/.env: configure sus credenciales de base de datos, la clave de API de OpenAI y las credenciales de administradorEn
django_client/.env: configure las credenciales de su base de datos y la configuración de OAuth
Inicie los servicios usando Docker Compose:
docker-compose up -dEsto iniciará los siguientes servicios:
db-mcp: base de datos PostgreSQL para el servidor MCPdb-django: base de datos PostgreSQL para el cliente Djangomcp_server: servidor MCP que se ejecuta en http://localhost:8001django_client: cliente de Django que se ejecuta en http://localhost:8000
Cree un usuario administrador para el servidor MCP:
docker-compose exec mcp_server python scripts/create_admin_user.pyEsto creará un usuario administrador con las credenciales especificadas en sus variables de entorno.
Registra el cliente Django con el servidor MCP:
docker-compose exec django_client python register_oauth_client.pyEsto registrará el cliente Django con el servidor MCP y actualizará el archivo
.envdel cliente Django con las credenciales del cliente.Acceder a las aplicaciones:
Servidor MCP: http://localhost:8001
Cliente Django: http://localhost:8000
Cree una cuenta de usuario en el cliente Django y comience a utilizar la aplicación.
Pruebas iniciales
Para verificar que su configuración funciona correctamente, ejecute las siguientes pruebas:
Pruebas del servidor MCP :
docker-compose exec mcp_server python -m pytestEsto ejecutará todas las pruebas unitarias para el servidor MCP, incluidos los puntos finales de OAuth, la funcionalidad de administración y la gestión de memoria.
Pruebas del cliente de Django :
docker-compose exec django_client python manage.py testEsto probará la integración del cliente Django con el servidor MCP.
Pruebas manuales :
Cree una cuenta de usuario en el cliente Django en http://localhost:8000/register
Inicie sesión y conéctese al servidor MCP a través de OAuth
Crea, recupera y gestiona recuerdos
Pruebe la funcionalidad de búsqueda semántica
Consideraciones de seguridad
Protección de datos
El contenido del texto de la memoria se cifra en reposo utilizando el cifrado simétrico Fernet de Python (AES-128 en modo CBC con relleno PKCS7) mientras que los metadatos siguen siendo buscables.
La información de identificación personal (PII) está protegida mediante el cifrado del campo de texto
Los tokens de acceso tienen un tiempo de vencimiento de 1 hora para limitar la exposición.
Los tokens de actualización son de larga duración, pero utilizan rotación: cada uso genera un nuevo token de actualización e invalida el anterior.
Los tokens OAuth se almacenan de forma segura en la base de datos PostgreSQL del cliente Django
Uso de UUID
Todos los identificadores del sistema utilizan el formato UUID v4 en lugar de números enteros secuenciales por varias razones:
Seguridad : Los UUID no exponen información del sistema ni registran recuentos
Escalabilidad : Los UUID se pueden generar sin coordinación de bases de datos, lo que permite sistemas distribuidos.
Imposibilidad de adivinar : los UUID son prácticamente imposibles de adivinar, lo que evita ataques de enumeración.
Coherencia : el uso de UUID en todo el sistema simplifica la integración con otros servicios
Todos los ID en la API (user_id, memory_id, client_id, etc.) deben estar en formato UUID.
Mejores prácticas de OAuth
Toda comunicación OAuth debe utilizar HTTPS en entornos de producción
Los códigos de autorización son de un solo uso y de corta duración (máximo 5 minutos).
PKCE es necesario para todos los clientes, incluso los confidenciales, para una defensa en profundidad.
Los tokens de actualización tienen una larga duración, pero los usuarios o administradores pueden revocarlos.
El sistema mantiene una lista negra de tokens revocados
Documentación
Documentación de la API
El servidor MCP incluye documentación Swagger/OpenAPI para todos los puntos finales:
Acceda a la interfaz de usuario de Swagger en
/docscuando el servidor esté en ejecuciónLa especificación OpenAPI está disponible en
/openapi.jsonTodos los puntos finales de la API están completamente documentados con esquemas de solicitud/respuesta y ejemplos.
Archivos de documentación adicional
TESTING.md : Guía completa para probar la aplicación
Describe todas las pruebas implementadas y sus propósitos.
Instrucciones para ejecutar pruebas localmente y en CI/CD
Documenta la cobertura de las pruebas e identifica áreas que necesitan pruebas adicionales
DEBUGGING.md : Realiza un seguimiento de los problemas y sus resoluciones
Registra errores conocidos que aún no se han solucionado
Documenta errores resueltos previamente y sus soluciones.
Proporciona orientación para la resolución de problemas comunes.
PLANNING.md : Realiza un seguimiento del desglose de las tareas necesarias para implementar el sitio
Enumera las tareas y subtareas necesarias para implementar el sitio
Documenta si una tarea se ha completado con una casilla de verificación
Despliegue
Este proyecto incluye un docker-compose.yml para desarrollo local y un plano render.yaml para implementación en Render. El mismo código base funciona tanto localmente en contenedores Docker como al implementarse en servicios en la nube de Render.
Implementación del servidor MCP
Implementación de Docker (recomendado para producción):
docker-compose up -dLa configuración de Docker Compose incluye:
Configuración de red para la comunicación entre contenedores
Montajes de volumen para almacenamiento de datos persistentes
Configuración de variables de entorno desde archivos .env
Mapeos de puertos (8000 para el cliente Django, 8001 para el servidor MCP)
Comprobaciones de estado de las dependencias del servicio
Implementación de Render Cloud : use el plano
render.yamlincluido para implementar en Render.
Licencia
Instituto Tecnológico de Massachusetts (MIT)
This server cannot be installed
remote-capable server
The server can be hosted and run remotely because it primarily relies on remote services or has no dependency on the local environment.
Una implementación basada en Django del Protocolo de Contexto Modelo (MCP) para gestionar preferencias políticas y visiones para el futuro.
Related MCP Servers
- Asecurity-licenseAqualityModel Context Protocol (MCP) is a new, standardized protocol for managing context between large language models (LLMs) and external systems. In this repository, we provide an installer as well as an MCP Server for Upstash Developer API's.Last updated -33548MIT License
- Asecurity-licenseAqualityA Model Context Protocol (MCP) server that optimizes token usage by caching data during language model interactions, compatible with any language model and MCP client.Last updated -42
- -security-license-qualityA Model Context Protocol service that wraps Django's migration commands as MCP endpoints, making it easy to manage migrations across multiple services and integrate with CI/CD pipelines.Last updated -5
- -security-license-qualityA Python-based implementation of the Model Context Protocol that enables communication between a model context management server and client through a request-response architecture.Last updated -