hakalab-mcp 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +175 -155
- package/index.js +61 -3
- package/package.json +1 -1
- package/test_simple.js +34 -0
- package/README_MCP.md +0 -436
package/README.md
CHANGED
|
@@ -1,208 +1,228 @@
|
|
|
1
|
-
# Hakalab-
|
|
1
|
+
# Hakalab-MCP v2.0
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Servidor MCP completo para automatización web con Selenium y Playwright**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/hakalab-mcp)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
- **Ejecución de pruebas** con filtros por tags y archivos específicos
|
|
9
|
-
- **Generación de reportes Allure** integrada
|
|
10
|
-
- **Sanitización y validación** de archivos de prueba
|
|
11
|
-
- **Gestión de Page Objects** independientes
|
|
12
|
-
- **Listado y organización** de archivos de prueba
|
|
8
|
+
## 🚀 Descripción
|
|
13
9
|
|
|
14
|
-
|
|
10
|
+
Hakalab-MCP es un servidor Model Context Protocol (MCP) que proporciona automatización web completa con soporte para **Selenium** y **Playwright**. Incluye 20 herramientas para controlar navegadores, interactuar con elementos, y crear suites de pruebas automatizadas.
|
|
15
11
|
|
|
16
|
-
|
|
17
|
-
Crea una suite completa de pruebas siguiendo los patrones del framework.
|
|
12
|
+
## ✨ Características
|
|
18
13
|
|
|
19
|
-
**
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
14
|
+
- ✅ **Doble Motor**: Selenium WebDriver + Playwright
|
|
15
|
+
- ✅ **Múltiples Navegadores**: Chrome, Firefox, Edge, Safari, Chromium, WebKit
|
|
16
|
+
- ✅ **20 Herramientas**: Gestión completa de navegadores e interacciones
|
|
17
|
+
- ✅ **Múltiples Selectores**: CSS, XPath, ID, Name, Class, Tag
|
|
18
|
+
- ✅ **Esperas Inteligentes**: Configurable por herramienta
|
|
19
|
+
- ✅ **Modo Headless**: Para ejecución sin interfaz
|
|
20
|
+
- ✅ **Screenshots**: Capturas automáticas con timestamp
|
|
21
|
+
- ✅ **Framework BDD**: Integración con Behave y Allure
|
|
22
|
+
- ✅ **Súper Liviano**: Solo 13.7 KB
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
```json
|
|
27
|
-
{
|
|
28
|
-
"feature_name": "Login de Usuario",
|
|
29
|
-
"scenarios": [
|
|
30
|
-
{
|
|
31
|
-
"name": "Login exitoso",
|
|
32
|
-
"description": "Usuario se autentica correctamente",
|
|
33
|
-
"tags": ["critical", "selenium"],
|
|
34
|
-
"steps": [
|
|
35
|
-
"Given ingreso a la página de login",
|
|
36
|
-
"When ingreso usuario \"admin\"",
|
|
37
|
-
"And ingreso contraseña \"password123\"",
|
|
38
|
-
"And hago click en iniciar sesión",
|
|
39
|
-
"Then veo el dashboard principal"
|
|
40
|
-
]
|
|
41
|
-
}
|
|
42
|
-
],
|
|
43
|
-
"page_elements": [
|
|
44
|
-
{
|
|
45
|
-
"name": "txt_usuario",
|
|
46
|
-
"type": "ID",
|
|
47
|
-
"locator": "username"
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
"name": "txt_password",
|
|
51
|
-
"type": "ID",
|
|
52
|
-
"locator": "password"
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"name": "btn_login",
|
|
56
|
-
"type": "XPATH",
|
|
57
|
-
"locator": "//button[@type='submit']"
|
|
58
|
-
}
|
|
59
|
-
],
|
|
60
|
-
"tags": ["login", "authentication"]
|
|
61
|
-
}
|
|
62
|
-
```
|
|
24
|
+
## 📦 Instalación
|
|
63
25
|
|
|
64
|
-
###
|
|
65
|
-
Ejecuta pruebas del framework con filtros opcionales.
|
|
26
|
+
### Opción 1: Uso Directo con npx (Recomendado)
|
|
66
27
|
|
|
67
|
-
|
|
68
|
-
- `tags` (array, opcional): Tags para filtrar (ej: ["selenium", "critical"])
|
|
69
|
-
- `feature_file` (string, opcional): Archivo específico a ejecutar
|
|
70
|
-
- `parallel` (boolean, opcional): Ejecución paralela
|
|
28
|
+
No requiere instalación previa. Simplemente agrega la configuración a tu cliente MCP:
|
|
71
29
|
|
|
72
|
-
**Ejemplo:**
|
|
73
30
|
```json
|
|
74
31
|
{
|
|
75
|
-
"
|
|
76
|
-
|
|
32
|
+
"mcpServers": {
|
|
33
|
+
"hakalab-mcp": {
|
|
34
|
+
"command": "npx",
|
|
35
|
+
"args": ["-y", "hakalab-mcp"]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
77
38
|
}
|
|
78
39
|
```
|
|
79
40
|
|
|
80
|
-
###
|
|
81
|
-
Genera el reporte de Allure después de ejecutar pruebas.
|
|
41
|
+
### Opción 2: Instalación Global
|
|
82
42
|
|
|
83
|
-
|
|
84
|
-
|
|
43
|
+
```bash
|
|
44
|
+
npm install -g hakalab-mcp
|
|
45
|
+
```
|
|
85
46
|
|
|
86
|
-
###
|
|
87
|
-
Crea un Page Object independiente.
|
|
47
|
+
### Opción 3: Instalación Local
|
|
88
48
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
49
|
+
```bash
|
|
50
|
+
npm install hakalab-mcp
|
|
51
|
+
```
|
|
92
52
|
|
|
93
|
-
|
|
94
|
-
Lista archivos del framework por tipo.
|
|
53
|
+
## 🔧 Configuración
|
|
95
54
|
|
|
96
|
-
|
|
97
|
-
- `file_type` (string): "feature", "steps", "pages", o "all"
|
|
55
|
+
### Para Kiro IDE
|
|
98
56
|
|
|
99
|
-
|
|
57
|
+
Agrega esta configuración a `~/.kiro/settings/mcp.json`:
|
|
100
58
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"mcpServers": {
|
|
62
|
+
"hakalab-mcp": {
|
|
63
|
+
"command": "npx",
|
|
64
|
+
"args": ["-y", "hakalab-mcp"],
|
|
65
|
+
"disabled": false,
|
|
66
|
+
"autoApprove": [
|
|
67
|
+
"open_browser",
|
|
68
|
+
"close_browser",
|
|
69
|
+
"navigate_to_url",
|
|
70
|
+
"click_element",
|
|
71
|
+
"fill_input",
|
|
72
|
+
"take_screenshot"
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
104
77
|
```
|
|
105
78
|
|
|
106
|
-
###
|
|
107
|
-
Copia el contenido de `mcp_config.json` a tu archivo de configuración MCP de Kiro:
|
|
79
|
+
### Para Claude Desktop
|
|
108
80
|
|
|
109
|
-
|
|
110
|
-
```bash
|
|
111
|
-
# Crear/editar .kiro/settings/mcp.json
|
|
112
|
-
```
|
|
81
|
+
Agrega esta configuración a `~/.claude_desktop_config.json`:
|
|
113
82
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"mcpServers": {
|
|
86
|
+
"hakalab-mcp": {
|
|
87
|
+
"command": "npx",
|
|
88
|
+
"args": ["-y", "hakalab-mcp"]
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
117
92
|
```
|
|
118
93
|
|
|
119
|
-
|
|
120
|
-
|
|
94
|
+
## 🛠️ Herramientas Disponibles (20 Total)
|
|
95
|
+
|
|
96
|
+
### 🌐 Gestión de Navegadores (6)
|
|
97
|
+
- `open_browser` - Abre un navegador con Selenium o Playwright
|
|
98
|
+
- `close_browser` - Cierra el navegador actual
|
|
99
|
+
- `navigate_to_url` - Navega a una URL específica
|
|
100
|
+
- `go_back` - Navega hacia atrás en el historial
|
|
101
|
+
- `go_forward` - Navega hacia adelante en el historial
|
|
102
|
+
- `refresh_page` - Recarga la página actual
|
|
103
|
+
|
|
104
|
+
### 🎯 Interacciones Básicas (6)
|
|
105
|
+
- `click_element` - Hace clic en un elemento
|
|
106
|
+
- `double_click_element` - Hace doble clic en un elemento
|
|
107
|
+
- `right_click_element` - Hace clic derecho en un elemento
|
|
108
|
+
- `fill_input` - Completa un campo de texto
|
|
109
|
+
- `select_option` - Selecciona una opción en un select/combobox
|
|
110
|
+
- `hover_element` - Pasa el mouse sobre un elemento
|
|
111
|
+
|
|
112
|
+
### 🔧 Interacciones Avanzadas (4)
|
|
113
|
+
- `drag_and_drop` - Arrastra un elemento y lo suelta en otro
|
|
114
|
+
- `scroll_to_element` - Hace scroll hasta un elemento
|
|
115
|
+
- `take_screenshot` - Toma una captura de pantalla
|
|
116
|
+
- `get_current_url` - Obtiene la URL actual
|
|
117
|
+
- `get_page_title` - Obtiene el título de la página
|
|
118
|
+
|
|
119
|
+
### 🧪 Framework BDD (6)
|
|
120
|
+
- `create_test_suite` - Crea suite completa (feature, steps, page object)
|
|
121
|
+
- `execute_tests` - Ejecuta pruebas del framework
|
|
122
|
+
- `list_test_files` - Lista archivos de prueba
|
|
123
|
+
- `create_page_object` - Crea un Page Object independiente
|
|
124
|
+
- `sanitize_tests` - Valida archivos de prueba
|
|
125
|
+
- `generate_allure_report` - Genera reporte de Allure
|
|
126
|
+
|
|
127
|
+
## 📝 Ejemplos de Uso
|
|
128
|
+
|
|
129
|
+
### Ejemplo 1: Búsqueda en Google
|
|
130
|
+
|
|
121
131
|
```
|
|
122
|
-
|
|
132
|
+
1. "Abre Chrome con Playwright"
|
|
133
|
+
2. "Ve a https://www.google.com"
|
|
134
|
+
3. "Completa el campo de búsqueda con 'hola mundo'"
|
|
135
|
+
4. "Haz click en el botón de búsqueda"
|
|
136
|
+
5. "Toma una captura de pantalla"
|
|
137
|
+
6. "Cierra el navegador"
|
|
123
138
|
```
|
|
124
139
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
## 📁 Estructura Generada
|
|
128
|
-
|
|
129
|
-
El MCP mantiene la estructura del framework original:
|
|
140
|
+
### Ejemplo 2: Automatización de Formulario
|
|
130
141
|
|
|
131
142
|
```
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
├── helper/
|
|
140
|
-
│ └── pages/
|
|
141
|
-
│ ├── __init__.py
|
|
142
|
-
│ └── page_*.py # Page Objects
|
|
143
|
-
└── allure-results/ # Resultados de ejecución
|
|
143
|
+
1. "Abre Firefox con Selenium"
|
|
144
|
+
2. "Ve a https://example.com/form"
|
|
145
|
+
3. "Completa el campo 'nombre' con 'Juan'"
|
|
146
|
+
4. "Completa el campo 'email' con 'juan@example.com'"
|
|
147
|
+
5. "Selecciona 'Opción 1' en el combobox"
|
|
148
|
+
6. "Haz click en el botón 'Enviar'"
|
|
149
|
+
7. "Toma una captura del resultado"
|
|
144
150
|
```
|
|
145
151
|
|
|
146
|
-
|
|
152
|
+
### Ejemplo 3: Interacciones Complejas
|
|
147
153
|
|
|
148
|
-
### Crear una nueva funcionalidad completa
|
|
149
154
|
```
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
+
1. "Abre Chrome con Playwright en modo headless"
|
|
156
|
+
2. "Ve a https://example.com"
|
|
157
|
+
3. "Pasa el mouse sobre el menú principal"
|
|
158
|
+
4. "Haz click en 'Productos'"
|
|
159
|
+
5. "Haz scroll hasta el producto deseado"
|
|
160
|
+
6. "Arrastra el producto al carrito"
|
|
161
|
+
7. "Toma una captura"
|
|
155
162
|
```
|
|
156
163
|
|
|
157
|
-
|
|
158
|
-
```
|
|
159
|
-
Usar herramienta: execute_tests
|
|
160
|
-
- Tags: ["selenium", "regression"]
|
|
161
|
-
- Generar reporte después
|
|
162
|
-
```
|
|
164
|
+
## 📋 Requisitos
|
|
163
165
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
166
|
+
- **Node.js**: 18.0.0 o superior
|
|
167
|
+
- **npm**: 8.0.0 o superior
|
|
168
|
+
- **Navegadores**: Chrome, Firefox, Edge, Safari (según el motor)
|
|
169
|
+
|
|
170
|
+
## 🎯 Casos de Uso
|
|
171
|
+
|
|
172
|
+
- ✅ Automatización de pruebas web
|
|
173
|
+
- ✅ Web scraping
|
|
174
|
+
- ✅ Pruebas de regresión
|
|
175
|
+
- ✅ Pruebas de UI
|
|
176
|
+
- ✅ Automatización de tareas repetitivas
|
|
177
|
+
- ✅ Validación de funcionalidad
|
|
178
|
+
- ✅ Pruebas de compatibilidad
|
|
179
|
+
|
|
180
|
+
## 🐛 Solución de Problemas
|
|
181
|
+
|
|
182
|
+
### Error: "Browser not found"
|
|
183
|
+
- Asegúrate de tener el navegador instalado
|
|
184
|
+
- Para Playwright: ejecuta `npx playwright install`
|
|
185
|
+
|
|
186
|
+
### Error: "Timeout waiting for element"
|
|
187
|
+
- Aumenta el `wait_time` en los parámetros
|
|
188
|
+
- Verifica que el selector sea correcto
|
|
189
|
+
|
|
190
|
+
### Error: "Connection refused"
|
|
191
|
+
- Verifica que el MCP esté correctamente configurado
|
|
192
|
+
- Reinicia tu cliente MCP
|
|
193
|
+
|
|
194
|
+
## 📚 Documentación Completa
|
|
195
|
+
|
|
196
|
+
Para documentación detallada, consulta [README_MCP.md](README_MCP.md)
|
|
197
|
+
|
|
198
|
+
## 🤝 Contribuciones
|
|
171
199
|
|
|
172
|
-
|
|
200
|
+
Las contribuciones son bienvenidas. Por favor:
|
|
173
201
|
|
|
174
|
-
|
|
202
|
+
1. Fork el repositorio
|
|
203
|
+
2. Crea una rama para tu feature
|
|
204
|
+
3. Commit tus cambios
|
|
205
|
+
4. Push a la rama
|
|
206
|
+
5. Abre un Pull Request
|
|
175
207
|
|
|
176
|
-
|
|
177
|
-
- **Page Object Model**: Crea clases siguiendo el patrón establecido
|
|
178
|
-
- **Plugins modulares**: Compatible con SeleniumPlugin, AllurePlugin, etc.
|
|
179
|
-
- **Variables de entorno**: Utiliza configuración del .env
|
|
180
|
-
- **Estructura de carpetas**: Mantiene la organización original
|
|
208
|
+
## 📄 Licencia
|
|
181
209
|
|
|
182
|
-
|
|
210
|
+
MIT License - ver [LICENSE](LICENSE) para más detalles
|
|
183
211
|
|
|
184
|
-
|
|
185
|
-
- **Ejecución con tags**: Filtrado por criticidad, tipo, etc.
|
|
186
|
-
- **Validación continua**: Sanitización de archivos
|
|
187
|
-
- **Feedback detallado**: Mensajes informativos en cada operación
|
|
212
|
+
## 👨💻 Autor
|
|
188
213
|
|
|
189
|
-
|
|
214
|
+
**Haka Lab** - [Felipe Farías](https://gitlab.com/felipe_farias)
|
|
190
215
|
|
|
191
|
-
|
|
192
|
-
- Requiere Python 3.7+ y las dependencias del framework
|
|
193
|
-
- Los archivos generados siguen las convenciones de naming del framework
|
|
194
|
-
- Compatible con ejecución local, hub y saucelabs (según configuración .env)
|
|
216
|
+
## 🔗 Enlaces
|
|
195
217
|
|
|
196
|
-
|
|
218
|
+
- **npm**: https://www.npmjs.com/package/hakalab-mcp
|
|
219
|
+
- **GitLab**: https://gitlab.com/felipe_farias/hakalab-mcp
|
|
220
|
+
- **Issues**: https://gitlab.com/felipe_farias/hakalab-mcp/-/issues
|
|
197
221
|
|
|
198
|
-
|
|
222
|
+
## 📞 Soporte
|
|
199
223
|
|
|
200
|
-
|
|
201
|
-
2. Revisar configuración de variables de entorno (.env)
|
|
202
|
-
3. Validar dependencias instaladas
|
|
203
|
-
4. Consultar logs de ejecución para debugging
|
|
224
|
+
Para reportar bugs o solicitar features, abre un issue en el repositorio de GitLab.
|
|
204
225
|
|
|
205
226
|
---
|
|
206
227
|
|
|
207
|
-
|
|
208
|
-
*Automatización inteligente de pruebas funcionales*
|
|
228
|
+
**¡Disfruta automatizando con Hakalab-MCP! 🚀**
|
package/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Hakalab-MCP v2.0
|
|
@@ -137,7 +137,7 @@ class WebAutomationMCP {
|
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
async openPlaywrightBrowser(browser, options) {
|
|
140
|
-
const { headless = false } = options;
|
|
140
|
+
const { headless = false } = options; // Por defecto NO headless (visible)
|
|
141
141
|
|
|
142
142
|
switch (browser.toLowerCase()) {
|
|
143
143
|
case 'chrome':
|
|
@@ -1154,9 +1154,11 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
1154
1154
|
});
|
|
1155
1155
|
|
|
1156
1156
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
1157
|
+
console.error(`[DEBUG] Received request: ${JSON.stringify(request)}`);
|
|
1157
1158
|
const { name, arguments: args } = request.params;
|
|
1158
1159
|
|
|
1159
1160
|
try {
|
|
1161
|
+
console.error(`[DEBUG] Executing tool: ${name} with args: ${JSON.stringify(args)}`);
|
|
1160
1162
|
let result;
|
|
1161
1163
|
|
|
1162
1164
|
switch (name) {
|
|
@@ -1166,7 +1168,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1166
1168
|
args.engine || 'selenium',
|
|
1167
1169
|
args.browser || 'chrome',
|
|
1168
1170
|
{
|
|
1169
|
-
headless: args.headless || false,
|
|
1171
|
+
headless: args.headless || false, // Por defecto NO headless
|
|
1170
1172
|
windowSize: args.window_size || '1920,1080'
|
|
1171
1173
|
}
|
|
1172
1174
|
);
|
|
@@ -1395,6 +1397,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1395
1397
|
};
|
|
1396
1398
|
}
|
|
1397
1399
|
|
|
1400
|
+
console.error(`[DEBUG] Tool result: ${JSON.stringify(result)}`);
|
|
1401
|
+
|
|
1398
1402
|
return {
|
|
1399
1403
|
content: [
|
|
1400
1404
|
{
|
|
@@ -1407,6 +1411,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1407
1411
|
};
|
|
1408
1412
|
|
|
1409
1413
|
} catch (error) {
|
|
1414
|
+
console.error(`[DEBUG] Error in handler: ${error.message}`);
|
|
1410
1415
|
return {
|
|
1411
1416
|
content: [
|
|
1412
1417
|
{
|
|
@@ -1420,9 +1425,62 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1420
1425
|
|
|
1421
1426
|
// Iniciar servidor
|
|
1422
1427
|
async function main() {
|
|
1428
|
+
// Verificar si se está ejecutando como comando CLI
|
|
1429
|
+
if (process.argv.length > 2) {
|
|
1430
|
+
// Modo CLI - ejecutar comando directamente
|
|
1431
|
+
const command = process.argv[2];
|
|
1432
|
+
const args = process.argv.slice(3);
|
|
1433
|
+
|
|
1434
|
+
console.error(`[CLI] Executing command: ${command} with args: ${args.join(' ')}`);
|
|
1435
|
+
|
|
1436
|
+
const automation = new WebAutomationMCP();
|
|
1437
|
+
let result;
|
|
1438
|
+
|
|
1439
|
+
try {
|
|
1440
|
+
switch (command) {
|
|
1441
|
+
case 'open_browser':
|
|
1442
|
+
const browser = args.find(arg => arg.startsWith('--browser='))?.split('=')[1] || 'chrome';
|
|
1443
|
+
const engine = args.find(arg => arg.startsWith('--engine='))?.split('=')[1] || 'selenium';
|
|
1444
|
+
const headless = args.includes('--headless'); // Solo headless si se especifica explícitamente
|
|
1445
|
+
|
|
1446
|
+
result = await automation.openBrowser(engine, browser, { headless });
|
|
1447
|
+
break;
|
|
1448
|
+
|
|
1449
|
+
case 'navigate_to_url':
|
|
1450
|
+
const url = args.find(arg => arg.startsWith('--url='))?.split('=')[1];
|
|
1451
|
+
if (!url) {
|
|
1452
|
+
console.log('❌ Error: Missing --url parameter');
|
|
1453
|
+
process.exit(1);
|
|
1454
|
+
}
|
|
1455
|
+
result = await automation.navigateToUrl(url);
|
|
1456
|
+
break;
|
|
1457
|
+
|
|
1458
|
+
default:
|
|
1459
|
+
console.log(`❌ Error: Unknown command: ${command}`);
|
|
1460
|
+
process.exit(1);
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
if (result.success) {
|
|
1464
|
+
console.log(`✅ ${result.message || 'Command executed successfully'}`);
|
|
1465
|
+
} else {
|
|
1466
|
+
console.log(`❌ ${result.error || 'Command failed'}`);
|
|
1467
|
+
process.exit(1);
|
|
1468
|
+
}
|
|
1469
|
+
} catch (error) {
|
|
1470
|
+
console.log(`❌ Error: ${error.message}`);
|
|
1471
|
+
process.exit(1);
|
|
1472
|
+
}
|
|
1473
|
+
|
|
1474
|
+
return;
|
|
1475
|
+
}
|
|
1476
|
+
|
|
1477
|
+
// Modo servidor MCP
|
|
1423
1478
|
const transport = new StdioServerTransport();
|
|
1424
1479
|
await server.connect(transport);
|
|
1425
1480
|
console.error('Hakalab-MCP v2.0 server running on stdio');
|
|
1481
|
+
|
|
1482
|
+
// Mantener el proceso vivo
|
|
1483
|
+
process.stdin.resume();
|
|
1426
1484
|
}
|
|
1427
1485
|
|
|
1428
1486
|
if (require.main === module) {
|
package/package.json
CHANGED
package/test_simple.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
|
|
2
|
+
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
|
|
3
|
+
const { CallToolRequestSchema } = require('@modelcontextprotocol/sdk/types.js');
|
|
4
|
+
|
|
5
|
+
const server = new Server(
|
|
6
|
+
{ name: 'test-mcp', version: '1.0.0' },
|
|
7
|
+
{ capabilities: { tools: {} } }
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
11
|
+
console.error(`[DEBUG] Received request: ${JSON.stringify(request)}`);
|
|
12
|
+
|
|
13
|
+
return {
|
|
14
|
+
content: [
|
|
15
|
+
{
|
|
16
|
+
type: 'text',
|
|
17
|
+
text: `✅ Test successful: ${request.params.name}`
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
async function main() {
|
|
24
|
+
const transport = new StdioServerTransport();
|
|
25
|
+
await server.connect(transport);
|
|
26
|
+
console.error('Test MCP server running');
|
|
27
|
+
|
|
28
|
+
// Mantener el proceso vivo
|
|
29
|
+
process.stdin.resume();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (require.main === module) {
|
|
33
|
+
main().catch(console.error);
|
|
34
|
+
}
|
package/README_MCP.md
DELETED
|
@@ -1,436 +0,0 @@
|
|
|
1
|
-
# Hakalab-MCP v2.0
|
|
2
|
-
|
|
3
|
-
**Servidor MCP completo para automatización web con Selenium y Playwright**
|
|
4
|
-
|
|
5
|
-
[](https://www.npmjs.com/package/hakalab-mcp)
|
|
6
|
-
[](https://opensource.org/licenses/MIT)
|
|
7
|
-
|
|
8
|
-
## 🚀 Descripción
|
|
9
|
-
|
|
10
|
-
Hakalab-MCP es un servidor Model Context Protocol (MCP) que proporciona automatización web completa con soporte para **Selenium** y **Playwright**. Incluye 20 herramientas para controlar navegadores, interactuar con elementos, y crear suites de pruebas automatizadas.
|
|
11
|
-
|
|
12
|
-
## ✨ Características
|
|
13
|
-
|
|
14
|
-
- ✅ **Doble Motor**: Selenium WebDriver + Playwright
|
|
15
|
-
- ✅ **Múltiples Navegadores**: Chrome, Firefox, Edge, Safari, Chromium, WebKit
|
|
16
|
-
- ✅ **20 Herramientas**: Gestión completa de navegadores e interacciones
|
|
17
|
-
- ✅ **Múltiples Selectores**: CSS, XPath, ID, Name, Class, Tag
|
|
18
|
-
- ✅ **Esperas Inteligentes**: Configurable por herramienta
|
|
19
|
-
- ✅ **Modo Headless**: Para ejecución sin interfaz
|
|
20
|
-
- ✅ **Screenshots**: Capturas automáticas con timestamp
|
|
21
|
-
- ✅ **Framework BDD**: Integración con Behave y Allure
|
|
22
|
-
- ✅ **Súper Liviano**: Solo 11.1 KB
|
|
23
|
-
|
|
24
|
-
## 📦 Instalación
|
|
25
|
-
|
|
26
|
-
### Opción 1: Uso Directo con npx (Recomendado)
|
|
27
|
-
|
|
28
|
-
No requiere instalación previa. Simplemente agrega la configuración a tu cliente MCP:
|
|
29
|
-
|
|
30
|
-
```json
|
|
31
|
-
{
|
|
32
|
-
"mcpServers": {
|
|
33
|
-
"hakalab-mcp": {
|
|
34
|
-
"command": "npx",
|
|
35
|
-
"args": ["-y", "hakalab-mcp"]
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Opción 2: Instalación Global
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
npm install -g hakalab-mcp
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### Opción 3: Instalación Local
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
npm install hakalab-mcp
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## 🔧 Configuración
|
|
54
|
-
|
|
55
|
-
### Para Kiro IDE
|
|
56
|
-
|
|
57
|
-
Agrega esta configuración a `~/.kiro/settings/mcp.json`:
|
|
58
|
-
|
|
59
|
-
```json
|
|
60
|
-
{
|
|
61
|
-
"mcpServers": {
|
|
62
|
-
"hakalab-mcp": {
|
|
63
|
-
"command": "npx",
|
|
64
|
-
"args": ["-y", "hakalab-mcp"],
|
|
65
|
-
"disabled": false,
|
|
66
|
-
"autoApprove": [
|
|
67
|
-
"open_browser",
|
|
68
|
-
"close_browser",
|
|
69
|
-
"navigate_to_url",
|
|
70
|
-
"click_element",
|
|
71
|
-
"fill_input",
|
|
72
|
-
"take_screenshot"
|
|
73
|
-
]
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
### Para Claude Desktop
|
|
80
|
-
|
|
81
|
-
Agrega esta configuración a `~/.claude_desktop_config.json`:
|
|
82
|
-
|
|
83
|
-
```json
|
|
84
|
-
{
|
|
85
|
-
"mcpServers": {
|
|
86
|
-
"hakalab-mcp": {
|
|
87
|
-
"command": "npx",
|
|
88
|
-
"args": ["-y", "hakalab-mcp"]
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Para Otros Clientes MCP
|
|
95
|
-
|
|
96
|
-
Usa la configuración estándar:
|
|
97
|
-
|
|
98
|
-
```json
|
|
99
|
-
{
|
|
100
|
-
"mcpServers": {
|
|
101
|
-
"hakalab-mcp": {
|
|
102
|
-
"command": "npx",
|
|
103
|
-
"args": ["-y", "hakalab-mcp"]
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## 🛠️ Herramientas Disponibles
|
|
110
|
-
|
|
111
|
-
### 🌐 Gestión de Navegadores
|
|
112
|
-
|
|
113
|
-
#### `open_browser`
|
|
114
|
-
Abre un navegador con el motor especificado.
|
|
115
|
-
|
|
116
|
-
**Parámetros:**
|
|
117
|
-
- `engine` (string): `selenium` o `playwright` (default: `selenium`)
|
|
118
|
-
- `browser` (string): `chrome`, `firefox`, `edge`, `safari`, `webkit`, `chromium` (default: `chrome`)
|
|
119
|
-
- `headless` (boolean): Ejecutar sin interfaz (default: `false`)
|
|
120
|
-
- `window_size` (string): Tamaño de ventana (default: `1920,1080`)
|
|
121
|
-
|
|
122
|
-
**Ejemplo:**
|
|
123
|
-
```
|
|
124
|
-
"Abre Chrome con Playwright"
|
|
125
|
-
"Abre Firefox con Selenium en modo headless"
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
#### `close_browser`
|
|
129
|
-
Cierra el navegador actual.
|
|
130
|
-
|
|
131
|
-
#### `navigate_to_url`
|
|
132
|
-
Navega a una URL específica.
|
|
133
|
-
|
|
134
|
-
**Parámetros:**
|
|
135
|
-
- `url` (string): URL a navegar
|
|
136
|
-
|
|
137
|
-
**Ejemplo:**
|
|
138
|
-
```
|
|
139
|
-
"Ve a https://www.google.com"
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
#### `go_back`
|
|
143
|
-
Navega hacia atrás en el historial.
|
|
144
|
-
|
|
145
|
-
#### `go_forward`
|
|
146
|
-
Navega hacia adelante en el historial.
|
|
147
|
-
|
|
148
|
-
#### `refresh_page`
|
|
149
|
-
Recarga la página actual.
|
|
150
|
-
|
|
151
|
-
### 🎯 Interacciones Básicas
|
|
152
|
-
|
|
153
|
-
#### `click_element`
|
|
154
|
-
Hace clic en un elemento.
|
|
155
|
-
|
|
156
|
-
**Parámetros:**
|
|
157
|
-
- `selector` (string): Selector del elemento
|
|
158
|
-
- `selector_type` (string): `css`, `xpath`, `id`, `name`, `class`, `tag` (default: `css`)
|
|
159
|
-
- `wait_time` (number): Tiempo de espera en ms (default: `5000`)
|
|
160
|
-
|
|
161
|
-
**Ejemplo:**
|
|
162
|
-
```
|
|
163
|
-
"Haz click en el botón con id 'submit'"
|
|
164
|
-
"Haz click en el elemento con selector '.btn-primary'"
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
#### `double_click_element`
|
|
168
|
-
Hace doble clic en un elemento.
|
|
169
|
-
|
|
170
|
-
#### `right_click_element`
|
|
171
|
-
Hace clic derecho en un elemento.
|
|
172
|
-
|
|
173
|
-
#### `fill_input`
|
|
174
|
-
Completa un campo de texto.
|
|
175
|
-
|
|
176
|
-
**Parámetros:**
|
|
177
|
-
- `selector` (string): Selector del campo
|
|
178
|
-
- `text` (string): Texto a ingresar
|
|
179
|
-
- `selector_type` (string): Tipo de selector (default: `css`)
|
|
180
|
-
- `clear` (boolean): Limpiar antes de escribir (default: `true`)
|
|
181
|
-
- `wait_time` (number): Tiempo de espera en ms (default: `5000`)
|
|
182
|
-
|
|
183
|
-
**Ejemplo:**
|
|
184
|
-
```
|
|
185
|
-
"Completa el campo 'username' con 'admin'"
|
|
186
|
-
"Ingresa 'hola' en el campo de búsqueda"
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
#### `select_option`
|
|
190
|
-
Selecciona una opción en un select/combobox.
|
|
191
|
-
|
|
192
|
-
**Parámetros:**
|
|
193
|
-
- `selector` (string): Selector del select
|
|
194
|
-
- `value` (string): Valor o texto de la opción
|
|
195
|
-
- `selector_type` (string): Tipo de selector (default: `css`)
|
|
196
|
-
- `by_value` (boolean): Seleccionar por valor (default: `true`)
|
|
197
|
-
- `wait_time` (number): Tiempo de espera en ms (default: `5000`)
|
|
198
|
-
|
|
199
|
-
**Ejemplo:**
|
|
200
|
-
```
|
|
201
|
-
"Selecciona 'Opción 1' en el combobox"
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
#### `hover_element`
|
|
205
|
-
Pasa el mouse sobre un elemento.
|
|
206
|
-
|
|
207
|
-
**Ejemplo:**
|
|
208
|
-
```
|
|
209
|
-
"Pasa el mouse sobre el menú principal"
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
### 🔧 Interacciones Avanzadas
|
|
213
|
-
|
|
214
|
-
#### `drag_and_drop`
|
|
215
|
-
Arrastra un elemento y lo suelta en otro.
|
|
216
|
-
|
|
217
|
-
**Parámetros:**
|
|
218
|
-
- `source_selector` (string): Selector del elemento origen
|
|
219
|
-
- `target_selector` (string): Selector del elemento destino
|
|
220
|
-
- `selector_type` (string): Tipo de selector (default: `css`)
|
|
221
|
-
- `wait_time` (number): Tiempo de espera en ms (default: `5000`)
|
|
222
|
-
|
|
223
|
-
**Ejemplo:**
|
|
224
|
-
```
|
|
225
|
-
"Arrastra el elemento '.item' al área '.drop-zone'"
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
#### `scroll_to_element`
|
|
229
|
-
Hace scroll hasta un elemento.
|
|
230
|
-
|
|
231
|
-
**Parámetros:**
|
|
232
|
-
- `selector` (string): Selector del elemento
|
|
233
|
-
- `selector_type` (string): Tipo de selector (default: `css`)
|
|
234
|
-
- `wait_time` (number): Tiempo de espera en ms (default: `5000`)
|
|
235
|
-
|
|
236
|
-
**Ejemplo:**
|
|
237
|
-
```
|
|
238
|
-
"Haz scroll hasta el footer"
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
#### `take_screenshot`
|
|
242
|
-
Toma una captura de pantalla.
|
|
243
|
-
|
|
244
|
-
**Parámetros:**
|
|
245
|
-
- `filename` (string): Nombre del archivo (opcional)
|
|
246
|
-
|
|
247
|
-
**Ejemplo:**
|
|
248
|
-
```
|
|
249
|
-
"Toma una captura de pantalla"
|
|
250
|
-
"Haz screenshot como 'resultado.png'"
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
### 📊 Utilidades
|
|
254
|
-
|
|
255
|
-
#### `get_current_url`
|
|
256
|
-
Obtiene la URL actual.
|
|
257
|
-
|
|
258
|
-
#### `get_page_title`
|
|
259
|
-
Obtiene el título de la página.
|
|
260
|
-
|
|
261
|
-
### 🧪 Framework (Behave + Allure)
|
|
262
|
-
|
|
263
|
-
#### `create_test_suite`
|
|
264
|
-
Crea una suite completa de pruebas (feature, steps, page object).
|
|
265
|
-
|
|
266
|
-
**Parámetros:**
|
|
267
|
-
- `feature_name` (string): Nombre del feature
|
|
268
|
-
- `scenarios` (array): Lista de escenarios
|
|
269
|
-
- `page_elements` (array): Elementos para Page Object
|
|
270
|
-
- `tags` (array): Tags del feature
|
|
271
|
-
|
|
272
|
-
#### `execute_tests`
|
|
273
|
-
Ejecuta pruebas del framework.
|
|
274
|
-
|
|
275
|
-
**Parámetros:**
|
|
276
|
-
- `tags` (array): Tags para filtrar
|
|
277
|
-
- `feature_file` (string): Archivo específico
|
|
278
|
-
- `parallel` (boolean): Ejecutar en paralelo
|
|
279
|
-
|
|
280
|
-
#### `list_test_files`
|
|
281
|
-
Lista archivos de prueba.
|
|
282
|
-
|
|
283
|
-
**Parámetros:**
|
|
284
|
-
- `file_type` (string): `feature`, `steps`, `pages`, `all`
|
|
285
|
-
|
|
286
|
-
#### `create_page_object`
|
|
287
|
-
Crea un Page Object independiente.
|
|
288
|
-
|
|
289
|
-
#### `sanitize_tests`
|
|
290
|
-
Valida archivos de prueba.
|
|
291
|
-
|
|
292
|
-
#### `generate_allure_report`
|
|
293
|
-
Genera reporte de Allure.
|
|
294
|
-
|
|
295
|
-
## 📝 Ejemplos de Uso
|
|
296
|
-
|
|
297
|
-
### Ejemplo 1: Búsqueda en Google
|
|
298
|
-
|
|
299
|
-
```
|
|
300
|
-
1. "Abre Chrome con Playwright"
|
|
301
|
-
2. "Ve a https://www.google.com"
|
|
302
|
-
3. "Completa el campo de búsqueda con 'hola mundo'"
|
|
303
|
-
4. "Haz click en el botón de búsqueda"
|
|
304
|
-
5. "Toma una captura de pantalla"
|
|
305
|
-
6. "Cierra el navegador"
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
### Ejemplo 2: Automatización de Formulario
|
|
309
|
-
|
|
310
|
-
```
|
|
311
|
-
1. "Abre Firefox con Selenium"
|
|
312
|
-
2. "Ve a https://example.com/form"
|
|
313
|
-
3. "Completa el campo 'nombre' con 'Juan'"
|
|
314
|
-
4. "Completa el campo 'email' con 'juan@example.com'"
|
|
315
|
-
5. "Selecciona 'Opción 1' en el combobox"
|
|
316
|
-
6. "Haz click en el botón 'Enviar'"
|
|
317
|
-
7. "Toma una captura del resultado"
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
### Ejemplo 3: Interacciones Complejas
|
|
321
|
-
|
|
322
|
-
```
|
|
323
|
-
1. "Abre Chrome con Playwright en modo headless"
|
|
324
|
-
2. "Ve a https://example.com"
|
|
325
|
-
3. "Pasa el mouse sobre el menú principal"
|
|
326
|
-
4. "Haz click en 'Productos'"
|
|
327
|
-
5. "Haz scroll hasta el producto deseado"
|
|
328
|
-
6. "Arrastra el producto al carrito"
|
|
329
|
-
7. "Toma una captura"
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
## 🔄 Flujo de Trabajo Típico
|
|
333
|
-
|
|
334
|
-
1. **Abrir navegador** → `open_browser`
|
|
335
|
-
2. **Navegar** → `navigate_to_url`
|
|
336
|
-
3. **Interactuar** → `click_element`, `fill_input`, etc.
|
|
337
|
-
4. **Capturar** → `take_screenshot`
|
|
338
|
-
5. **Cerrar** → `close_browser`
|
|
339
|
-
|
|
340
|
-
## 🎯 Casos de Uso
|
|
341
|
-
|
|
342
|
-
- ✅ Automatización de pruebas web
|
|
343
|
-
- ✅ Web scraping
|
|
344
|
-
- ✅ Pruebas de regresión
|
|
345
|
-
- ✅ Pruebas de UI
|
|
346
|
-
- ✅ Automatización de tareas repetitivas
|
|
347
|
-
- ✅ Validación de funcionalidad
|
|
348
|
-
- ✅ Pruebas de compatibilidad
|
|
349
|
-
|
|
350
|
-
## 📋 Requisitos
|
|
351
|
-
|
|
352
|
-
- **Node.js**: 18.0.0 o superior
|
|
353
|
-
- **npm**: 8.0.0 o superior
|
|
354
|
-
- **Navegadores**: Chrome, Firefox, Edge, Safari (según el motor)
|
|
355
|
-
|
|
356
|
-
## 🔧 Configuración Avanzada
|
|
357
|
-
|
|
358
|
-
### Variables de Entorno
|
|
359
|
-
|
|
360
|
-
```bash
|
|
361
|
-
# Aumentar timeout global
|
|
362
|
-
export MCP_TIMEOUT=30000
|
|
363
|
-
|
|
364
|
-
# Modo debug
|
|
365
|
-
export DEBUG=hakalab-mcp:*
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
### Opciones de Ejecución
|
|
369
|
-
|
|
370
|
-
```json
|
|
371
|
-
{
|
|
372
|
-
"mcpServers": {
|
|
373
|
-
"hakalab-mcp": {
|
|
374
|
-
"command": "npx",
|
|
375
|
-
"args": ["-y", "hakalab-mcp"],
|
|
376
|
-
"env": {
|
|
377
|
-
"NODE_ENV": "production",
|
|
378
|
-
"DEBUG": "false"
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
## 🐛 Solución de Problemas
|
|
386
|
-
|
|
387
|
-
### Error: "Browser not found"
|
|
388
|
-
- Asegúrate de tener el navegador instalado
|
|
389
|
-
- Para Playwright: ejecuta `npx playwright install`
|
|
390
|
-
|
|
391
|
-
### Error: "Timeout waiting for element"
|
|
392
|
-
- Aumenta el `wait_time` en los parámetros
|
|
393
|
-
- Verifica que el selector sea correcto
|
|
394
|
-
|
|
395
|
-
### Error: "Connection refused"
|
|
396
|
-
- Verifica que el MCP esté correctamente configurado
|
|
397
|
-
- Reinicia tu cliente MCP
|
|
398
|
-
|
|
399
|
-
## 📚 Documentación Adicional
|
|
400
|
-
|
|
401
|
-
- [Model Context Protocol](https://modelcontextprotocol.io/)
|
|
402
|
-
- [Selenium WebDriver](https://www.selenium.dev/)
|
|
403
|
-
- [Playwright](https://playwright.dev/)
|
|
404
|
-
- [Behave BDD](https://behave.readthedocs.io/)
|
|
405
|
-
|
|
406
|
-
## 🤝 Contribuciones
|
|
407
|
-
|
|
408
|
-
Las contribuciones son bienvenidas. Por favor:
|
|
409
|
-
|
|
410
|
-
1. Fork el repositorio
|
|
411
|
-
2. Crea una rama para tu feature
|
|
412
|
-
3. Commit tus cambios
|
|
413
|
-
4. Push a la rama
|
|
414
|
-
5. Abre un Pull Request
|
|
415
|
-
|
|
416
|
-
## 📄 Licencia
|
|
417
|
-
|
|
418
|
-
MIT License - ver [LICENSE](LICENSE) para más detalles
|
|
419
|
-
|
|
420
|
-
## 👨💻 Autor
|
|
421
|
-
|
|
422
|
-
**Haka Lab** - [Felipe Farías](https://gitlab.com/felipe_farias)
|
|
423
|
-
|
|
424
|
-
## 🔗 Enlaces
|
|
425
|
-
|
|
426
|
-
- **npm**: https://www.npmjs.com/package/hakalab-mcp
|
|
427
|
-
- **GitLab**: https://gitlab.com/felipe_farias/hakalab-mcp
|
|
428
|
-
- **Issues**: https://gitlab.com/felipe_farias/hakalab-mcp/-/issues
|
|
429
|
-
|
|
430
|
-
## 📞 Soporte
|
|
431
|
-
|
|
432
|
-
Para reportar bugs o solicitar features, abre un issue en el repositorio de GitLab.
|
|
433
|
-
|
|
434
|
-
---
|
|
435
|
-
|
|
436
|
-
**¡Disfruta automatizando con Hakalab-MCP! 🚀**
|