From d9f3381eec17557fbaf3e9b2a22876277c1d6696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20H=C3=B8ydahl?= Date: Mon, 17 Nov 2025 19:26:33 +0100 Subject: [PATCH 01/11] First version of MCP web site --- content/doap/solr-mcp.rdf | 52 ++ content/pages/mcp/community.md | 42 + content/pages/mcp/downloads.md | 5 + content/pages/mcp/features.md | 4 + content/pages/mcp/index.md | 4 + pelicanconf.py | 4 + themes/solr/static/css/mcp.css | 1033 ++++++++++++++++++++++ themes/solr/templates/_header.html | 5 +- themes/solr/templates/index.html | 12 + themes/solr/templates/mcp/_css.html | 8 + themes/solr/templates/mcp/_footer.html | 30 + themes/solr/templates/mcp/_head.html | 25 + themes/solr/templates/mcp/_header.html | 39 + themes/solr/templates/mcp/base.html | 46 + themes/solr/templates/mcp/community.html | 13 + themes/solr/templates/mcp/downloads.html | 20 + themes/solr/templates/mcp/features.html | 113 +++ themes/solr/templates/mcp/fullwidth.html | 24 + themes/solr/templates/mcp/index.html | 79 ++ themes/solr/templates/mcp/page.html | 11 + themes/solr/templates/mcp/subnav.html | 20 + 21 files changed, 1588 insertions(+), 1 deletion(-) create mode 100644 content/doap/solr-mcp.rdf create mode 100644 content/pages/mcp/community.md create mode 100644 content/pages/mcp/downloads.md create mode 100644 content/pages/mcp/features.md create mode 100644 content/pages/mcp/index.md create mode 100644 themes/solr/static/css/mcp.css create mode 100644 themes/solr/templates/mcp/_css.html create mode 100644 themes/solr/templates/mcp/_footer.html create mode 100644 themes/solr/templates/mcp/_head.html create mode 100644 themes/solr/templates/mcp/_header.html create mode 100644 themes/solr/templates/mcp/base.html create mode 100644 themes/solr/templates/mcp/community.html create mode 100644 themes/solr/templates/mcp/downloads.html create mode 100644 themes/solr/templates/mcp/features.html create mode 100644 themes/solr/templates/mcp/fullwidth.html create mode 100644 themes/solr/templates/mcp/index.html create mode 100644 themes/solr/templates/mcp/page.html create mode 100644 themes/solr/templates/mcp/subnav.html diff --git a/content/doap/solr-mcp.rdf b/content/doap/solr-mcp.rdf new file mode 100644 index 0000000000..c79815c7ef --- /dev/null +++ b/content/doap/solr-mcp.rdf @@ -0,0 +1,52 @@ + + + + + + 2025-10-26 + + Apache Solr MCP Server + + + Model Context Protocol server for Apache Solr + + + + Go + + + + + + + + + + + + Apache Solr Team + + + + + + diff --git a/content/pages/mcp/community.md b/content/pages/mcp/community.md new file mode 100644 index 0000000000..e2e5b9a22c --- /dev/null +++ b/content/pages/mcp/community.md @@ -0,0 +1,42 @@ +Title: Community +URL: mcp/community.html +save_as: mcp/community.html +template: mcp/community + +## Support ## + +The Solr MCP community provides user support for free through the [users mailing list](#mailing-lists-chat) and [slack channels](#slack). + +## Mailing Lists & Chat ## + +The Solr MCP server shares mailing lists with its parent project, Apache Solr. +Available lists can be [found here]({filename}/pages/community.md#mailing-lists-chat). + +#### Slack #### + +* The project's main Slack channel is `#solr-mcp` in the `the-asf` organization. + Link: + +## Issue tracker ## + +The Solr MCP Server uses [Github issues](https://github.com/apache/solr-mcp/issues) in its repository for issue tracking. + +## How To Contribute ## + +Looking to contribute to the Solr MCP Server? Read the [CONTRIBUTING.md](https://github.com/apache/solr-mcp/blob/main/CONTRIBUTING.md) instructions and join us. + +## Code of Conduct ## + +For a large and diverse community like ours to be friendly, welcoming and respectful, we recognize the need for some guidelines. The project follows [Apache's Code of Conduct statement](https://www.apache.org/foundation/policies/conduct). Please take some time to read and understand it. + +If you feel there has been a violation of this code, please point out your concerns publicly in a friendly and matter of fact manner. Nonverbal communication is prone to misinterpretation and misunderstanding. Everyone has bad days and sometimes says things they regret later. Someone else's communication style may clash with yours, but the difference can be amicably resolved. After pointing out your concerns please be generous upon receiving an apology. + +Should there be repeated instances of code of conduct violations, or if there is an obvious and severe violation, the Solr PMC may become involved. + +### The Apache Way + +As an Apache project we strive to follow [The Apache Way](http://theapacheway.com/). If you are new to the community or to open source in general, you may benefit from understanding our core values as a community, and why we operate the way we do. + +## Version Control ## + +The project's Git repository is found at https://github.com/apache/solr-mcp or the mirror at https://gitbox.apache.org/repos/asf/solr-mcp.git diff --git a/content/pages/mcp/downloads.md b/content/pages/mcp/downloads.md new file mode 100644 index 0000000000..8e59896a6f --- /dev/null +++ b/content/pages/mcp/downloads.md @@ -0,0 +1,5 @@ +Title: Downloads +URL: mcp/downloads.html +save_as: mcp/downloads.html +template: mcp/downloads + diff --git a/content/pages/mcp/features.md b/content/pages/mcp/features.md new file mode 100644 index 0000000000..6e96e5ecff --- /dev/null +++ b/content/pages/mcp/features.md @@ -0,0 +1,4 @@ +Title: Features +URL: mcp/features.html +save_as: mcp/features.html +template: mcp/features diff --git a/content/pages/mcp/index.md b/content/pages/mcp/index.md new file mode 100644 index 0000000000..b9d9a795c2 --- /dev/null +++ b/content/pages/mcp/index.md @@ -0,0 +1,4 @@ +Title: Welcome +URL: mcp/index.html +save_as: mcp/index.html +template: mcp/index diff --git a/pelicanconf.py b/pelicanconf.py index ee0c7925fc..51d2625b33 100755 --- a/pelicanconf.py +++ b/pelicanconf.py @@ -18,6 +18,10 @@ SOLR_OPERATOR_LATEST_RELEASE_DATE = datetime(2025, 3, 25) SOLR_OPERATOR_PREVIOUS_MAJOR_RELEASE = 'v0.8.1' +SOLR_MCP_LATEST_RELEASE = 'v0.0.0' +#SOLR_MCP_LATEST_RELEASE_DATE = datetime(2025, 3, 25) +#SOLR_MCP_PREVIOUS_MAJOR_RELEASE = 'v0.8.1' + # This string will be appended to all unversioned css and js resources to prevent caching surprises on edits. # The theme's htaccess file also sets a cache-control header with longer lifetime, if the v=XXXX query string is added. STATIC_RESOURCE_SUFFIX = "?v=%s" % dirhash('themes/solr/static', 'sha1')[-8:] diff --git a/themes/solr/static/css/mcp.css b/themes/solr/static/css/mcp.css new file mode 100644 index 0000000000..16ab22b3e8 --- /dev/null +++ b/themes/solr/static/css/mcp.css @@ -0,0 +1,1033 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +html, body { + font-family: 'Helvetica Neue', sans-serif; /* substitute for proxima nova */ + color: #333; +} + +body { + overflow-x:hidden; + pointer-events: none; +} + +body > * { + pointer-events: auto; +} + +.alignleft { + float: left; +} + +.alignright { + float: right; +} + +.container { + padding: 40px 0; +} + +code, pre { + font-family: Menlo, Consolas,"Liberation Mono",Courier,monospace; + color:#4F504D; +} + +code { + font-weight: 500; +} + +/* + * Elements + */ +:focus { + outline: 0; +} + +.offset { + position: relative; + top: -150px; + padding-top: 150px; + margin-bottom: -130px; + z-index: -1000; +} + +.offset-medium { + position: relative; + top: -115px; + padding-top: 115px; + padding-bottom: 0px; + margin-bottom: -115px; + z-index: -1000; +} + +.offset-small { + position: relative; + top: -56px; + padding-top: 112px; + margin-bottom: -56px; + z-index: -1000; +} + +.btn1{ + border: 1px solid #d1d3d4; + background-color:inherit; + text-transform: uppercase; + color:#000; + padding: 0.7em 1em; + font-weight: 500; + margin: 0; +} +.btn1:hover, .btn1:focus { + color:#ff833d; + background:inherit; +} + +div.centered { + text-align: center; + padding-top: 32px; +} + +a.btn, button { + border: 1px solid #d1d3d4; + background-color:inherit; + text-transform: uppercase; + color:#000; + padding: 0.7em 1em; + font-weight: 500; + margin: 0; +} + +a.btn:hover, a.btn:focus, +button:hover, button:focus { + color:#ff833d; + background:inherit; +} + +a.btn.white, +button.white { + color:#fff; +} + +a.btn.white, +button.white:hover { + color:#262130; + background:#fff; +} + +/* + * Header + */ + +.header-section { + position: fixed; + z-index: 999; + min-width: 100%; + background:#865981; +} + +.header-fill { + padding-top: 90px; +} + +.top-bar, .top-bar .name { + background:#865981; + height: 90px; +} + +.top-bar .name .logo { + height: 100%; + position:relative; + left: 15px; + padding: 20px 0 25px 0; +} + +.top-bar-section ul li, .top-bar-section li:not(.has-form) a:not(.button) { + background: #865981; +} + +.top-bar-section li:not(.has-form) a:not(.btn):hover { + background:inherit; + color: #25202f; +} + +.top-bar-section .navigation a.selected { + color: #25202f; +} + +.top-bar-section li:not(.has-form) a.btn:hover, .top-bar-section li:not(.has-form) a.btn:focus { + background:#fff; + color: #25202f; +} + +.top-bar-section ul li>a, +.top-bar-section ul li>a.btn, +.top-bar.shrink.expanded .top-bar-section ul li>a, +.top-bar.shrink.expanded .top-bar-section ul li>a.btn { + padding: 0 10px !important; + transition: all 0.1s ease; + text-transform:uppercase; + font-size:0.92rem; +} + +.top-bar-section ul li>a.btn { + margin: 0; + background-color: transparent; + text-align:left; +} + +.top-bar.expanded .toggle-topbar a { + color:#fff; +} + +.top-bar.expanded .top-bar-section li:not(.has-form) a:not(.btn):hover { + background:#fff; +} + +/* full-width nav styles */ +@media only screen and (min-width: 47.5em) { + .top-bar-section .navigation { + margin: 20px 20px 20px 0; + } + .top-bar .name .logo { + left: 15px; + } + .top-bar .btn { + padding-top: .65rem; + padding-bottom: .55rem; + top: 2px; + text-align:center; + border: 1px solid #fff; + } + .top-bar .btn:hover { + background:#fff; + } +} + +/* shrink header styles */ +.top-bar.shrink, .top-bar.shrink .name, .top-bar.expanded .name { + height: 55px; +} + +.top-bar.shrink.expanded { + height:auto; +} + +.top-bar.shrink .name .logo, .top-bar.expanded .name .logo { + padding: 10px 0 15px 0; +} + +.top-bar.shrink .top-bar-section ul li>a, .top-bar.shrink .top-bar-section ul li>a.btn { + font-size: 0.8em; +} + +.top-bar.shrink .top-bar-section li:not(.has-form) a:not(.button) { + line-height: 35px; +} + +.top-bar.shrink .navigation { + margin: 10px 15px 10px 0; +} + +.top-bar.shrink.expanded .navigation { + margin: 0; +} + +.top-bar.shrink.expanded .top-bar-section li:not(.has-form) a:not(.button) { + line-height: 1.6; +} + +.top-bar.shrink .button { + padding: 10px 20px; +} + +/* + * Global + */ +h1, h2, h3, h4, h5 { + font-family: 'Raleway', 'Helvetica Neue', sans-serif; + font-weight:300; +} + +h1 { + margin-bottom: 20px; + color: #865981; +} + +h2 { + margin-bottom: 0.8em; + color: #865981; +} + +h3 { + color: #666; +} + +h4 { + color: #666; +} + +h5 { + color: #999; +} + +p { + line-height: 1.8em; + color:#262130; +} + +.button { + background-color: #ff833d; + text-transform: uppercase; +} + +.button:hover, +.button:focus, +.button:active { + background-color: #ff5c00; +} + +.annotation { + color: #262130; + text-transform: uppercase; + margin-bottom: 0.8em; + font-weight:400; +} + +/* + * PAGES + */ + +.homepage h1.red { + color: #865981;; +} + +.page h1, .page h2, .page h3 { + font-family: 'Raleway', 'Helvetica Neue', sans-serif; + color: #262130; +} + +.page h1, .subnav h1 , h1.news { + font-weight:300; +} + +.subnav h1 , h1.news { + margin-bottom: 30px; +} + +.subnav h1 , h1.news { + line-height:0.8; +} + +.page h1 small, .subnav h1 small, h1.news small { + font-size:0.4em; + color:#333; +} + +.page h2, .page h3 { + font-weight:500; +} + +.page h2 { + font-size:1.5em; +} + +.page h3 { + font-size:1.4em; +} + +.page p, .page ul li, .page ol li { + color:#333; +} + +.page a { + color: #865981; +} + +.page .date { + color: #865981; + text-transform:uppercase; + font-weight:500; +} + +#resources { + text-align:center; +} + +pre { + white-space:pre-wrap; + overflow:hidden; +} + +/* + * Alternate styles (blue sections) + */ +.alternate .annotation { + color: #865981; +} + +.alternate h1 { + font-weight: 100; + color: #212121; +} + +.alternate h2 { + font-weight: 300; +} + +hr { + margin-bottom: 2em; + color:#e4e2dd; +} + +/* + * Small styles + */ + +.small h1 { + font-size: 2em; +} + +.small h2 { + font-size: 1.6em; +} + +.small h3 { + font-size: 1.4em; +} + +.small h4 { + font-size: 1.2em; +} + +.small h5 { + font-size: 1em; +} + +.small p { + font-size: 0.9em; +} + +/* + * Section styles + */ +section { + padding: 40px 0; + color: #333; + text-align:center; +} + +.artifacthub-widget > section { + padding: 0; +} + +section.gray { + background-color: #f9f8f8; +} + +section.orange { + background-color: #865981; + color: #fff; + padding:60px 0 80px 0; + text-align:center; + position:relative; +} + +section.orange .annotation { + color:#fff; +} + +section.orange h1 { + color: inherit; +} + +section.orange h2 { + color: inherit; +} + +section.orange p { + color:#fff; + font-weight: 300; + font-size: 1.1em; +} + +section.orange .down-arrow { + position: absolute; + left: 50%; +} + +section.orange .down-arrow .red { + color: #ff833c; +} + +section.orange .down-arrow a { + color:#fff; +} + +section.orange.full-width { + margin-left: -100%; + margin-right: -100%; + margin-bottom: 2em; +} + + +/* + * Hero + */ +.hero { + background-color: #262130; + color: #fff; + position:relative; + padding: 100px 0; +} + +.hero h1, +.hero p { + color: #fff; +} + +.hero p { + margin-bottom: 40px; + font-weight: 300; + font-size: 1.1em; +} + +.hero .button { + background-color: #305cb3; +} + +.hero .button:hover, +.hero .button:focus, +.hero .button:active { + background-color: #0045cd; +} + +.hero .down-arrow { + position: absolute; + bottom: -80px; + left: 50%; +} + +.hero .down-arrow .red { + color: #865981; +} + +.hero .down-arrow a { + color:#fff; +} + +.security { + background-color: #FFBF78; + padding-top: 10px; + padding-bottom: 0px; + display: none; +} + +.security a { + color: #262130; +} + +.topnews { + background-color: #59BD81; + padding-top: 15px; + padding-bottom: 0px; + display: none; +} + +.topnews .row p a { + color: #262130; + font-size: larger; +} + +.topnews-operator { + background-color: #59BD81; + padding-top: 15px; + padding-bottom: 0px; + display: none; +} + +.topnews-operator .row p a { + color: #262130; + font-size: larger; +} + +/* + * Footer + */ +footer { + background-color: #262130; + color: #f9f8f8; + padding: 40px 0 20px 0; +} + +footer h4 { + padding-bottom:15px; + text-transform:uppercase; + font-size: 1em; +} + +footer h4, footer ul li a, .page footer ul li a { + color: #f9f8f8; + font-family: 'Raleway', 'Helvetica Neue', sans-serif; +} + +footer ul li a, .page footer ul li a { + font-weight:300; + font-size:0.9em; +} + +footer ul { + list-style: none; + margin-left: 0; +} + +footer .copyright { + padding: 50px 0 40px 0; +} + +footer .copyright p { + color: #bbb; + font-size:0.7em; + text-align:center; +} + +/* + * Gray/white section styles + */ + +.white h1 { + line-height:0.8; +} + +.gray .annotation { + color: #262130; + font-size: 1em; +} + +.gray h1 { + color: #865981; + line-height:0.8; +} + +.gray .box h3 { + color:#000; + font-size:1.4em; + margin-bottom:20px; +} + +.gray .box p { + font-size: 0.9em; + line-height: 1.3em; + color:#333; +} + +.gray .box button { + font-size: 0.75em; + margin-bottom: 0; +} + +.gray .box button:hover { + background-color:inherit; + color:#ff833d; +} + +.gray .box:hover { + background:#fff; + border: 1px solid #333; + cursor:pointer; +} + +.gray .box:hover button { + color:#ff833d; +} + +.gray .box .img { + height:120px; +} + +.gray .box .img img { + height:95px; +} + +.full-width .gray .box { + padding:0; + border:none; +} + +.full-width .gray .box:hover { + border:none; + cursor:default; + background:inherit; +} + +/* box variants */ +.col-4 .box { + margin: 15px; + padding: 5px 5px 15px 5px; + border: solid 1px transparent +} + +.col-4 .box .title { + height: 70px; +} + +.col-3 .box { + margin: 15px; + padding: 20px 20px 30px 20px; + border: solid 1px transparent +} + +.col-3 .box .title { + height: 70px; +} + +[class*="block-grid-"] { + display: flex; + padding: 0; + margin:0; + flex-wrap: wrap; + justify-content: center; +} + +/* + * Solr books + */ +.books { + margin:40px 0; + +} + +.books > div{ + padding-left: 5px; +} + +.powered{ + line-height: 99px; + height: 99px; +} +.powered div{ + line-height: 99px; + height: 99px; + padding-right: 10px; +} + +.powered img{ + vertical-align: middle; + display: inline; +} + +/* + * Slider + * TODO: Not in use + */ +.slider-prev { + left:-25px; + color:#ffa16b; +} + +.slider-next { + right:-25px; + color:#ffa16b; +} + +.slider-prev, .slider-next { + position: absolute; + display: block; + height: 20px; + width: 20px; + cursor: pointer; + top: 50%; + margin-top: -10px; +} + +/* + * FEATURES PAGE + */ +section.list { + padding:80px 0; +} + +section.list { + text-align:left; +} + +section.list ul li { + font-family: 'Raleway', 'Helvetica Neue', sans-serif; + font-weight:300; + color: #333; + font-size: 1.2em; + padding-right:20px; +} + +section.list ul li p { + font-family: 'Helvetica Neue', sans-serif; + font-weight:300; + color: #A13016; + margin-top: 10px; + font-size: 0.8em; +} + +section.list ul li ul { + padding-top: 10px; +} + +section.list ul li ul li { + font-family: 'Helvetica Neue', sans-serif; + font-weight:300; + color: #A13016; + margin-top: 2px; + font-size: 0.96em; +} + + +.anchor-fixed { + top: 57px; + z-index: 1000; + position: fixed; +} + +/* + * Subnav style pages + */ +.sub-nav { + display:inline-block; + margin-bottom:0; +} + +.sub-nav-container { + height: 100px; + width: 1000px; + margin: 0 auto; +} + +.sub-nav-border { + padding: 20px 0; + background: white; + border-top: 1px solid #e4e2dd; + border-bottom: 1px solid #e4e2dd; + margin: 0 auto 30px auto; +} + +.sub-nav dd { + margin-bottom: 0; +} + +.sub-nav dd a { + padding-right: 30px; + padding-left: 15px; + border-right:1px solid #e4e2dd; + position: relative; + z-index: 2000; +} + +.codehilite { + margin: 10px 0; + background-color: #EEEEEE; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 15px; +} + +pre { + line-height:1.5; +} + +ul.breadcrumbs { + background-color:transparent; + border: none; +} + +/* + * Sidebar + */ + +.side-nav { + padding:25px; + border:1px solid #e4e2dd; + margin-bottom:40px; +} + +ul.side-nav > li { + border-top:1px solid #e4e2dd; + padding:10px 0 10px 10px; + margin:0; +} + +.page .side-nav li a { + color:#25202f; + font-weight:300; + font-size: 1.3em; +} + +.page .side-nav li a.active { + color:#865981; +} + +.page .side-nav li a:hover { + color:#865981; +} + +#search form, #search fieldset { + border:none; + padding:0; + margin:0; +} + +.search-box { + display: inline-block; + padding-right: 1em; + position: relative; + width: 150px; + height: 42px; +} + +#search input[type="search"] { + font-family: 'Raleway', 'Helvetica Neue', sans-serif; + font-weight:300; + height: 28px; + width: 135px; + font-size: 12px; + border: none; + box-shadow: none; + position: absolute; + top: 8px; + left: 0px; + padding-right: 26px; +} + +#search input[type="search"]:focus { + background-color: #f9f9f9; +} + +.search-button { + position:absolute; + height:23px; + width:23px; + background-color: transparent !important; + line-height: 23px !important; + padding: 0 !important; + top: 10px; + right: 17px; + margin:0; +} + +.search-button img { + padding:0; + line-height:23px; + margin:0; +} + +.nested-nav { + +} + +ul.breadcrumbs { + margin:0; + padding:0; +} + +ul.breadcrumbs a { + text-transform:none; + font-size:1.2em; +} + +.tutorials .orange { + margin-top: 40px; + margin-bottom:40px; +} + +.float-right { + float: right; +} + +img.float-right { + margin: 5px 0px 10px 10px; +} + + +.poweredby .list ul{ + list-style-type: none; +} + +.wrappable-btn { + border: 1px solid #d1d3d4; + background-color: inherit; + text-transform: uppercase; + color: #000; + padding: 0.25em 0.75em 0.05em 0.47em; + font-weight: 500; + margin: 0; + display: inline-block; + vertical-align: middle; +} +.wrappable-btn:hover, .wrappable-btn:focus { + color: #ff833d; + background: inherit; +} + +.ref-guide-badge { + background-color: #865981; + color: #fff; + display: inline-block; + text-align: center; + font-size: 0.6em; + line-height: 1.1; + font-weight: 500; + vertical-align: middle; + padding: 1px 2px; + margin: 0em 0.50em 0.30em -0.40em; +} +.wrappable-btn:hover .ref-guide-badge, .wrappable-btn:focus .ref-guide-badge { + background-color: #ff833d; +} + +ul li div.box div.img img.resizeable-solr-logo { + max-width:243px; + max-height:123px; + height:auto; + width: 100%; + border:2px solid #CCC +} + +ul li div.box h3.fixed-wrap-point-logo-title { + padding-left:9px; + padding-right:8px; +} + +section h3.asset-download { + text-align: left; + padding-top: 10px; +} + +ul li div.box div.img.logo-container { + padding: 20px; + height: auto; + width: auto; +} +ul li div.box div.img.logo-container.black-background { + background-color:#000; +} +ul li div.box div.img.logo-container.white-background { + background-color:#fff; +} +ul li div.box div.img.logo-container.orange-background { + background-color:#865981; +} +.full-width .gray .box.logo-box { + position: relative; + border: 1px solid #CCC; +} diff --git a/themes/solr/templates/_header.html b/themes/solr/templates/_header.html index b9ae4ae45e..5a7051350c 100644 --- a/themes/solr/templates/_header.html +++ b/themes/solr/templates/_header.html @@ -29,7 +29,10 @@ Project
  • - Solr Operator + K8S Operator +
  • +
  • + MCP
  • + + + +{% include "mcp/_css.html" %} + + + + +{% include "_javascript.html" %} diff --git a/themes/solr/templates/mcp/_header.html b/themes/solr/templates/mcp/_header.html new file mode 100644 index 0000000000..3c38d211ce --- /dev/null +++ b/themes/solr/templates/mcp/_header.html @@ -0,0 +1,39 @@ +
    +
    + +
    +
    + +
    diff --git a/themes/solr/templates/mcp/base.html b/themes/solr/templates/mcp/base.html new file mode 100644 index 0000000000..da0b928a73 --- /dev/null +++ b/themes/solr/templates/mcp/base.html @@ -0,0 +1,46 @@ + + + + {% include "mcp/_head.html" %} + {% block title %}{{ page.title }}{% endblock %} - Apache Solr MCP Server + {% block css %}{% endblock %} + + {% block metakeys %} + + {% endblock %} + {% block ogmeta %} + + + + + + + {% endblock %} + + {% block favicon %} + + + {% endblock %} + {% block rss %}{% endblock %} + {% block javascript %}{% endblock %} + {% include "_matomo.html" %} + + + + {% include "mcp/_header.html" %} + + {% block solr_security_warning %} + {% endblock %} + {% block hero_header %} + {% endblock %} + {% block content %} + {% endblock %} +
    + {% include "mcp/_footer.html" %} +
    + + {% include "_last_scripts.html" %} + + diff --git a/themes/solr/templates/mcp/community.html b/themes/solr/templates/mcp/community.html new file mode 100644 index 0000000000..ab8733470d --- /dev/null +++ b/themes/solr/templates/mcp/community.html @@ -0,0 +1,13 @@ +{% extends "mcp/subnav.html" %} + +{% block subnav_title %}Community{% endblock %} +{% block subnav_subtitle %}Join the active community of Solr MCP Server contributors.{% endblock %} +{% block subnav_nav_items %} +
    Support
    +
    Lists/Chat
    +
    Issues
    +
    Contributing
    +
    Code of Conduct
    +
    Version Control
    +
    Powered By
    +{% endblock %} diff --git a/themes/solr/templates/mcp/downloads.html b/themes/solr/templates/mcp/downloads.html new file mode 100644 index 0000000000..772aa5ee81 --- /dev/null +++ b/themes/solr/templates/mcp/downloads.html @@ -0,0 +1,20 @@ +{% extends "mcp/page.html" %} + +{% block content_inner %} +
    + + +

    {{ page.title }} + +

    + {{ page.content }} +

    This project is incubating and has not made any releases yet.

    +
    +{% endblock content_inner %} diff --git a/themes/solr/templates/mcp/features.html b/themes/solr/templates/mcp/features.html new file mode 100644 index 0000000000..d6f0a6f3dc --- /dev/null +++ b/themes/solr/templates/mcp/features.html @@ -0,0 +1,113 @@ +{% extends "mcp/fullwidth.html" %} + +{% block fullwidth_title %}

    Extension

    {% endblock %} + +{% block hero_header_inner %} +
    +
    + Apache Solr MCP Server {{ SOLR_MCP_LATEST_RELEASE }} +
    +

    + Solr MCP Server Features +

    +

    + The Solr MCP Server is a Model Context Protocol (MCP) server that provides a declarative API for managing Solr Clouds. +

    +
    +
    +{% endblock %} + +{% block content_inner %} +
    + +
    + +
    +
    +
    +
    + Really super MCP server +
    +

    + AI all the way +

    +
    +
    +
    +
    + +
    + +
    + + +
    + +
    + +{{ super() }} +{% endblock content_inner %} diff --git a/themes/solr/templates/mcp/fullwidth.html b/themes/solr/templates/mcp/fullwidth.html new file mode 100644 index 0000000000..e326919d46 --- /dev/null +++ b/themes/solr/templates/mcp/fullwidth.html @@ -0,0 +1,24 @@ +{% extends "mcp/base.html" %} + +{% block hero_header %} +
    +
    + {% block hero_header_inner %} +
    +
    + Apache Solr MCP Server {{ SOLR_MCP_LATEST_RELEASE }} +
    +

    + The Apache Solr MCP Server gives your LLM super powers in managing Solr clusters. +

    + +
    +
    + {% endblock hero_header_inner %} +
    +
    +{% endblock hero_header %} + +{% block content %} +{% block content_inner %}{{ page.content }}{% endblock %} +{% endblock %} diff --git a/themes/solr/templates/mcp/index.html b/themes/solr/templates/mcp/index.html new file mode 100644 index 0000000000..310fc3135c --- /dev/null +++ b/themes/solr/templates/mcp/index.html @@ -0,0 +1,79 @@ +{% extends "mcp/fullwidth.html" %} + +{% block bodyclass %}homepage{% endblock %} + +{% block solr_security_warning %} +{% set latest_sec_articles = (articles | selectattr("category.name", "eq", "solr/security") | list)[:1] %} +{% if (latest_sec_articles | length) > 0 %} +{% set latest_sec_date = latest_sec_articles[0].date | strftime("%Y-%m-%d") %} +
    + +
    +{% endif %} +{% endblock %} + +{% block content_inner %} +
    + +
    +
    +
    +
    +   +
    +

    + Learn more about the Solr MCP Server. +

    +

    + Solr MCP Server gives your LLM Solr superpowers. +

    +
    +
    + +
    + +
    +
    +
    +

    + The Apache Software Foundation +

    +

    + The Apache Software Foundation provides support for the Apache community of open-source software projects. The Apache projects are defined by collaborative consensus based processes, an open, pragmatic software license and a desire to create high quality software that leads the way in its field. Apache Lucene, Apache Solr, Apache PyLucene, Apache Open Relevance Project and their respective logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners. +

    +
    +

    + +

    +
    +
    +
    +{% endblock content_inner %} diff --git a/themes/solr/templates/mcp/page.html b/themes/solr/templates/mcp/page.html new file mode 100644 index 0000000000..845fadbb9b --- /dev/null +++ b/themes/solr/templates/mcp/page.html @@ -0,0 +1,11 @@ +{% extends "mcp/base.html" %} + +{% block content %} +
    + {% block subnav %} + {% endblock %} +
    + {% block content_inner %}{{ page.content }}{% endblock %} +
    +
    +{% endblock %} diff --git a/themes/solr/templates/mcp/subnav.html b/themes/solr/templates/mcp/subnav.html new file mode 100644 index 0000000000..76e81656f7 --- /dev/null +++ b/themes/solr/templates/mcp/subnav.html @@ -0,0 +1,20 @@ +{% extends "mcp/page.html" %} + +{% block subnav %} +
    +
    +

    {% block subnav_title %}{% endblock %}
    + {% block subnav_subtitle %}{% endblock %}

    +
    +
    + +{% endblock %} From 43cd6a97e6cc3bfa9c93b9ffc09ab28c7c790175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20H=C3=B8ydahl?= Date: Mon, 17 Nov 2025 19:29:55 +0100 Subject: [PATCH 02/11] Change to a green theme --- themes/solr/static/css/mcp.css | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/themes/solr/static/css/mcp.css b/themes/solr/static/css/mcp.css index 16ab22b3e8..cf97fd65ca 100644 --- a/themes/solr/static/css/mcp.css +++ b/themes/solr/static/css/mcp.css @@ -137,7 +137,7 @@ button.white:hover { position: fixed; z-index: 999; min-width: 100%; - background:#865981; + background:#2d7a3e; } .header-fill { @@ -145,7 +145,7 @@ button.white:hover { } .top-bar, .top-bar .name { - background:#865981; + background:#2d7a3e; height: 90px; } @@ -157,7 +157,7 @@ button.white:hover { } .top-bar-section ul li, .top-bar-section li:not(.has-form) a:not(.button) { - background: #865981; + background: #2d7a3e; } .top-bar-section li:not(.has-form) a:not(.btn):hover { @@ -265,12 +265,12 @@ h1, h2, h3, h4, h5 { h1 { margin-bottom: 20px; - color: #865981; + color: #2d7a3e; } h2 { margin-bottom: 0.8em; - color: #865981; + color: #2d7a3e; } h3 { @@ -313,7 +313,7 @@ p { */ .homepage h1.red { - color: #865981;; + color: #2d7a3e;; } .page h1, .page h2, .page h3 { @@ -355,11 +355,11 @@ p { } .page a { - color: #865981; + color: #2d7a3e; } .page .date { - color: #865981; + color: #2d7a3e; text-transform:uppercase; font-weight:500; } @@ -374,10 +374,10 @@ pre { } /* - * Alternate styles (blue sections) + * Alternate styles (green sections) */ .alternate .annotation { - color: #865981; + color: #2d7a3e; } .alternate h1 { @@ -440,7 +440,7 @@ section.gray { } section.orange { - background-color: #865981; + background-color: #2d7a3e; color: #fff; padding:60px 0 80px 0; text-align:center; @@ -523,7 +523,7 @@ section.orange.full-width { } .hero .down-arrow .red { - color: #865981; + color: #2d7a3e; } .hero .down-arrow a { @@ -619,7 +619,7 @@ footer .copyright p { } .gray h1 { - color: #865981; + color: #2d7a3e; line-height:0.8; } @@ -874,11 +874,11 @@ ul.side-nav > li { } .page .side-nav li a.active { - color:#865981; + color:#2d7a3e; } .page .side-nav li a:hover { - color:#865981; + color:#2d7a3e; } #search form, #search fieldset { @@ -980,7 +980,7 @@ img.float-right { } .ref-guide-badge { - background-color: #865981; + background-color: #2d7a3e; color: #fff; display: inline-block; text-align: center; @@ -1025,7 +1025,7 @@ ul li div.box div.img.logo-container.white-background { background-color:#fff; } ul li div.box div.img.logo-container.orange-background { - background-color:#865981; + background-color:#2d7a3e; } .full-width .gray .box.logo-box { position: relative; From bfdf55c909229fc54bc26fca06469ceb504e50d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20H=C3=B8ydahl?= Date: Mon, 17 Nov 2025 19:46:51 +0100 Subject: [PATCH 03/11] Add some AI generated initial content for index and features --- themes/solr/templates/mcp/features.html | 197 +++++++++++++++++------- themes/solr/templates/mcp/index.html | 102 ++++++++++-- 2 files changed, 231 insertions(+), 68 deletions(-) diff --git a/themes/solr/templates/mcp/features.html b/themes/solr/templates/mcp/features.html index d6f0a6f3dc..71aad89fdb 100644 --- a/themes/solr/templates/mcp/features.html +++ b/themes/solr/templates/mcp/features.html @@ -1,109 +1,188 @@ {% extends "mcp/fullwidth.html" %} -{% block fullwidth_title %}

    Extension

    {% endblock %} +{% block fullwidth_title %}

    Features

    {% endblock %} {% block hero_header_inner %}
    Apache Solr MCP Server {{ SOLR_MCP_LATEST_RELEASE }}
    -

    - Solr MCP Server Features -

    +

    Powerful MCP Tools for Solr

    - The Solr MCP Server is a Model Context Protocol (MCP) server that provides a declarative API for managing Solr Clouds. + A comprehensive set of AI-ready tools to search, index, and manage your Solr collections. Designed to work seamlessly with Claude and other LLM assistants through the Model Context Protocol.

    -
    +
    {% endblock %} {% block content_inner %} -
    +
    -
      +
      +
      + Search Capabilities +
      +

      Advanced Search Tools

      +

      Execute complex searches with filters, faceting, and pagination—all driven by natural language instructions.

      +
      +
    +
    +
    -
    +
    -
    +
    - Really super MCP server + Indexing & Data Management
    -

    - AI all the way -

    -
    +

    Flexible Document Indexing

    +

    Index documents in multiple formats with automatic field normalization and error handling.

    +
    +
      +
    • +
      +
      +
      +

      Multi-Format Support

      +

      Index documents in JSON, CSV, or XML formats with automatic parsing and validation

      +
      +
      +
    • +
    • +
      +
      +
      +

      Field Normalization

      +

      Automatically sanitize and normalize field names to match Solr's schema requirements

      +
      +
      +
    • +
    • +
      +
      +
      +

      Nested Structure Support

      +

      Handle complex nested documents and multi-valued fields with intelligent flattening

      +
      +
      +
    • +
    +
    -
    +
    +
    +
    +
    + Collection & Schema Management +
    +

    Collection Intelligence

    +

    Introspect and understand your collections and schemas dynamically within your AI workflows.

    +
    +
    -
    - -
    +
    -
      +
      +
      + Platform & Integration +
      +

      Built for Enterprise Deployment

      +

      Deploy with confidence using proven Spring Boot technologies and comprehensive error handling.

      +
      +
    +
    +
    diff --git a/themes/solr/templates/mcp/index.html b/themes/solr/templates/mcp/index.html index 310fc3135c..e219a174c7 100644 --- a/themes/solr/templates/mcp/index.html +++ b/themes/solr/templates/mcp/index.html @@ -19,28 +19,112 @@

    ⚠ There are recent security announcements. R {% block content_inner %}
    +
    + +
    +
    -   + Why Use Solr MCP Server?
    -

    - Learn more about the Solr MCP Server. -

    +

    Empower Your AI with Enterprise Search

    - Solr MCP Server gives your LLM Solr superpowers. + Integrate Apache Solr directly into your AI workflows. Execute complex searches, manage indexes, and analyze your data—all through natural language with an AI assistant.

    -
      +
        +
      • +
        +
        +
        +

        Powerful Search

        +
        +

        Complex queries, filtering, faceting, and pagination through a natural language interface

        +
        +
      • +
      • +
        +
        +
        +

        Flexible Indexing

        +
        +

        Index documents in JSON, CSV, or XML formats with automatic field name normalization

        +
        +
      • +
      • +
        +
        +
        +

        Standards-Based

        +
        +

        Implements the Model Context Protocol specification for seamless AI integration

        +
        +
      • +
      • +
        +
        +
        +

        Multi-Collection

        +
        +

        Manage and query multiple Solr collections and schemas through a unified interface

        +
        +
      • +
      • +
        +
        +
        +

        Easy Deployment

        +
        +

        Deploy as a Docker container, Spring Boot application, or via HTTP/STDIO transports

        +
        +
      • +
      • +
        +
        +
        +

        Enterprise Ready

        +
        +

        Built on proven technologies with comprehensive error handling and logging

        +
        +
      • +
      +
    +
    + +
    +
    +
    +
    + Next Steps +
    +

    Explore the Solr MCP Server

    +
    +
    +
    +
    • Features

      -

      What is included?

      +

      Discover all the capabilities and tools available

      Learn More
    • @@ -49,9 +133,9 @@

      Features

      -

      Solr MCP Server Community

      +

      Community

      -

      Get support and give back. Contribute to the Solr MCP Server project.

      +

      Get support, contribute, and join the conversation

      Learn More
      From f358478fc1066815fa9add988dc1751cc47dddb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20H=C3=B8ydahl?= Date: Tue, 18 Nov 2025 01:53:59 +0100 Subject: [PATCH 04/11] Revert rename of Solr Operator menu --- themes/solr/templates/_header.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/solr/templates/_header.html b/themes/solr/templates/_header.html index 5a7051350c..3c52bd8208 100644 --- a/themes/solr/templates/_header.html +++ b/themes/solr/templates/_header.html @@ -29,7 +29,7 @@ Project
    • - K8S Operator + Solr Operator
    • MCP From bb6a5bc9a58f2119dc773c316ef69d52fd55fade Mon Sep 17 00:00:00 2001 From: adityamparikh Date: Fri, 24 Apr 2026 14:39:47 -0400 Subject: [PATCH 05/11] Restructure MCP site with full documentation content Rewrite the MCP subproject website to contain actual usage content instead of just linking to GitHub, following the SonarQube MCP Server docs pattern. New pages: - Quick Start: step-by-step from zero to working integration - Per-client setup pages (one page each): Claude Desktop, Claude Code, VS Code/Copilot, Cursor, JetBrains, MCP Inspector Each with STDIO and HTTP mode configs. - Security: OAuth2 setup with Auth0 and Keycloak - Observability: LGTM stack traces, metrics, and logs - Resources: documentation links and references Updated pages: - Features: replaced generic cards with tool reference tables, MCP resources table, environment variables reference - Index: added Quick Start and Clients to Next Steps section - Header: added Quick Start, Clients, Resources nav items - Footer: reorganized into Features, Get Started, Resources, Community columns with links to all new pages Fixes: - DOAP: programming-language Go -> Java, category go -> java - pelicanconf: version v0.0.0 -> v1.0.0 Signed-off-by: Aditya Parikh Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: adityamparikh --- content/doap/solr-mcp.rdf | 4 +- content/pages/mcp/clients/claude-code.md | 73 ++++++ content/pages/mcp/clients/claude-desktop.md | 105 ++++++++ content/pages/mcp/clients/cursor.md | 57 +++++ content/pages/mcp/clients/jetbrains.md | 60 +++++ content/pages/mcp/clients/mcp-inspector.md | 54 ++++ content/pages/mcp/clients/vs-code.md | 69 ++++++ content/pages/mcp/observability.md | 114 +++++++++ content/pages/mcp/quick-start.md | 69 ++++++ content/pages/mcp/resources.md | 47 ++++ content/pages/mcp/security.md | 175 +++++++++++++ pelicanconf.py | 2 +- themes/solr/templates/mcp/_footer.html | 44 +++- themes/solr/templates/mcp/_header.html | 19 +- themes/solr/templates/mcp/client.html | 26 ++ themes/solr/templates/mcp/features.html | 246 ++++++++++--------- themes/solr/templates/mcp/index.html | 43 +++- themes/solr/templates/mcp/observability.html | 11 + themes/solr/templates/mcp/quick-start.html | 10 + themes/solr/templates/mcp/resources.html | 9 + themes/solr/templates/mcp/security.html | 10 + 21 files changed, 1092 insertions(+), 155 deletions(-) create mode 100644 content/pages/mcp/clients/claude-code.md create mode 100644 content/pages/mcp/clients/claude-desktop.md create mode 100644 content/pages/mcp/clients/cursor.md create mode 100644 content/pages/mcp/clients/jetbrains.md create mode 100644 content/pages/mcp/clients/mcp-inspector.md create mode 100644 content/pages/mcp/clients/vs-code.md create mode 100644 content/pages/mcp/observability.md create mode 100644 content/pages/mcp/quick-start.md create mode 100644 content/pages/mcp/resources.md create mode 100644 content/pages/mcp/security.md create mode 100644 themes/solr/templates/mcp/client.html create mode 100644 themes/solr/templates/mcp/observability.html create mode 100644 themes/solr/templates/mcp/quick-start.html create mode 100644 themes/solr/templates/mcp/resources.html create mode 100644 themes/solr/templates/mcp/security.html diff --git a/content/doap/solr-mcp.rdf b/content/doap/solr-mcp.rdf index c79815c7ef..40faa36a20 100644 --- a/content/doap/solr-mcp.rdf +++ b/content/doap/solr-mcp.rdf @@ -31,10 +31,10 @@ - Go + Java - + diff --git a/content/pages/mcp/clients/claude-code.md b/content/pages/mcp/clients/claude-code.md new file mode 100644 index 0000000000..b257dd0bae --- /dev/null +++ b/content/pages/mcp/clients/claude-code.md @@ -0,0 +1,73 @@ +Title: Claude Code +URL: mcp/clients/claude-code.html +save_as: mcp/clients/claude-code.html +template: mcp/client + +[Claude Code](https://docs.anthropic.com/en/docs/claude-code) is Anthropic's CLI tool for Claude. It supports MCP servers via the `claude mcp add` command or a `.mcp.json` project file. + +*** + +## STDIO Mode (Recommended) ## + +### CLI ### + +```bash +# Docker +claude mcp add --transport stdio solr-mcp -- \ + docker run -i --rm -e SOLR_URL=http://host.docker.internal:8983/solr/ \ + ghcr.io/apache/solr-mcp:latest + +# JAR +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 +``` + +### `.mcp.json` ### + +Add to your project root: + +```json +{ + "mcpServers": { + "solr-mcp": { + "type": "stdio", + "command": "docker", + "args": ["run", "-i", "--rm", + "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", + "ghcr.io/apache/solr-mcp:latest"] + } + } +} +``` + +*** + +## HTTP Mode ## + +Start the server first (see [Running the Server](https://github.com/apache/solr-mcp#running-the-server)), then: + +### CLI ### + +```bash +claude mcp add --transport http solr-mcp http://localhost:8080/mcp +``` + +### `.mcp.json` ### + +```json +{ + "mcpServers": { + "solr-mcp": { + "type": "http", + "url": "http://localhost:8080/mcp" + } + } +} +``` + +### Secured HTTP (OAuth2) ### + +Claude Code detects the OAuth2 challenge from the server and initiates the authorization flow automatically. The configuration is the same as unsecured HTTP. + +See [Security](/mcp/security.html) for server-side OAuth2 setup. diff --git a/content/pages/mcp/clients/claude-desktop.md b/content/pages/mcp/clients/claude-desktop.md new file mode 100644 index 0000000000..2ce2cab9a1 --- /dev/null +++ b/content/pages/mcp/clients/claude-desktop.md @@ -0,0 +1,105 @@ +Title: Claude Desktop +URL: mcp/clients/claude-desktop.html +save_as: mcp/clients/claude-desktop.html +template: mcp/client + +[Claude Desktop](https://claude.ai/download) is Anthropic's desktop application for Claude. It supports MCP servers via STDIO and HTTP transports. + +### Configuration File + +* **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` +* **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` + +Restart Claude Desktop after any configuration change. + +*** + +## STDIO Mode (Recommended) ## + +STDIO mode communicates via stdin/stdout. This is the simplest setup for local use. + +### Docker ### + +```json +{ + "mcpServers": { + "solr-mcp": { + "command": "docker", + "args": ["run", "-i", "--rm", + "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", + "ghcr.io/apache/solr-mcp:latest"] + } + } +} +``` + +**Linux users**: add `"--add-host=host.docker.internal:host-gateway"` to the `args` array. + +### JAR ### + +```json +{ + "mcpServers": { + "solr-mcp": { + "command": "java", + "args": ["-jar", "/absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar"], + "env": { + "SOLR_URL": "http://localhost:8983/solr/" + } + } + } +} +``` + +Requires Java 25+ and a [built JAR](https://github.com/apache/solr-mcp#running-the-server). + +*** + +## HTTP Mode ## + +HTTP mode connects to a running MCP server via REST endpoints. Start the server first, then configure Claude Desktop to connect using `mcp-remote`. + +### Start the Server ### + +```bash +# Docker +docker run -p 8080:8080 --rm \ + -e PROFILES=http \ + -e SOLR_URL=http://host.docker.internal:8983/solr/ \ + ghcr.io/apache/solr-mcp:latest + +# Or Gradle +PROFILES=http ./gradlew bootRun +``` + +### Configure Claude Desktop ### + +```json +{ + "mcpServers": { + "solr-mcp": { + "command": "npx", + "args": ["mcp-remote", "http://localhost:8080/mcp"] + } + } +} +``` + +### Secured HTTP (OAuth2) ### + +When OAuth2 is enabled on the server, `mcp-remote` handles the authorization flow automatically—it discovers the authorization server and opens a browser for consent. + +```json +{ + "mcpServers": { + "solr-mcp": { + "command": "npx", + "args": ["mcp-remote", "http://localhost:8080/mcp", "--allow-http"] + } + } +} +``` + +The `--allow-http` flag is needed for `http://` URLs (development). Omit it in production with HTTPS. + +See [Security](/mcp/security.html) for server-side OAuth2 setup. diff --git a/content/pages/mcp/clients/cursor.md b/content/pages/mcp/clients/cursor.md new file mode 100644 index 0000000000..2d58abd1ec --- /dev/null +++ b/content/pages/mcp/clients/cursor.md @@ -0,0 +1,57 @@ +Title: Cursor +URL: mcp/clients/cursor.html +save_as: mcp/clients/cursor.html +template: mcp/client + +[Cursor](https://cursor.sh/) supports MCP servers natively via project configuration files or the Cursor Settings UI. + +*** + +## STDIO Mode (Recommended) ## + +### Project Configuration (`.cursor/mcp.json`) ### + +Create `.cursor/mcp.json` in your project root: + +```json +{ + "mcpServers": { + "solr-mcp": { + "command": "docker", + "args": ["run", "-i", "--rm", + "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", + "ghcr.io/apache/solr-mcp:latest"] + } + } +} +``` + +### Cursor Settings UI ### + +1. Open **Cursor Settings** (gear icon or Cmd+, / Ctrl+,) +2. Navigate to **Features** > **MCP Servers** +3. Click **Add New MCP Server** +4. Enter: + * **Name**: `solr-mcp` + * **Type**: `command` + * **Command**: `docker run -i --rm -e SOLR_URL=http://host.docker.internal:8983/solr/ ghcr.io/apache/solr-mcp:latest` + +*** + +## HTTP Mode ## + +Start the server first (see [Running the Server](https://github.com/apache/solr-mcp#running-the-server)), then: + +```json +{ + "mcpServers": { + "solr-mcp": { + "url": "http://localhost:8080/mcp" + } + } +} +``` + +The configuration is the same for secured and unsecured HTTP. Cursor handles the MCP OAuth2 flow automatically. + +See the [Cursor MCP documentation](https://docs.cursor.com/context/model-context-protocol) for the latest configuration format. diff --git a/content/pages/mcp/clients/jetbrains.md b/content/pages/mcp/clients/jetbrains.md new file mode 100644 index 0000000000..78e18ae4bd --- /dev/null +++ b/content/pages/mcp/clients/jetbrains.md @@ -0,0 +1,60 @@ +Title: JetBrains IDEs +URL: mcp/clients/jetbrains.html +save_as: mcp/clients/jetbrains.html +template: mcp/client + +[JetBrains IDEs](https://www.jetbrains.com/) (IntelliJ IDEA, WebStorm, PyCharm, etc.) support MCP servers through the AI Assistant plugin. + +*** + +## STDIO Mode (Recommended) ## + +### Project Configuration (`.junie/mcp.json`) ### + +Create `.junie/mcp.json` in your project root: + +```json +{ + "mcpServers": { + "solr-mcp": { + "command": "docker", + "args": ["run", "-i", "--rm", + "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", + "ghcr.io/apache/solr-mcp:latest"] + } + } +} +``` + +### IDE Settings ### + +1. Open **Settings** (Cmd+, / Ctrl+Alt+S) +2. Navigate to **Tools** > **AI Assistant** > **MCP Servers** +3. Click **Add** (`+`) +4. Configure: + * **Name**: `solr-mcp` + * **Transport**: `STDIO` + * **Command**: `docker` + * **Arguments**: `run -i --rm -e SOLR_URL=http://host.docker.internal:8983/solr/ ghcr.io/apache/solr-mcp:latest` + +*** + +## HTTP Mode ## + +Start the server first (see [Running the Server](https://github.com/apache/solr-mcp#running-the-server)), then: + +```json +{ + "mcpServers": { + "solr-mcp": { + "url": "http://localhost:8080/mcp" + } + } +} +``` + +Or in IDE Settings, select **SSE** transport and enter `http://localhost:8080/mcp` as the URL. + +The configuration is the same for secured and unsecured HTTP. JetBrains IDEs handle the MCP OAuth2 flow automatically. + +MCP support requires the AI Assistant plugin. See the [JetBrains MCP documentation](https://www.jetbrains.com/help/idea/model-context-protocol.html) for the latest configuration format. diff --git a/content/pages/mcp/clients/mcp-inspector.md b/content/pages/mcp/clients/mcp-inspector.md new file mode 100644 index 0000000000..4d721f1d49 --- /dev/null +++ b/content/pages/mcp/clients/mcp-inspector.md @@ -0,0 +1,54 @@ +Title: MCP Inspector +URL: mcp/clients/mcp-inspector.html +save_as: mcp/clients/mcp-inspector.html +template: mcp/client + +The [MCP Inspector](https://github.com/modelcontextprotocol/inspector) is a web-based tool for testing and debugging MCP servers. It lets you browse available tools, invoke them interactively, and inspect responses. + +### Install ### + +```bash +npx @modelcontextprotocol/inspector +``` + +This starts the Inspector UI at `http://localhost:6274`. + +*** + +## HTTP Mode ## + +1. Start the server in HTTP mode: + + # Docker + docker run -p 8080:8080 --rm \ + -e PROFILES=http \ + -e SOLR_URL=http://host.docker.internal:8983/solr/ \ + ghcr.io/apache/solr-mcp:latest + + # Or Gradle + PROFILES=http ./gradlew bootRun + +2. In MCP Inspector, enter: `http://localhost:8080/mcp` +3. Click **Connect** + +*** + +## STDIO Mode ## + +1. In MCP Inspector, select **STDIO** transport +2. **Command**: `docker` +3. **Arguments**: `run -i --rm -e SOLR_URL=http://host.docker.internal:8983/solr/ ghcr.io/apache/solr-mcp:latest` +4. Click **Connect** + +*** + +## OAuth2 ## + +When OAuth2 is enabled on the server, configure the Inspector's OAuth settings before connecting: + +1. Click the **OAuth** settings in the Inspector +2. Enter your provider's Authorization URL, Token URL, Client ID, and Redirect URI (`http://localhost:6274/oauth/callback`) +3. Complete the OAuth flow +4. The Inspector will include the Bearer token in all subsequent requests + +See [Security](/mcp/security.html) for server-side OAuth2 setup with Auth0 and Keycloak. diff --git a/content/pages/mcp/clients/vs-code.md b/content/pages/mcp/clients/vs-code.md new file mode 100644 index 0000000000..0cf50f5b2d --- /dev/null +++ b/content/pages/mcp/clients/vs-code.md @@ -0,0 +1,69 @@ +Title: VS Code / GitHub Copilot +URL: mcp/clients/vs-code.html +save_as: mcp/clients/vs-code.html +template: mcp/client + +[VS Code](https://code.visualstudio.com/) supports MCP servers through built-in MCP support (VS Code 1.99+). Solr MCP tools are available in GitHub Copilot Chat when using Agent mode. + +*** + +## STDIO Mode (Recommended) ## + +### Workspace Configuration (`.vscode/mcp.json`) ### + +Create `.vscode/mcp.json` in your project root: + +```json +{ + "servers": { + "solr-mcp": { + "type": "stdio", + "command": "docker", + "args": ["run", "-i", "--rm", + "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", + "ghcr.io/apache/solr-mcp:latest"] + } + } +} +``` + +### User Settings (`settings.json`) ### + +Open VS Code Settings (JSON) and add: + +```json +{ + "mcp": { + "servers": { + "solr-mcp": { + "type": "stdio", + "command": "docker", + "args": ["run", "-i", "--rm", + "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", + "ghcr.io/apache/solr-mcp:latest"] + } + } + } +} +``` + +*** + +## HTTP Mode ## + +Start the server first (see [Running the Server](https://github.com/apache/solr-mcp#running-the-server)), then: + +```json +{ + "servers": { + "solr-mcp": { + "type": "sse", + "url": "http://localhost:8080/mcp" + } + } +} +``` + +The configuration is the same for secured and unsecured HTTP. VS Code handles the MCP OAuth2 flow automatically. + +See the [VS Code MCP documentation](https://code.visualstudio.com/docs/copilot/chat/mcp-servers) for the latest configuration format. diff --git a/content/pages/mcp/observability.md b/content/pages/mcp/observability.md new file mode 100644 index 0000000000..46da40be58 --- /dev/null +++ b/content/pages/mcp/observability.md @@ -0,0 +1,114 @@ +Title: Observability +URL: mcp/observability.html +save_as: mcp/observability.html +template: mcp/observability + +## Overview ## + +When running in **HTTP mode**, the Solr MCP Server exports telemetry data via OpenTelemetry to the **LGTM stack** (Loki, Grafana, Tempo, Mimir) for full observability. + +| Signal | Backend | What it shows | +|--------|---------|---------------| +| **Traces** | Tempo | Distributed traces for every MCP tool invocation, Solr query, and HTTP request | +| **Metrics** | Mimir/Prometheus | JVM stats, HTTP request rates, Solr query latencies, cache hit ratios | +| **Logs** | Loki | Structured application logs correlated with trace IDs | + +Every MCP tool invocation creates a trace span: search, indexing (JSON, CSV, XML), collection operations (list, stats, health, create), and schema retrieval. All incoming HTTP requests and outgoing Solr calls are automatically traced. + +*** + +## Setup ## + +### Start the LGTM Stack ### + +The project's `compose.yaml` includes a Grafana OTEL LGTM all-in-one container: + +```bash +docker compose up -d +``` + +This starts: + +| Service | URL | Purpose | +|---------|-----|---------| +| Grafana | http://localhost:3000 | Dashboards and exploration (no auth required) | +| OTLP gRPC | localhost:4317 | Trace/metric/log ingestion (gRPC) | +| OTLP HTTP | localhost:4318 | Trace/metric/log ingestion (HTTP) | + +### Run the Server with Observability ### + +```bash +PROFILES=http ./gradlew bootRun +``` + +The server auto-configures OTLP export when the LGTM stack is running. Default configuration: + +```properties +management.tracing.sampling.probability=1.0 # 100% sampling (dev) +otel.exporter.otlp.endpoint=http://localhost:4317 +otel.exporter.otlp.protocol=grpc +``` + +*** + +## Grafana ## + +Open [http://localhost:3000](http://localhost:3000) and click **Explore** in the left sidebar. + +### View Traces (Tempo) ### + +1. Select **Tempo** as the data source +2. Use TraceQL to search: + + {.service.name="solr-mcp"} + +3. Click on a trace to see the span waterfall—each MCP tool invocation, Solr query, and HTTP request is a separate span + +### View Logs (Loki) ### + +1. Select **Loki** as the data source +2. Use LogQL to search: + + {service_name="solr-mcp"} |= "search" + +3. Logs are automatically correlated with trace IDs—click a log line to jump to its trace + +### View Metrics (Prometheus) ### + +1. Select **Prometheus** as the data source +2. Example queries: + + # HTTP request rate + rate(http_server_requests_seconds_count[5m]) + + # JVM memory usage + jvm_memory_used_bytes + + # Request latency (p99) + histogram_quantile(0.99, rate(http_server_requests_seconds_bucket[5m])) + +*** + +## Actuator Endpoints ## + +The following health and metrics endpoints are exposed in HTTP mode: + +```bash +curl http://localhost:8080/actuator/health # Health check +curl http://localhost:8080/actuator/info # Build info +curl http://localhost:8080/actuator/metrics # Available metrics +curl http://localhost:8080/actuator/prometheus # Prometheus scrape endpoint +curl http://localhost:8080/actuator/loggers # Logger levels +``` + +*** + +## Production Configuration ## + +For production, reduce the sampling rate and configure the OTLP endpoint for your collector: + +```bash +export OTEL_SAMPLING_PROBABILITY=0.1 # 10% sampling +export OTEL_TRACES_URL=https://otel-collector.example.com:4317 +PROFILES=http java -jar build/libs/solr-mcp-1.0.0-SNAPSHOT.jar +``` diff --git a/content/pages/mcp/quick-start.md b/content/pages/mcp/quick-start.md new file mode 100644 index 0000000000..e7906267dc --- /dev/null +++ b/content/pages/mcp/quick-start.md @@ -0,0 +1,69 @@ +Title: Quick Start +URL: mcp/quick-start.html +save_as: mcp/quick-start.html +template: mcp/quick-start + +## Prerequisites ## + +* [Docker](https://docs.docker.com/get-docker/) and Docker Compose +* An MCP client — this guide uses [Claude Desktop](https://claude.ai/download), but any MCP-compatible client works. See [Adding to AI Clients](/mcp/clients/claude-desktop.html) for other options. + +## Start Solr with Sample Data ## + +Clone the repository and start Solr in SolrCloud mode: + +```bash +git clone https://github.com/apache/solr-mcp.git +cd solr-mcp +docker compose up -d +``` + +This starts Solr with ZooKeeper and creates two sample collections pre-loaded with data: + +* **films** — 1,100+ movie records with titles, directors, genres, and release dates +* **books** — empty collection ready for indexing + +Wait ~30 seconds for Solr to fully initialize. Verify at [http://localhost:8983/solr/](http://localhost:8983/solr/). + +## Configure Your MCP Client ## + +Add the following to your Claude Desktop configuration file: + +* **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` +* **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` + +```json +{ + "mcpServers": { + "solr-mcp": { + "command": "docker", + "args": ["run", "-i", "--rm", + "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", + "ghcr.io/apache/solr-mcp:latest"] + } + } +} +``` + +Restart Claude Desktop after saving. + +**Linux users**: add `--add-host=host.docker.internal:host-gateway` to the args array to connect to Solr on the host machine. + +## Try It Out ## + +Open Claude Desktop and try these prompts: + +* *"Search the films collection for movies directed by Steven Spielberg"* +* *"What collections are available in Solr?"* +* *"Show me the schema for the films collection"* +* *"Find all sci-fi movies released after 2000 and show the genre breakdown"* +* *"Index this JSON into the books collection: [{"id": "1", "title": "The Great Gatsby", "author": "F. Scott Fitzgerald"}]"* + +*** + +## Next Steps ## + +* **[Adding to AI Clients](/mcp/clients/claude-desktop.html)** — configure Claude Code, VS Code, Cursor, JetBrains, or MCP Inspector +* **[Features](/mcp/features.html)** — explore all available tools and resources +* **[Security](/mcp/security.html)** — set up OAuth2 authentication for HTTP mode +* **[Observability](/mcp/observability.html)** — enable tracing, metrics, and logging diff --git a/content/pages/mcp/resources.md b/content/pages/mcp/resources.md new file mode 100644 index 0000000000..a618257d71 --- /dev/null +++ b/content/pages/mcp/resources.md @@ -0,0 +1,47 @@ +Title: Resources +URL: mcp/resources.html +save_as: mcp/resources.html +template: mcp/resources + +## Guides ## + +* **[Quick Start](/mcp/quick-start.html)** — get from zero to a working AI + Solr integration in under 2 minutes +* **[Security (OAuth2)](/mcp/security.html)** — Auth0 and Keycloak setup for HTTP mode +* **[Observability](/mcp/observability.html)** — traces, metrics, and logs via the LGTM stack + +## Documentation ## + +* [README](https://github.com/apache/solr-mcp#readme) — quick start, client configurations, and usage overview +* [CONTRIBUTING](https://github.com/apache/solr-mcp/blob/main/CONTRIBUTING.md) — pull request process and commit conventions +* [Architecture](https://github.com/apache/solr-mcp/blob/main/dev-docs/ARCHITECTURE.md) — project structure and design decisions +* [Development Guide](https://github.com/apache/solr-mcp/blob/main/dev-docs/DEVELOPMENT.md) — build system, testing, and IDE setup +* [Auth0 Setup](https://github.com/apache/solr-mcp/blob/main/security-docs/AUTH0_SETUP.md) — detailed OAuth2 setup with Auth0 +* [Keycloak Setup](https://github.com/apache/solr-mcp/blob/main/dev-docs/KEYCLOAK_SETUP.md) — detailed OAuth2 setup with Keycloak + +*** + +## References ## + +### MCP Protocol ### + +* [Model Context Protocol Specification](https://spec.modelcontextprotocol.io/) +* [MCP GitHub Organization](https://github.com/modelcontextprotocol) +* [MCP Inspector](https://github.com/modelcontextprotocol/inspector) + +### Spring AI MCP ### + +* [Spring AI MCP Server (Spring Boot)](https://docs.spring.io/spring-ai/reference/api/mcp/mcp-server-boot.html) +* [Spring AI MCP Project](https://spring.io/projects/spring-ai) +* [Spring AI Community MCP Security](https://github.com/spring-ai-community/mcp-security) + +### Apache Solr ### + +* [Apache Solr Documentation](https://solr.apache.org/guide/) +* [SolrJ Client Library](https://solr.apache.org/guide/solr/latest/deployment-guide/solrj.html) + +### Tools and Libraries ### + +* [Jib (Docker image builder)](https://github.com/GoogleContainerTools/jib) +* [Testcontainers](https://www.testcontainers.org/) +* [OpenTelemetry](https://opentelemetry.io/) +* [Grafana LGTM Stack](https://github.com/grafana/docker-otel-lgtm) diff --git a/content/pages/mcp/security.md b/content/pages/mcp/security.md new file mode 100644 index 0000000000..1c6b5aa617 --- /dev/null +++ b/content/pages/mcp/security.md @@ -0,0 +1,175 @@ +Title: Security +URL: mcp/security.html +save_as: mcp/security.html +template: mcp/security + +## Overview ## + +When running in HTTP mode, the Solr MCP Server supports **OAuth2 authentication** with JWT token validation. Security is **disabled by default** and must be explicitly enabled. + +* **Protocol**: OAuth2 Resource Server with JWT validation +* **Supported providers**: Auth0, Keycloak, Okta, or any OAuth2/OIDC provider +* **STDIO mode**: Security is not applicable (OS-level process isolation) +* **HTTP mode**: Optional, enabled with `SECURITY_ENABLED=true` + +### Enable Security ### + +```bash +export PROFILES=http +export SECURITY_ENABLED=true +export OAUTH2_ISSUER_URI=https://your-provider.example.com/ +./gradlew bootRun +``` + +Or with Docker: + +```bash +docker run -p 8080:8080 --rm \ + -e PROFILES=http \ + -e SECURITY_ENABLED=true \ + -e OAUTH2_ISSUER_URI=https://your-provider.example.com/ \ + -e SOLR_URL=http://host.docker.internal:8983/solr/ \ + ghcr.io/apache/solr-mcp:latest +``` + +*** + +## Auth0 ## + +### 1. Create Auth0 Application ### + +1. Go to [Auth0 Dashboard](https://manage.auth0.com/) > **Applications** > **Create Application** +2. Name: `Solr MCP Server` +3. Type: **Machine to Machine Applications** +4. Note your **Domain**, **Client ID**, and **Client Secret** + +### 2. Create Auth0 API ### + +1. Navigate to **Applications** > **APIs** > **Create API** +2. Name: `Solr MCP API` +3. Identifier (audience): `https://solr-mcp-api` +4. Signing Algorithm: **RS256** + +### 3. Configure Callback URLs ### + +In your application settings, add to **Allowed Callback URLs**: + + http://localhost:6274/oauth/callback,http://localhost:3334/oauth/callback,http://localhost:8080/login/oauth2/code/auth0 + +Each callback URL serves a different client: + +* `http://localhost:6274/oauth/callback` — MCP Inspector +* `http://localhost:3334/oauth/callback` — `mcp-remote` (Claude Desktop, VS Code, Cursor, JetBrains in HTTP mode) +* `http://localhost:8080/login/oauth2/code/auth0` — Direct server OAuth2 code flow + +### 4. Run the Server ### + +```bash +export PROFILES=http +export SECURITY_ENABLED=true +export OAUTH2_ISSUER_URI=https://your-tenant.auth0.com/ +./gradlew bootRun +``` + +### 5. Get an Access Token ### + +```bash +curl --request POST \ + --url https://your-tenant.auth0.com/oauth/token \ + --header 'content-type: application/json' \ + --data '{ + "client_id": "YOUR_CLIENT_ID", + "client_secret": "YOUR_CLIENT_SECRET", + "audience": "https://solr-mcp-api", + "grant_type": "client_credentials" + }' +``` + +Or use the convenience script: + +```bash +./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 +``` + +### 6. Use the Token ### + +```bash +curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ + http://localhost:8080/mcp +``` + +For the full step-by-step guide, see [Auth0 Setup Guide](https://github.com/apache/solr-mcp/blob/main/security-docs/AUTH0_SETUP.md). + +*** + +## Keycloak ## + +### 1. Start Keycloak ### + +```bash +docker run -d --name keycloak \ + -p 8180:8080 \ + -e KC_BOOTSTRAP_ADMIN_USERNAME=admin \ + -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \ + quay.io/keycloak/keycloak:26.0 start-dev +``` + +Access the admin console at `http://localhost:8180` (login: `admin` / `admin`). + +### 2. Create Realm and Client ### + +1. Create realm: `solr-mcp` +2. Create client: + * Client ID: `solr-mcp-client` + * Client type: OpenID Connect + * Client authentication: OFF (public client) + * Valid redirect URIs: `http://localhost:6274/*`, `http://localhost:3334/*`, `http://localhost:8080/*` + * Web origins: `*` + +### 3. Create Test User ### + +1. Navigate to **Users** > **Add user** +2. Username: `testuser`, Email verified: ON +3. Set password in **Credentials** tab + +### 4. Run the Server ### + +```bash +export PROFILES=http +export SECURITY_ENABLED=true +export OAUTH2_ISSUER_URI=http://localhost:8180/realms/solr-mcp +./gradlew bootRun +``` + +### 5. Get a Token ### + +```bash +curl -X POST "http://localhost:8180/realms/solr-mcp/protocol/openid-connect/token" \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -d "client_id=solr-mcp-client" \ + -d "username=testuser" \ + -d "password=yourpassword" \ + -d "grant_type=password" +``` + +For the full guide including role-based access control and production deployment, see [Keycloak Setup Guide](https://github.com/apache/solr-mcp/blob/main/dev-docs/KEYCLOAK_SETUP.md). + +*** + +## How OAuth2 Works with MCP Clients ## + +When a client connects to a secured Solr MCP Server: + +1. Client connects to `/mcp` +2. Server responds with `401` + OAuth2 metadata +3. Client discovers the authorization server from `/.well-known/oauth-authorization-server` +4. Client opens a browser for login/consent +5. Client receives an authorization code, exchanges it for an access token (JWT) +6. Client attaches the Bearer token to all subsequent MCP requests +7. Server validates the JWT with the OAuth2 provider + +Most MCP clients handle this flow transparently—the configuration is the same for secured and unsecured HTTP servers. See the individual [client setup pages](/mcp/clients/claude-desktop.html) for details. diff --git a/pelicanconf.py b/pelicanconf.py index 51d2625b33..2559ddec1c 100755 --- a/pelicanconf.py +++ b/pelicanconf.py @@ -18,7 +18,7 @@ SOLR_OPERATOR_LATEST_RELEASE_DATE = datetime(2025, 3, 25) SOLR_OPERATOR_PREVIOUS_MAJOR_RELEASE = 'v0.8.1' -SOLR_MCP_LATEST_RELEASE = 'v0.0.0' +SOLR_MCP_LATEST_RELEASE = 'v1.0.0' #SOLR_MCP_LATEST_RELEASE_DATE = datetime(2025, 3, 25) #SOLR_MCP_PREVIOUS_MAJOR_RELEASE = 'v0.8.1' diff --git a/themes/solr/templates/mcp/_footer.html b/themes/solr/templates/mcp/_footer.html index 97d24cb9a8..6b1c9da465 100644 --- a/themes/solr/templates/mcp/_footer.html +++ b/themes/solr/templates/mcp/_footer.html @@ -2,26 +2,52 @@ + + -
    diff --git a/themes/solr/templates/mcp/_header.html b/themes/solr/templates/mcp/_header.html index 3c38d211ce..0f0b16dc99 100644 --- a/themes/solr/templates/mcp/_header.html +++ b/themes/solr/templates/mcp/_header.html @@ -14,21 +14,22 @@ Features
  • - Downloads + Quick Start +
  • +
  • + Clients +
  • +
  • + Resources
  • Community
  • -
  • - ᐱ Solr TLP + ▲ Solr TLP
  • diff --git a/themes/solr/templates/mcp/client.html b/themes/solr/templates/mcp/client.html new file mode 100644 index 0000000000..52c825397e --- /dev/null +++ b/themes/solr/templates/mcp/client.html @@ -0,0 +1,26 @@ +{% extends "mcp/page.html" %} + +{% block content_inner %} +
    + + +

    {{ page.title }}

    + +

    + All clients: + Claude Desktop · + Claude Code · + VS Code / Copilot · + Cursor · + JetBrains · + MCP Inspector +

    + + {{ page.content }} +
    +{% endblock content_inner %} diff --git a/themes/solr/templates/mcp/features.html b/themes/solr/templates/mcp/features.html index 71aad89fdb..f6950d4a4a 100644 --- a/themes/solr/templates/mcp/features.html +++ b/themes/solr/templates/mcp/features.html @@ -9,135 +9,155 @@

    Powerful MCP Tools for Solr

    - A comprehensive set of AI-ready tools to search, index, and manage your Solr collections. Designed to work seamlessly with Claude and other LLM assistants through the Model Context Protocol. + 9 tools and 2 resources that let AI assistants search, index, and manage your Solr collections through natural language.

    -
    +
    {% endblock %} {% block content_inner %} -
    + +
    -
    - Search Capabilities -
    -

    Advanced Search Tools

    -

    Execute complex searches with filters, faceting, and pagination—all driven by natural language instructions.

    +
    MCP Tools
    +

    Tool Reference

    +

    Each tool is callable by any MCP-compatible AI client. The AI translates natural language into the right tool calls automatically.

    +
    -
      -
    • -
      -
      -
      -

      Full-Text Search

      -

      Execute complex search queries across your collections with support for boolean operators and phrase queries

      -
      -
      -
    • -
    • -
      -
      -
      -

      Flexible Filtering

      -

      Filter results by field values with support for ranges, wildcards, and complex filter queries

      -
      -
      -
    • -
    • -
      -
      -
      -

      Faceted Search

      -

      Get faceted counts across dimensions to power AI-driven analytics and categorization

      -
      -
      -
    • -
    +
    + + + + + + + + + + +
    ToolDescription
    searchFull-text search with filtering, faceting, sorting, and pagination. Accepts query strings, filter queries, facet fields, sort clauses, start offset, and row count.
    + +

    Indexing

    + + + + + + + + + + + + + + + + +
    ToolDescription
    index-json-documentsIndex documents from a JSON array string. Handles batch processing (1,000 per batch), field name sanitization, and automatic commits.
    index-csv-documentsIndex documents from a CSV string. First row is used as headers. Same batch processing and field normalization.
    index-xml-documentsIndex documents from a Solr XML string (<add><doc>...).
    + +

    Collections

    + + + + + + + + + + + + + + + + + + + + +
    ToolDescription
    list-collectionsList all available Solr collections in the cluster.
    get-collection-statsComprehensive metrics: index stats, query performance, cache hit ratios, handler throughput.
    check-healthHealth check returning status, document count, and responsiveness.
    create-collectionCreate a new collection with configurable shards, replicas, and configset. Defaults: _default configset, 1 shard, 1 replica.
    + +

    Schema

    + + + + + + + + +
    ToolDescription
    get-schemaRetrieve the complete schema definition: field definitions, field types, dynamic fields, copy fields, unique key, and schema attributes.
    + +
    -
    +
    -
    - Indexing & Data Management -
    -

    Flexible Document Indexing

    -

    Index documents in multiple formats with automatic field normalization and error handling.

    +
    MCP Resources
    +

    Read-Only Data

    +

    MCP Resources provide data that clients can access directly without calling a tool. The schema resource supports autocompletion for collection names.

    +
    -
      -
    • -
      -
      -
      -

      Multi-Format Support

      -

      Index documents in JSON, CSV, or XML formats with automatic parsing and validation

      -
      -
      -
    • -
    • -
      -
      -
      -

      Field Normalization

      -

      Automatically sanitize and normalize field names to match Solr's schema requirements

      -
      -
      -
    • -
    • -
      -
      -
      -

      Nested Structure Support

      -

      Handle complex nested documents and multi-valued fields with intelligent flattening

      -
      -
      -
    • -
    +
    + + + + + + + + + + + + +
    Resource URIDescription
    solr://collectionsList of all Solr collections available in the cluster.
    solr://{collection}/schemaSchema definition for a specific collection. Supports autocompletion—MCP clients can query for available collection names.
    +
    -
    +
    -
    - Collection & Schema Management -
    -

    Collection Intelligence

    -

    Introspect and understand your collections and schemas dynamically within your AI workflows.

    +
    Platform
    +

    Enterprise-Ready Infrastructure

    • -
      +
      -

      Collection Discovery

      -

      List and inspect all available collections in your Solr instance

      +

      STDIO & HTTP Transports

      +

      STDIO for local AI clients (Claude Desktop). HTTP for remote access, multi-client, and MCP Inspector.

    • -
      +
      -

      Schema Introspection

      -

      Dynamically discover field types, analyzers, and schema configuration for intelligent indexing

      +

      OAuth2 Security

      +

      JWT validation with Auth0, Keycloak, or any OAuth2/OIDC provider. Setup guide →

    • -
      +
      -

      Field Metadata

      -

      Access detailed field information including type, analysis chains, and configuration

      +

      Observability

      +

      OpenTelemetry traces, Prometheus metrics, structured logs via LGTM stack. Learn more →

    • @@ -145,46 +165,28 @@

      Field Metadata

    -
    +
    -
    - Platform & Integration -
    -

    Built for Enterprise Deployment

    -

    Deploy with confidence using proven Spring Boot technologies and comprehensive error handling.

    +
    Configuration
    +

    Environment Variables

    +
    -
      -
    • -
      -
      -
      -

      Standards Compliance

      -

      Full implementation of the Model Context Protocol specification for AI assistant integration

      -
      -
      -
    • -
    • -
      -
      -
      -

      Multiple Transports

      -

      Run in STDIO mode for Claude Desktop or HTTP mode for remote deployments and testing

      -
      -
      -
    • -
    • -
      -
      -
      -

      Error Handling

      -

      Comprehensive error reporting and validation ensures clear feedback to AI assistants

      -
      -
      -
    • -
    +
    + + + + + + + + + + +
    VariableDescriptionDefault
    SOLR_URLSolr base URLhttp://localhost:8983/solr/
    PROFILESTransport mode: stdio or httpstdio
    SECURITY_ENABLEDEnable OAuth2 authentication (HTTP only)false
    OAUTH2_ISSUER_URIOAuth2 issuer URL (Auth0, Keycloak, Okta)
    OTEL_SAMPLING_PROBABILITYTracing sampling rate (0.0–1.0)1.0
    OTEL_TRACES_URLOTLP collector endpointhttp://localhost:4317
    +
    diff --git a/themes/solr/templates/mcp/index.html b/themes/solr/templates/mcp/index.html index e219a174c7..d9ce9233a8 100644 --- a/themes/solr/templates/mcp/index.html +++ b/themes/solr/templates/mcp/index.html @@ -118,25 +118,44 @@

    Explore the Solr MCP Server

    + + +
  • + +
    +
    +

    AI Clients

    +

    Claude, VS Code, Cursor, JetBrains

    + Configure +
    +
  • -
    -

    Community

    -
    -

    Get support, contribute, and join the conversation

    - Learn More +

    Community

    +

    Get support and contribute

    + Join
  • diff --git a/themes/solr/templates/mcp/observability.html b/themes/solr/templates/mcp/observability.html new file mode 100644 index 0000000000..3b38952361 --- /dev/null +++ b/themes/solr/templates/mcp/observability.html @@ -0,0 +1,11 @@ +{% extends "mcp/subnav.html" %} + +{% block subnav_title %}Observability{% endblock %} +{% block subnav_subtitle %}Traces, metrics, and logs for the Solr MCP Server via the LGTM stack.{% endblock %} +{% block subnav_nav_items %} +
    Overview
    +
    Setup
    +
    Grafana
    +
    Actuator
    +
    Production
    +{% endblock %} diff --git a/themes/solr/templates/mcp/quick-start.html b/themes/solr/templates/mcp/quick-start.html new file mode 100644 index 0000000000..50136f7900 --- /dev/null +++ b/themes/solr/templates/mcp/quick-start.html @@ -0,0 +1,10 @@ +{% extends "mcp/subnav.html" %} + +{% block subnav_title %}Quick Start{% endblock %} +{% block subnav_subtitle %}Get from zero to a working AI + Solr integration in under 2 minutes.{% endblock %} +{% block subnav_nav_items %} +
    Prerequisites
    +
    Start Solr
    +
    Configure Client
    +
    Try It
    +{% endblock %} diff --git a/themes/solr/templates/mcp/resources.html b/themes/solr/templates/mcp/resources.html new file mode 100644 index 0000000000..6b71a8ff84 --- /dev/null +++ b/themes/solr/templates/mcp/resources.html @@ -0,0 +1,9 @@ +{% extends "mcp/subnav.html" %} + +{% block subnav_title %}Resources{% endblock %} +{% block subnav_subtitle %}Documentation, guides, and references for the Solr MCP Server.{% endblock %} +{% block subnav_nav_items %} +
    Guides
    +
    Documentation
    +
    References
    +{% endblock %} diff --git a/themes/solr/templates/mcp/security.html b/themes/solr/templates/mcp/security.html new file mode 100644 index 0000000000..1abcf56c65 --- /dev/null +++ b/themes/solr/templates/mcp/security.html @@ -0,0 +1,10 @@ +{% extends "mcp/subnav.html" %} + +{% block subnav_title %}Security{% endblock %} +{% block subnav_subtitle %}OAuth2 authentication for the Solr MCP Server in HTTP mode.{% endblock %} +{% block subnav_nav_items %} +
    Overview
    +
    Auth0
    +
    Keycloak
    +
    How It Works
    +{% endblock %} From 68fddcf2956146e58a42013aded82217f976cfd8 Mon Sep 17 00:00:00 2001 From: adityamparikh Date: Fri, 24 Apr 2026 14:50:33 -0400 Subject: [PATCH 06/11] Use JAR-first ordering, local Docker images only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reorder all client configs to show JAR setup first (ATR release path) and local Docker images second. Remove all ghcr.io references — use solr-mcp:latest built locally via ./gradlew jibDockerBuild. Applies to: quick-start, all 6 client pages, security page. Signed-off-by: Aditya Parikh Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: adityamparikh --- content/pages/mcp/clients/claude-code.md | 29 ++++++++++++--- content/pages/mcp/clients/claude-desktop.md | 41 ++++++++++++--------- content/pages/mcp/clients/cursor.md | 20 +++++++++- content/pages/mcp/clients/jetbrains.md | 22 +++++++++-- content/pages/mcp/clients/mcp-inspector.md | 17 +++++---- content/pages/mcp/clients/vs-code.md | 26 ++++++++++--- content/pages/mcp/quick-start.md | 37 +++++++++++++++++-- content/pages/mcp/security.md | 4 +- 8 files changed, 149 insertions(+), 47 deletions(-) diff --git a/content/pages/mcp/clients/claude-code.md b/content/pages/mcp/clients/claude-code.md index b257dd0bae..4d6340d180 100644 --- a/content/pages/mcp/clients/claude-code.md +++ b/content/pages/mcp/clients/claude-code.md @@ -12,21 +12,38 @@ template: mcp/client ### CLI ### ```bash -# Docker -claude mcp add --transport stdio solr-mcp -- \ - docker run -i --rm -e SOLR_URL=http://host.docker.internal:8983/solr/ \ - ghcr.io/apache/solr-mcp:latest - # JAR 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 + +# Docker (local image — build first with ./gradlew jibDockerBuild) +claude mcp add --transport stdio solr-mcp -- \ + docker run -i --rm -e SOLR_URL=http://host.docker.internal:8983/solr/ \ + solr-mcp:latest ``` ### `.mcp.json` ### Add to your project root: +**JAR:** + +```json +{ + "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/" } + } + } +} +``` + +**Docker (local image):** + ```json { "mcpServers": { @@ -35,7 +52,7 @@ Add to your project root: "command": "docker", "args": ["run", "-i", "--rm", "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", - "ghcr.io/apache/solr-mcp:latest"] + "solr-mcp:latest"] } } } diff --git a/content/pages/mcp/clients/claude-desktop.md b/content/pages/mcp/clients/claude-desktop.md index 2ce2cab9a1..e849131d02 100644 --- a/content/pages/mcp/clients/claude-desktop.md +++ b/content/pages/mcp/clients/claude-desktop.md @@ -18,40 +18,42 @@ Restart Claude Desktop after any configuration change. STDIO mode communicates via stdin/stdout. This is the simplest setup for local use. -### Docker ### +### JAR ### + +Requires Java 25+ and a [built JAR](https://github.com/apache/solr-mcp#running-the-server) (`./gradlew build`). ```json { "mcpServers": { "solr-mcp": { - "command": "docker", - "args": ["run", "-i", "--rm", - "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", - "ghcr.io/apache/solr-mcp:latest"] + "command": "java", + "args": ["-jar", "/absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar"], + "env": { + "SOLR_URL": "http://localhost:8983/solr/" + } } } } ``` -**Linux users**: add `"--add-host=host.docker.internal:host-gateway"` to the `args` array. +### Docker (local image) ### -### JAR ### +Build the image first: `./gradlew jibDockerBuild` ```json { "mcpServers": { "solr-mcp": { - "command": "java", - "args": ["-jar", "/absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar"], - "env": { - "SOLR_URL": "http://localhost:8983/solr/" - } + "command": "docker", + "args": ["run", "-i", "--rm", + "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", + "solr-mcp:latest"] } } } ``` -Requires Java 25+ and a [built JAR](https://github.com/apache/solr-mcp#running-the-server). +**Linux users**: add `"--add-host=host.docker.internal:host-gateway"` to the `args` array. *** @@ -62,14 +64,17 @@ HTTP mode connects to a running MCP server via REST endpoints. Start the server ### Start the Server ### ```bash -# Docker -docker run -p 8080:8080 --rm \ - -e PROFILES=http \ - -e SOLR_URL=http://host.docker.internal:8983/solr/ \ - ghcr.io/apache/solr-mcp:latest +# JAR +PROFILES=http java -jar build/libs/solr-mcp-1.0.0-SNAPSHOT.jar # Or Gradle PROFILES=http ./gradlew bootRun + +# Or Docker (local image) +docker run -p 8080:8080 --rm \ + -e PROFILES=http \ + -e SOLR_URL=http://host.docker.internal:8983/solr/ \ + solr-mcp:latest ``` ### Configure Claude Desktop ### diff --git a/content/pages/mcp/clients/cursor.md b/content/pages/mcp/clients/cursor.md index 2d58abd1ec..e07a374971 100644 --- a/content/pages/mcp/clients/cursor.md +++ b/content/pages/mcp/clients/cursor.md @@ -13,6 +13,22 @@ template: mcp/client Create `.cursor/mcp.json` in your project root: +**JAR:** + +```json +{ + "mcpServers": { + "solr-mcp": { + "command": "java", + "args": ["-jar", "/absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar"], + "env": { "SOLR_URL": "http://localhost:8983/solr/" } + } + } +} +``` + +**Docker (local image — build first with `./gradlew jibDockerBuild`):** + ```json { "mcpServers": { @@ -20,7 +36,7 @@ Create `.cursor/mcp.json` in your project root: "command": "docker", "args": ["run", "-i", "--rm", "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", - "ghcr.io/apache/solr-mcp:latest"] + "solr-mcp:latest"] } } } @@ -34,7 +50,7 @@ Create `.cursor/mcp.json` in your project root: 4. Enter: * **Name**: `solr-mcp` * **Type**: `command` - * **Command**: `docker run -i --rm -e SOLR_URL=http://host.docker.internal:8983/solr/ ghcr.io/apache/solr-mcp:latest` + * **Command**: `java -jar /absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar` *** diff --git a/content/pages/mcp/clients/jetbrains.md b/content/pages/mcp/clients/jetbrains.md index 78e18ae4bd..44887de935 100644 --- a/content/pages/mcp/clients/jetbrains.md +++ b/content/pages/mcp/clients/jetbrains.md @@ -13,6 +13,22 @@ template: mcp/client Create `.junie/mcp.json` in your project root: +**JAR:** + +```json +{ + "mcpServers": { + "solr-mcp": { + "command": "java", + "args": ["-jar", "/absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar"], + "env": { "SOLR_URL": "http://localhost:8983/solr/" } + } + } +} +``` + +**Docker (local image — build first with `./gradlew jibDockerBuild`):** + ```json { "mcpServers": { @@ -20,7 +36,7 @@ Create `.junie/mcp.json` in your project root: "command": "docker", "args": ["run", "-i", "--rm", "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", - "ghcr.io/apache/solr-mcp:latest"] + "solr-mcp:latest"] } } } @@ -34,8 +50,8 @@ Create `.junie/mcp.json` in your project root: 4. Configure: * **Name**: `solr-mcp` * **Transport**: `STDIO` - * **Command**: `docker` - * **Arguments**: `run -i --rm -e SOLR_URL=http://host.docker.internal:8983/solr/ ghcr.io/apache/solr-mcp:latest` + * **Command**: `java` + * **Arguments**: `-jar /absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar` *** diff --git a/content/pages/mcp/clients/mcp-inspector.md b/content/pages/mcp/clients/mcp-inspector.md index 4d721f1d49..0d2239f67f 100644 --- a/content/pages/mcp/clients/mcp-inspector.md +++ b/content/pages/mcp/clients/mcp-inspector.md @@ -19,15 +19,18 @@ This starts the Inspector UI at `http://localhost:6274`. 1. Start the server in HTTP mode: - # Docker - docker run -p 8080:8080 --rm \ - -e PROFILES=http \ - -e SOLR_URL=http://host.docker.internal:8983/solr/ \ - ghcr.io/apache/solr-mcp:latest + # JAR + PROFILES=http java -jar build/libs/solr-mcp-1.0.0-SNAPSHOT.jar # Or Gradle PROFILES=http ./gradlew bootRun + # Or Docker (local image — build first with ./gradlew jibDockerBuild) + docker run -p 8080:8080 --rm \ + -e PROFILES=http \ + -e SOLR_URL=http://host.docker.internal:8983/solr/ \ + solr-mcp:latest + 2. In MCP Inspector, enter: `http://localhost:8080/mcp` 3. Click **Connect** @@ -36,8 +39,8 @@ This starts the Inspector UI at `http://localhost:6274`. ## STDIO Mode ## 1. In MCP Inspector, select **STDIO** transport -2. **Command**: `docker` -3. **Arguments**: `run -i --rm -e SOLR_URL=http://host.docker.internal:8983/solr/ ghcr.io/apache/solr-mcp:latest` +2. **Command**: `java` +3. **Arguments**: `-jar /absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar` 4. Click **Connect** *** diff --git a/content/pages/mcp/clients/vs-code.md b/content/pages/mcp/clients/vs-code.md index 0cf50f5b2d..148ae56d89 100644 --- a/content/pages/mcp/clients/vs-code.md +++ b/content/pages/mcp/clients/vs-code.md @@ -13,6 +13,23 @@ template: mcp/client Create `.vscode/mcp.json` in your project root: +**JAR:** + +```json +{ + "servers": { + "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/" } + } + } +} +``` + +**Docker (local image — build first with `./gradlew jibDockerBuild`):** + ```json { "servers": { @@ -21,7 +38,7 @@ Create `.vscode/mcp.json` in your project root: "command": "docker", "args": ["run", "-i", "--rm", "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", - "ghcr.io/apache/solr-mcp:latest"] + "solr-mcp:latest"] } } } @@ -37,10 +54,9 @@ Open VS Code Settings (JSON) and add: "servers": { "solr-mcp": { "type": "stdio", - "command": "docker", - "args": ["run", "-i", "--rm", - "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", - "ghcr.io/apache/solr-mcp:latest"] + "command": "java", + "args": ["-jar", "/absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar"], + "env": { "SOLR_URL": "http://localhost:8983/solr/" } } } } diff --git a/content/pages/mcp/quick-start.md b/content/pages/mcp/quick-start.md index e7906267dc..4a2a60f2a5 100644 --- a/content/pages/mcp/quick-start.md +++ b/content/pages/mcp/quick-start.md @@ -5,6 +5,7 @@ template: mcp/quick-start ## Prerequisites ## +* Java 25+ ([Eclipse Temurin](https://adoptium.net/) recommended) * [Docker](https://docs.docker.com/get-docker/) and Docker Compose * An MCP client — this guide uses [Claude Desktop](https://claude.ai/download), but any MCP-compatible client works. See [Adding to AI Clients](/mcp/clients/claude-desktop.html) for other options. @@ -25,6 +26,14 @@ This starts Solr with ZooKeeper and creates two sample collections pre-loaded wi Wait ~30 seconds for Solr to fully initialize. Verify at [http://localhost:8983/solr/](http://localhost:8983/solr/). +## Build the Server ## + +```bash +./gradlew build +``` + +This produces `build/libs/solr-mcp-1.0.0-SNAPSHOT.jar`. + ## Configure Your MCP Client ## Add the following to your Claude Desktop configuration file: @@ -32,6 +41,28 @@ Add the following to your Claude Desktop configuration file: * **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` * **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` +```json +{ + "mcpServers": { + "solr-mcp": { + "command": "java", + "args": ["-jar", "/absolute/path/to/solr-mcp/build/libs/solr-mcp-1.0.0-SNAPSHOT.jar"], + "env": { "SOLR_URL": "http://localhost:8983/solr/" } + } + } +} +``` + +Restart Claude Desktop after saving. + +**Alternatively**, you can use a local Docker image: + +```bash +./gradlew jibDockerBuild +``` + +Then configure Claude Desktop with: + ```json { "mcpServers": { @@ -39,15 +70,13 @@ Add the following to your Claude Desktop configuration file: "command": "docker", "args": ["run", "-i", "--rm", "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", - "ghcr.io/apache/solr-mcp:latest"] + "solr-mcp:latest"] } } } ``` -Restart Claude Desktop after saving. - -**Linux users**: add `--add-host=host.docker.internal:host-gateway` to the args array to connect to Solr on the host machine. +**Linux users**: add `"--add-host=host.docker.internal:host-gateway"` to the args array. ## Try It Out ## diff --git a/content/pages/mcp/security.md b/content/pages/mcp/security.md index 1c6b5aa617..907239d440 100644 --- a/content/pages/mcp/security.md +++ b/content/pages/mcp/security.md @@ -21,7 +21,7 @@ export OAUTH2_ISSUER_URI=https://your-provider.example.com/ ./gradlew bootRun ``` -Or with Docker: +Or with Docker (local image — build first with `./gradlew jibDockerBuild`): ```bash docker run -p 8080:8080 --rm \ @@ -29,7 +29,7 @@ docker run -p 8080:8080 --rm \ -e SECURITY_ENABLED=true \ -e OAUTH2_ISSUER_URI=https://your-provider.example.com/ \ -e SOLR_URL=http://host.docker.internal:8983/solr/ \ - ghcr.io/apache/solr-mcp:latest + solr-mcp:latest ``` *** From a3fb34913de400f4ad0a29b22283c9feae003d05 Mon Sep 17 00:00:00 2001 From: adityamparikh Date: Fri, 24 Apr 2026 15:19:09 -0400 Subject: [PATCH 07/11] Fix subnav anchor links to match generated heading slugs - quick-start: #start-solr -> #start-solr-with-sample-data, etc. - security: #how-oauth2-works -> #how-oauth2-works-with-mcp-clients - observability: #actuator -> #actuator-endpoints, #production -> #production-configuration - community: remove #powered-by (no matching heading) Signed-off-by: Aditya Parikh Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: adityamparikh --- themes/solr/templates/mcp/community.html | 1 - themes/solr/templates/mcp/observability.html | 4 ++-- themes/solr/templates/mcp/quick-start.html | 6 +++--- themes/solr/templates/mcp/security.html | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/themes/solr/templates/mcp/community.html b/themes/solr/templates/mcp/community.html index ab8733470d..d20e29389f 100644 --- a/themes/solr/templates/mcp/community.html +++ b/themes/solr/templates/mcp/community.html @@ -9,5 +9,4 @@
    Contributing
    Code of Conduct
    Version Control
    -
    Powered By
    {% endblock %} diff --git a/themes/solr/templates/mcp/observability.html b/themes/solr/templates/mcp/observability.html index 3b38952361..b25c076281 100644 --- a/themes/solr/templates/mcp/observability.html +++ b/themes/solr/templates/mcp/observability.html @@ -6,6 +6,6 @@
    Overview
    Setup
    Grafana
    -
    Actuator
    -
    Production
    +
    Actuator
    +
    Production
    {% endblock %} diff --git a/themes/solr/templates/mcp/quick-start.html b/themes/solr/templates/mcp/quick-start.html index 50136f7900..3b6e1ab770 100644 --- a/themes/solr/templates/mcp/quick-start.html +++ b/themes/solr/templates/mcp/quick-start.html @@ -4,7 +4,7 @@ {% block subnav_subtitle %}Get from zero to a working AI + Solr integration in under 2 minutes.{% endblock %} {% block subnav_nav_items %}
    Prerequisites
    -
    Start Solr
    -
    Configure Client
    -
    Try It
    +
    Start Solr
    +
    Configure Client
    +
    Try It
    {% endblock %} diff --git a/themes/solr/templates/mcp/security.html b/themes/solr/templates/mcp/security.html index 1abcf56c65..00f5e9dae6 100644 --- a/themes/solr/templates/mcp/security.html +++ b/themes/solr/templates/mcp/security.html @@ -6,5 +6,5 @@
    Overview
    Auth0
    Keycloak
    -
    How It Works
    +
    How It Works
    {% endblock %} From 870ff70983959a1f16a735803977b2206cbc8993 Mon Sep 17 00:00:00 2001 From: adityamparikh Date: Fri, 24 Apr 2026 15:27:31 -0400 Subject: [PATCH 08/11] Update doc links for solr-mcp docs/ restructure Update GitHub links from dev-docs/ and security-docs/ to the new docs/development/ paths in resources and security pages. Signed-off-by: Aditya Parikh Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: adityamparikh --- content/pages/mcp/resources.md | 8 ++++---- content/pages/mcp/security.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/pages/mcp/resources.md b/content/pages/mcp/resources.md index a618257d71..ae7b1a483a 100644 --- a/content/pages/mcp/resources.md +++ b/content/pages/mcp/resources.md @@ -13,10 +13,10 @@ template: mcp/resources * [README](https://github.com/apache/solr-mcp#readme) — quick start, client configurations, and usage overview * [CONTRIBUTING](https://github.com/apache/solr-mcp/blob/main/CONTRIBUTING.md) — pull request process and commit conventions -* [Architecture](https://github.com/apache/solr-mcp/blob/main/dev-docs/ARCHITECTURE.md) — project structure and design decisions -* [Development Guide](https://github.com/apache/solr-mcp/blob/main/dev-docs/DEVELOPMENT.md) — build system, testing, and IDE setup -* [Auth0 Setup](https://github.com/apache/solr-mcp/blob/main/security-docs/AUTH0_SETUP.md) — detailed OAuth2 setup with Auth0 -* [Keycloak Setup](https://github.com/apache/solr-mcp/blob/main/dev-docs/KEYCLOAK_SETUP.md) — detailed OAuth2 setup with Keycloak +* [Architecture](https://github.com/apache/solr-mcp/blob/main/docs/development/ARCHITECTURE.md) — project structure and design decisions +* [Development Guide](https://github.com/apache/solr-mcp/blob/main/docs/development/DEVELOPMENT.md) — build system, testing, and IDE setup +* [Auth0 Setup](https://github.com/apache/solr-mcp/blob/main/docs/development/AUTH0_SETUP.md) — detailed OAuth2 setup with Auth0 +* [Keycloak Setup](https://github.com/apache/solr-mcp/blob/main/docs/development/keycloak.md) — detailed OAuth2 setup with Keycloak *** diff --git a/content/pages/mcp/security.md b/content/pages/mcp/security.md index 907239d440..978a81eb96 100644 --- a/content/pages/mcp/security.md +++ b/content/pages/mcp/security.md @@ -102,7 +102,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ http://localhost:8080/mcp ``` -For the full step-by-step guide, see [Auth0 Setup Guide](https://github.com/apache/solr-mcp/blob/main/security-docs/AUTH0_SETUP.md). +For the full step-by-step guide, see [Auth0 Setup Guide](https://github.com/apache/solr-mcp/blob/main/docs/development/AUTH0_SETUP.md). *** @@ -156,7 +156,7 @@ curl -X POST "http://localhost:8180/realms/solr-mcp/protocol/openid-connect/toke -d "grant_type=password" ``` -For the full guide including role-based access control and production deployment, see [Keycloak Setup Guide](https://github.com/apache/solr-mcp/blob/main/dev-docs/KEYCLOAK_SETUP.md). +For the full guide including role-based access control and production deployment, see [Keycloak Setup Guide](https://github.com/apache/solr-mcp/blob/main/docs/development/keycloak.md). *** From 2a249d758b03f5c479281c7cd400e53d26e9a90c Mon Sep 17 00:00:00 2001 From: adityamparikh Date: Fri, 24 Apr 2026 15:48:59 -0400 Subject: [PATCH 09/11] Fix proofreading issues: license URL, downloads text, inspector order - _head.html: fix stray space in license URL (LICENSE- 2.0 -> LICENSE-2.0) - downloads.html: remove incorrect "incubating" language, link to README - mcp-inspector.md: reorder STDIO before HTTP for consistency Signed-off-by: Aditya Parikh Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: adityamparikh --- content/pages/mcp/clients/mcp-inspector.md | 18 +++++++++--------- themes/solr/templates/mcp/_head.html | 2 +- themes/solr/templates/mcp/downloads.html | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/content/pages/mcp/clients/mcp-inspector.md b/content/pages/mcp/clients/mcp-inspector.md index 0d2239f67f..6e4402bd71 100644 --- a/content/pages/mcp/clients/mcp-inspector.md +++ b/content/pages/mcp/clients/mcp-inspector.md @@ -15,6 +15,15 @@ This starts the Inspector UI at `http://localhost:6274`. *** +## STDIO Mode ## + +1. In MCP Inspector, select **STDIO** transport +2. **Command**: `java` +3. **Arguments**: `-jar /absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar` +4. Click **Connect** + +*** + ## HTTP Mode ## 1. Start the server in HTTP mode: @@ -36,15 +45,6 @@ This starts the Inspector UI at `http://localhost:6274`. *** -## STDIO Mode ## - -1. In MCP Inspector, select **STDIO** transport -2. **Command**: `java` -3. **Arguments**: `-jar /absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar` -4. Click **Connect** - -*** - ## OAuth2 ## When OAuth2 is enabled on the server, configure the Inspector's OAuth settings before connecting: diff --git a/themes/solr/templates/mcp/_head.html b/themes/solr/templates/mcp/_head.html index bf48a54b13..9834463439 100644 --- a/themes/solr/templates/mcp/_head.html +++ b/themes/solr/templates/mcp/_head.html @@ -6,7 +6,7 @@ (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE- 2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/themes/solr/templates/mcp/downloads.html b/themes/solr/templates/mcp/downloads.html index 772aa5ee81..a093066e9f 100644 --- a/themes/solr/templates/mcp/downloads.html +++ b/themes/solr/templates/mcp/downloads.html @@ -15,6 +15,6 @@

    {{ page.title }}

    {{ page.content }} -

    This project is incubating and has not made any releases yet.

    +

    This project has not made any official releases yet. See the README for instructions on building from source.

    {% endblock content_inner %} From 9d6800af113418aa7c6d88b1059188d57ea92d4c Mon Sep 17 00:00:00 2001 From: adityamparikh Date: Mon, 4 May 2026 17:11:33 -0400 Subject: [PATCH 10/11] docs(mcp): add Native Image quick-start section Document the GraalVM native image build path on the MCP quick-start page. Spring Boot's bootBuildImage produces an opt-in native image for the STDIO profile that starts in milliseconds and uses substantially less memory than the JVM Jib image. Note that the native image is AOT-locked to the STDIO profile (Spring Boot bakes a profile-specific bean graph at build time, so a single native image cannot serve both transports). HTTP deployments use the JVM Jib image; native HTTP support is a future enhancement. Signed-off-by: Aditya Parikh Signed-off-by: adityamparikh --- content/pages/mcp/quick-start.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/content/pages/mcp/quick-start.md b/content/pages/mcp/quick-start.md index 4a2a60f2a5..82d1087d15 100644 --- a/content/pages/mcp/quick-start.md +++ b/content/pages/mcp/quick-start.md @@ -78,6 +78,33 @@ Then configure Claude Desktop with: **Linux users**: add `"--add-host=host.docker.internal:host-gateway"` to the args array. +## Native Image (experimental) ## + +An opt-in GraalVM native image build is available for the **STDIO** profile. The native binary starts in milliseconds and uses substantially less memory than the JVM image. HTTP transport is JVM-only on this release; native HTTP support requires a separate native image AOT-locked to the http profile and is tracked as a future enhancement. + +```bash +# Build the native Docker image (works on any host OS — compiles inside a Linux builder container) +./gradlew bootBuildImage +# Produces: solr-mcp:1.0.0-SNAPSHOT-native (also tagged :latest-native) +``` + +Configure Claude Desktop: + +```json +{ + "mcpServers": { + "solr-mcp": { + "command": "docker", + "args": ["run", "-i", "--rm", + "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", + "solr-mcp:latest-native"] + } + } +} +``` + +The native image is AOT-compiled for the STDIO profile — Spring Boot bakes a profile-specific bean graph at build time, so a single native image cannot serve both transports. HTTP-mode deployments should use the JVM Jib image above. + ## Try It Out ## Open Claude Desktop and try these prompts: From 26be7c8e43df3c111b9a5d85580767732016513e Mon Sep 17 00:00:00 2001 From: adityamparikh Date: Wed, 6 May 2026 17:06:39 -0400 Subject: [PATCH 11/11] docs(mcp): update Native Image section for stdio + http variants MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit apache/solr-mcp now ships two native image variants instead of just one: solr-mcp:-native-stdio (built via `bootBuildImage -Pnative`) and solr-mcp:-native-http (`bootBuildImage -Pnative -Pprofile=http`). Each is AOT-pinned to a single transport because Spring AOT bakes the web-application-type into the binary. The previous text said HTTP transport was JVM-only and called native HTTP support a future enhancement. Both claims are now stale — verified end-to-end via DockerImageMcpClientStdioIntegrationTest in apache/solr-mcp. Updates: - Mention both stdio and http native variants - Show `-Pnative -Pprofile=stdio|http` build commands - Update tag suffix from `-native` to `-native-stdio` / `-native-http` - Reframe the trade-off: single Jib JVM image is dual-transport, native variants are single-transport per AOT pin Signed-off-by: adityamparikh --- content/pages/mcp/quick-start.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/content/pages/mcp/quick-start.md b/content/pages/mcp/quick-start.md index 82d1087d15..e4ccfa4943 100644 --- a/content/pages/mcp/quick-start.md +++ b/content/pages/mcp/quick-start.md @@ -80,15 +80,19 @@ Then configure Claude Desktop with: ## Native Image (experimental) ## -An opt-in GraalVM native image build is available for the **STDIO** profile. The native binary starts in milliseconds and uses substantially less memory than the JVM image. HTTP transport is JVM-only on this release; native HTTP support requires a separate native image AOT-locked to the http profile and is tracked as a future enhancement. +Opt-in GraalVM native image builds are available for both **STDIO** and **HTTP** transports. Native binaries start in milliseconds and use substantially less memory than the JVM image. Spring AOT bakes a profile-specific bean graph at build time, so each native image is single-transport — pick the one that matches your client. ```bash -# Build the native Docker image (works on any host OS — compiles inside a Linux builder container) -./gradlew bootBuildImage -# Produces: solr-mcp:1.0.0-SNAPSHOT-native (also tagged :latest-native) +# Build the native STDIO image +./gradlew bootBuildImage -Pnative +# Produces: solr-mcp:1.0.0-SNAPSHOT-native-stdio (also tagged :latest-native-stdio) + +# Build the native HTTP image +./gradlew bootBuildImage -Pnative -Pprofile=http +# Produces: solr-mcp:1.0.0-SNAPSHOT-native-http (also tagged :latest-native-http) ``` -Configure Claude Desktop: +Configure Claude Desktop with the native STDIO image: ```json { @@ -97,13 +101,13 @@ Configure Claude Desktop: "command": "docker", "args": ["run", "-i", "--rm", "-e", "SOLR_URL=http://host.docker.internal:8983/solr/", - "solr-mcp:latest-native"] + "solr-mcp:latest-native-stdio"] } } } ``` -The native image is AOT-compiled for the STDIO profile — Spring Boot bakes a profile-specific bean graph at build time, so a single native image cannot serve both transports. HTTP-mode deployments should use the JVM Jib image above. +For dual-transport support from a single image (e.g. switch between modes via `PROFILES` env var without rebuilding), use the JVM Jib image above. The JVM image trades startup time and memory footprint for transport flexibility. ## Try It Out ##