com.opensolr/opensolr-mcp
PYPI · OPENSOLR-MCP
Managed Apache Solr for agents: hybrid BM25+kNN search, server-side embeddings, RAG answers
Available components
Last scanned (5 hours ago)
Scores higher than 58% of PyPI servers
Category Search and Retrieval
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security50
- Malware scan not yet available for this package.Unverified
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 31 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 26 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability58
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 2827 tokens (~176/item across 16 items; 16 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management87
- Stability observed for 26 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage71
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "opensolr_delete_documents" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 −14
- Malware scan: pass → unverified ▼ security
- 3 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.
- 2 Nov 26 −4
- Stability: pass → 0.77 functional
- 29 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- Package version: 0.5.0 → 0.8.1 functional
- 28 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- 27 Oct 26 +1
- Stability: 0.97 → pass security
- 26 Oct 26 −1
- Stability: pass → 0.97 functional
- 25 Oct 26 +15
- Malware scan: unverified → pass ▲ security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed pypi/opensolr-mcp@0.8.1
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | setuptools.build_meta |
Background: Why install scripts are a supply-chain risk →
Dependencies 31 packages
| Packages resolved | 31 |
|---|---|
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
opensolr_add_documents ~161
Index plain-text documents via the Opensolr Data Ingestion API. Ingestion is ASYNC: embeddings, sentiment, and all derived fields are computed server-side and documents become searchable within about a minute (progress is visible in the Opensolr Control Panel). With wait=true (default) this blocks until the job completes. Metadata keys become filterable meta_* fields; metadata "uri" (a real URL) is used as the document identity — the Solr id is md5(uri). Returns job info and the resulting Solr document ids.
| Name | Type | Req | Description |
|---|---|---|---|
| ids | – | – | – |
| index | string | yes | – |
| metadatas | – | – | – |
| texts | array | yes | – |
| wait | boolean | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
opensolr_ai_answer ~354
Ask a question and get a grounded RAG answer generated ONLY from the content already indexed in the given Opensolr index. Retrieval runs through the platform's tuned hybrid pipeline (the index's saved Search Tuning applies automatically) — the top rag_docs hits (first rag_words words of text each) become the LLM context, the same pipeline as the hosted search UI. filter_query optionally narrows retrieval with a raw Solr fq expression; instruction optionally replaces the default prompt (e.g. "Answer in German", "Extract a list of people"); tuning optionally overrides retrieval knobs per call. That list is the whole set, not a sample — an abbreviated one reads as everything that is supported, and freshness_boost was invisible to callers because of it: fw_title, fw_description, fw_uri, fw_text, fw_text_t, lexical_weight, vector_weight, vector_topk, search_mode (union / keywords_required / meaning_required / intersection), quality_boost, min_score, freshness_boost, fresh_bias, lexical_norm_k, mm (flexible / balanced / strict or raw Solr mm syntax). freshness_boost and fresh_bias are different knobs despite the names: the first is a hard window in DAYS that filters older documents out, the second only re-orders, multiplying each score by a recency curve on creation_date so recent documents win ties while nothing becomes unreachable.
| Name | Type | Req | Description |
|---|---|---|---|
| filter_query | – | – | – |
| index | string | yes | – |
| instruction | – | – | – |
| query | string | yes | – |
| rag_docs | integer | – | – |
| rag_words | integer | – | – |
| tuning | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
opensolr_apply_schema ~115
Install the Opensolr vector schema on an index of a vector region, so Data Ingestion, vector and hybrid search and PDF pages all work on it. It replaces the index configuration. An index that already holds documents needs force=true: those documents keep the fields they were written with and must be sent again. An index outside the vector regions cannot take it (the answer says where to create one). Returns the new check.
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | – | – |
| index | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
opensolr_check_schema ~167
Whether an index is ready for every Opensolr tool, and exactly why not. Answers "ready", "capabilities" (ingestion, vector_search, pdf_pages, keyword_search), the server and its Solr version, whether the server is in a vector region, the fields and types that are missing or different from the Opensolr vector schema, "problems" (sentences) and "fix": "apply_schema" (run opensolr_apply_schema), "new_index" (create one with opensolr_create_index in a region of opensolr_vector_regions) or "none". The other tools run this check once per index on their own; call it to see the details.
| Name | Type | Req | Description |
|---|---|---|---|
| index | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
opensolr_create_index ~93
Create a new vector-enabled Opensolr index in a vector region. location: an environment id from opensolr_vector_regions, or a short name matched against that live list by environment id or country (e.g. "us", "de"). Additional dedicated regions can be deployed on request (support@opensolr.com).
| Name | Type | Req | Description |
|---|---|---|---|
| index | string | yes | – |
| location | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
opensolr_delete_documents ~68
Delete documents by ids (Solr ids or your original ids) or by a raw Solr query, e.g. 'meta_category:"drafts"' or '+id:"abc123"'.
| Name | Type | Req | Description |
|---|---|---|---|
| ids | – | – | – |
| index | string | yes | – |
| query | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
opensolr_describe_image ~105
What a picture shows and what is written on it: "caption" (a sentence about what it depicts), "text" (the text read off it by OCR, empty if none), "labels" (the things in it) and "codes" (barcodes / QR codes). index is the Opensolr index the reading is counted on. Nothing is stored.
| Name | Type | Req | Description |
|---|---|---|---|
| image_path | string | yes | – |
| index | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
opensolr_extract_text ~252
Read local files on Opensolr without indexing them: their text, the text in their pictures (OCR, 100+ languages), a PDF page by page, scanned pages and picture files (JPG, PNG, TIFF...) included. path is a file or a folder (pattern filters the files of a folder, e.g. "*.pdf"; recursive walks its sub-folders). index is the Opensolr index the work is counted on (pictures read: 0.5 AI request each; a file read before is free). Files still being read after wait_seconds come back with state "queued"/"processing": call again with the same path to get them — they are not sent twice. Each file: path, state, mime and its "pages" (a PDF: page, text, is_ocr, lang) or "text"; "error" when it could not be read. The whole answer is cut at max_chars characters.
| Name | Type | Req | Description |
|---|---|---|---|
| index | string | yes | – |
| max_chars | integer | – | – |
| path | string | yes | – |
| pattern | string | – | – |
| recursive | boolean | – | – |
| wait_seconds | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
opensolr_index_files ~275
Index local files into an Opensolr index: one file or a whole folder. Each file is read on Opensolr — its text, the text in its pictures (OCR), the pictures without text described — and a PDF is indexed ONE DOCUMENT PER PAGE, so a search finds the page that answers it (results carry the page number and a link to it). Word, RTF, OpenDocument, text, HTML and picture files (scans) are one document each. pattern filters the files of a folder (e.g. "*.pdf"), recursive walks its sub-folders, metadata is added to every document as filterable meta_* fields. Sending the same files again replaces them. Files still being read after wait_seconds come back under "pending": call again with the same path to index them (the bytes are not sent twice). Returns "documents" (path, source, uri, id), "pending", "failed" and "jobs" (Data Ingestion job ids, see opensolr_ingest_status); documents become searchable about a minute after their job runs.
| Name | Type | Req | Description |
|---|---|---|---|
| index | string | yes | – |
| metadata | – | – | – |
| path | string | yes | – |
| pattern | string | – | – |
| recursive | boolean | – | – |
| wait_seconds | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
opensolr_index_info ~40
Get connection details for an index: Solr URL, version, environment. (Credentials are intentionally not returned.)
| Name | Type | Req | Description |
|---|---|---|---|
| index | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
opensolr_ingest_status ~49
Status of a Data Ingestion job (state, processed/success/failed doc counts). Also visible in the Opensolr Control Panel.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
opensolr_list_indexes ~23
List all search indexes in the connected Opensolr account.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
opensolr_read_document ~160
Read one indexed document in full — search results carry only an excerpt. document is the "document_id" or "id" of a search result, the id it was sent with, or its URL. A PDF indexed page by page comes back as its pages in order (page_from to page_to, default the first 50; "pages_indexed" tells how many it has) — read the next ones with page_from. Any other document comes back as one text. The answer is cut at max_chars characters ("truncated": true).
| Name | Type | Req | Description |
|---|---|---|---|
| document | string | yes | – |
| index | string | yes | – |
| max_chars | integer | – | – |
| page_from | integer | – | – |
| page_to | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
opensolr_search ~392
Search an Opensolr index and return the k most relevant documents. search_mode: "hybrid" (default — BM25 + semantic kNN fused per document), "semantic" (pure kNN), or "lexical" (pure keyword edismax — no embedding call, zero AI quota, works on ANY index including non-vector ones). For hybrid: mode is union / keywords_required / meaning_required / intersection, alpha balances semantic (0) vs lexical (1). filter_query accepts a raw Solr fq expression, e.g. 'meta_category:"docs"'. fresh_bias biases the ranking toward recent documents by multiplying each score by a recency curve on creation_date. It re-orders and never filters: the hit count is unchanged, nothing old becomes unreachable, and a document with no creation_date is simply left unboosted. Works in all three search modes. Off by default — turn it on when newer should beat older on a tie. date_from / date_to (YYYY-MM-DD, both included, either may be left out) keep only documents dated in that period (creation_date) — use them when the question names a period. A PDF indexed page by page is one result per PDF (group_pages, on by default): its best page, with "uri", "page", "page_url" (opens the PDF at that page), "document_id" (for opensolr_read_document) and "more_pages", its other matching pages.
| Name | Type | Req | Description |
|---|---|---|---|
| alpha | number | – | – |
| date_from | – | – | – |
| date_to | – | – | – |
| filter_query | – | – | – |
| fresh_bias | boolean | – | – |
| group_pages | boolean | – | – |
| index | string | yes | – |
| k | integer | – | – |
| mode | string | – | – |
| query | string | yes | – |
| search_mode | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
opensolr_search_by_image ~329
Search an Opensolr index with a PHOTO instead of a text query. The image at image_path is read three ways by the Opensolr image engine — visual labels (what it depicts), OCR text (words printed on it), and any barcode / QR code — and turned into a text query that runs through the normal search. No image vector is stored; the picture simply becomes words. using selects which reading drives the search: "auto" the engine's chosen text (OCR text when the picture is mostly text, otherwise the visual labels) — the default, "meaning" the visual labels (what the picture depicts), "text" only the OCR text read off the picture (empty if none), "code" the first barcode / QR code, matched as an exact keyword. search_mode / mode / alpha / fresh_bias / filter_query / date_from / date_to / group_pages behave exactly as in opensolr_search. Returns {"read": {text, mode, labels, codes}, "results": [...]} so the caller sees both what the picture was read as and the matching documents.
| Name | Type | Req | Description |
|---|---|---|---|
| alpha | number | – | – |
| date_from | – | – | – |
| date_to | – | – | – |
| filter_query | – | – | – |
| fresh_bias | boolean | – | – |
| group_pages | boolean | – | – |
| image_path | string | yes | – |
| index | string | yes | – |
| k | integer | – | – |
| mode | string | – | – |
| search_mode | string | – | – |
| using | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
opensolr_vector_regions ~52
List the vector-enabled Opensolr environments currently available (the servers with the Opensolr web crawler that are up, any Solr version: dense vectors, the hybrid query parser and Data Ingestion).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
How do I install the com.opensolr/opensolr-mcp server?
com.opensolr/opensolr-mcp runs locally as a PyPI package, launched with uvx opensolr-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · opensolr-mcp
claude mcp add com-opensolr-opensolr-mcp -- uvx opensolr-mcp
What is the com.opensolr/opensolr-mcp server?
com.opensolr/opensolr-mcp is listed in the public MCP registry as com.opensolr/opensolr-mcp. Managed Apache Solr for agents: hybrid BM25+kNN search, server-side embeddings, RAG answers. This page covers its PyPI package (opensolr-mcp).
Is the com.opensolr/opensolr-mcp server safe to use?
com.opensolr/opensolr-mcp scores 61 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the com.opensolr/opensolr-mcp server expose?
com.opensolr/opensolr-mcp exposes 16 tools: opensolr_search, opensolr_search_by_image, opensolr_ai_answer, opensolr_read_document, opensolr_extract_text, and 11 more. Their descriptions and schemas cost roughly 2,635 tokens of context every time the server is loaded.
Is the com.opensolr/opensolr-mcp server still maintained?
com.opensolr/opensolr-mcp is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the com.opensolr/opensolr-mcp server under?
com.opensolr/opensolr-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.