MCP Pytest Server

local-only server

The server can only run on the client’s local machine because it depends on local resources.

Integrations

  • Allows integration with pytest for test automation, including recording test session starts, test outcomes, and session finishes. The integration enables pytest to use the MCP service tools through a conftest.py configuration.

Servicio MCP de Pytest

Estado del paquete

Estamos ejecutando el paquete npm publicado (@modelcontextprotocol/mcp-pytest-server), no el código fuente compilado localmente. Esto se confirma mediante:

  • La ruta ejecutable: ~/.npm/_npx/15b07286cbcc3329/node_modules/.bin/mcp-server-memory
  • La configuración del paquete json que especifica el binario debe compilarse en dist/index.js
  • La presencia en la caché global de npm

Como referencia, las versiones del SDK de Python están disponibles en: https://github.com/modelcontextprotocol/python-sdk/tags

Visualización de registros

Para ver la salida y los registros del servidor:

  1. Ver la salida del terminal en vivo donde se ejecuta el servidor
  2. Consulte el archivo de registro en ~/workspace/mcp-pytest-server/output.log
  3. Utilice tail para seguir el registro en tiempo real:
    tail -f ~/workspace/mcp-pytest-server/output.log
  4. Para registros históricos, utilice less o cat:
    less ~/workspace/mcp-pytest-server/output.log cat ~/workspace/mcp-pytest-server/output.log

Empezando

Prerrequisitos

  • Node.js v16 o superior
  • Python 3.8 o superior
  • npm instalado
  • Servicio de memoria (@modelcontextprotocol/server-memory) en ejecución (se recomienda usar uvx para la ejecución en segundo plano):
    1. Instalar uvx: npm install -g uvx
    2. Crear configuración uvx (uvx.config.js):
      module.exports = { services: { memory: { command: 'node ~/.npm/_npx/15b07286cbcc3329/node_modules/.bin/mcp-server-memory', autorestart: true, log: 'memory.log', env: { NODE_ENV: 'production' } } } }
    3. Servicio de inicio: uvx start memory

Instalación solo para desarrollo de mcp-pytest-server

cd ~/workspace/mcp-pytest-server

Instalar dependencias de JavaScript

npm install @modelcontextprotocol/sdk npm install

Iniciar el servidor MCP Pytest

node index.js

Ejecutar Pytest con integración MCP

pytest --mcp

Servicios de inspección

Inspeccionando el servicio de memoria

Para inspeccionar el servicio de memoria:

  1. Inicie el servicio en modo de depuración:
    npx --node-options='--inspect' @modelcontextprotocol/server-memory
  2. Abra Chrome DevTools en chrome://inspect
  3. Haga clic en "Abrir herramientas de desarrollo dedicadas para Node".
  4. Establecer puntos de interrupción e inspeccionar la ejecución del servicio

Alternativamente, utilice la depuración Node.js incorporada de VSCode:

  1. Cree una configuración launch.json:
{ "type": "node", "request": "launch", "name": "Debug Memory Service", "runtimeExecutable": "npx", "runtimeArgs": ["@modelcontextprotocol/server-memory"], "args": [], "console": "integratedTerminal" }

Inspeccionando el servicio MCP-Pytest durante el desarrollo

Para inspeccionar el servicio mcp-pytest:

  1. Inicie el servicio en modo de depuración:
    node --inspect ~/workspace/mcp-pytest-server/index.js
  2. Abra Chrome DevTools en chrome://inspect
  3. Haga clic en "Abrir herramientas de desarrollo dedicadas para Node".
  4. Establecer puntos de interrupción e inspeccionar la ejecución del servicio

Alternativamente, utilice la depuración Node.js incorporada de VSCode:

  1. Cree una configuración launch.json:
{ "type": "node", "request": "launch", "name": "Debug MCP-Pytest Service", "program": "${workspaceFolder}/index.js", "console": "integratedTerminal" }

Arquitectura e implementación

Descripción general

La integración de MCP pytest consta de varios componentes:

  1. mcp-pytest-server : Un servidor Node.js que implementa las herramientas de servicio MCP
  2. conftest.py : Configuración de prueba que integra pytest con el servicio MCP
  3. SDK : SDK de JavaScript y Python para la integración de MCP

Detalles del componente

