fsext-mcp-server-java
Fsext-MCP-Server(Java): Um servidor MCP completo e seguro para operações no sistema de arquivos local, com ferramentas integradas de processamento de imagem, OCR e mídia.
Documentação
FsExt-MCP-Server (Java)
Visão Geral
Um servidor Model Context Protocol (MCP) de alto desempenho e seguro, construído com Quarkus para operações locais de sistema de arquivos, equipado com processamento nativo de imagens, OCR Tesseract e ferramentas utilitárias de mídia. Totalmente compatível com a especificação oficial do MCP, entregando esquemas padronizados de requisição/resposta, I/O de streaming para arquivos grandes, implantação remota multi-transporte e fluxos robustos de busca e substituição de texto para integração com agentes LLM.
Recursos Principais
- Gerenciamento Completo de Arquivos e Diretórios: Suporta criação, exclusão, cópia, movimentação, inspeção de metadados e validação de existência de arquivos; cópia/movimentação recursiva de árvores de diretórios completas com proteções de segurança contra sobrescrita.
- Pipeline de Leitura e Escrita de Arquivos em Streaming: Carregamento completo de texto, streaming de texto segmentado linha por linha, I/O binário em blocos e lógica de sobrescrita/append de texto e binário projetada para evitar carregar arquivos grandes inteiros na memória heap da JVM.
- Busca Avançada e Substituição In-Place: Varredura recursiva de conteúdo em todo o diretório, correspondência contextual em múltiplos arquivos com linhas de contexto pré/pós configuráveis, suporte a expressões regulares, correspondência sem diferenciar maiúsculas/minúsculas e substituição atômica de texto in-place com estatísticas de contagem de correspondências.
- Kit de Ferramentas de Processamento Nativo de Imagens: Utilitários de imagem de alta velocidade alimentados por Tess4J, incluindo redimensionamento com proporção bloqueada e preenchimento de canvas, recorte retangular preciso e rotação arbitrária no sentido horário.
- Extração de Texto com OCR Tesseract: Reconhecimento confiável de texto em imagens rasterizadas, apoiado por binários locais do Tesseract. Sem implementações alternativas em WASM; configuração de caminho binário vazio não acionará mecanismos alternativos de OCR baseados em JS. Suporte a tessdata em múltiplos idiomas com diretórios de binários e de dados configuráveis.
- Validação Estrita de Entrada e Esquema de Resposta Unificado: Cada ferramenta aplica validação estrita de esquema JSON
additionalProperties: falsepara bloquear campos de entrada não reconhecidos e mitigar riscos de injeção. Todas as operações retornam um payload de sucesso/erro encapsulado e consistente para análise uniforme no lado do cliente. - Compatibilidade Multi-Transporte: Implementa todos os transportes padrão oficiais do MCP:
stdio: Integração nativa para clientes MCP desktop locais (Claude Desktop, Cursor, etc.)sse: Transporte legado leve de streaming de eventos remotoshttp: Transporte remoto bidirecional moderno Streamable HTTP
- Isolamento de Sandbox de Segurança do Workspace: A flag
--lock-rootrestringe todas as operações de sistema de arquivos exclusivamente à árvore de diretórios especificada, eliminando vulnerabilidades de escape de caminho e acesso não autorizado entre pastas. - Alocação Dinâmica de Porta: Detecta automaticamente a ocupação da porta padrão 8000 e aloca uma porta TCP livre acima de 1024 quando nenhum valor personalizado de
--porté fornecido. - Otimizações de Runtime Nativo Quarkus: Baixa latência de inicialização, pegada mínima de memória, suporte CORS integrado para implantações remotas HTTP/SSE e lógica de encerramento gracioso de conexão para sessões remotas de longa duração.
Início Rápido
Pré-requisitos
- Java 17+
- Gradle (wrapper incluído no repositório, sem necessidade de instalação global)
- Binário Tesseract (opcional, necessário apenas para as funções de ferramenta OCR)
1. Compilar o Uber Jar Executável
Use o wrapper Gradle incluído para compilar e empacotar um jar executável autocontido:
# Windows
./gradlew.bat clean buildRunJar
# macOS / Linux
./gradlew clean buildRunJar
Caminho do artefato de saída: build/fsext-mcp-server-<version>.jar
2. Iniciar o Servidor a partir do Jar Empacotado
Substitua <x.y.z> pela string da sua versão real de build.
# Default stdio mode, unrestricted full filesystem access
java -jar build/fsext-mcp-server-x.y.z.jar
# Secure locked workspace mode (recommended for production agent usage)
java -jar build/fsext-mcp-server-x.y.z.jar --lock-root /my/workspace
# Remote SSE streaming service
java -jar build/fsext-mcp-server-x.y.z.jar --transport sse --host 0.0.0.0 --port 8000 --lock-root /my/workspace
# Modern Streamable HTTP remote service
java -jar build/fsext-mcp-server-x.y.z.jar --transport http --host 127.0.0.1 --port 8080 --lock-root /my/workspace
3. Integrar com Clientes Desktop MCP (Claude Desktop / Cursor)
Exemplo de configuração JSON de cliente para integração local via transporte stdio:
{
"mcpServers": {
"fsext-java": {
"command": "java",
"args": [
"-jar",
"/absolute/path/to/fsext-mcp-server-x.y.z.jar",
"--lock-root",
"/my/workspace"
]
}
}
}
Configuração de Desenvolvimento Local do Repositório de Código-Fonte
# Clone official source repository
git clone https://github.com/kurtzhi/fsext-mcp-server-java
cd fsext-mcp-server-java
# Build full executable uber jar
./gradlew clean buildRunJar
Tabela de Referência de Parâmetros de Inicialização via CLI
| Parâmetro | Valor Padrão | Descrição |
|---|---|---|
--transport | stdio | Implementação de transporte MCP: stdio / sse / http |
--host | 127.0.0.1 | Endereço de bind de rede; completamente ignorado no transporte stdio |
--port | 8000 | Porta TCP de escuta do serviço. Se a porta padrão 8000 estiver ocupada e nenhuma porta personalizada for fornecida, seleciona automaticamente uma porta livre ≥1024; ignorado no transporte stdio |
--origin | * | Lista separada por vírgulas de origens CORS permitidas para transportes remotos HTTP/SSE |
--lock-root | Vazio | Restringe todas as operações de sistema de arquivos a este diretório raiz; acesso irrestrito ao SO se omitido |
Exemplos de Inicialização para Implantação em Produção
1. Modo Stdio Local (Clientes Desktop MCP)
java -jar build/fsext-mcp-server-x.y.z.jar --lock-root /my/workspace
2. Modo de Transporte SSE Remoto
java -jar build/fsext-mcp-server-x.y.z.jar --transport sse --host 0.0.0.0 --port 8000 --lock-root /my/workspace
Endpoints SSE
- Canal de assinatura de stream SSE de longa duração (push de eventos do servidor):
http://<host>:<port>/sse - Canal de envio de requisições de cliente JSON-RPC:
http://<host>:<port>/messages
Configuração de Conexão do MCP Inspector
- Tipo de Transporte: SSE
- Endereço de Conexão:
http://127.0.0.1:8000/sse
3. Transporte Remoto HTTP Streamable (Padrão Moderno Oficial)
java -jar build/fsext-mcp-server-x.y.z.jar --transport http --host 0.0.0.0 --port 8000 --lock-root /my/workspace
Endpoint Bidirecional Unificado
Ponto de entrada único compartilhado que lida com todas as requisições de clientes e tráfego de streaming do servidor:
http://<host>:<port>/mcp
Configuração de Conexão do MCP Inspector
- Tipo de Transporte: Streamable HTTP
- Endereço de Conexão:
http://127.0.0.1:8000/mcp
4. Comparação entre Transportes SSE e HTTP Streamable
| Recurso | Transporte SSE de Dois Endpoints | Transporte HTTP Streamable de Endpoint Único |
|---|---|---|
| Arquitetura de Endpoints | Dois endpoints separados: assinatura de stream GET + envio de mensagens POST | URL única unificada para tráfego bidirecional completo |
| Padrão de Comunicação | Apenas push unidirecional de eventos servidor-para-cliente | Comunicação híbrida bidirecional completa de requisição/stream |
| Confiabilidade da Conexão | Propenso a quedas de sessão, sincronização complexa de estado entre endpoints | Recuperação automática de sessão, otimizado para implantações remotas de alta concorrência |
| Status da Especificação | Implementação de compatibilidade legada; não recomendado para novas implantações | Padrão MCP oficial atual para todas as integrações remotas de rede |
Charsets de Arquivos de Texto Suportados
Todos os identificadores de charset não diferenciam maiúsculas/minúsculas; valores válidos para operações de leitura/escrita de texto:
utf-8/UTF_8iso-8859-1/ISO_8859_1utf-16/UTF_16utf-16be/UTF_16BEutf-16le/UTF_16LEascii/US_ASCII
Especificação Global de Resposta Unificada
Todas as ferramentas MCP compartilham uma estrutura JSON encapsulada de nível superior idêntica, tanto para execução bem-sucedida quanto para estados de falha em runtime. Os payloads de negócio de cada ferramenta são aninhados dentro do sub-objeto info sob o campo raiz res.
Definição do Esquema Principal
{
"res": {
"success": boolean,
"info": object
}
}
success: Flag global de status da operaçãotrue: A lógica da ferramenta foi concluída sem exceções;infocontém os dados de retorno específicos da ferramentafalse: A operação falhou (bloqueio de escape do workspace, arquivo ausente, erro de I/O, esquema de entrada inválido, permissão negada, etc.)
- Comportamento duplo de
info:- Estado de sucesso (
success: true): Payload personalizado estruturado, exclusivo de cada ferramenta - Estado de falha (
success: false): Objeto de erro padronizado com código de erro legível por máquina e explicação legível por humanos"info": { "code": "ERROR_CODE_IDENTIFIER", "message": "Detailed human-readable failure description" }
- Estado de sucesso (
Exemplos de Payloads de Resposta
1. Resposta de Listagem de Diretório Bem-Sucedida
{
"res": {
"success": true,
"info": {
"paths": [
"/workspace/demo/Main.java",
"/workspace/demo/util/FileTool.java"
]
}
}
}
2. Resposta de Falha por Bloqueio de Segurança de Escape do Workspace
{
"res": {
"success": false,
"info": {
"code": "WORKSPACE_ESCAPE_FORBIDDEN",
"message": "Access restricted: Path `/etc/passwd` is outside allowed workspace `/my/workspace`"
}
}
}
Referência Completa das Ferramentas MCP
Todos os esquemas de entrada de ferramentas aplicam validação estrita additionalProperties: false para rejeitar parâmetros não reconhecidos e mitigar vetores de ataque de injeção de caminho malicioso.
1. Ferramentas de Operação de Diretório
fs_list_directory
Varre o diretório alvo (superficial ou recursivo) e retorna caminhos absolutos de arquivos filtrados, com suporte a filtros de tipo e extensão. Parâmetros
source_dir(string, obrigatório): Diretório raiz para varredurarecursive(booleano, obrigatório): Habilita travessia recursiva completa de todos os subdiretóriosonly_files(booleano, obrigatório): Filtra os resultados para retornar apenas arquivos regulares, excluindo diretóriosfile_extension(string, opcional, padrão=""): Filtra a saída pela extensão de sufixo do arquivo alvo
fs_copy_directory
Copia recursivamente uma árvore de diretórios inteira com comportamento de sobrescrita configurável para diretórios de destino conflitantes. Parâmetros
source_dir(string, obrigatório): Caminho da árvore de diretórios de origemcopy_dest_dir(string, obrigatório): Caminho do diretório de saída alvooverwrite(booleano, opcional, padrão=false): Limpa e sobrescreve o conteúdo pré-existente do diretório de destino
fs_move_directory
Realoca atomicamente uma árvore de diretórios inteira para um novo caminho alvo. Falha imediatamente se o destino existir, a menos que a sobrescrita esteja explicitamente habilitada, para evitar perda acidental de dados. Parâmetros
source_dir(string, obrigatório): Caminho do diretório de origemdest_dir(string, obrigatório): Caminho do diretório de destinooverwrite(booleano, opcional, padrão=false): Permite sobrescrever diretórios de destino conflitantes
2. Ferramentas Básicas de Operação de Arquivo Único
fs_create_file
Cria um novo arquivo de texto, gera automaticamente diretórios pai ausentes, com conteúdo de texto inicial e codificação de charset configuráveis. Parâmetros
file_path(string, obrigatório): Caminho absoluto do arquivo alvocontent(string, opcional, padrão=""): Conteúdo de texto inicial a ser gravado no novo arquivocharset(string, opcional, padrão="utf-8"): Identificador de charset suportado (veja a lista de charsets acima)
fs_delete_file
Exclui permanentemente apenas um único arquivo regular; rejeita entradas de caminho de diretório para bloquear riscos de exclusão recursiva em massa. Parâmetros
file_path(string, obrigatório): Caminho absoluto do arquivo regular alvo
fs_copy_file
Copia um único arquivo preservando os metadados originais do sistema de arquivos, com sobrescrita configurável para arquivos alvo conflitantes. Parâmetros
source_file_path(string, obrigatório): Caminho absoluto do arquivo de origemdest_file_path(string, obrigatório): Caminho absoluto do arquivo de saída alvooverwrite(booleano, opcional, padrão=false): Sobrescreve o arquivo de destino pré-existente
fs_move_file
Move atomicamente um único arquivo para um novo caminho absoluto, com lógica de sobrescrita configurável para arquivos de destino conflitantes. Parâmetros
source_file_path(string, obrigatório): Caminho absoluto do arquivo de origemdest_file_path(string, obrigatório): Caminho absoluto do arquivo de destinooverwrite(booleano, opcional, padrão=false): Permite sobrescrever arquivos de destino conflitantes
fs_get_file_info
Recupera metadados completos de arquivos ou diretórios, com cálculo opcional de digest criptográfico SHA-256 para validação de integridade. Parâmetros
file_path(string, obrigatório): Caminho absoluto da entrada do sistema de arquivos alvocalc_digest(booleano, opcional, padrão=false): Calcula o hash SHA-256 do conteúdo do arquivo
fs_is_file_exists
Verificação leve de existência para qualquer entrada do sistema de arquivos (arquivo ou diretório) sem carregar metadados completos. Parâmetros
file_path(string, obrigatório): Caminho absoluto para verificar a existência
3. Ferramentas de Leitura e Escrita de Arquivos
fs_read_full_text
Lê o conteúdo de texto completo de um arquivo alvo com codificação de texto especificada pelo usuário. Parâmetros
file_path(string, obrigatório): Caminho absoluto do arquivo de texto alvocharset(string, opcional, padrão="utf-8"): Identificador de charset suportado
fs_read_text_range
Streaming de texto segmentado por linhas, otimizado para arquivos grandes; pula linhas iniciais e limita o total de linhas lidas para evitar alocação excessiva de heap. Parâmetros
file_path(string, obrigatório): Caminho absoluto do arquivo de texto alvolines_to_skip(inteiro, obrigatório, min=0): Número de linhas iniciais a pular durante a leituramax_lines_to_read(inteiro, obrigatório, min=0): Número máximo total de linhas a extrair do arquivoline_separator(string, opcional, padrão="\n"): Caractere delimitador de quebra de linhacharset(string, opcional, padrão="utf-8"): Identificador de charset suportado
fs_read_binary_chunk
Leitura em streaming por blocos para arquivos binários; retorna cargas úteis de bytes codificadas em Base64 para transmissão segura via rede JSON-RPC, com detecção de marcador de fim de fluxo. Parâmetros
file_path(string, obrigatório): Caminho absoluto do arquivo binário alvobytes_to_skip(inteiro, obrigatório, min=0): Deslocamento inicial em bytes a pular antes de ler o blocomax_bytes_to_read(inteiro, obrigatório, min=0): Comprimento máximo em bytes a ler em um único bloco
fs_write_text
Grava conteúdo de texto codificado no arquivo alvo, com suporte a sobrescrita completa ou modo de gravação somente anexação. Parâmetros
file_path(string, obrigatório): Caminho absoluto do arquivo de saída alvotext(string, obrigatório, minLength=1): Conteúdo de texto bruto a persistirappend(booleano, opcional, padrão=false): Alternância de modo de anexação (false = sobrescrita completa do arquivo)charset(string, opcional, padrão="utf-8"): Identificador de charset suportado
fs_write_binary
Decodifica carga útil binária em Base64 e grava bytes brutos no arquivo alvo; suporta modo de anexação para fluxos de upload binário em múltiplos blocos. Parâmetros
file_path(string, obrigatório): Caminho absoluto do arquivo de saída alvobase64_data(string, obrigatório, minLength=1): Carga útil de bytes binários brutos codificada em Base64append(booleano, opcional, padrão=false): Anexar dados binários ao final do arquivo (false = sobrescrita completa)
4. Ferramentas de Busca de Conteúdo e Substituição no Local
fs_search_files_by_content
Escaneia recursivamente árvores de diretórios e retorna caminhos absolutos de todos os arquivos contendo padrões de texto correspondentes; suporta regex, insensibilidade a maiúsculas/minúsculas e filtragem por extensão de arquivo. Parâmetros
dir_path(string, obrigatório): Diretório raiz para escaneamento recursivo de conteúdorecursive(booleano, obrigatório): Habilitar recursão completa em subdiretóriossearch_term(string, obrigatório): Palavra-chave de texto simples ou padrão de expressão regularis_regex(booleano, opcional, padrão=false): Tratar search_term como padrão regexignore_case(booleano, opcional, padrão=true): Alternância de correspondência insensível a maiúsculas/minúsculasfile_extension(string, opcional, padrão=""): Filtrar arquivos escaneados por sufixo de extensãocharset(string, opcional, padrão="utf-8"): Charset usado para analisar arquivos alvo
fs_search_in_files_by_content
Correspondência de conteúdo em massa em múltiplos diretórios, retorna resultados estruturados com linhas de contexto pré/pós configuráveis ao redor do conteúdo correspondente, além de limites rígidos globais de contagem de resultados. Parâmetros
dir_path(string, obrigatório): Caminho absoluto do diretório raiz de escaneamentorecursive(booleano, obrigatório): Habilitar travessia recursiva completa de subdiretóriossearch_term(string, obrigatório): Palavra-chave de busca ou padrão regexlimit(inteiro, obrigatório): Limite máximo rígido no total de entradas correspondentes retornadasis_regex(booleano, opcional, padrão=false): Habilitar lógica de correspondência com expressões regularesignore_case(booleano, opcional, padrão=true): Desabilitar correspondência sensível a maiúsculas/minúsculaslines_before(inteiro, opcional, padrão=0): Número de linhas de contexto antes de cada linha correspondentelines_after(inteiro, opcional, padrão=0): Número de linhas de contexto após cada linha correspondentefile_extension(string, opcional, padrão=""): Filtrar arquivos escaneados por sufixo de extensãocharset(string, opcional, padrão="utf-8"): Charset usado para analisar arquivos alvo
fs_search_in_file_by_content
Busca de conteúdo de precisão em arquivo único, retorna segmentos correspondentes estruturados com linhas de contexto pré/pós configuráveis para fluxos de inspeção de código e documentos. Parâmetros
file_path(string, obrigatório): Caminho absoluto do arquivo único alvosearch_term(string, obrigatório): Palavra-chave de busca ou padrão regexis_regex(booleano, opcional, padrão=false): Habilitar lógica de correspondência com expressões regularesignore_case(booleano, opcional, padrão=true): Alternância de correspondência insensível a maiúsculas/minúsculaslines_before(inteiro, opcional, padrão=0): Linhas de contexto anteriores para cada correspondêncialines_after(inteiro, opcional, padrão=0): Linhas de contexto posteriores para cada correspondênciacharset(string, opcional, padrão="utf-8"): Charset usado para analisar o arquivo alvo
fs_file_replace
Executa substituição global de texto no local dentro de um único arquivo alvo; retorna a contagem total de segmentos de texto correspondentes e substituídos após a conclusão da operação de gravação. Parâmetros
file_path(string, obrigatório): Caminho absoluto do arquivo editável alvosearch_term(string, obrigatório): Substring de texto a localizar e substituirreplacement(string, obrigatório): Nova carga útil de texto de substituiçãoline_separator(string, opcional, padrão="\n"): Delimitador de quebra de linha para análise do arquivo
5. Ferramentas de Processamento de Imagem
fs_image_resize
Redimensiona a imagem de origem para dimensões de pixel especificadas, com preservação nativa da proporção e preenchimento transparente do canvas para preencher exatamente as dimensões de resolução alvo. Parâmetros
source_path(string, obrigatório): Caminho absoluto da imagem de entrada de origemdest_path(string, obrigatório): Caminho absoluto da imagem de saída redimensionadawidth(inteiro, obrigatório, >0): Dimensão de largura em pixels alvoheight(inteiro, obrigatório, >0): Dimensão de altura em pixels alvokeep_aspect_ratio(booleano, opcional, padrão=true): Bloquear proporção original da imagem durante o redimensionamentopad_to_target(booleano, opcional, padrão=true): Adicionar preenchimento transparente para preencher exatamente largura/altura alvo quando a proporção estiver bloqueada
fs_image_crop
Extrai uma região retangular de pixels da imagem de origem e exporta como arquivo de imagem de saída independente. Parâmetros
source_path(string, obrigatório): Caminho absoluto da imagem de entrada de origemdest_path(string, obrigatório): Caminho absoluto da imagem de saída recortadax(inteiro, obrigatório, ≥0): Coordenada de pixel esquerda da origem da região de recortey(inteiro, obrigatório, ≥0): Coordenada de pixel superior da origem da região de recortewidth(inteiro, obrigatório, >0): Largura em pixels da região retangular recortadaheight(inteiro, obrigatório, >0): Altura em pixels da região retangular recortada
fs_image_rotate
Rotaciona a imagem de origem no sentido horário por valores arbitrários de graus em ponto flutuante; expande automaticamente as dimensões do canvas de saída para reter todo o conteúdo da imagem sem cortar bordas. Parâmetros
source_path(string, obrigatório): Caminho absoluto da imagem de entrada de origemdest_path(string, obrigatório): Caminho absoluto da imagem de saída rotacionadadegrees(número, obrigatório): Ângulo de rotação no sentido horário em graus
6. Ferramenta de Extração de Texto OCR
fs_ocr_extract_text
Extrai texto legível por humanos de arquivos de imagem raster via instalação local do binário Tesseract OCR. Não existe implementação de fallback em JavaScript WASM; tesseract_bin_path vazio não inicializará mecanismos alternativos de OCR baseados na web.
Parâmetros
image_path(string, obrigatório): Caminho absoluto da imagem de entrada para reconhecimento de textotesseract_bin_path(string, opcional, padrão=""): Caminho absoluto para o binário executável local do Tesseract; valor vazio usa apenas a busca no PATH do sistematessdata_path(string, opcional, padrão=""): Caminho absoluto do diretório contendo arquivos de dados de treinamento de idioma do Tesseractlang(string, opcional, padrão="eng"): Prefixo do código de idioma correspondente aos arquivos de treinamento tessdata disponíveis
Dependências de Runtime Principais
io.quarkus:quarkus-bom:3.37.1: BOM de alinhamento de versão Quarkusio.quarkus:quarkus-arc: Contêiner de injeção de dependência CDI Quarkusio.quarkus:quarkus-reactive-routes: Núcleo de roteamento HTTP reativoio.quarkiverse.mcp:quarkus-mcp-server-http:1.13.1: Implementação de transporte MCP HTTP & SSE streamableio.quarkiverse.mcp:quarkus-mcp-server-stdio:1.13.1: Implementação de transporte MCP Stdionet.sourceforge.tess4j:tess4j:5.18.0: Biblioteca de ligação Java Tesseract OCR
Tarefas Gradle de Build e Desenvolvimento do Projeto
# Clean all compiled build artifacts and temporary directories
./gradlew clean
# Full clean + compile + package self-contained uber jar
./gradlew clean buildRunJar
Licença
Este projeto é de código aberto sob a Apache License 2.0. Consulte o arquivo LICENSE no nível raiz para os termos e condições legais completos da licença.
Avisos de Software de Terceiros
Este software inclui múltiplas bibliotecas de dependência de código aberto. Todos os componentes de terceiros mantêm seus detentores de direitos autorais originais e seus respectivos acordos de licença de código aberto.
Um detalhamento completo de todas as bibliotecas de terceiros, versões e licenças está disponível no arquivo THIRD-PARTY-NOTICES no nível raiz e empacotado dentro do artefato JAR em /META-INF/THIRD-PARTY-NOTICES.
Repositório e Rastreamento de Problemas
- Repositório de Origem no GitHub: https://github.com/kurtzhi/fsext-mcp-server-java
- Relatórios de Bugs e Solicitações de Recursos: https://github.com/kurtzhi/fsext-mcp-server-java/issues