shakatoti1618-agent
MCP server that enables AI agents to perform GitHub operations (repos, issues, commits, PRs) via natural language, integrated with hosts like Antigravity.
README
shakatoti1618-agent — GitHub AI Agent (MCP Server)
Servidor Model Context Protocol (MCP) que permite a un agente de IA (LLM: Gemini, Claude, etc.) ejecutar operaciones reales en GitHub usando lenguaje natural, integrado con Antigravity como host.
- Proyecto Integrador 5 — Especialización Backend · Henry
- Stack: Node.js 18+ · TypeScript · MCP SDK · Octokit · Zod · Vitest
- Comunicación: stdio (JSON-RPC)
Tabla de contenidos
- Arquitectura
- Tools disponibles
- Requisitos
- Obtener el GitHub Token
- Instalación
- Configuración en Antigravity
- Verificar que funciona (MCP Inspector)
- Ejemplos de prompts
- Estructura del proyecto
- Errores y troubleshooting
- Testing
- Extras implementados
Arquitectura
┌────────────────────────────────────────────────────────────────┐
│ ANTIGRAVITY (Host) │
│ Gestiona la sesión y conecta los componentes │
└──────────────────────────────┬─────────────────────────────────┘
▼
┌────────────────────────────────────────────────────────────────┐
│ LLM — Gemini / Claude (Client) │
│ Lee la descripción de los tools y decide cuál usar │
└──────────────────────────────┬─────────────────────────────────┘
▼ JSON-RPC sobre stdio
┌────────────────────────────────────────────────────────────────┐
│ MCP SERVER — shakatoti1618-agent (tu código) │
│ tools/list · tools/call · validación Zod · errores │
└──────────────────────────────┬─────────────────────────────────┘
▼ HTTPS (autenticado)
┌────────────────────────────────────────────────────────────────┐
│ GITHUB API (vía Octokit) │
│ repos · issues · commits · pull requests │
└────────────────────────────────────────────────────────────────┘
¿Quién decide qué tool usar? No el usuario directamente: el LLM lee las descripciones de los tools (que expone tools/list) y elige cuál invocar y con qué parámetros. Por eso cada descripción está escrita para que el agente distinga cuándo usarla.
Tools disponibles
| Tool | Descripción | Parámetros |
|---|---|---|
create_repository |
Crea un repositorio | name*, description, isPrivate, autoInit |
create_issue |
Abre un issue | owner, repo, title*, body |
list_repositories |
Lista repos del usuario | perPage, page |
create_commit |
Crea/actualiza un archivo (commit) | owner, repo, path, message, content*, branch |
list_issues |
Lista issues de un repo | owner, repo, state, perPage |
close_issue |
Cierra un issue | owner, repo, issueNumber* |
create_pull_request |
Crea un PR entre ramas | owner, repo, title, head, base*, body |
list_commits |
Lista commits recientes | owner, repo, perPage |
* = requerido. Los schemas de Zod validan cada parámetro antes de llamar a la API (nombres de repos 3–100 chars alfanuméricos con guiones, issueNumber entero positivo, estado open|closed|all, etc.) y sus mensajes de error son comprensibles para el usuario final.
Requisitos
- Node.js 18+
- npm
- Una cuenta de GitHub
- Antigravity (para usarlo con el agente) o MCP Inspector (para debug)
Obtener el GitHub Token
-
Ve a GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic).
-
Generate new token (classic).
-
Da un nombre (ej.
mcp-agent), expiración, y marca los scopes:Scope Para qué sirve repoRepositorios, issues, commits, PRs userInformación del usuario autenticado admin:orgOperaciones sobre organizaciones -
Copia el token (empieza con
ghp_…). Solo se muestra una vez.
⚠️ Seguridad: el token NUNCA se sube al repositorio. Está en
.env(ignorado por.gitignore). Si se expone por error, revócalo de inmediato en GitHub.
Instalación
# 1. Instalar dependencias
npm install
# 2. Crear el archivo .env a partir del ejemplo
cp .env.example .env # (en Windows: copy .env.example .env)
# 3. Editar .env y pegar tu token
# GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxx
# 4. Compilar y verificar
npm run typecheck
npm test
npm run build
Configuración en Antigravity
Crea el archivo .mcp.json en la raíz del proyecto (este archivo está en .gitignore porque contiene credenciales):
{
"mcpServers": {
"shakatoti1618-agent": {
"command": "node",
"args": ["dist/index.js"],
"env": {
"GITHUB_TOKEN": "ghp_xxxxxxxxxxxxxxxx"
}
}
}
}
Requiere
npm run buildantes, o usa"command": "npx", "args": ["tsx", "src/index.ts"]para desarrollo. Eldist/se genera connpm run build.
Verificar que funciona (MCP Inspector)
npx @modelcontextprotocol/inspector node dist/index.js
Con el inspector puedes listar los tools (tools/list) y probar cada uno (tools/call) sin tocar el agente.
Ejemplos de prompts
| Objetivo | Prompt que funciona |
|---|---|
| Crear repo | "Crea un repositorio llamado mi-proyecto con una descripción breve y que sea privado." |
| Crear issue | "Abre un issue en shakatoti1618/mi-proyecto con el título Fix: no carga la página y una descripción." |
| Listar repos | "¿Qué repositorios tengo?" |
| Commit | "Agrega el archivo docs/README.md con el contenido # Documentación al repo shakatoti1618/mi-proyecto, con mensaje Agrega documentación." |
| Listar issues | "Muéstrame los issues abiertos de shakatoti1618/mi-proyecto." |
| Cerrar issue | "Cierra el issue número 3 de shakatoti1618/mi-proyecto." |
| Crear PR | "Crea un pull request de feature/login hacia main en shakatoti1618/mi-proyecto con título Implementa login." |
| Ver commits | "¿Cuáles son los últimos commits de shakatoti1618/mi-proyecto?" |
Nota: un prompt vago ("haz cosas con mi repo") confunde al LLM. Cuanto más específico sea (nombre exacto del repo, rama, mensaje), mejor resultado.
Estructura del proyecto
shakatoti1618-agent/
├── src/
│ ├── index.ts # Entry point: env, cliente, server, stdio
│ ├── server.ts # Instancia MCP + registro de handlers
│ ├── types.ts # Tipos de dominio compartidos
│ ├── schemas/schemas.ts # Schemas Zod (validación + descripciones)
│ ├── github/
│ │ ├── client.ts # Configuración del cliente Octokit
│ │ └── operations.ts # Operaciones de negocio sobre GitHub
│ ├── tools/
│ │ ├── definitions.ts # Tools que ve el LLM (name/description/schema)
│ │ └── handlers.ts # Dispatcher: valida, ejecuta, formatea
│ ├── errors/errors.ts # Custom errors + transformación + retry/backoff
│ └── utils/
│ ├── logger.ts # Logging estructurado (stderr, nunca stdout)
│ └── validators.ts # Reglas de GitHub compartidas
├── tests/ # Unit tests (Vitest + mocks)
├── .env.example # Plantilla sin valores reales
├── .gitignore
├── tsconfig.json
└── package.json
¿Por qué separar client.ts de operations.ts? No es solo organización: permite mockear el cliente de Octokit en los tests sin tocar la lógica de negocio. operations.ts recibe el cliente por constructor, así que en los tests se inyecta un objeto fake con vi.fn().
¿Por qué el logging usa console.error y nunca console.log? El server MCP se comunica por stdio: el host lee JSON-RPC de stdout. Cualquier console.log rompe el protocolo. Por eso todos los logs van a stderr.
Errores y troubleshooting
El server distingue 5 categorías de error y devuelve mensajes en lenguaje natural, nunca stack traces:
| Categoría | Origen | Ejemplo de mensaje al usuario |
|---|---|---|
VALIDATION |
Input inválido (Zod) | "El nombre del repositorio debe tener al menos 3 caracteres." |
AUTHENTICATION |
Token inválido / sin scope (401/403) | "Tu token no tiene permisos para esta operación." |
API |
GitHub respondió mal (404, 422, 500) | "El repositorio [x] no fue encontrado. Verifica el nombre e intenta de nuevo." |
RATE_LIMIT |
Límite de requests (429/403) | "Se alcanzó el límite de solicitudes a la API de GitHub. Espera e intenta de nuevo." |
NETWORK |
Sin conexión / timeout | "No se pudo conectar con GitHub. Verifica tu conexión." |
Rate limiting: los errores transitorios se reintentan con exponential backoff (3 intentos, espera creciente con jitter). No se reintenta nunca de forma inmediata, para no empeorar el problema, ni se reintentan errores definitivos (validación/autenticación).
Problemas frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
| El server no arranca: "No se encontró GITHUB_TOKEN" | .env no existe o vacío |
Copiar .env.example → .env y pegar el token |
403 en todas las operaciones |
Token sin el scope repo |
Regenerar el token marcando repo, user, admin:org |
401 Bad credentials |
Token inválido/revocado | Generar un token nuevo |
| El agente no responde o responde mal | El server quedó colgado o dist/ desactualizado |
npm run build y reiniciar el server en Antigravity |
| No se ve ningún tool | dist/index.js no existe |
npm run build |
| El protocolo se rompe (errores raros de parsing) | Algo escribió en stdout (un console.log accidental) |
Buscar y reemplazar por el logger |
429 repetidos |
Demasiadas llamadas en poco tiempo | Esperar o bajar la frecuencia; el server reintenta solo con backoff |
Testing
npm run test # corre todos los tests (Vitest)
npm run test:watch # modo watch
- 40 tests distribuidos en 4 archivos:
tests/schemas.test.ts— validación de inputs (válidos pasan, inválidos fallan con mensajes claros).tests/operations.test.ts— lógica de GitHub con Octokit mockeado (sin llamadas reales).tests/errors.test.ts— transformación 401/403/404/429 → mensajes y retry con backoff.tests/handlers.test.ts— dispatcher de tools (tool desconocido, inputs inválidos, errores).
- Los tests son deterministas: no dependen de la API real ni del estado externo.
Extras implementados
- +3 tools avanzados (extra credit):
close_issue,create_pull_request,list_commits. - Logging estructurado con niveles (
LOG_LEVEL=debug|info|warn|error) vía stderr. - Schemas derivados: el JSON Schema que ve el LLM se genera desde los schemas de Zod (
zod-to-json-schema), una sola fuente de verdad. - Retry con exponential backoff y jitter para rate limit/errores de red.
- Cierre limpio del server ante SIGINT/SIGTERM.
Desarrollado como Proyecto Integrador 5 · Henry · Especialización Backend.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。