github-assistant-mcp
GitHub Assistant MCP
Un pequeño servidor Model Context Protocol (MCP) autocontenido que expone cinco herramientas centradas en lectura a un asistente de codificación con IA (p. ej. OpenCode). Permite al asistente inspeccionar un espacio de trabajo local y obtener un perfil público de GitHub a través de un transporte stdio limpio y aislado.
"Un servidor MCP de GitHub simple para OpenCode."
Tabla de contenidos
Related MCP server: chatgpt-codex-local-mcp
Descripción general
El servidor es un servidor MCP local que OpenCode inicia como proceso hijo. Habla el protocolo MCP a través de stdio (stdin/stdout) y registra cinco herramientas. El asistente llama a esas herramientas; el servidor realiza el trabajo (lecturas del sistema de archivos, un git diff o una llamada a la API de GitHub) y devuelve resultados de texto estructurados.
Todo lo que toca el sistema de archivos está confinado a un único directorio WORKSPACE_ROOT, por lo que el asistente nunca puede leer ni escapar fuera de la carpeta del proyecto.
Cómo funciona (Arquitectura)
┌─────────────────────────┐ stdio (MCP/JSON-RPC) ┌──────────────────────────────┐
│ │ ───────────────────────────────▶ │ github-assistant (this) │
│ OpenCode / AI │ tool call: get_github_profile │ │
│ Assistant │ │ ┌────────────────────────┐ │
│ │ ◀─────────────────────────────── │ │ McpServer │ │
│ - sees 5 tools │ result (JSON text) │ │ (server.ts) │ │
│ - calls them │ │ └───────────┬────────────┘ │
│ - sandbox enforced │ │ │ registerTools │
└─────────────────────────┘ └──────────────┼──────────────┘
▼
┌────────────────────────────────┐
│ tools.ts (5 tool handlers) │
└───┬──────┬──────┬──────┬─────┬──┘
┌───────────────┘ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌─────────┐ ┌────────────┐
│ github.ts │ │ workspace.ts│ │ git.ts │ │ paths.ts │
│ GitHub API │ │ list/read/ │ │ git diff│ │ resolve │
│ (fetch) │ │ search │ │ │ │ sandbox │
└─────┬──────┘ └─────┬──────┘ └────┬────┘ └─────┬──────┘
│ │ │ │
▼ ▼ ▼ ▼
api.github.com WORKSPACE_ROOT/* git CLI config.ts
(files only) (cwd=root) WORKSPACE_ROOTFlujo de datos para una sola llamada a herramienta:
Assistant ──JSON-RPC request──▶ McpServer
│
▼
tool handler (tools.ts)
│ validates args with zod
▼
business logic (github / workspace / git / paths)
│ resolveWorkspacePath() enforces sandbox
▼
result helper (result.ts) → { content: [{ type:"text", text }] }
│
▼
Assistant ◀──JSON-RPC response── McpServerTransporte y ciclo de vida
Tipo:
local— OpenCode lanza el servidor como proceso hijo.Transporte:
stdiomedianteserveStdio()de@modelcontextprotocol/server/stdio.Secuencia de inicio:
Se ejecuta
node dist/server.js(declarado enopencode.json) concwd = ".".createServer()construye unMcpServerllamadogithub-assistant(v1.0.0).registerTools(server)conecta las cinco herramientas.serveStdio(createServer)comienza a leer mensajes JSON-RPC desde stdin y a escribir resultados en stdout.
Apagado: OpenCode termina el proceso cuando finaliza la sesión.
Debido a que el proceso hereda el directorio de trabajo de OpenCode, WORKSPACE_ROOT se resuelve al directorio del proyecto (path.resolve(process.cwd())).
Referencia de herramientas
Todas las herramientas están registradas en src/tools.ts y devuelven resultados de texto MCP (JSON o texto plano).
1. get_github_profile
Obtiene el perfil público de GitHub del usuario fijo (imshashwatsingh).
Entradas: ninguna
Backend:
fetch()ahttps://api.github.com/users/imshashwatsinghconAccept: application/vnd.github+jsony una cabeceraUser-Agent.Devuelve: nombre de usuario, nombre, empresa, ubicación, biografía, repositorios/gists públicos, seguidores, siguiendo, URL del perfil, marcas de tiempo de creación/actualización.
Archivo:
src/github.ts
2. list_files
Lista archivos bajo un directorio del espacio de trabajo hasta una profundidad.
Entradas:
path(por defecto"."),maxDepth(0–10, por defecto 3)Backend:
collectFiles()recursivo ensrc/workspace.ts— omite enlaces simbólicos (sin bucles) e ignora directorios configurados (node_modules,.git,dist,.next,coverage,.cache). Limitado aMAX_RESULTS(500).Devuelve: raíz del espacio de trabajo, número de archivos y rutas de archivo relativas.
Archivo:
src/workspace.ts
3. read_file
Lee un archivo de texto UTF-8 con rango de líneas opcional.
Entradas:
path(obligatorio),startLine(opcional),endLine(opcional)Backend:
readWorkspaceFile()— aplica el sandbox, rechaza no archivos, rechaza archivos mayores queMAX_FILE_SIZE(1 MB) y rechaza extensiones binarias. Devuelve líneas numeradas.Devuelve: contenido del archivo con prefijos
línea: texto.Archivo:
src/workspace.ts
4. search_context
Búsqueda de palabras clave en todo el espacio de trabajo con contexto circundante.
Entradas:
query(obligatorio),path(por defecto"."),maxResults(1–100, por defecto 50),contextLines(0–10, por defecto 2)Backend:
searchContext()recopila archivos, filtra solo texto y archivos con límite de tamaño, luego escanea cada línea (sin distinción de mayúsculas) y capturacontextLinesarriba/abajo de cada coincidencia.Devuelve: consulta, ruta de búsqueda, número de coincidencias y coincidencias con archivo/línea/contexto.
Archivo:
src/workspace.ts
5. summarize_diff
Inspecciona el diff de Git actual y devuelve un resumen estructurado.
Entradas:
staged(por defectofalse),base(referencia git opcional),path(archivo/directorio opcional),maxDiffChars(1000–200000, por defecto 50000)Backend:
summarizeDiff()ejecutagit diff --no-ext-diff --unified=3(con--cached/ referencia base / filtros de ruta) desdeWORKSPACE_ROOT. Las estadísticas se analizan del propio diff unificado (sin una segunda llamada agit). El diff se trunca si superamaxDiffChars.Devuelve: archivos modificados, inserciones, eliminaciones, estadísticas por archivo y el diff sin procesar — o
{ empty: true }cuando no hay cambios.Archivo:
src/git.ts
Modelo de seguridad
El servidor es intencionalmente de solo lectura y aislado:
Preocupación | Protección |
Travesía de rutas ( |
|
Lectura de archivos binarios |
|
Archivos demasiado grandes |
|
Bucles de enlaces simbólicos |
|
Explosión de directorios | Listado/búsqueda limitados a |
Escritura / eliminación / ejecución | Ninguna. El servidor no tiene herramientas de escritura, eliminación o ejecución arbitraria de shell. El único proceso generado es |
Red | Solo una llamada saliente: la API pública de GitHub de solo lectura para un usuario fijo. |
El límite del sandbox reside enteramente en
paths.ts. Cualquier nueva herramienta que toque el sistema de archivos debe enrutar las rutas a través deresolveWorkspacePath().
Recorrido por el proyecto
Punto de entrada —
src/server.tscreateServer()instanciaMcpServery llama aregisterTools().serveStdio()lo conecta a stdin/stdout.Registro de herramientas —
src/tools.tsCinco llamadas aserver.registerTool(...). Cada una declara una descripción, uninputSchemavalidado con zod y un manejador asíncrono. Los manejadores delegan en los módulos siguientes y envuelven la salida con los ayudantes deresult.ts.Configuración —
src/config.tsConstantes centrales:WORKSPACE_ROOT(resuelto desdeprocess.cwd()), límites de tamaño/resultados, nombre de usuario/URL de GitHub y conjuntos de ignorados/binarios.Seguridad de rutas —
src/paths.tsresolveWorkspacePath()es la puerta del sandbox.toWorkspaceRelative()convierte rutas absolutas de nuevo a cadenas relativas al espacio de trabajo para mostrar.isProbablyTextFile()clasifica archivos por extensión.E/S del espacio de trabajo —
src/workspace.tscollectFiles()(listado recursivo),readWorkspaceFile()(lectura segura) ysearchContext()(escaneo de palabras clave). Todos pasan porresolveWorkspacePath().GitHub —
src/github.tsfetchGitHubProfile()llama a la API pública y mapea elGitHubUsersin procesar a la forma más amigableGitHubProfile.Git —
src/git.tssummarizeDiff()construye y ejecuta el comandogit diff;parseDiffStats()deriva recuentos de inserciones/eliminaciones por archivo directamente del texto del diff.Resultados —
src/result.tsPequeños ayudantes (textResult,errorResult,errorWithContext) estandarizan el sobrecontentde MCP y el marcado de errores.
Configuración
opencode.json (raíz del proyecto) declara el servidor:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"github-assistant": {
"type": "local",
"command": ["node", "dist/server.js"],
"cwd": ".",
"enabled": true
}
}
}Dentro del servidor, el comportamiento se ajusta mediante constantes en src/config.ts:
Constante | Valor por defecto | Significado |
|
| Raíz del sandbox (directorio del proyecto) |
|
| Tamaño máximo de archivo legible |
|
| Máximo de archivos de listado/búsqueda |
|
| Objetivo del perfil |
|
| Omitidos al recorrer |
|
| Tratados como no textuales |
Compilación y ejecución
# install dependencies
npm install
# compile TypeScript -> dist/
npm run build
# start the server (used by opencode.json)
npm start
# run directly from source (no build step)
npm run dev
# the workspace must be a git repo for summarize_diff to work
git initOpenCode detecta el servidor automáticamente desde opencode.json una vez compilado (dist/server.js).
Estructura de archivos
github_assistant_mcp/
├── opencode.json # MCP server declaration for OpenCode
├── package.json # scripts + dependencies
├── tsconfig.json # TypeScript config
├── src/
│ ├── server.ts # Entry point: create + serve McpServer
│ ├── tools.ts # Registers the 5 tools + handlers
│ ├── config.ts # Constants, limits, GitHub target
│ ├── paths.ts # Sandbox path resolution + helpers
│ ├── workspace.ts # list / read / search filesystem
│ ├── github.ts # GitHub profile fetch
│ ├── git.ts # git diff summary + stat parsing
│ └── result.ts # MCP result/error helpers
└── dist/ # Compiled output (npm run build)Limitaciones
get_github_profileapunta a un único usuario fijo; no está parametrizado.summarize_diffinforma solo cambios en el árbol de trabajo — los archivos sin seguimiento no se muestran congit diff.Las herramientas del sistema de archivos están confinadas a
WORKSPACE_ROOT; no hay acceso entre proyectos.Todas las herramientas son de solo lectura por diseño — sin ediciones, eliminaciones ni ejecución de shell.
Sin autenticación: la llamada a GitHub usa la API pública no autenticada (limitada a 60 solicitudes/hora por IP).
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA read-only MCP server for AI coding agents to inspect repositories, audit code quality, route engineering skills, and plan safe issue/PR workflows.1MIT
- FlicenseAqualityCmaintenanceA secure MCP server that exposes local repository context to ChatGPT/Codex with read-only access, path validation, and no generic shell.17
- AlicenseNot gradedqualityAmaintenanceA read-only MCP server that provides AI agents with live, structured workspace awareness, including project listing, git status, and budgeted context packing, minimizing token usage.62MIT
- FlicenseBqualityCmaintenanceA read-only MCP server that exposes a local code workspace to AI clients via stdio, providing file browsing and text search capabilities with path safety rules.1
Related MCP Connectors
An MCP server that gives your AI access to the source code and docs of all public github repos
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/imshashwatsingh/github-assitant-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server