Java Filesystem & Web MCP Server
An MCP server for LLM agents to perform filesystem operations and access web resources.
Java Filesystem & Web MCP Server
This project implements a Model Context Protocol (MCP) server that provides filesystem operations and web access tools for Large Language Model (LLM) agents. It enables AI assistants to interact with both the local filesystem and web resources through a set of well-defined operations.
Features
The server provides the following operations:
Filesystem Operations
- Reading Files: Read the complete contents of a file with proper encoding detection
- Writing Files: Create or overwrite files with new content
- Editing Files: Make line-based edits with git-style diff generation
- Searching Files: Recursively search for files and directories using glob patterns
- Listing Directories: Get detailed listings of directory contents
- Directory Creation: Create directories and nested directory structures
- Grep Files: Search for text patterns within files with line numbers and context, similar to Unix grep command
- Bash Command: Execute bash commands in the system shell and capture their output
Web Operations
- Web Page Fetching: Retrieve content from web pages with configurable timeouts
- HTML Content Extraction: Extract text content from HTML documents
These operations are exposed as tools for Large Language Models using the Model Context Protocol (MCP), allowing AI systems to safely interact with the filesystem and access web resources.
Example of the MCP Java tool with DevoxxGenie
Getting Started
Prerequisites
- Java 17 or higher
- Maven 3.6+
- Spring Boot 3.3.6
- Spring AI MCP Server components
Building the Project
Build the project using Maven:
mvn clean package
Running the Server
The server supports two transport modes:
SSE Mode (HTTP-based, default)
Run the server for SSE-based communication:
java -jar target/devoxx-filesystem-0.0.1-SNAPSHOT.jar
This starts an HTTP server on port 8081 with the SSE endpoint at /sse.
STDIO Mode (for MCP clients like Claude Desktop or DevoxxGenie)
For STDIO-based communication (required by most MCP clients):
java -Dspring.ai.mcp.server.stdio=true \
-Dspring.main.web-application-type=none \
-Dspring.main.banner-mode=off \
-Dlogging.pattern.console= \
-jar target/devoxx-filesystem-0.0.1-SNAPSHOT.jar
Important flags for STDIO mode:
-Dspring.ai.mcp.server.stdio=true- Enables STDIO transport-Dspring.main.web-application-type=none- Disables the web server-Dspring.main.banner-mode=off- Disables Spring Boot banner (required to avoid corrupting JSON-RPC communication)-Dlogging.pattern.console=- Disables console logging
Tool Services
Filesystem Tools
ReadFileService
readFile(String fullPathFile)
Reads the complete contents of a file from the file system. Handles various text encodings and provides detailed error messages if the file cannot be read.
WriteFileService
writeFile(String path, String content)
Creates a new file or completely overwrites an existing file with new content. Creates parent directories if they don't exist.
EditFileService
editFile(String path, String edits, Boolean dryRun)
Makes line-based edits to a text file. Each edit replaces exact line sequences with new content. Returns a git-style diff showing the changes made. The dryRun parameter allows viewing changes without applying them.
SearchFilesService
searchFiles(String path, String pattern)
Recursively searches for files and directories matching a pattern. Searches through all subdirectories from the starting path. The search is case-insensitive and matches partial names.
ListDirectoryService
listDirectory(String path)
Gets a detailed listing of all files and directories in a specified path. Results clearly distinguish between files and directories with additional metadata.
GrepFilesService
grepFiles(String directory, String pattern, String fileExtension, Boolean useRegex, Integer contextLines, Integer maxResults, Boolean ignoreCase)
Searches for text patterns within files. Returns matching files with line numbers and context. Similar to the Unix 'grep' command but with additional features for context display. Supports regex patterns, case-insensitive search, and context lines before/after matches.
CreateDirectoryService
createDirectory(List<String> directories)
Creates new directories or ensures that directories exist. Can create multiple directories in one operation. If a directory already exists, the operation succeeds silently. Perfect for setting up directory structures for projects or ensuring required paths exist.
BashService
executeBash(String command, String workingDirectory, Integer timeoutSeconds)
Execute a Bash command in the system shell and return the output. This tool allows running system commands and capturing their standard output and error streams. Use with caution as some commands may have system-wide effects.
Web Tools
FetchWebpageService
fetchWebpage(String url, Integer timeoutMs)
Fetches or reads a webpage from a URL and returns its content. The service uses jsoup to connect to the webpage and retrieve its content. The optional timeoutMs parameter allows setting a custom connection timeout.
Testing
Running Unit Tests
A comprehensive set of unit tests is provided for all service classes. Run them using:
mvn test
The tests use JUnit 5 and Mockito for mocking external dependencies like the jsoup library for web requests.
Running Integration Tests
Integration tests verify the STDIO transport by spawning the server as a subprocess. First build the JAR, then run integration tests:
mvn package -DskipTests
mvn test -Pintegration-tests
Test Clients
Test clients are provided to demonstrate MCP protocol usage:
ClientStdio.java- Demonstrates STDIO transport communicationClientSse.java- Demonstrates SSE transport communication
Configuration
The application is configured via application.properties:
spring.main.web-application-type=none
spring.main.banner-mode=off
logging.pattern.console=
spring.ai.mcp.server.name=filesystem-server
spring.ai.mcp.server.version=0.0.1
logging.file.name=,/JavaFileSystemMCP/target/filesystem-server.log
Project Structure
JavaFileSystemMCP/
src/
main/
java/
com/
devoxx/
mcp/
filesystem/
tools/
EditFileService.java
ReadFileService.java
WriteFileService.java
SearchFilesService.java
FetchWebpageService.java
ListDirectoryService.java
CreateDirectoryService.java
GrepFilesService.java
BashService.java
McpServerApplication.java
resources/
application.properties
test/
java/
com/
devoxx/
mcp/
filesystem/
tools/
ReadFileServiceTest.java
WriteFileServiceTest.java
EditFileServiceTest.java
SearchFilesServiceTest.java
FetchWebpageServiceTest.java
ListDirectoryServiceTest.java
CreateDirectoryServiceTest.java
GrepFilesServiceTest.java
ClientStdio.java
pom.xml
README.md
Dependencies
The project uses:
- Spring Boot 3.3.6
- Spring AI MCP Server Components
- Jackson for JSON processing
- jsoup for HTML parsing and web content retrieval
- JUnit 5 and Mockito for testing
Implementation Notes
- The server is designed to operate using the STDIO transport mechanism
- Banner mode and console logging are disabled to allow the STDIO transport to work properly
- Error handling provides detailed information about issues encountered during operations
- Each tool service includes comprehensive error handling and returns results in a standardized JSON format
- The
EditFileServiceincludes sophisticated diff generation for tracking changes - The
SearchFilesServicesupports glob patterns for flexible file matching - The
FetchWebpageServiceincludes configurable timeouts and robust error handling for web requests
Integration with DevoxxGenie MCP Support
This server can be easily integrated with DevoxxGenie using the MCP (Model Context Protocol) support. Here's how to set it up:
Configuration in DevoxxGenie
- In DevoxxGenie, access the MCP Server configuration screen
- Configure the server with the following settings:
-
Name:
JavaFilesystem(or any descriptive name) -
Transport Type:
STDIO -
Command: Full path to your Java executable (e.g.,
/Library/Java/JavaVirtualMachines/liberica-jdk-23.jdk/Contents/Home/bin/java) -
Arguments:
-Dspring.ai.mcp.server.stdio=true -Dspring.main.web-application-type=none -Dspring.main.banner-mode=off -Dlogging.pattern.console= -jar ~/JavaFileSystemMCP/target/devoxx-filesystem-0.0.1-SNAPSHOT.jarEnter each argument on a new line. You may need to change the path for -jar to point to where you've built the jar.
Important: The
-Dspring.main.banner-mode=offflag is required to disable the Spring Boot banner, which would otherwise interfere with the JSON-RPC communication over STDIO.
-
Usage with DevoxxGenie
Once configured, DevoxxGenie will automatically discover the tools provided by this MCP server. The AI assistant can then use these tools to:
- Read and write files on the local system
- Search for files and directories
- List directory contents
- Make edits to existing files
- Search for text patterns within files (grep)
- Create directories and nested directory structures
- Execute bash commands in the system shell
- Fetch web pages and extract content
All operations will be performed with the permissions of the user running the DevoxxGenie application.
Using with Claude Desktop
Edit your claude_desktop_config.json file with the following:
{
"mcpServers": {
"filesystem": {
"command": "/Library/Java/JavaVirtualMachines/liberica-jdk-23.jdk/Contents/Home/bin/java",
"args": [
"-Dspring.ai.mcp.server.stdio=true",
"-Dspring.main.web-application-type=none",
"-Dspring.main.banner-mode=off",
"-Dlogging.pattern.console=",
"-jar",
"~/JavaFileSystemMCP/target/devoxx-filesystem-0.0.1-SNAPSHOT.jar"
]
}
}
}
You may need to change the path for -jar to point to where you've built the jar.
Important: The -Dspring.main.banner-mode=off flag is required to disable the Spring Boot banner, which would otherwise interfere with the JSON-RPC communication over STDIO.
Security Considerations
When using this server, be aware that:
- The LLM agent will have access to read and write files on the host system
- The agent can execute bash commands with the permissions of the user running the application
- The agent can fetch content from any accessible web URL
- Consider running the server with appropriate permissions and in a controlled environment
- The server does not implement authentication or authorization mechanisms
- Consider network firewall rules if restricting web access is required
Related Servers
MCP Apple Notes
Perform semantic search and retrieval augmented generation over your Apple Notes.
CData FTP Server
A read-only MCP server for querying live FTP data using the CData JDBC Driver.
Excel Analyser MCP
Read and analyze Excel (.xlsx) and CSV (.csv) files with scalable, chunked, and column-specific data access, ideal for large datasets.
awaBerry device as a service
awaBerry Agentic allows for secure remote access to any terminal based device for workflows allowing any Agent and Large Language Model based routine to execute commands on your devices for getting access to required data - and to also write genrated data back.
Filesystem MCP Server
Provides AI agents with secure access to local filesystem operations like reading, writing, and managing files and directories.
MCP PDF Reader
Extract text, images, and perform OCR on PDF documents using Tesseract OCR.
JSON MCP Server
A high-performance MCP server for comprehensive JSON file operations, including reading, writing, and advanced querying, optimized for LLM interactions.
Obsidian MCP Server - Enhanced
Provides comprehensive access to an Obsidian vault, allowing AI agents to read, write, search, and manage notes via the Local REST API plugin.
Claude Text Editor
An MCP server for viewing, editing, and creating text files, based on the Claude built-in text editor tool.
Custom PDF MCP Server
A server for processing PDF files, allowing text and table extraction, metadata retrieval, and file listing within a specific directory.