uMCP (ultraMCP)
A lightweight framework for building MCP (Model Context Protocol) servers in Java. uMCP provides a simple abstraction layer over the official MCP Java SDK, making it easy to create and deploy MCP servers with TCP transport.
Features
- Simple Abstractions: Clean interfaces (
SyncCapability
,AsyncCapability
) for implementing MCP tools - TCP Transport by Default: Always uses TCP transport via mcp-java-bridge
- Type Safety: Automatic type handling and JSON schema generation
- Builder Pattern: Fluent API for server configuration
- Minimal Dependencies: Lightweight framework built on top of the official SDK
- Claude Desktop Ready: Works seamlessly with Claude Desktop using the bridge connector
Installation
Prerequisites
- Java 17 or higher
- Gradle 8.5+ (for building from source)
Using as a Dependency
Add uMCP to your project:
Maven
<dependency>
<groupId>org.gegolabs</groupId>
<artifactId>uMCP</artifactId>
<version>1.0.0</version>
</dependency>
Gradle
implementation 'org.gegolabs:uMCP:1.0.0'
Note: Currently available in Maven Local. Run ./gradlew publishToMavenLocal
after cloning.
Building from Source
# Clone the repository
git clone https://github.com/cobach/uMCP.git
cd uMCP
# Build and install to local Maven repository
./gradlew publishToMavenLocal
# Run tests
./gradlew test
Creating Tools
Tools in uMCP implement the SyncCapability
or AsyncCapability
interface:
@Name("my-tool")
@Description("Description of what my tool does")
public class MyTool implements SyncCapability<MyInput, MyOutput> {
@Override
public void initialize() throws CapabilityException {
// Initialize resources if needed
}
@Override
public void shutdown() throws CapabilityException {
// Clean up resources if needed
}
@Override
public MyOutput execute(MyInput input) throws CapabilityException {
// Tool implementation
return new MyOutput(result);
}
}
Server Configuration
uMCP servers always use TCP transport. You can configure the host and port:
// Default: localhost:3000
MCPServer server = MCPServer.builder()
.name("MyServer")
.version("1.0.0")
.tool(new MyTool())
.build();
// Custom port
MCPServer server = MCPServer.builder()
.name("MyServer")
.version("1.0.0")
.port(8080)
.tool(new MyTool())
.build();
// Custom host and port
MCPServer server = MCPServer.builder()
.name("MyServer")
.version("1.0.0")
.host("0.0.0.0")
.port(8080)
.tool(new MyTool())
.tool(new AnotherTool())
.build();
// Start the server
server.start();
Instalación en Claude Desktop
After building your MCP server, you need to configure Claude Desktop to connect to it. The mcp-java-bridge JAR includes a CLI installer for this purpose.
Step 1: Access the Bridge JAR
When using uMCP, the bridge JAR is automatically included as a dependency. You can access it in two ways:
From Maven Repository:
java -jar ~/.m2/repository/org/gegolabs/mcp/mcp-java-bridge/1.0.0/mcp-java-bridge-1.0.0.jar
Or copy it using a Gradle task:
task copyBridgeJar(type: Copy) {
from configurations.runtimeClasspath.filter { it.name.contains('mcp-java-bridge') }
into 'install'
rename { 'mcp-bridge.jar' }
}
Then: ./gradlew copyBridgeJar
Step 2: Configure Claude Desktop
Choose one of these three options:
Option A: Interactive Installation (Recommended)
Run the installer without arguments for a guided setup:
java -jar mcp-java-bridge-1.0.0.jar
This will:
- Auto-detect the JAR location
- Prompt for server name (e.g., "my-server")
- Prompt for host (default: localhost)
- Prompt for port (default: 3000)
- Automatically configure Claude Desktop
- Create a backup of existing configuration
Option B: Command Line Installation
For automated setups, use specific parameters:
java -jar mcp-java-bridge-1.0.0.jar install \
-n "my-server" \
-c mcp-java-bridge-1.0.0.jar \
-h localhost \
-p 3000
Parameters:
-n
- Server name in Claude Desktop (required)-c
- Path to the JAR that will act as connector-h
- Server host (default: localhost)-p
- Server port (default: 3000)
Option C: Manual Configuration
If you prefer to configure manually, edit ~/Library/Application Support/Claude/claude_desktop_config.json
:
{
"mcpServers": {
"my-server": {
"command": "java",
"args": [
"-jar",
"/path/to/mcp-java-bridge-1.0.0.jar",
"--connector",
"localhost",
"3000"
]
}
}
}
Step 3: Start Your Server
- Start your MCP server (make sure it's running on the configured port)
- Restart Claude Desktop to load the new configuration
- Your server should now be available in Claude Desktop
MCP Bridge JAR Commands
The mcp-java-bridge JAR is included when you use uMCP. It's a multi-purpose tool with three modes:
1. Interactive Installer (Default)
java -jar mcp-java-bridge-1.0.0.jar
2. Connector Mode
Used by Claude Desktop to bridge stdio↔TCP:
# Default settings (localhost:3000)
java -jar mcp-java-bridge-1.0.0.jar --connector
# Custom host/port
java -jar mcp-java-bridge-1.0.0.jar --connector 192.168.1.100 8080
3. Install Command
java -jar mcp-java-bridge-1.0.0.jar install -n <server-name> -c <jar-path> [-h <host>] [-p <port>]
4. Help
java -jar mcp-java-bridge-1.0.0.jar --help
Creating Your MCP Server
Step 1: Create a New Project
Create a new Gradle project with the following build.gradle
:
plugins {
id 'java'
id 'application'
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
implementation 'org.gegolabs:uMCP:1.0.0'
}
application {
mainClass = 'com.example.MyMCPServer'
}
java {
sourceCompatibility = JavaVersion.VERSION_17
}
// Task to copy mcp-java-bridge JAR for easy Claude Desktop installation
task installBridge(type: Copy) {
from configurations.runtimeClasspath.filter { it.name.contains('mcp-java-bridge') }
into 'install'
rename { 'mcp-bridge.jar' }
doLast {
println "Bridge JAR copied to: install/mcp-bridge.jar"
println "Run installer: java -jar install/mcp-bridge.jar"
}
}
// Run installBridge after build
build.finalizedBy installBridge
Step 2: Create Your Server Application
package com.example;
import org.gegolabs.mcp.MCPServer;
import org.gegolabs.mcp.impl.DomainAvailability;
import org.gegolabs.mcp.impl.SystemInformation;
public class MyMCPServer {
public static void main(String[] args) throws Exception {
int port = args.length > 0 ? Integer.parseInt(args[0]) : 3000;
MCPServer server = MCPServer.builder()
.name("MyMCPServer")
.version("1.0.0")
.port(port)
.tool(new DomainAvailability())
.tool(new SystemInformation())
.build();
server.start();
System.out.println("MCP Server running on port " + port);
// Keep running until interrupted
Thread.currentThread().join();
}
}
Step 3: Build and Configure
# Build your project (this also copies the bridge JAR)
./gradlew build
# Configure Claude Desktop using the bridge installer
java -jar install/mcp-bridge.jar
# Run your server
./gradlew run
# Or run the JAR directly
java -jar build/libs/your-project.jar 3000
uMCP Library Structure
uMCP/
├── src/
│ ├── main/java/org/gegolabs/mcp/
│ │ ├── protocol/ # Core interfaces (SyncCapability, AsyncCapability)
│ │ ├── impl/ # Example tool implementations
│ │ ├── bridge/ # Bridge integration (from mcp-java-bridge)
│ │ └── MCPServer.java # Main server builder class
│ └── test/ # Unit tests
├── docs/ # Additional documentation
└── build.gradle # Build configuration
When you use uMCP in your project, it provides:
- Core abstractions for creating MCP tools
- MCPServer builder for easy server setup
- Built-in TCP transport via mcp-java-bridge
- Example implementations to reference
Dependencies
- MCP Java SDK 0.10.0
- mcp-java-bridge 1.0.0
- Project Reactor (via SDK)
- SLF4J + Logback for logging
- Lombok for reducing boilerplate
Testing with MCP Inspector
While MCP Inspector expects stdio transport, you can test your uMCP server using the bridge:
- Start your uMCP server
- Use the mcp-java-bridge connector as an intermediary
- Point MCP Inspector to the connector
Local Development
When developing with uMCP locally:
# Clone and install uMCP to local Maven repository
git clone https://github.com/cobach/uMCP.git
cd uMCP
./gradlew publishToMavenLocal
This installs uMCP to your local Maven repository (~/.m2/repository), making it available for your projects to use as a dependency.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Contributing
[Contributing guidelines to be added]