GitPrism

GitPrism es un pipeline rápido, eficiente en tokens y sin estado que convierte repositorios públicos de GitHub en Markdown listo para LLM.

Documentación

GitPrism

Dashboard

Un pipeline rápido, eficiente en tokens y sin estado que convierte repositorios públicos de GitHub en Markdown listo para LLM. Desplegado como un único Cloudflare Worker que sirve a humanos, agentes de IA y clientes MCP desde un mismo motor central compartido.

                    ┌─────────────────────────────────────────────┐
                    │          Single Cloudflare Worker            │
                    │               (gitprism)                    │
                    │                                             │
   Humans ────────► │  /              → Astro Static UI           │
                    │                   (Workers Static Assets)   │
                    │                                             │
   AI Agents ─────► │  /ingest?...    → REST API                  │
                    │  /<github-url>  → URL Proxy (shorthand)     │
                    │                                             │
   MCP Clients ───► │  /mcp           → Stateless MCP Server      │
                    │                   (createMcpHandler)        │
                    │                                             │
                    │         ┌───────────────────┐               │
                    │         │   Core Engine      │               │
                    │         │  URL Parser        │               │
                    │         │  Zipball Fetch     │               │
                    │         │  fflate Decomp     │               │
                    │         │  Filter/Ignore     │               │
                    │         │  MD Formatter      │               │
                    │         └───────────────────┘               │
                    └─────────────────────────────────────────────┘
                                       │
                                       ▼
                              GitHub Zipball API
                          (authenticated via secret)

Autenticación

GitPrism admite tokens de acceso personal de GitHub opcionales para evitar los límites de tasa compartidos y usar tu cuota personal de la API de GitHub.

Límites de tasa predeterminados

  • Sin autenticación: 30 solicitudes por minuto por dirección IP
  • Con token del servidor: Compartido entre todos los usuarios (5,000 req/h para la IP del Worker)
  • Con token de usuario: Tu cuota personal de GitHub (5,000 solicitudes por hora)

Usar tu propio token

API REST:

curl -H "X-GitHub-Token: ghp_xxxx" https://gitprism.cloudemo.org/ingest?repo=owner/repo

Interfaz web: Haz clic en el ícono de configuración ⚙️ en la barra de búsqueda para abrir el panel de configuración del token. Tu token se almacena en localStorage y nunca se envía a ningún servidor que no sea GitHub a través de este Worker.

Herramienta MCP:

{
  "url": "https://github.com/owner/repo",
  "detail": "full",
  "github_token": "ghp_xxxx"
}

Requisitos del token

Encabezados de respuesta

El encabezado X-Token-Source indica qué token se usó:

  • user — Tu token personal (a través del encabezado X-GitHub-Token)
  • server — El token compartido del Worker
  • none — No hay token disponible

Uso

Interfaz web

Visita https://gitprism.cloudemo.org/ y pega cualquier URL de GitHub. Usa el panel de configuración (⚙️) para configurar tu token de GitHub.

API REST

Forma canónica (recomendada para uso programático):

GET /ingest?repo=owner/repo&ref=main&path=src&detail=full

Forma abreviada con URL adjunta (amigable para humanos):

GET /https://github.com/owner/repo/tree/main/src

La rama, la referencia y el subdirectorio se extraen automáticamente de la URL de GitHub. Agrega una abreviatura de detalle para controlar la salida:

GET /https://github.com/owner/repo?summary
GET /https://github.com/owner/repo/tree/main/src?file-list

Parámetros (forma canónica):

ParámetroObligatorioPredeterminadoDescripción
repoSí (canónico)owner/repo, p. ej. cloudflare/workers-sdk
refNorama predeterminadaRama, etiqueta o SHA de confirmación
pathNoSubdirectorio para limitar los resultados
detailNofullNivel de salida: summary, structure, file-list o full
no-cacheNofalseEstablécelo en true para omitir la caché de respuesta

Abreviatura de nivel de detalle — en lugar de ?detail=<level>, agrega el nivel como una clave simple. Funciona tanto en la forma canónica como en la de proxy de URL:

/ingest?repo=owner/repo&summary
/https://github.com/owner/repo?structure

Niveles de detalle:

NivelAbreviaturaDevuelve
summary?summaryFront-matter YAML con nombre del repositorio, referencia, recuento de archivos, tamaño total
structure?structureResumen + árbol de directorios ASCII
file-list?file-listEstructura + tabla de cada archivo incluido con tamaño en bytes y recuento de líneas
full?fullResumen + estructura + contenido completo de los archivos en bloques de código delimitados. Transmitido.

Encabezados de respuesta:

EncabezadoDescripción
Content-Typetext/markdown; charset=utf-8
X-Repoowner/repo
X-RefReferencia original solicitada (rama, etiqueta o SHA)
X-Commit-ShaSHA de confirmación resuelto usado para la clave de caché
X-File-CountNúmero de archivos incluidos
X-Total-SizeTamaño total de los archivos incluidos en bytes
X-Truncatedtrue si la salida se truncó
X-RateLimit-RemainingLímite de tasa restante de la API de GitHub
X-RateLimit-ResetMarca de tiempo de restablecimiento del límite de tasa de la API de GitHub
X-CacheHIT o MISS

Respuestas de error (JSON):

EstadoCondición
400Entrada malformada
404Repositorio no encontrado o privado
413El archivo supera el límite de 50 MB
429Límite de tasa alcanzado (30 req/min por IP, omitido con X-GitHub-Token)
502Error de la API de GitHub

Herramienta MCP

Conecta cualquier cliente compatible con MCP a https://gitprism.cloudemo.org/mcp.

Herramienta disponible: ingest_repo

ArgumentoObligatorioPredeterminadoDescripción
urlURL de GitHub o abreviatura owner/repo
detailNofullsummary, structure, file-list o full
github_tokenNoTu PAT de GitHub para omitir los límites de tasa
{
  "url": "https://github.com/owner/repo",
  "detail": "summary",
  "github_token": "ghp_xxxx"
}

La herramienta es totalmente compatible con los agentes de Code Mode: el esquema de entrada Zod fuertemente tipado y las anotaciones descriptivas permiten que createCodeTool() del lado del cliente lo envuelva automáticamente.

Despliegue

Opción A — Workers Builds (recomendada)

Workers Builds conecta tu repositorio de GitHub a Cloudflare y se despliega automáticamente en cada push a main. La interfaz de usuario de Astro se compila durante el paso de compilación; ui/dist/ no se confirma intencionalmente en git.

Pasos:

  1. Ve al panel de CloudflareWorkers & PagesCrearImportar un repositorio de Git

  2. Conecta tu cuenta de GitHub y selecciona este repositorio

  3. Configura Configuración de compilación:

    ConfiguraciónValor
    Ramamain
    Comando de compilaciónnpm install && npm run build
    Comando de desplieguenpx wrangler deploy (predeterminado)
  4. Haz clic en Guardar y desplegar — la primera compilación se ejecutará de inmediato

  5. Una vez desplegado, ve a tu Worker → ConfiguraciónVariables y secretosAgregar un secreto:

    NombreValor
    GITHUB_TOKENPAT de grano fino con alcance solo lectura de repositorios públicos

    Sin este secreto, el Worker sigue funcionando, pero los límites de tasa de la API de GitHub bajan de 5,000 a 60 solicitudes/hora (compartidas entre todas las solicitudes desde la IP saliente del Worker).

  6. Opcional — Dominio personalizado: Worker → ConfiguraciónDominios personalizados → agrega tu dominio. Esto habilita la API de caché de Workers. Sin un dominio personalizado, el Worker se despliega en <name>.<subdomain>.workers.dev y el almacenamiento en caché no hace nada silenciosamente (el código maneja esto con elegancia). Para habilitar el enrutamiento una vez que tengas un dominio, descomenta y actualiza el bloque routes en wrangler.jsonc:

    "routes": [
      { "pattern": "yourdomain.com/*", "custom_domain": true }
    ],
    