servidor mcp-pytest (JavaScript)

  • Ubicación: ~/workspace/mcp-pytest-server
  • Implementación: Node.js (index.js)
  • Estado: Ejecutando el paquete npm publicado (no compilado localmente)
  • Estado del paquete: publicado como '@modelcontextprotocol/mcp-pytest-server' en npm
  • Ruta ejecutable: ~/.npm/_npx/15b07286cbcc3329/node_modules/.bin/mcp-server-memory (confirma el uso del paquete publicado)
  • Funcionalidad: Proporciona herramientas de servicio MCP para la integración de PyTest

conftest.py (Python)

  • Ubicación: ~/workspace/textgrad/tests/conftest.py
  • Propósito: Configura pytest para integrarse con los servicios MCP
  • Estado actual: Uso exitoso del SDK de Python desde ~/workspace/mcp-pytest-server/python-sdk

SDK

SDK de JavaScript

  • Ubicación: https://github.com/modelcontextprotocol/typescript-sdk
  • Estado del paquete: publicado como '@modelcontextprotocol/sdk' en npm
  • Uso: Se puede instalar mediante npm install @modelcontextprotocol/sdk
  • Implementación: Proporciona un cliente TypeScript/JavaScript para la integración de MCP

SDK de Python

  • Ubicación: ~/workspace/mcp-pytest-server/python-sdk
  • Estado del paquete: No publicado en ningún administrador de paquetes (PyPI, Conda, etc.)
  • Uso: utilizado internamente por la integración de PyTest
  • Implementación: Proporciona un cliente Python para la integración de MCP
  • Instalación para múltiples proyectos:
    1. Navegue al directorio del paquete: cd ~/workspace/mcp-pytest-server/python-sdk
    2. Instalar en modo de desarrollo: pip install -e .
    3. El paquete ahora estará disponible para todos los proyectos de Python en el sistema.
    4. Para actualizar, simplemente extraiga los últimos cambios del repositorio.

Estado de implementación

La funcionalidad principal de las tres herramientas (record_session_start, record_test_outcome, record_session_finish) se ha implementado en index.js. Esta implementación incluye:

Estado de implementación: La funcionalidad principal de las tres herramientas (record_session_start, record_test_outcome, record_session_finish) se ha implementado en index.js. La implementación incluye:

  • Validación de entrada para todas las herramientas
  • Manejo y registro de errores adecuados
  • Registro de herramientas y gestión de solicitudes
  • Generación de respuesta básica

1. record_session_start [IMPLEMENTADO]

Descripción: Esta herramienta se ejecuta al inicio de una sesión de pytest. Inicializa el contexto de la ejecución de prueba actual mediante la creación o actualización de las entidades "TestRun_Latest" y "Env_Current" en el servidor MCP memory . Es importante destacar que esta herramienta también garantiza que se borren todos los datos de ejecuciones de prueba anteriores asociados con "TestRun_Latest" para mantener una única fuente de información para la última ejecución.

Detalles de implementación:

  • Validación de entrada para environment.os y environment.python_version
  • Generación de respuesta básica con detalles del entorno
  • Manejo de errores para parámetros no válidos

Esquema de entrada:

{ "environment": { "os": "string", "python_version": "string" } } **Example Usage:**

llamada mcp pytest-mcp record_session_start '{"entorno": {"sistema operativo": "MacOS", "versión de Python": "3.13.1"}}'

Expected Behavior: Clear Previous Data: Deletes the "TestRun_Latest" entity and any relations where "TestRun_Latest" is the from or to entity from the memory MCP server. This ensures no accumulation of historical data. Create "Env_Current" Entity: Creates an entity named "Env_Current" with the entity type "TestEnvironment" and observations for the operating system and Python version. Create "TestRun_Latest" Entity: Creates an entity named "TestRun_Latest" with the entity type "TestRun" and an initial observation like "status: running". Create Relation: Creates a relation of type "ran_on" from "TestRun_Latest" to "Env_Current". Example Interaction (run in cline window):

use_mcp_tool pytest-mcp record_session_start '{"entorno": {"sistema operativo": "MacOS", "versión de Python": "3.13.1"}}'

## 2. record_test_outcome [IMPLEMENTED] Description: This tool is called after each individual test case has finished executing. It records the outcome of the test (passed, failed, skipped), its duration, and any error information if the test failed. **Implementation Details:** - Input validation for nodeid, outcome, duration, and optional error - Basic response generation with test outcome details - Error handling for invalid parameters Input Schema:

{ "nodeid": "string", "outcome": "string (aprobó|falló|omitió)", "duration": "number", "error": "string (opcional)" }

Expected Behavior: Create/Update TestCase Entity: Creates or updates an entity with the name matching the nodeid (e.g., "test_module.py::test_function"), setting its entity type to "TestCase". Add Outcome Observation: Adds an observation with the format "outcome: <outcome>" to the TestCase entity. Add Duration Observation: Adds an observation with the format "duration: <duration>" to the TestCase entity. Add Error Observation (if applicable): If the outcome is "failed" and the error field is provided, add an observation with the format "error: <error>" to the TestCase entity. Create Relation: Creates a relation of type "contains_test" from "TestRun_Latest" to the TestCase entity. Example Interaction (run in cline window):

use_mcp_tool pytest-mcp record_test_outcome '{"nodeid": "test_module.py_example", "resultado": "aprobado", "duración": 0.123}' use_mcp_tool pytest-mcp record_test_outcome '{"nodeid": "test_module.py_failure", "resultado": "fallido", "duración": 0.05, "error": "Error de aserción: ... "}'

## 3. record_session_finish [IMPLEMENTED] Description: This tool is called at the end of a pytest session. It records summary information about the entire test run, such as the total number of tests, the counts of passed, failed, and skipped tests, and the exit status of the pytest process. It also updates the status of the "TestRun_Latest" entity to "finished". **Implementation Details:** - Input validation for summary object - Basic response generation with session summary - Error handling for invalid parameters Input Schema:

{ "resumen": { "pruebas_totales": "entero", "aprobadas": "entero", "reprobadas": "entero", "omitidas": "entero", "estado_de_salida": "entero" } }

Expected Behavior: Update TestRun_Latest Status: Updates the "TestRun_Latest" entity's observation "status: running" to "status: finished". Add Summary Observations: Adds observations to the "TestRun_Latest" entity for total_tests, passed, failed, skipped, and exitstatus based on the input summary. Add End Time Observation: Adds an observation with the format "end_time: <timestamp>" to the "TestRun_Latest" entity. Example Interaction (run in cline window):

use_mcp_tool pytest-mcp record_session_finish '{"resumen": {"pruebas_totales": 10, "aprobadas": 7, "fallidas": 2, "omitidas": 1, "estado_de_salida": 0}}'

## Debugging the service

nodo ~/espacio de trabajo/mcp-pytest-server/index.js

ps aux | grep index.js sudo tcpdump -i any -s 0 -w mcp_traffic.pcap puerto <número_de_puerto>

cline

use_pytest-mcp

#Development Suggested Optimizations: ## Faster JSON Use a Faster JSON Library: Replace the built-in json module with orjson for faster parsing and serialization. import orjson as json ## Dispatch mechanism Implement a Dispatch Mechanism: Use dictionaries to map request types and tool names to handler functions. def handle_list_tools(request): # ... def handle_record_session_start(args): # ... # ... other tool handlers ... request_handlers = { "list_tools": handle_list_tools, "call_tool": { "record_session_start": handle_record_session_start, # ... other tools ... } } def handle_request(request): request_type = request["type"] handler = request_handlers.get(request_type) if handler: if request_type == "call_tool": tool_name = request["name"] tool_handler = handler.get(tool_name) if tool_handler: tool_handler(request["arguments"]) else: send_response({"type": "error", "code": -32601, "message": f"Unknown tool: {tool_name}"}) else: handler(request) else: send_response({"type": "error", "code": -32601, "message": f"Unknown request type: {request_type}"}) ## Concurrency Concurrency: Explore using asynchronous programming (e.g., asyncio) or threading to handle multiple requests concurrently. This would require more significant changes to the server's structure. ## Python SDK Implementation Summary ### Current Status - Python SDK package structure created at ~/workspace/mcp-pytest-server/python-sdk - Basic package files implemented: - setup.py with package configuration - src/mcp/__init__.py with version information - Package successfully installed in development mode using pip install -e . - PYTHONPATH configuration verified to allow package import - Currently running as a development installation with full source access - Service level: Development/Testing (not production-ready) ### Service Level Details - **Development Mode**: Running with pip install -e . allows for immediate code changes without reinstallation - **Source Access**: Full access to source code for debugging and development - **Dependencies**: Managed through setup.py with direct access to local development environment - **Stability**: Suitable for testing and development, not recommended for production use - **Performance**: May include debug logging and unoptimized code paths ### Remaining Tasks - Implement core MCP client functionality in Python SDK - Add pytest integration hooks - Create proper test suite for Python SDK - Publish package to PyPI for easier distribution - Optimize for production deployment
ID: vrkz0o2puq