@mcptoolshop/registry-stats 2.2.0 → 3.0.0
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.es.md +137 -134
- package/README.fr.md +137 -134
- package/README.hi.md +137 -134
- package/README.it.md +137 -134
- package/README.ja.md +137 -134
- package/README.md +6 -6
- package/README.pt-BR.md +137 -134
- package/README.zh.md +137 -134
- package/package.json +1 -1
package/README.es.md
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
<p align="center">
|
|
2
|
-
<a href="README.ja.md">日本語</a> | <a href="README.zh.md">中文</a> | <a href="README.md">English</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.it.md">Italiano</a> | <a href="README.pt-BR.md">Português (BR)</a>
|
|
3
|
-
</p>
|
|
4
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="README.ja.md">日本語</a> | <a href="README.zh.md">中文</a> | <a href="README.md">English</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.it.md">Italiano</a> | <a href="README.pt-BR.md">Português (BR)</a>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
5
|
<p align="center">
|
|
6
6
|
<img src="https://raw.githubusercontent.com/mcp-tool-shop-org/brand/main/logos/registry-stats/readme.png" alt="registry-stats logo" width="400" />
|
|
7
7
|
</p>
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
<p align="center">
|
|
10
10
|
Five registries. One engine. Dashboard included.
|
|
11
11
|
</p>
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
<p align="center">
|
|
14
14
|
<a href="https://github.com/mcp-tool-shop-org/registry-stats/actions/workflows/pages.yml"><img src="https://github.com/mcp-tool-shop-org/registry-stats/actions/workflows/pages.yml/badge.svg" alt="CI"></a>
|
|
15
15
|
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="MIT License"></a>
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
<a href="https://mcp-tool-shop-org.github.io/registry-stats/dashboard/"><img src="https://img.shields.io/badge/Dashboard-live-green" alt="Dashboard"></a>
|
|
18
18
|
<a href="https://mcp-tool-shop-org.github.io/registry-stats/"><img src="https://img.shields.io/badge/Landing_Page-live-blue" alt="Landing Page"></a>
|
|
19
19
|
</p>
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
<p align="center">
|
|
22
22
|
<a href="#dashboard">Dashboard</a> ·
|
|
23
23
|
<a href="#desktop-app">Desktop App</a> ·
|
|
@@ -28,57 +28,60 @@
|
|
|
28
28
|
<a href="#config-file">Config</a> ·
|
|
29
29
|
<a href="#license">License</a>
|
|
30
30
|
</p>
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
---
|
|
33
|
-
|
|
34
|
-
Publica en npm, PyPI, NuGet, el Marketplace de VS Code y Docker Hub. Actualmente, responder a la pregunta "¿cómo le están yendo a mis paquetes?" implica consultar cinco sitios diferentes. **registry-stats** es la plataforma completa: un motor de TypeScript (CLI + API + servidor REST), un panel web
|
|
35
|
-
|
|
36
|
-
No tiene dependencias de tiempo de ejecución. Utiliza `fetch()` nativo. Node 18+.
|
|
37
|
-
|
|
38
|
-
## ¿Qué hay dentro?
|
|
39
|
-
|
|
40
|
-
| Capa | ¿Qué hace? |
|
|
41
|
-
|-------|-------------|
|
|
42
|
-
| **Engine** | Biblioteca de TypeScript + CLI + servidor REST. Consulta cinco registros con una
|
|
43
|
-
| **Dashboard** |
|
|
44
|
-
| **Desktop** | Aplicación nativa para Windows con WinUI 3 + WebView2. Incluye el panel sin conexión y descarga las estadísticas en tiempo real bajo demanda. |
|
|
45
|
-
|
|
46
|
-
## Panel
|
|
47
|
-
|
|
48
|
-
Un panel de estadísticas que se actualiza automáticamente se encuentra en [`/dashboard/`](https://mcp-tool-shop-org.github.io/registry-stats/dashboard/).
|
|
49
|
-
|
|
50
|
-
- **Interfaz con pestañas** — Pestañas
|
|
51
|
-
- **
|
|
52
|
-
- **Resumen ejecutivo** —
|
|
53
|
-
- **Seis gráficos interactivos** —
|
|
54
|
-
- **Motor de crecimiento inteligente** —
|
|
55
|
-
- **
|
|
56
|
-
- **
|
|
57
|
-
- **
|
|
58
|
-
- **
|
|
59
|
-
- **
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
- **
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
33
|
+
|
|
34
|
+
Publica en npm, PyPI, NuGet, el Marketplace de VS Code y Docker Hub. Actualmente, responder a la pregunta "¿cómo le están yendo a mis paquetes?" implica consultar cinco sitios diferentes. **registry-stats** es la plataforma completa: un motor de TypeScript (CLI + API + servidor REST), un panel web interactivo y una aplicación de escritorio nativa para Windows, todo desde un único repositorio.
|
|
35
|
+
|
|
36
|
+
No tiene dependencias de tiempo de ejecución. Utiliza `fetch()` nativo. Node 18+.
|
|
37
|
+
|
|
38
|
+
## ¿Qué hay dentro?
|
|
39
|
+
|
|
40
|
+
| Capa | ¿Qué hace? |
|
|
41
|
+
|-------|-------------|
|
|
42
|
+
| **Engine** | Biblioteca de TypeScript + CLI + servidor REST. Consulta cinco registros con una sola interfaz. Publicado en npm como `@mcptoolshop/registry-stats`. |
|
|
43
|
+
| **Dashboard** | Una aplicación web impulsada por Astro, con el copiloto de IA Pulse (transmisión de voz, búsqueda web, pantalla completa, conectores de datos de GitHub), seis gráficos interactivos, actualización en tiempo real, exportación de informes (PDF / JSONL / Markdown) y una guía de ayuda con pestañas. Reconstruida semanalmente mediante CI; se puede actualizar bajo demanda. |
|
|
44
|
+
| **Desktop** | Aplicación nativa para Windows con WinUI 3 + WebView2. Incluye el panel de control sin conexión y descarga las estadísticas en tiempo real bajo demanda. |
|
|
45
|
+
|
|
46
|
+
## Panel de control
|
|
47
|
+
|
|
48
|
+
Un panel de control de estadísticas que se actualiza automáticamente se encuentra en [`/dashboard/`](https://mcp-tool-shop-org.github.io/registry-stats/dashboard/).
|
|
49
|
+
|
|
50
|
+
- **Interfaz con pestañas** — Pestañas de Inicio, Analítica, Clasificación y Ayuda.
|
|
51
|
+
- **Copiloto de IA Pulse** — Asistente conversacional impulsado por Ollama con síntesis de voz en streaming (habla mientras el modelo de lenguaje genera texto, 4 voces a través de [mcp-voice-soundboard](https://github.com/mcp-tool-shop-org/mcp-voice-soundboard)), búsqueda web (Wikipedia + SearXNG opcional), reproducción automática de voz, modo de pantalla completa, conector de datos de organizaciones de GitHub, selector de modelos y memoria de conversación.
|
|
52
|
+
- **Resumen ejecutivo** — Puntuación de salud (0–100), índice de diversidad, cambio semanal, número total de descargas en todos los registros.
|
|
53
|
+
- **Seis gráficos interactivos** — Tendencia de 30 días (agregada / por registro / conmutación entre los 5 principales), cuota de registro (área polar), riesgo de la cartera (histograma + Gini y P90), los 10 principales por impulso, rastreador de velocidad con gráficos de líneas, y mapa de calor de 30 días con detección de picos (>2σ).
|
|
54
|
+
- **Motor de crecimiento inteligente** — Maneja la distorsión de denominadores pequeños con un umbral base, un límite porcentual y una fórmula de velocidad amortiguada.
|
|
55
|
+
- **Información útil** — Recomendaciones generadas automáticamente y alertas para paquetes en declive.
|
|
56
|
+
- **Panel Pulse** — Vista dividida de "Established Movers" (≥ 50 descargas/semana) y paquetes emergentes y nuevos, con gráficos de líneas de 7 días integrados, deltas absolutos + porcentuales, contexto base y un resumen ejecutivo de una línea.
|
|
57
|
+
- **Actualización en tiempo real** — Recuperación bajo demanda desde las API de npm y PyPI con indicador de progreso; los resultados se almacenan en caché en sessionStorage (TTL de 5 minutos) para que los cambios de pestaña sean instantáneos.
|
|
58
|
+
- **Exportación de informes** — Menú desplegable junto al botón de Actualizar que ofrece tres formatos: **PDF Ejecutivo** (a través de jsPDF), **JSONL del modelo de lenguaje** (registros tipados para la ingesta de IA) y **Markdown para desarrolladores** (tablas GFM).
|
|
59
|
+
- **Clasificación** — 132 paquetes clasificados por descargas semanales con gráficos de líneas de 30 días integrados y distintivos de tendencia inteligentes.
|
|
60
|
+
- **Página de configuración** — Editor de cartera con validación, sección complementaria de sincronización de registros y descripción general del flujo de trabajo.
|
|
61
|
+
- **Pestaña de ayuda** — Guía fácil de entender que cubre cada pestaña, conceptos clave, consejos para el asistente de IA, flujo de datos y enlaces útiles.
|
|
62
|
+
- **Tema oscuro / claro** — Sigue la preferencia del sistema.
|
|
63
|
+
|
|
64
|
+
Los datos se obtienen en el momento de la compilación y se reconstruyen semanalmente mediante CI (los lunes a las 06:00 UTC). La actualización en tiempo real descarga los últimos números directamente desde las API de los registros. Configure los paquetes rastreados en `site/src/data/packages.json` (132 paquetes en 5 registros).
|
|
65
|
+
|
|
66
|
+
## Aplicación de escritorio
|
|
67
|
+
|
|
68
|
+
Una aplicación nativa para Windows que integra el panel de control en un entorno WebView2 local:
|
|
69
|
+
|
|
70
|
+
- **Funciona sin conexión** — Incluye HTML/CSS/JS empaquetados; funciona sin conexión a Internet.
|
|
71
|
+
- **Actualización en tiempo real** — Descarga `stats.json` de GitHub Pages bajo demanda.
|
|
72
|
+
- **Exportación a CSV** — Exporta los datos de la clasificación con un solo clic.
|
|
73
|
+
- **Empaquetado MSIX** — Se construye y firma en CI mediante `desktop-ci.yml`.
|
|
74
|
+
|
|
75
|
+
El código fuente de la aplicación de escritorio se encuentra en `desktop/`. Se construyó con .NET 10 MAUI y apunta a WinUI 3.
|
|
76
|
+
|
|
77
|
+
## Instalación
|
|
78
|
+
|
|
76
79
|
```bash
|
|
77
80
|
npm install @mcptoolshop/registry-stats
|
|
78
81
|
```
|
|
79
|
-
|
|
80
|
-
## CLI
|
|
81
|
-
|
|
82
|
+
|
|
83
|
+
## CLI
|
|
84
|
+
|
|
82
85
|
```bash
|
|
83
86
|
# Query a single registry
|
|
84
87
|
registry-stats express -r npm
|
|
@@ -116,11 +119,11 @@ registry-stats express -r npm --range 2025-01-01:2025-06-30 --format chart
|
|
|
116
119
|
# Start a REST API server
|
|
117
120
|
registry-stats serve --port 3000
|
|
118
121
|
```
|
|
119
|
-
|
|
120
|
-
## Archivo de configuración
|
|
121
|
-
|
|
122
|
-
Crea un archivo `registry-stats.config.json` en la raíz de tu proyecto (o ejecuta `registry-stats --init`):
|
|
123
|
-
|
|
122
|
+
|
|
123
|
+
## Archivo de configuración
|
|
124
|
+
|
|
125
|
+
Crea un archivo `registry-stats.config.json` en la raíz de tu proyecto (o ejecuta `registry-stats --init`):
|
|
126
|
+
|
|
124
127
|
```json
|
|
125
128
|
{
|
|
126
129
|
"registries": ["npm", "pypi", "nuget", "vscode", "docker"],
|
|
@@ -139,11 +142,11 @@ Crea un archivo `registry-stats.config.json` en la raíz de tu proyecto (o ejecu
|
|
|
139
142
|
"concurrency": 5
|
|
140
143
|
}
|
|
141
144
|
```
|
|
142
|
-
|
|
143
|
-
Ejecuta `registry-stats` sin argumentos para obtener las estadísticas de todos los paquetes configurados. La CLI busca el archivo de configuración desde el directorio actual.
|
|
144
|
-
|
|
145
|
-
La configuración también está disponible de forma programática:
|
|
146
|
-
|
|
145
|
+
|
|
146
|
+
Ejecuta `registry-stats` sin argumentos para obtener las estadísticas de todos los paquetes configurados. La CLI busca el archivo de configuración desde el directorio actual.
|
|
147
|
+
|
|
148
|
+
La configuración también está disponible de forma programática:
|
|
149
|
+
|
|
147
150
|
```typescript
|
|
148
151
|
import { loadConfig, defaultConfig, starterConfig } from '@mcptoolshop/registry-stats';
|
|
149
152
|
|
|
@@ -151,9 +154,9 @@ const config = loadConfig(); // finds nearest config file, or null
|
|
|
151
154
|
const defaults = defaultConfig(); // returns default Config object
|
|
152
155
|
const template = starterConfig(); // returns starter JSON string
|
|
153
156
|
```
|
|
154
|
-
|
|
155
|
-
## API programática
|
|
156
|
-
|
|
157
|
+
|
|
158
|
+
## API programática
|
|
159
|
+
|
|
157
160
|
```typescript
|
|
158
161
|
import { stats, calc, createCache } from '@mcptoolshop/registry-stats';
|
|
159
162
|
|
|
@@ -194,41 +197,41 @@ const cache = createCache();
|
|
|
194
197
|
await stats('npm', 'express', { cache }); // fetches
|
|
195
198
|
await stats('npm', 'express', { cache }); // cache hit
|
|
196
199
|
```
|
|
197
|
-
|
|
198
|
-
## Soporte para registros
|
|
199
|
-
|
|
200
|
-
| Registro | Formato del paquete | Series de tiempo | Datos disponibles |
|
|
201
|
-
|----------|---------------|-------------|----------------|
|
|
202
|
-
| `npm` | `express`, `@scope/pkg` | Sí (549 días) | último día, última semana, último mes |
|
|
203
|
-
| `pypi` | `requests` | Sí (180 días) | último día, última semana, último mes, total |
|
|
204
|
-
| `nuget` | `Newtonsoft.Json` | No | total |
|
|
205
|
-
| `vscode` | `publisher.extension` | No | total (instalaciones), calificación, tendencias |
|
|
206
|
-
| `docker` | `namespace/repo` | No | total (descargas), estrellas |
|
|
207
|
-
|
|
208
|
-
## Fiabilidad integrada
|
|
209
|
-
|
|
210
|
-
- Reintentos automáticos con retroceso exponencial en caso de errores 429/5xx.
|
|
211
|
-
- Respeta los encabezados `Retry-After`.
|
|
212
|
-
- Limitación de concurrencia para solicitudes masivas.
|
|
213
|
-
- Caché TTL opcional (plug-in: proporciona tu propio backend de Redis/archivo a través de la interfaz `StatsCache`).
|
|
214
|
-
|
|
215
|
-
## Servidor de API REST
|
|
216
|
-
|
|
217
|
-
Ejecútalo como un microservicio o intégralo en tu propio servidor:
|
|
218
|
-
|
|
200
|
+
|
|
201
|
+
## Soporte para registros
|
|
202
|
+
|
|
203
|
+
| Registro | Formato del paquete | Series de tiempo | Datos disponibles |
|
|
204
|
+
|----------|---------------|-------------|----------------|
|
|
205
|
+
| `npm` | `express`, `@scope/pkg` | Sí (549 días) | último día, última semana, último mes |
|
|
206
|
+
| `pypi` | `requests` | Sí (180 días) | último día, última semana, último mes, total |
|
|
207
|
+
| `nuget` | `Newtonsoft.Json` | No | total |
|
|
208
|
+
| `vscode` | `publisher.extension` | No | total (instalaciones), calificación, tendencias |
|
|
209
|
+
| `docker` | `namespace/repo` | No | total (descargas), estrellas |
|
|
210
|
+
|
|
211
|
+
## Fiabilidad integrada
|
|
212
|
+
|
|
213
|
+
- Reintentos automáticos con retroceso exponencial en caso de errores 429/5xx.
|
|
214
|
+
- Respeta los encabezados `Retry-After`.
|
|
215
|
+
- Limitación de concurrencia para solicitudes masivas.
|
|
216
|
+
- Caché TTL opcional (plug-in: proporciona tu propio backend de Redis/archivo a través de la interfaz `StatsCache`).
|
|
217
|
+
|
|
218
|
+
## Servidor de API REST
|
|
219
|
+
|
|
220
|
+
Ejecútalo como un microservicio o intégralo en tu propio servidor:
|
|
221
|
+
|
|
219
222
|
```bash
|
|
220
223
|
registry-stats serve --port 3000
|
|
221
224
|
```
|
|
222
|
-
|
|
225
|
+
|
|
223
226
|
```
|
|
224
227
|
GET /stats/:package # all registries
|
|
225
228
|
GET /stats/:registry/:package # single registry
|
|
226
229
|
GET /compare/:package?registries=npm,pypi
|
|
227
230
|
GET /range/:registry/:package?start=YYYY-MM-DD&end=YYYY-MM-DD&format=json|csv|chart
|
|
228
231
|
```
|
|
229
|
-
|
|
230
|
-
Uso programático para servidores personalizados o sin servidor:
|
|
231
|
-
|
|
232
|
+
|
|
233
|
+
Uso programático para servidores personalizados o sin servidor:
|
|
234
|
+
|
|
232
235
|
```typescript
|
|
233
236
|
import { createHandler, serve } from '@mcptoolshop/registry-stats';
|
|
234
237
|
|
|
@@ -240,9 +243,9 @@ import { createServer } from 'node:http';
|
|
|
240
243
|
const handler = createHandler();
|
|
241
244
|
createServer(handler).listen(3000);
|
|
242
245
|
```
|
|
243
|
-
|
|
244
|
-
## Registros personalizados
|
|
245
|
-
|
|
246
|
+
|
|
247
|
+
## Registros personalizados
|
|
248
|
+
|
|
246
249
|
```typescript
|
|
247
250
|
import { registerProvider, type RegistryProvider } from '@mcptoolshop/registry-stats';
|
|
248
251
|
|
|
@@ -263,9 +266,9 @@ const cargo: RegistryProvider = {
|
|
|
263
266
|
registerProvider(cargo);
|
|
264
267
|
await stats('cargo', 'serde');
|
|
265
268
|
```
|
|
266
|
-
|
|
267
|
-
## Estructura del repositorio
|
|
268
|
-
|
|
269
|
+
|
|
270
|
+
## Estructura del repositorio
|
|
271
|
+
|
|
269
272
|
```
|
|
270
273
|
registry-stats/
|
|
271
274
|
├── src/ # TypeScript engine (published to npm)
|
|
@@ -273,9 +276,9 @@ registry-stats/
|
|
|
273
276
|
├── desktop/ # WinUI 3 desktop app (.NET 10 MAUI)
|
|
274
277
|
└── test/ # Library tests (vitest)
|
|
275
278
|
```
|
|
276
|
-
|
|
277
|
-
## Desarrollo
|
|
278
|
-
|
|
279
|
+
|
|
280
|
+
## Desarrollo
|
|
281
|
+
|
|
279
282
|
```bash
|
|
280
283
|
# Engine
|
|
281
284
|
npm install && npm run build && npm test
|
|
@@ -286,36 +289,36 @@ npm run site:dev
|
|
|
286
289
|
# Dashboard (production build)
|
|
287
290
|
npm run site:build
|
|
288
291
|
```
|
|
289
|
-
|
|
290
|
-
## Seguridad y alcance de los datos
|
|
291
|
-
|
|
292
|
-
| Aspecto | Detalle |
|
|
293
|
-
|--------|--------|
|
|
294
|
-
| **Data touched** | Estadísticas de
|
|
295
|
-
| **Data NOT touched** | Sin telemetría. Sin análisis. Sin almacenamiento de credenciales. Sin datos de usuario. Sin escrituras de archivos. |
|
|
296
|
-
| **Permissions** | Lectura: APIs
|
|
297
|
-
| **Network** | Conexiones HTTPS salientes a APIs
|
|
298
|
-
| **Telemetry** |
|
|
299
|
-
|
|
300
|
-
Consulte [SECURITY.md](SECURITY.md) para informar sobre vulnerabilidades.
|
|
301
|
-
|
|
302
|
-
##
|
|
303
|
-
|
|
304
|
-
| Categoría | Puntuación |
|
|
305
|
-
|----------|-------|
|
|
306
|
-
| A. Seguridad | 10 |
|
|
307
|
-
| B. Manejo de errores | 10 |
|
|
308
|
-
| C. Documentación para
|
|
309
|
-
| D. Higiene
|
|
310
|
-
| E. Identidad (suave) | 10 |
|
|
311
|
-
| **Overall** | **50/50** |
|
|
312
|
-
|
|
313
|
-
> Auditoría completa: [SHIP_GATE.md](SHIP_GATE.md) · [SCORECARD.md](SCORECARD.md)
|
|
314
|
-
|
|
315
|
-
## Licencia
|
|
316
|
-
|
|
317
|
-
MIT
|
|
318
|
-
|
|
292
|
+
|
|
293
|
+
## Seguridad y alcance de los datos
|
|
294
|
+
|
|
295
|
+
| Aspecto | Detalle |
|
|
296
|
+
|--------|--------|
|
|
297
|
+
| **Data touched** | Estadísticas de descargas públicas de npm, PyPI, NuGet, Marketplace de VS Code, Docker Hub. Caché en memoria (opcional). |
|
|
298
|
+
| **Data NOT touched** | Sin telemetría. Sin análisis. Sin almacenamiento de credenciales. Sin datos de usuario. Sin escrituras de archivos. |
|
|
299
|
+
| **Permissions** | Lectura: APIs de registros públicos a través de HTTPS. Escritura: solo a stdout/stderr. |
|
|
300
|
+
| **Network** | Conexiones HTTPS salientes a APIs de registros públicos. Servidor REST local opcional. |
|
|
301
|
+
| **Telemetry** | Ninguna información es recopilada o enviada. |
|
|
302
|
+
|
|
303
|
+
Consulte [SECURITY.md](SECURITY.md) para informar sobre vulnerabilidades.
|
|
304
|
+
|
|
305
|
+
## Evaluación
|
|
306
|
+
|
|
307
|
+
| Categoría | Puntuación |
|
|
308
|
+
|----------|-------|
|
|
309
|
+
| A. Seguridad | 10 |
|
|
310
|
+
| B. Manejo de errores | 10 |
|
|
311
|
+
| C. Documentación para el operador | 10 |
|
|
312
|
+
| D. Higiene en la entrega | 10 |
|
|
313
|
+
| E. Identidad (suave) | 10 |
|
|
314
|
+
| **Overall** | **50/50** |
|
|
315
|
+
|
|
316
|
+
> Auditoría completa: [SHIP_GATE.md](SHIP_GATE.md) · [SCORECARD.md](SCORECARD.md)
|
|
317
|
+
|
|
318
|
+
## Licencia
|
|
319
|
+
|
|
320
|
+
MIT
|
|
321
|
+
|
|
319
322
|
---
|
|
320
|
-
|
|
321
|
-
Creado por <a href="https://mcp-tool-shop.github.io/">MCP Tool Shop</a>
|
|
323
|
+
|
|
324
|
+
Creado por <a href="https://mcp-tool-shop.github.io/">MCP Tool Shop</a>
|