Opción B — Despliegue manual (CLI de Wrangler)

git clone https://github.com/cougz/gitprism.git
cd gitprism
npm install
npm run build          # builds ui/dist/
npx wrangler secret put GITHUB_TOKEN
npx wrangler deploy

Variables de entorno

Configuradas en wrangler.jsonc bajo vars. Anúlalas en el panel de Cloudflare en Worker → ConfiguraciónVariables y secretos si es necesario:

VariablePredeterminadoDescripción
MAX_ZIP_BYTES52428800 (50 MB)Tamaño máximo del archivo zip antes de rechazar con 413
MAX_OUTPUT_BYTES10485760 (10 MB)Tamaño máximo de salida antes del truncamiento
MAX_FILE_COUNT5000Recuento máximo de archivos antes del truncamiento
CACHE_TTL_SECONDS86400 (24 horas)TTL de caché para claves de caché basadas en SHA

Secretos

SecretoCómo configurarloPropósito
GITHUB_TOKENPanel → Secretos, o npx wrangler secret put GITHUB_TOKENPAT de grano fino, solo lectura de repositorios públicos. Aumenta el límite de tasa de GitHub de 60 a 5,000 req/h.

Por qué se requiere un paso de compilación

ui/dist/ (el frontend de Astro compilado) está excluido de git. Wrangler lee assets.directory = "./ui/dist" desde wrangler.jsonc y sube esos archivos como activos estáticos durante el despliegue. Si ese directorio no existe en el momento del despliegue, el Worker se despliega sin interfaz de usuario. El paso npm run build compila el código fuente de Astro en ui/src/ hacia ui/dist/ antes de que Wrangler se ejecute.

Desarrollo

# Build the Astro UI (required before deploying or running wrangler dev)
npm run build

# Run tests (169 tests)
npm test

# Watch mode
npm run test:watch

# Type-check
npm run typecheck

# Local dev server (requires ui/dist/ to exist — run npm run build first)
npm run dev

Arquitectura

Estructura del proyecto

gitprism/
├── src/
│   ├── index.ts              # Worker entry point, routing
│   ├── types.ts              # Shared interfaces and error classes
│   ├── engine/
│   │   ├── parser.ts         # URL parsing and validation
│   │   ├── fetcher.ts        # GitHub zipball download + size check
│   │   ├── decompressor.ts   # fflate decompression + processing
│   │   ├── filter.ts         # Ignore lists, .gitignore, binary detection
│   │   ├── formatter.ts      # Markdown output generators (4 levels)
│   │   └── ingest.ts         # Shared pipeline (used by API + MCP)
│   ├── mcp/
│   │   └── server.ts         # createMcpHandler setup
│   ├── api/
│   │   ├── handler.ts        # REST API handler, streaming, caching
│   │   └── llmstxt.ts        # /llms.txt endpoint
│   └── utils/
│       ├── cache.ts          # Workers Cache API helpers
│       ├── ratelimit.ts      # Rate limiting helper
│       └── headers.ts        # Response header builder
├── test/                     # Vitest test files (169 tests)
├── ui/
│   ├── src/                  # Astro source
│   ├── dist/                 # Build output (gitignored)
│   └── astro.config.mjs
├── PLAN.md                   # Detailed implementation plan
└── wrangler.jsonc

Decisiones clave

