A Spring AI Model Context Protocol (MCP) server that provides tools for interacting with Apache Solr. Enables AI assistants like Claude to search, index, and manage Solr collections through the MCP protocol.
docker compose up -d
./gradlew bootRun
./gradlew build java -jar build/libs/solr-mcp-1.0.0-SNAPSHOT.jar
docker run -i --rm ghcr.io/apache/solr-mcp:latest
PROFILES=http ./gradlew bootRun
PROFILES=http java -jar build/libs/solr-mcp-1.0.0-SNAPSHOT.jar
docker run -p 8080:8080 --rm -e PROFILES=http ghcr.io/apache/solr-mcp:latest
For more options (custom SOLR_URL, Linux host networking) see the Deployment Guide: docs/DEPLOYMENT.md
Add this to your Claude Desktop config (macOS path shown); then restart Claude.
STDIO mode (default)
Using Docker:
{ "mcpServers": { "solr-mcp": { "command": "docker", "args": ["run", "-i", "--rm", "ghcr.io/apache/solr-mcp:latest"], "env": { "SOLR_URL": "http://localhost:8983/solr/" } } } }
Using JAR:
{ "mcpServers": { "solr-mcp": { "command": "java", "args": [ "-jar", "/absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar" ], "env": { "SOLR_URL": "http://localhost:8983/solr/" } } } }
HTTP mode
Using Docker:
{ "mcpServers": { "solr-mcp": { "command": "docker", "args": [ "run", "-p", "8080:8080", "--rm", "ghcr.io/apache/solr-mcp:latest" ], "env": { "PROFILES": "http", "SOLR_URL": "http://localhost:8983/solr/" } } } }
Using JAR:
{ "mcpServers": { "solr-mcp": { "command": "java", "args": [ "-jar", "/absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar" ], "env": { "PROFILES": "http", "SOLR_URL": "http://localhost:8983/solr/" } } } }
Connecting to a running HTTP server
If you already have the MCP server running in HTTP mode (via Gradle, JAR, or Docker), you can connect Claude Desktop to it using mcp-remote:
Running via Gradle:
PROFILES=http ./gradlew bootRun
Running locally (JAR):
PROFILES=http java -jar build/libs/solr-mcp-1.0.0-SNAPSHOT.jar
Running via Docker:
docker run -p 8080:8080 --rm -e PROFILES=http ghcr.io/apache/solr-mcp:latest
Then add to your claude_desktop_config.json:
{ "mcpServers": { "solr-mcp-http": { "command": "npx", "args": [ "mcp-remote", "http://localhost:8080/mcp" ] } } }
More configuration options: see the Building Docker images section below.
Add Solr MCP to Claude Code using the CLI or by adding a .mcp.json file to your project root.
STDIO mode (default)
Using Docker (CLI):
claude mcp add --transport stdio solr-mcp -- docker run -i --rm ghcr.io/apache/solr-mcp:latest
Using JAR (CLI):
claude mcp add --transport stdio -e SOLR_URL=http://localhost:8983/solr/ solr-mcp -- java -jar /absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar
Or add to your project's .mcp.json:
Using Docker:
{ "mcpServers": { "solr-mcp": { "type": "stdio", "command": "docker", "args": ["run", "-i", "--rm", "ghcr.io/apache/solr-mcp:latest"], "env": { "SOLR_URL": "http://localhost:8983/solr/" } } } }
Using JAR:
{ "mcpServers": { "solr-mcp": { "type": "stdio", "command": "java", "args": ["-jar", "/absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar"], "env": { "SOLR_URL": "http://localhost:8983/solr/" } } } }
HTTP mode
Start the server first (pick one):
# Gradle PROFILES=http ./gradlew bootRun # JAR PROFILES=http java -jar build/libs/solr-mcp-1.0.0-SNAPSHOT.jar # Docker docker run -p 8080:8080 --rm -e PROFILES=http ghcr.io/apache/solr-mcp:latest
Then add to Claude Code:
claude mcp add --transport http solr-mcp http://localhost:8080/mcp
Or add to .mcp.json:
{ "mcpServers": { "solr-mcp": { "type": "http", "url": "http://localhost:8080/mcp" } } }
The Solr MCP server supports OAuth2 authentication when running in HTTP mode, providing secure access control for your MCP tools.
http profileConfigure Auth0 (see detailed guide: security-docs/AUTH0_SETUP.md)
Set Environment Variable:
export OAUTH2_ISSUER_URI=https://your-tenant.auth0.com/ export PROFILES=http
Run the Server:
./gradlew bootRun
Get Access Token (using convenience script):
./scripts/get-auth0-token.sh --domain your-tenant.auth0.com \ --client-id YOUR_CLIENT_ID \ --client-secret YOUR_CLIENT_SECRET \ --audience https://solr-mcp-api
Use the Token:
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://localhost:8080/mcp
For complete setup instructions, see security-docs/AUTH0_SETUP.md
| Tool | Description |
|---|---|
search | Full-text search with filtering, faceting, sorting, and pagination |
| Tool | Description |
|---|---|
index-json-documents | Index documents from a JSON string into a Solr collection |
index-csv-documents | Index documents from a CSV string into a Solr collection |
index-xml-documents | Index documents from an XML string into a Solr collection |
| Tool | Description |
|---|---|
create-collection | Create a new Solr collection (configSet, numShards, replicationFactor optional — default to _default, 1, 1) |
list-collections | List all available Solr collections |
get-collection-stats | Get statistics and metrics for a collection |
check-health | Check the health status of a collection |
| Tool | Description |
|---|---|
get-schema | Retrieve schema information for a collection |
MCP Resources provide a way to expose data that can be read by MCP clients. The Solr MCP Server provides the following resources:
| Resource URI | Description |
|---|---|
solr://collections | List of all Solr collections available in the cluster |
solr://{collection}/schema | Schema definition for a specific collection (supports autocompletion) |
The solr://{collection}/schema resource supports autocompletion for the {collection} parameter. MCP clients can use the completion API to get a list of available collection names.
Claude Desktop (STDIO):
MCP Inspector (HTTP):
MCP Inspector (HTTP with OAuth2 - Success):
MCP Inspector (HTTP with OAuth2 - Failure):
MCP Inspector (STDIO):
Three image artifacts cover the full transport × runtime matrix. The JVM image is built with Jib (clean stdout, multi-arch); the native variants are built with Paketo Cloud Native Buildpacks.
| Image | Toolchain | Build command | STDIO | HTTP |
|---|---|---|---|---|
solr-mcp:<version> | Jib | ./gradlew jibDockerBuild | ✅ | ✅ |
solr-mcp:<version>-native-stdio | Paketo | ./gradlew bootBuildImage -Pnative | ✅ | ❌ |
solr-mcp:<version>-native-http | Paketo | ./gradlew bootBuildImage -Pnative -Pprofile=http | ❌ | ✅ |
# STDIO — Jib JVM (default profile is stdio) docker run -i --rm \ -e SOLR_URL=http://host.docker.internal:8983/solr/ \ solr-mcp:latest # STDIO — native (faster startup, smaller image) docker run -i --rm \ -e SOLR_URL=http://host.docker.internal:8983/solr/ \ solr-mcp:latest-native-stdio # HTTP — Jib JVM docker run -p 8080:8080 --rm \ -e PROFILES=http \ -e SOLR_URL=http://host.docker.internal:8983/solr/ \ solr-mcp:latest # HTTP — native docker run -p 8080:8080 --rm \ -e PROFILES=http \ -e SOLR_URL=http://host.docker.internal:8983/solr/ \ solr-mcp:latest-native-http
java -jar entrypoint with no launcher script. Stdout stays clean for MCP STDIO, and runtime PROFILES=http switches to web mode.libjvm helpers (memory calculator, NMT, ca-certificates) write 6 lines to stdout before the JVM, breaking MCP's JSON-RPC stream. Verified end-to-end by DockerImageMcpClientStdioIntegrationTest (Spring AI MCP client times out on initialize()). Filed upstream as paketo-buildpacks/libjvm#482. We use Jib for the JVM image instead.spring.main.web-application-type into the binary at AOT time. Activating both profiles picks servlet (http overrides stdio), which forces Tomcat to start regardless of the runtime PROFILES value, breaking stdio. So we ship one native image per transport.{ "mcpServers": { "solr-mcp": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", "solr-mcp:latest-native" ] } } }
See docs/specs/graalvm-native-image.md for the native image design and known risks.
We welcome contributions!
Apache License 2.0 — see LICENSE
Built with: