A Spring AI Model Context Protocol (MCP) server that provides tools for interacting with Apache Solr. This server enables AI assistants like Claude to search, index, and manage Solr collections through the MCP protocol.
This project provides a set of tools that allow AI assistants to interact with Apache Solr, a powerful open-source search platform. By implementing the Spring AI MCP protocol, these tools can be used by any MCP-compatible client, including Claude Desktop. The project uses SolrJ, the official Java client for Solr, to communicate with Solr instances.
The server provides the following capabilities:
The server supports two transport modes:
git clone https://github.com/yourusername/solr-mcp-server.git cd solr-mcp-server
docker-compose up -d
This will start a Solr instance in SolrCloud mode with ZooKeeper and create two sample collections:
books - A collection with sample book datafilms - A collection with sample film dataThis project uses Gradle with version catalogs for dependency management. All dependencies and their versions are centrally managed in gradle/libs.versions.toml.
# Build the project and run tests ./gradlew build # Build without tests (faster) ./gradlew assemble # Clean and rebuild ./gradlew clean build
The build produces two JAR files in build/libs/:
solr-mcp-server-0.0.1-SNAPSHOT.jar - Executable JAR with all dependencies (fat JAR)solr-mcp-server-0.0.1-SNAPSHOT-plain.jar - Plain JAR without dependenciesThe codebase follows a clean, modular architecture organized by functionality:
src/main/java/org/apache/solr/mcp/server/
├── Main.java # Application entry point
├── config/ # Configuration classes
│ ├── SolrConfig.java # Solr client bean configuration
│ └── SolrConfigurationProperties.java # Solr connection properties
├── search/ # Search functionality
│ ├── SearchService.java # MCP tool for searching Solr
│ └── SearchResponse.java # Search result DTOs
├── indexing/ # Document indexing functionality
│ ├── IndexingService.java # MCP tool for indexing documents
│ └── documentcreator/ # Document format parsers
│ ├── IndexingDocumentCreator.java # Interface for document creators
│ ├── JsonDocumentCreator.java # JSON document parser
│ ├── CsvDocumentCreator.java # CSV document parser
│ ├── XmlDocumentCreator.java # XML document parser
│ ├── SolrDocumentCreator.java # Factory for document creators
│ ├── FieldNameSanitizer.java # Field name sanitization utility
│ └── DocumentProcessingException.java # Indexing exceptions
└── metadata/ # Collection management functionality
├── CollectionService.java # MCP tools for collection operations
├── SchemaService.java # MCP tool for schema retrieval
├── CollectionUtils.java # Collection utility methods
└── Dtos.java # Collection-related DTOs (records)
MCP Tools: Service classes annotated with @McpTool expose functionality to AI assistants
SearchService - Search queries with filtering, faceting, and paginationIndexingService - Document indexing with support for JSON, CSV, and XML formatsCollectionService - Collection management (list, stats, health checks)SchemaService - Schema introspectionConfiguration: Spring Boot configuration using properties files
application.properties - Default configurationapplication-stdio.properties - STDIO transport profileapplication-http.properties - HTTP transport profileDocument Creators: Strategy pattern implementation for parsing different document formats
DTOs: Java records for immutable data transfer objects (removed Lombok dependency)
The server provides the following tools that can be used by MCP clients:
Search a Solr collection with advanced query options.
Tool: Search Description: Search specified Solr collection with query, optional filters, facets, sorting, and pagination. Parameters: - collection: Solr collection to query - query: Solr q parameter (defaults to "*:*" if not specified) - filterQueries: Solr fq parameter (optional) - facetFields: Solr facet fields (optional) - sortClauses: Solr sort parameter (optional) - start: Starting offset for pagination (optional) - rows: Number of rows to return (optional)
Index JSON documents into a Solr collection.
Tool: index_documents Description: Index documents from JSON string into Solr collection Parameters: - collection: Solr collection to index into - json: JSON string containing documents to index
List all available Solr collections.
Tool: listCollections Description: List solr collections Parameters: None
Get detailed statistics and metrics for a Solr collection.
Tool: getCollectionStats Description: Get stats/metrics on a Solr collection Parameters: - collection: Name of the collection
Check the health status of a Solr collection.
Tool: checkHealth Description: Check health of a Solr collection Parameters: - collection: Name of the collection
Retrieve the schema for a Solr collection.
Tool: getSchema Description: Get schema for a Solr collection Parameters: - collection: Name of the collection
To add this MCP server to Claude Desktop:
./gradlew build
In Claude Desktop, go to Settings > Developer > Edit Config
Add the following configuration to your MCP settings:
{ "mcpServers": { "solr-search-mcp": { "command": "java", "args": [ "-jar", "/absolute/path/to/solr-mcp-server/build/libs/solr-mcp-server-0.0.1-SNAPSHOT.jar" ], "env": { "SOLR_URL": "http://localhost:8983/solr/", "PROFILES": "stdio" } } } }
Note: Replace /absolute/path/to/solr-mcp-server with the actual path to your project directory.
For development and testing, you can use the MCP Inspector:
# Install the MCP Inspector (requires Node.js) ➜ ~ npx @modelcontextprotocol/inspector Starting MCP inspector... ⚙️ Proxy server listening on localhost:6277 🔑 Session token: 12345 Use this token to authenticate requests or set DANGEROUSLY_OMIT_AUTH=true to disable auth 🚀 MCP Inspector is up and running at: http://localhost:6274/?MCP_PROXY_AUTH_TOKEN=12345 🌐 Opening browser...
This provides a web interface to test MCP tools interactively.
./gradlew bootRun --args='--spring.profiles.active=http'
Here are some examples of how to use the tools from an MCP client like Claude:
I need to search for fantasy books in the Solr collection. Can you help me?
Claude can use the Search tool to query the books collection:
I'll search for fantasy books in the Solr collection. Using the Search tool with: - collection: books - query: genre_s:fantasy - rows: 5 Here are the fantasy books I found: 1. "A Game of Thrones" by George R.R. Martin 2. "A Clash of Kings" by George R.R. Martin ...
I have some new book data I'd like to add to Solr. Can you help me index it?
Claude can use the index_documents tool:
I'll help you index that book data into Solr.
Using the index_documents tool with:
- collection: books
- json: [{"id":"123456789","name":["The New Book"],"author":["Jane Author"],"genre_s":"mystery","price":[12.99]}]
The document has been successfully indexed into the books collection.
What Solr collections are available in the system?
Claude can use the listCollections tool:
I'll check what Solr collections are available. Using the listCollections tool. The following collections are available: 1. books 2. films
Can you tell me more about the 'books' collection? I'd like to know its size and other metrics.
Claude can use the getCollectionStats tool:
I'll get statistics for the 'books' collection. Using the getCollectionStats tool with: - collection: books Here are the statistics for the 'books' collection: - Number of documents: 1,245 - Segment count: 5 - Query performance: - Average query time: 12ms - Cache hit ratio: 0.85 - Handler statistics: - Select handler requests: 1,532 - Update handler requests: 245
Is the 'films' collection healthy and responding properly?
Claude can use the checkHealth tool:
I'll check the health of the 'films' collection. Using the checkHealth tool with: - collection: films Health status: - Healthy: Yes - Response time: 8ms - Total documents: 532 - Last checked: 2023-06-15 14:32:45
What fields are defined in the 'books' collection schema?
Claude can use the getSchema tool:
I'll retrieve the schema for the 'books' collection. Using the getSchema tool with: - collection: books The 'books' collection has the following fields: - id (string): Unique identifier - name (text_general): Book title - author (text_general): Book author - genre_s (string): Genre - price (float): Book price - in_stock_b (boolean): Whether the book is in stock - publish_date (date): Publication date
STDIO transport is the recommended option for local deployments because:
⚠️ Warning: The current HTTP implementation is insecure for production use without additional security measures.
HTTP transport has the following security vulnerabilities when deployed without authentication:
If you need to deploy the MCP server with HTTP transport for remote access, you must implement security controls:
If you encounter issues:
SOLR_URL environment variable to point to a different Solr instance.This project is licensed under the Apache License 2.0.
Contributions are welcome! Please feel free to submit a Pull Request.