Gumi-MCP
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
Gumi-MCP
Servidor MCP de consulta ao workspace, com política de leitura de código e documentação.
server.py e tunnel_server.py oferecem leitura. A entrada opcional
desktop_tunnel.py agrega o Desktop-Gumi e inclui execução/escrita autorizadas.
A política de arquivos do leitor não restringe o shell. Consulte
PERFIS_E_RECUPERACAO.md para identificar a entrada,
os limites e as verificações de recuperação.
O problema
Conectar um agente de IA ao seu repositório parece simples: aponte um servidor de filesystem para a pasta e pronto. Só que um projeto pessoal raramente é só código. Ao lado dele moram dados de uso, exports, mídia, bancos locais — e leitura via MCP sai da sua máquina.
Este servidor nasceu de um projeto pessoal de IA, e a primeira medição foi desconfortável:
Dos 8.970 arquivos do workspace, 8.034 eram dados pessoais e apenas 936 eram código. O servidor entregava os 8.970.
O Gumi-MCP existe para resolver isso: o agente enxerga o código, e só o código.
Related MCP server: repo-inspector-mcp
Como resolve
Uma política, três camadas, um caminho só. Nenhuma tool manipula Path por conta
própria — todas passam por security.py:
resolver() o caminho está dentro da raiz? (resolve symlinks e `..` antes)
↓
esta_ignorado() é pasta gerada? (.git, .venv, node_modules…)
↓
motivo_privacidade() é zona de dados? (pasta — data, backups, temp… — ou padrão de
nome: .env, *.local.*, *.db, *.jsonl, *.jks, *-wal…)
↓
extensao_legivel() é formato de texto conhecido? (allowlist, não denylist)Duas decisões que valem explicar:
Indexar não é servir. Um .png entra no índice porque o metadado é útil; o
conteúdo nunca é lido. Já um caminho dentro de uma pasta privada não entra nem como
metadado — o nome de um arquivo de dados já é um dado.
O que é bloqueado continua aparecendo, marcado como bloqueado: "privado".
Esconder criaria um mapa mentiroso do repositório; o que não pode é o conteúdo sair.
O que o agente ganha
Cursor sem perda |
|
Verificação de integridade |
|
Índice que não mente | Watcher em tempo real e scanner de reconciliação periódico — o mesmo par que o Wazuh usa, porque watcher sozinho perde o que acontece enquanto o servidor está desligado. |
Busca com contexto | FTS5 com BM25 devolvendo |
O índice não é palavra final | Toda linha do índice volta a passar pela política na hora da consulta, como o Azure AI Search faz com ACL: retrato envelhece, permissão indexada envelhece junto. 0,42 ms por linha. |
Reconciliação em setores | A varredura anuncia cada projeto assim que ele fica pronto, e a busca espera só o setor que ela cruza — o mesmo desenho do |
Erros que ensinam |
|
Proveniência | Todo JSON carrega |
19 tools, 2 resources, 3 prompts. Todas com readOnlyHint e openWorldHint=false.
Duas delas — search e fetch — são apelidos para o Deep Research (ver abaixo):
não abrem caminho novo, chamam a mesma busca e a mesma leitura das outras.
Verificação
320 testes · 101 ataques adversariais bloqueados · 10 usos legítimos intactosAlvo marcado com * é prova fraca. Um caminho que não existe sob a raiz servida
volta como erro de qualquer jeito — bloqueio de verdade, mas sem a política ter sido
consultada. O relatório separa os dois desde 18/09/2026, porque um número que soma as
duas coisas afirma mais do que mediu.
E o arnês precisa medir a raiz certa. Medido em 18/09/2026 (lote O4): sem env=,
o SDK do MCP entrega ao servidor-filho apenas doze variáveis de sistema — nenhuma
GUMI_MCP_*. O filho subia na raiz padrão enquanto o relatório dizia estar testando
outra, e o * de prova fraca, calculado no processo pai, saía trocado. Agora o arnês
passa as GUMI_MCP_* adiante e pergunta ao próprio servidor que raiz ele serve,
em vez de acreditar na variável que ele mesmo enxerga.
Além dos testes de unidade, tests/verificacao_adversarial.py sobe o servidor de
verdade contra um workspace de verdade e tenta arrancar dados por todo caminho que
consegui imaginar: .., caminho absoluto, maiúsculas (DATA/), barra dupla, . no
meio, .. interno, leitura por trecho, por metadado, pelo índice, e pela busca. Mais
sete formas de envenenar argumentos e seis de hostilidade que o servidor precisa
digerir sem travar (cursor de outra instância, limites de 999.999).
Segurança que quebra a ferramenta não serve — por isso a suíte também exige que o uso legítimo continue de pé.
Instalação
git clone https://github.com/igv8101/gumi-mcp
cd gumi-mcp
python -m venv .venv && .venv/Scripts/activate # Linux/macOS: source .venv/bin/activate
pip install -r requirements.txtDefina a raiz a servir. Sem ela o servidor serve apenas a própria pasta — de propósito: melhor servir de menos do que servir demais em silêncio.
GUMI_MCP_ROOT=/caminho/do/seu/projetoSe a raiz for a pasta que guarda vários projetos, "estar dentro da raiz" deixa de ser resposta suficiente: ao lado do que pode ser servido passa a morar o que não pode de jeito nenhum. Para esse caso existe uma lista branca de primeiro nível — o que não estiver nela fica de fora, inclusive projeto novo que apareça depois:
GUMI_MCP_PROJETOS=Projeto-A,Projeto-BVazia (o padrão), a regra fica desligada. Ligada, ela vale para leitura,
índice e busca; o que ficou de fora continua aparecendo nas listagens,
marcado bloqueado: "fora-do-escopo" — esconder criaria um mapa mentiroso.
A lista é de projetos, e projeto é pasta. Arquivo solto na raiz (um
CLAUDE.md, um relatório que alguma automação grava ali) é servido sem
precisar entrar nela: ele nunca foi um projeto não autorizado, só caía fora
por a comparação ser pelo primeiro pedaço do caminho. Isso não afrouxa mais
nada — privacidade, extensão liberada e o sniff de binário continuam por
cima, e conteúdo de pasta não autorizada segue barrado.
Conectar a um cliente
scripts/integrar_ia.py registra o Gumi-MCP e o Desktop-Gumi com orquestração
no Claude Desktop e no Codex (app e CLI), com backup, releitura e --conferir.
Veja INTEGRACAO_IA.md para os provedores, credenciais e limites.
O script anterior conectar_clientes.py é legado e não instala a orquestração.
Também é possível configurar somente a leitura com comando+args:
{
"mcpServers": {
"gumi-workspace": {
"command": "/caminho/gumi-mcp/.venv/Scripts/python.exe",
"args": ["/caminho/gumi-mcp/server.py"],
"env": { "GUMI_MCP_ROOT": "/caminho/do/seu/projeto" }
}
}
}ChatGPT tem conexão separada: endpoint HTTPS autenticado ou Secure MCP Tunnel. O túnel pode conectar o servidor privado sem abrir uma porta pública. A associação depende das credenciais e da disponibilidade na conta.
Revisão 2.8.0
Varreduras incompletas preservam a baseline; o índice de texto remove conteúdo
que virou binário; históricos voltam a passar pela política ao serem consultados.
Linhas muito longas são divididas por next_line e next_column (reenvie como
start_line e start_column). A saúde informa espaço SQLite alocado/reutilizável,
e a trilha de auditoria coordena escrita e rotação entre processos.
Validação desta revisão: 382 testes aprovados, mais inicialização e chamadas reais por stdio dos dois servidores. As APIs pagas foram simuladas, sem consumo. Detalhes e limitações em REVISAO_2026-09-22.md.
Deep Research: os apelidos search e fetch
Em Developer Mode o ChatGPT chama qualquer tool pelo nome que ela tiver. O Deep
Research não: ele procura duas tools chamadas exatamente search e fetch, com
forma de resposta fixa — search(query) devolve {"results": [{id, title, url}]} e
fetch(id) devolve {id, title, text, url, metadata}, como structuredContent e
como JSON no content.
As duas existem aqui como apelido, não como caminho novo: search chama o mesmo
miolo de search_project e fetch passa pelo mesmo portão de read_file. Tudo que
uma bloqueia, a outra bloqueia — com a mesma frase, e há teste exigindo isso. A
verificação adversarial espelha no fetch toda tentativa feita contra o read_file.
Duas escolhas que valem saber:
A URL de citação é
gumi://workspace/arquivo/<caminho>, nuncafile://. Caminho absoluto carrega o nome de usuário e o desenho das pastas da máquina, e a citação é justamente o que sai dela.Documento acima do teto de resposta sai cortado, dizendo que foi (
metadata.truncado,bytes_totais,bytes_servidos). O contrato do Deep Research não tem paginação; recusar o fim do documento perderia também o começo. Quem precisa do resto usaread_file_excerpt.
Quem puder escolher a ferramenta, prefira search_project: ela devolve também linha,
trecho e paginação.
Ajustar a política ao seu projeto
Os padrões são conservadores. Para acrescentar as pastas do seu projeto sem
versioná-las, crie um privado.local.json (já ignorado pelo git):
{ "diretorios": ["minha_pasta_de_dados"], "prefixos": ["_rascunho"] }Ele soma aos padrões de config.py — nunca afrouxa. A única exceção é a
chave "projetos", que alimenta a lista branca acima: como lista branca
autoriza em vez de bloquear, acrescentar um nome ali abre aquele projeto.
Está no mesmo arquivo porque é ele que descreve a máquina de quem usa, e não
vai para o git.
Configuração
Variável | Padrão | O que faz |
| a própria pasta | raiz servida |
| vazio (sem restrição) | lista branca de projetos de primeiro nível, separados por vírgula |
|
| índice SQLite |
|
| log e trilha de auditoria |
|
| intervalo do scanner de reconciliação |
|
| rótulo de quem subiu este processo; vai em cada linha da trilha |
O servidor escreve apenas no próprio banco e nos próprios logs. Nada no workspace é criado, alterado, movido ou executado — nunca.
Quem leu o quê
A trilha (logs/auditoria.jsonl) guarda uma linha JSON por chamada: quando, de
onde (origem), qual tool, quais argumentos, quantos bytes saíram (bytes_resposta)
e se foi negada. Nunca o conteúdo servido — só o tamanho dele.
origem vem de GUMI_MCP_ORIGEM e é declarada por quem sobe o processo: o servidor
fala stdio, então cada cliente sobe o seu. É o que permite responder "o que o GPT leu
do meu computador?" com um arquivo em vez de uma lembrança —
get_audit_trail(origem="gpt") devolve só as leituras daquele lado.
Duas honestidades sobre ela. É declarada, não provada: separa clientes que se
identificam, e não é defesa contra um cliente que minta. E não autoriza nada — a
política de security.py não olha para a origem, e tem teste prendendo isso, porque no
dia em que a origem virasse permissão, mentir nela viraria ataque. Quem não se declara
entra como desconhecida; carimbar claude por padrão seria inventar procedência.
Notas de implementação
Três coisas que só apareceram construindo, e que valem para qualquer servidor MCP:
Em stdio, stdout pertence ao protocolo. Um print() de debug derruba a conexão
JSON-RPC. Todo log aqui vai para arquivo ou stderr.
Só ToolError chega ao cliente. Qualquer outra exceção vira
"Error executing tool X" genérico, e o modelo fica sem saber se errou o caminho, se
o arquivo é grande demais ou se foi bloqueado.
Watcher em tempo real não basta. Se o servidor sobe e desce a cada consulta, ele não vê nada nos intervalos — e o scanner da subida grava depois que a primeira resposta foi montada, o que faz a percepção chegar com uma consulta de atraso. A correção é perguntar duas vezes na mesma sessão, usando o cursor da primeira.
Licença
MIT — veja LICENSE.
Related MCP Connectors
Read-only AI coding tools for change verification, release readiness, capacity, and guidance.
Code intelligence platform for AI agents. 20 tools for architecture, security & impact analysis.
Repository evidence for agents before they adopt dependencies, enter codebases, compare, or merge.
Your coding agent asks the business logic of your repository and checks commits before they land
Related MCP Servers
- FlicenseBqualityDmaintenanceProvides LLMs with safe, read-only access to local codebases for searching, reading files, and finding function definitions. All source code remains local, ensuring privacy while enabling AI assistants to explore project structures and functionality.4-
- AlicenseAqualityCmaintenanceEnables AI clients to securely inspect local source repositories with read-only tools for listing files, reading files, and searching text, while enforcing path traversal protection and sensitive-file filtering.3MIT
- AlicenseNot gradedqualityAmaintenanceEnables language models to explore and analyze source code repositories through read-only tools for listing directories, reading files, searching code, finding symbols, and inspecting git history, with strict sandboxing and security controls.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI coding assistants to inspect local and remote repositories through sandboxed tools that surface project overviews, structure, dependency audits, Git churn hotspots, and a heuristic health score. It also supports safe GitHub issue searching and creation with built-in duplicate preflight checks, while blocking sensitive files, binary content, and path traversal attacks.22 npmMIT