DecisiónJustificación
Worker único (sin Pages)Workers Static Assets es el enfoque recomendado. Sin CORS, despliegue más simple.
createMcpHandler() (sin Durable Objects)La herramienta no tiene estado. No se necesita estado por sesión.
fflate sobre jszipDescompresión en streaming, paquete más pequeño, menor memoria máxima en aislamientos V8.
GITHUB_TOKEN del lado del servidorAumenta el límite de tasa de 60 a 5,000 req/h sin autenticación de usuario.
Verificación de tamaño previaEvita fallos por falta de memoria con repositorios grandes.
API de caché desde el primer díaRepositorio+referencia+detalle idénticos producen salida idéntica. El almacenamiento en caché reduce la latencia y el uso de la API de GitHub.
TransformStream en streaming para fullReduce la memoria máxima, mejora el tiempo hasta el primer byte.

Filtrado de archivos

Lista de ignorados codificada

Lo siguiente siempre se excluye independientemente de .gitignore:

Directorios: node_modules/, vendor/, .git/, __pycache__/, .venv/, venv/, dist/, build/, .next/, .nuxt/, .svelte-kit/, .output/, .cache/, .parcel-cache/, coverage/, .tox/, .mypy_cache/

Archivos: package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb, Cargo.lock, composer.lock, Gemfile.lock, go.sum, poetry.lock, *.min.js, *.min.css, *.map, *.wasm, *.pb.go, *.pyc, *.pyo

Extensiones binarias: .png, .jpg, .jpeg, .gif, .ico, .webp, .bmp, .tiff, .svg, .woff, .woff2, .ttf, .eot, .otf, .pdf, .zip, .tar, .gz, .bz2, .7z, .rar, .exe, .dll, .so, .dylib, .bin, .o, .a, .mp3, .mp4, .avi, .mov, .mkv, .flac, .wav, .ogg, .sqlite, .db, .DS_Store

Detección de contenido binario: Los archivos que contienen bytes nulos en sus primeros 8 KB se omiten independientemente de la extensión.

Soporte de .gitignore

El .gitignore raíz del repositorio se analiza y aplica. Admite:

  • Patrones comodín (*.log, **/*.tmp)
  • Patrones de directorio con barra final (logs/)
  • Patrones anclados (/build)
  • Patrones de negación (!important.log)
  • Comentarios (# this line is ignored)

Limitación: Solo se evalúa el .gitignore raíz. Los archivos .gitignore anidados (p. ej., src/.gitignore) no se admiten en v1.

Compatibilidad con Code Mode

La herramienta MCP ingest_repo es compatible con los agentes de Code Mode por diseño:

  • Nombre de herramienta claro y descriptivo (ingest_repo)
  • Descripción de varias oraciones que explica los cuatro niveles de detalle
  • Esquemas Zod fuertemente tipados con .describe() en cada parámetro
  • No se necesitan cambios del lado del servidor: las herramientas MCP estándar con esquemas tipados son inherentemente compatibles con Code Mode

Límites

LímiteValorConfigurable
Tamaño máximo del archivo zip50 MBvariable de entorno MAX_ZIP_BYTES
Tamaño máximo de salida10 MBvariable de entorno MAX_OUTPUT_BYTES
Recuento máximo de archivos5,000variable de entorno MAX_FILE_COUNT
Límite de tasa (sin token)30 req/min por IPenlace de límites de tasa wrangler.jsonc
Límite de tasa (token de usuario)5,000 req/hCuota por usuario de GitHub
TTL de caché24 horasvariable de entorno CACHE_TTL_SECONDS

Comportamiento del límite de tasa:

  • Sin X-GitHub-Token: El limitador de tasa de Cloudflare aplica 30 solicitudes por minuto por IP
  • Con X-GitHub-Token: El limitador de tasa de Cloudflare se omite; se aplica tu cuota personal de GitHub (5,000 req/h)
  • El encabezado de respuesta X-Token-Source indica qué token se usó (user, server o none)

Comportamiento del almacenamiento en caché:

Las claves de caché usan SHA de confirmación resueltos para la invalidación automática cuando los repositorios se actualizan. Las entradas de caché antiguas expiran naturalmente después del TTL. Si la resolución del SHA falla, se omite el almacenamiento en caché y siempre se obtienen datos frescos.

Licencia

MIT